From ab12d49c18ac6c34e5aed7f6cda9f0c998555ea1 Mon Sep 17 00:00:00 2001 From: Holger Drewes Date: Tue, 18 Nov 2025 13:52:55 +0100 Subject: [PATCH 1/5] Expand util blob example --- packages/util/examples/blobs.ts | 44 ++++++++++++++++++++++++++++----- packages/util/src/blobs.ts | 2 +- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/packages/util/examples/blobs.ts b/packages/util/examples/blobs.ts index 8e553ba5ec8..a49c070af06 100644 --- a/packages/util/examples/blobs.ts +++ b/packages/util/examples/blobs.ts @@ -1,12 +1,44 @@ -import { bytesToHex, computeVersionedHash, getBlobs } from '@ethereumjs/util' +import * as fs from 'fs' +import { + type PrefixedHexString, + blobsToCellProofs, + blobsToProofs, + computeVersionedHash, + getBlob, + getBlobs, + hexToBytes, +} from '@ethereumjs/util' +import { trustedSetup } from '@paulmillr/trusted-setups/fast-peerdas.js' +import { KZG as microEthKZG } from 'micro-eth-signer/kzg.js' -const blobs = getBlobs('test input') +const kzg = new microEthKZG(trustedSetup) + +// Use with node ./examples/blobs.ts +const filePath = process.argv[2] +let blobData: string = fs.readFileSync(filePath, 'ascii') +console.log(blobData) +console.log(blobData.length) +blobData = blobData.substring(0, 100) + +const blobs = [getBlob(hexToBytes(`0x${blobData}`))] + +//const blobData = 'hello' +//const blobs = getBlobs(blobData) console.log('Created the following blobs:') -console.log(blobs) +//console.log(blobs) + +const commitment = kzg.blobToKzgCommitment(blobs[0]) -const commitment = bytesToHex(new Uint8Array([1, 2, 3])) const blobCommitmentVersion = 0x01 -const versionedHash = computeVersionedHash(commitment, blobCommitmentVersion) +const versionedHash = computeVersionedHash(commitment as PrefixedHexString, blobCommitmentVersion) + +// EIP-4844 only +const blobProof = blobsToProofs(kzg, blobs, [commitment as PrefixedHexString]) +const cellProofs = blobsToCellProofs(kzg, blobs) -console.log(`Versioned hash ${versionedHash} computed`) +console.log(`Commitment : ${commitment}`) +console.log(`Versioned hash : ${versionedHash}`) +console.log(`Blob proof (EIP-4844) : ${blobProof}`) +console.log(`First cell proof (EIP-7594) : ${cellProofs[0]}`) +console.log(`Num cell proofs (EIP-7594) : ${cellProofs.length}`) diff --git a/packages/util/src/blobs.ts b/packages/util/src/blobs.ts index 87d91e611a2..de631f26990 100644 --- a/packages/util/src/blobs.ts +++ b/packages/util/src/blobs.ts @@ -36,7 +36,7 @@ function getPadded(data: Uint8Array, blobs_len: number): Uint8Array { * @param data Input data (must be exactly BLOB_SIZE bytes) * @returns Hex-prefixed blob string */ -function getBlob(data: Uint8Array): PrefixedHexString { +export function getBlob(data: Uint8Array): PrefixedHexString { const blob = new Uint8Array(BLOB_SIZE) for (let i = 0; i < FIELD_ELEMENTS_PER_BLOB; i++) { const chunk = new Uint8Array(32) From cc891f82d09c5d384e02c2bba2bbefc79a2df29a Mon Sep 17 00:00:00 2001 From: Holger Drewes Date: Thu, 20 Nov 2025 19:47:47 +0100 Subject: [PATCH 2/5] Fix getBlobs() in Util, remove size limitation in example --- packages/util/examples/blobs.ts | 4 ++-- packages/util/src/blobs.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/util/examples/blobs.ts b/packages/util/examples/blobs.ts index a49c070af06..976d46bfb46 100644 --- a/packages/util/examples/blobs.ts +++ b/packages/util/examples/blobs.ts @@ -15,10 +15,10 @@ const kzg = new microEthKZG(trustedSetup) // Use with node ./examples/blobs.ts const filePath = process.argv[2] -let blobData: string = fs.readFileSync(filePath, 'ascii') +const blobData: string = fs.readFileSync(filePath, 'ascii') console.log(blobData) console.log(blobData.length) -blobData = blobData.substring(0, 100) +//blobData = blobData.substring(0, 100) const blobs = [getBlob(hexToBytes(`0x${blobData}`))] diff --git a/packages/util/src/blobs.ts b/packages/util/src/blobs.ts index de631f26990..91c7f63ff43 100644 --- a/packages/util/src/blobs.ts +++ b/packages/util/src/blobs.ts @@ -40,7 +40,7 @@ export function getBlob(data: Uint8Array): PrefixedHexString { const blob = new Uint8Array(BLOB_SIZE) for (let i = 0; i < FIELD_ELEMENTS_PER_BLOB; i++) { const chunk = new Uint8Array(32) - chunk.set(data.subarray(i * 31, (i + 1) * 31), 0) + chunk.set(data.subarray(i * 32, (i + 1) * 32), 0) blob.set(chunk, i * 32) } From 9ec290fcbc0fc1ec277af90945a104a7bb4b73ee Mon Sep 17 00:00:00 2001 From: ScottyPoi Date: Wed, 26 Nov 2025 13:03:03 -0700 Subject: [PATCH 3/5] revert change to getBlob --- packages/util/src/blobs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/util/src/blobs.ts b/packages/util/src/blobs.ts index 91c7f63ff43..de631f26990 100644 --- a/packages/util/src/blobs.ts +++ b/packages/util/src/blobs.ts @@ -40,7 +40,7 @@ export function getBlob(data: Uint8Array): PrefixedHexString { const blob = new Uint8Array(BLOB_SIZE) for (let i = 0; i < FIELD_ELEMENTS_PER_BLOB; i++) { const chunk = new Uint8Array(32) - chunk.set(data.subarray(i * 32, (i + 1) * 32), 0) + chunk.set(data.subarray(i * 31, (i + 1) * 31), 0) blob.set(chunk, i * 32) } From e21a35b30be36fc032bd5367cab3ad0a526016ef Mon Sep 17 00:00:00 2001 From: ScottyPoi Date: Wed, 26 Nov 2025 13:16:20 -0700 Subject: [PATCH 4/5] fix blob example --- packages/util/examples/blobs.ts | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/packages/util/examples/blobs.ts b/packages/util/examples/blobs.ts index 976d46bfb46..872ad46dccc 100644 --- a/packages/util/examples/blobs.ts +++ b/packages/util/examples/blobs.ts @@ -7,6 +7,7 @@ import { getBlob, getBlobs, hexToBytes, + unprefixedHexToBytes, } from '@ethereumjs/util' import { trustedSetup } from '@paulmillr/trusted-setups/fast-peerdas.js' import { KZG as microEthKZG } from 'micro-eth-signer/kzg.js' @@ -15,18 +16,10 @@ const kzg = new microEthKZG(trustedSetup) // Use with node ./examples/blobs.ts const filePath = process.argv[2] -const blobData: string = fs.readFileSync(filePath, 'ascii') +const blobData: PrefixedHexString = `0x${fs.readFileSync(filePath, 'ascii')}` console.log(blobData) -console.log(blobData.length) -//blobData = blobData.substring(0, 100) -const blobs = [getBlob(hexToBytes(`0x${blobData}`))] - -//const blobData = 'hello' -//const blobs = getBlobs(blobData) - -console.log('Created the following blobs:') -//console.log(blobs) +const blobs = [blobData] const commitment = kzg.blobToKzgCommitment(blobs[0]) @@ -37,6 +30,7 @@ const versionedHash = computeVersionedHash(commitment as PrefixedHexString, blob const blobProof = blobsToProofs(kzg, blobs, [commitment as PrefixedHexString]) const cellProofs = blobsToCellProofs(kzg, blobs) +console.log(`Blob size : ${hexToBytes(blobData).length / 1024}KiB`) console.log(`Commitment : ${commitment}`) console.log(`Versioned hash : ${versionedHash}`) console.log(`Blob proof (EIP-4844) : ${blobProof}`) From 94dd6f37ca551441d271e50798b0c00071b4f3c4 Mon Sep 17 00:00:00 2001 From: Holger Drewes Date: Wed, 3 Dec 2025 14:00:08 +0100 Subject: [PATCH 5/5] Commented out blobs example file reading and make it optional again --- packages/util/examples/blobs.ts | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/packages/util/examples/blobs.ts b/packages/util/examples/blobs.ts index 872ad46dccc..c1636421726 100644 --- a/packages/util/examples/blobs.ts +++ b/packages/util/examples/blobs.ts @@ -1,36 +1,35 @@ -import * as fs from 'fs' +//import * as fs from 'fs' import { type PrefixedHexString, blobsToCellProofs, blobsToProofs, computeVersionedHash, - getBlob, - getBlobs, hexToBytes, - unprefixedHexToBytes, } from '@ethereumjs/util' import { trustedSetup } from '@paulmillr/trusted-setups/fast-peerdas.js' import { KZG as microEthKZG } from 'micro-eth-signer/kzg.js' const kzg = new microEthKZG(trustedSetup) -// Use with node ./examples/blobs.ts -const filePath = process.argv[2] -const blobData: PrefixedHexString = `0x${fs.readFileSync(filePath, 'ascii')}` -console.log(blobData) +/** + * Uncomment for a more realistic example using a real blob, e.g. from https://blobscan.com/ + * Use with node ./examples/blobs.ts + */ +// const filePath = process.argv[2] +//const blob: PrefixedHexString = `0x${fs.readFileSync(filePath, 'ascii')}` +const blob: PrefixedHexString = `0x${'11'.repeat(131072)}` // 128 KiB +console.log(blob) -const blobs = [blobData] - -const commitment = kzg.blobToKzgCommitment(blobs[0]) +const commitment = kzg.blobToKzgCommitment(blob) const blobCommitmentVersion = 0x01 const versionedHash = computeVersionedHash(commitment as PrefixedHexString, blobCommitmentVersion) // EIP-4844 only -const blobProof = blobsToProofs(kzg, blobs, [commitment as PrefixedHexString]) -const cellProofs = blobsToCellProofs(kzg, blobs) +const blobProof = blobsToProofs(kzg, [blob], [commitment as PrefixedHexString]) +const cellProofs = blobsToCellProofs(kzg, [blob]) -console.log(`Blob size : ${hexToBytes(blobData).length / 1024}KiB`) +console.log(`Blob size : ${hexToBytes(blob).length / 1024}KiB`) console.log(`Commitment : ${commitment}`) console.log(`Versioned hash : ${versionedHash}`) console.log(`Blob proof (EIP-4844) : ${blobProof}`)