@aztec/blob-lib 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2 → 0.76.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/blob.d.ts +154 -0
- package/dest/blob.d.ts.map +1 -0
- package/dest/blob.js +128 -117
- package/dest/encoding.d.ts +66 -0
- package/dest/encoding.d.ts.map +1 -0
- package/dest/encoding.js +21 -11
- package/dest/errors.d.ts +4 -0
- package/dest/errors.d.ts.map +1 -0
- package/dest/errors.js +2 -1
- package/dest/index.d.ts +6 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +10 -6
- package/dest/interface.d.ts +10 -0
- package/dest/interface.d.ts.map +1 -0
- package/dest/interface.js +2 -3
- package/dest/mocks.d.ts +20 -0
- package/dest/mocks.d.ts.map +1 -0
- package/dest/mocks.js +10 -21
- package/package.json +3 -3
package/dest/blob.d.ts
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
4
|
+
import { BufferReader } from '@aztec/foundation/serialize';
|
|
5
|
+
import cKzg from 'c-kzg';
|
|
6
|
+
import type { Blob as BlobBuffer } from 'c-kzg';
|
|
7
|
+
import { type BlobJson } from './interface.js';
|
|
8
|
+
export declare const VERSIONED_HASH_VERSION_KZG = 1;
|
|
9
|
+
/**
|
|
10
|
+
* A class to create, manage, and prove EVM blobs.
|
|
11
|
+
*/
|
|
12
|
+
export declare class Blob {
|
|
13
|
+
/** The blob to be broadcast on L1 in bytes form. */
|
|
14
|
+
readonly data: BlobBuffer;
|
|
15
|
+
/** The hash of all tx effects inside the blob. Used in generating the challenge z and proving that we have included all required effects. */
|
|
16
|
+
readonly fieldsHash: Fr;
|
|
17
|
+
/** Challenge point z (= H(H(tx_effects), kzgCommmitment). Used such that p(z) = y. */
|
|
18
|
+
readonly challengeZ: Fr;
|
|
19
|
+
/** Evaluation y = p(z), where p() is the blob polynomial. BLS12 field element, rep. as BigNum in nr, bigint in ts. */
|
|
20
|
+
readonly evaluationY: Buffer;
|
|
21
|
+
/** Commitment to the blob C. Used in compressed BLS12 point format (48 bytes). */
|
|
22
|
+
readonly commitment: Buffer;
|
|
23
|
+
/** KZG opening proof for y = p(z). The commitment to quotient polynomial Q, used in compressed BLS12 point format (48 bytes). */
|
|
24
|
+
readonly proof: Buffer;
|
|
25
|
+
constructor(
|
|
26
|
+
/** The blob to be broadcast on L1 in bytes form. */
|
|
27
|
+
data: BlobBuffer,
|
|
28
|
+
/** The hash of all tx effects inside the blob. Used in generating the challenge z and proving that we have included all required effects. */
|
|
29
|
+
fieldsHash: Fr,
|
|
30
|
+
/** Challenge point z (= H(H(tx_effects), kzgCommmitment). Used such that p(z) = y. */
|
|
31
|
+
challengeZ: Fr,
|
|
32
|
+
/** Evaluation y = p(z), where p() is the blob polynomial. BLS12 field element, rep. as BigNum in nr, bigint in ts. */
|
|
33
|
+
evaluationY: Buffer,
|
|
34
|
+
/** Commitment to the blob C. Used in compressed BLS12 point format (48 bytes). */
|
|
35
|
+
commitment: Buffer,
|
|
36
|
+
/** KZG opening proof for y = p(z). The commitment to quotient polynomial Q, used in compressed BLS12 point format (48 bytes). */
|
|
37
|
+
proof: Buffer);
|
|
38
|
+
/**
|
|
39
|
+
* The encoded version of the blob will determine the end of the blob based on the transaction encoding.
|
|
40
|
+
* This is required when the fieldsHash of a blob will contain trailing zeros.
|
|
41
|
+
*
|
|
42
|
+
* See `./encoding.ts` for more details.
|
|
43
|
+
*
|
|
44
|
+
* This method is used to create a Blob from a buffer.
|
|
45
|
+
* @param blob - The buffer to create the Blob from.
|
|
46
|
+
* @param multiBlobFieldsHash - The fields hash to use for the Blob.
|
|
47
|
+
* @returns A Blob created from the buffer.
|
|
48
|
+
*
|
|
49
|
+
* @throws If unable to deserialize the blob.
|
|
50
|
+
*/
|
|
51
|
+
static fromEncodedBlobBuffer(blob: BlobBuffer, multiBlobFieldsHash?: Fr): Promise<Blob>;
|
|
52
|
+
/**
|
|
53
|
+
* Create a Blob from an array of fields.
|
|
54
|
+
*
|
|
55
|
+
* @param fields - The array of fields to create the Blob from.
|
|
56
|
+
* @param multiBlobFieldsHash - The fields hash to use for the Blob.
|
|
57
|
+
* @returns A Blob created from the array of fields.
|
|
58
|
+
*/
|
|
59
|
+
static fromFields(fields: Fr[], multiBlobFieldsHash?: Fr): Promise<Blob>;
|
|
60
|
+
/**
|
|
61
|
+
* Create a Blob from a JSON object.
|
|
62
|
+
*
|
|
63
|
+
* Blobs will be in this form when requested from the blob sink, or from
|
|
64
|
+
* the beacon chain via `getBlobSidecars`
|
|
65
|
+
* https://ethereum.github.io/beacon-APIs/?urls.primaryName=dev#/Beacon/getBlobSidecars
|
|
66
|
+
*
|
|
67
|
+
* @dev WARNING: by default json deals with encoded buffers
|
|
68
|
+
*
|
|
69
|
+
* @param json - The JSON object to create the Blob from.
|
|
70
|
+
* @returns A Blob created from the JSON object.
|
|
71
|
+
*/
|
|
72
|
+
static fromJson(json: BlobJson): Promise<Blob>;
|
|
73
|
+
/**
|
|
74
|
+
* Get the JSON representation of the blob.
|
|
75
|
+
*
|
|
76
|
+
* @dev WARNING: by default json deals with encoded buffers
|
|
77
|
+
* @param index - optional - The index of the blob in the block.
|
|
78
|
+
* @returns The JSON representation of the blob.
|
|
79
|
+
*/
|
|
80
|
+
toJson(index?: number): BlobJson;
|
|
81
|
+
/**
|
|
82
|
+
* Get the fields from the blob.
|
|
83
|
+
*
|
|
84
|
+
* @dev WARNING: this method does not take into account trailing zeros
|
|
85
|
+
*
|
|
86
|
+
* @returns The fields from the blob.
|
|
87
|
+
*/
|
|
88
|
+
toFields(): Fr[];
|
|
89
|
+
/**
|
|
90
|
+
* Get the encoded fields from the blob.
|
|
91
|
+
*
|
|
92
|
+
* @dev This method takes into account trailing zeros
|
|
93
|
+
*
|
|
94
|
+
* @returns The encoded fields from the blob.
|
|
95
|
+
*
|
|
96
|
+
* @throws If unable to deserialize the blob.
|
|
97
|
+
*/
|
|
98
|
+
toEncodedFields(): Fr[];
|
|
99
|
+
/**
|
|
100
|
+
* Get the commitment fields from the blob.
|
|
101
|
+
*
|
|
102
|
+
* The 48-byte commitment is encoded into two field elements:
|
|
103
|
+
* +------------------+------------------+
|
|
104
|
+
* | Field Element 1 | Field Element 2 |
|
|
105
|
+
* | [bytes 0-31] | [bytes 32-47] |
|
|
106
|
+
* +------------------+------------------+
|
|
107
|
+
* | 32 bytes | 16 bytes |
|
|
108
|
+
* +------------------+------------------+
|
|
109
|
+
* @returns The commitment fields from the blob.
|
|
110
|
+
*/
|
|
111
|
+
commitmentToFields(): [Fr, Fr];
|
|
112
|
+
getEthVersionedBlobHash(): Buffer;
|
|
113
|
+
static getEthVersionedBlobHash(commitment: Buffer): Buffer;
|
|
114
|
+
/**
|
|
115
|
+
* Get the buffer representation of the ENTIRE blob.
|
|
116
|
+
*
|
|
117
|
+
* @dev WARNING: this buffer contains all metadata aswell as the data itself
|
|
118
|
+
*
|
|
119
|
+
* @returns The buffer representation of the blob.
|
|
120
|
+
*/
|
|
121
|
+
toBuffer(): Buffer;
|
|
122
|
+
/**
|
|
123
|
+
* Create a Blob from a buffer.
|
|
124
|
+
*
|
|
125
|
+
* @dev WARNING: this method contains all metadata aswell as the data itself
|
|
126
|
+
*
|
|
127
|
+
* @param buf - The buffer to create the Blob from.
|
|
128
|
+
* @returns A Blob created from the buffer.
|
|
129
|
+
*/
|
|
130
|
+
static fromBuffer(buf: Buffer | BufferReader): Blob;
|
|
131
|
+
/**
|
|
132
|
+
* Get the size of the blob in bytes
|
|
133
|
+
*/
|
|
134
|
+
getSize(): number;
|
|
135
|
+
/**
|
|
136
|
+
* Returns a proof of opening of the blob to verify on L1 using the point evaluation precompile:
|
|
137
|
+
*
|
|
138
|
+
* input[:32] - versioned_hash
|
|
139
|
+
* input[32:64] - z
|
|
140
|
+
* input[64:96] - y
|
|
141
|
+
* input[96:144] - commitment C
|
|
142
|
+
* input[144:192] - proof (a commitment to the quotient polynomial q(X))
|
|
143
|
+
*
|
|
144
|
+
* See https://eips.ethereum.org/EIPS/eip-4844#point-evaluation-precompile
|
|
145
|
+
*/
|
|
146
|
+
getEthBlobEvaluationInputs(): `0x${string}`;
|
|
147
|
+
static getEthBlobEvaluationInputs(blobs: Blob[]): `0x${string}`;
|
|
148
|
+
static getViemKzgInstance(): {
|
|
149
|
+
blobToKzgCommitment: typeof cKzg.blobToKzgCommitment;
|
|
150
|
+
computeBlobKzgProof: typeof cKzg.computeBlobKzgProof;
|
|
151
|
+
};
|
|
152
|
+
static getBlobs(fields: Fr[]): Promise<Blob[]>;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=blob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob.d.ts","sourceRoot":"","sources":["../src/blob.ts"],"names":[],"mappings":";;AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAE9E,OAAO,IAAI,MAAM,OAAO,CAAC;AACzB,OAAO,KAAK,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,OAAO,CAAC;AAIhD,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAM/C,eAAO,MAAM,0BAA0B,IAAO,CAAC;AAE/C;;GAEG;AACH,qBAAa,IAAI;IAEb,oDAAoD;aACpC,IAAI,EAAE,UAAU;IAChC,6IAA6I;aAC7H,UAAU,EAAE,EAAE;IAC9B,sFAAsF;aACtE,UAAU,EAAE,EAAE;IAC9B,sHAAsH;aACtG,WAAW,EAAE,MAAM;IACnC,kFAAkF;aAClE,UAAU,EAAE,MAAM;IAClC,iIAAiI;aACjH,KAAK,EAAE,MAAM;;IAX7B,oDAAoD;IACpC,IAAI,EAAE,UAAU;IAChC,6IAA6I;IAC7H,UAAU,EAAE,EAAE;IAC9B,sFAAsF;IACtE,UAAU,EAAE,EAAE;IAC9B,sHAAsH;IACtG,WAAW,EAAE,MAAM;IACnC,kFAAkF;IAClE,UAAU,EAAE,MAAM;IAClC,iIAAiI;IACjH,KAAK,EAAE,MAAM;IAG/B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,UAAU,EAAE,mBAAmB,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvF;;;;;;OAMG;WACU,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,mBAAmB,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB9E;;;;;;;;;;;OAWG;WACU,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAepD;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ;IAWhC;;;;;;OAMG;IACH,QAAQ,IAAI,EAAE,EAAE;IAIhB;;;;;;;;OAQG;IACH,eAAe,IAAI,EAAE,EAAE;IAUvB;;;;;;;;;;;OAWG;IACH,kBAAkB,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;IAK9B,uBAAuB,IAAI,MAAM;IAMjC,MAAM,CAAC,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAM1D;;;;;;OAMG;IACH,QAAQ,IAAI,MAAM;IAiBlB;;;;;;;OAOG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAYnD;;OAEG;IACH,OAAO;IAIP;;;;;;;;;;OAUG;IACH,0BAA0B,IAAI,KAAK,MAAM,EAAE;IAW3C,MAAM,CAAC,0BAA0B,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,MAAM,EAAE;IAmB/D,MAAM,CAAC,kBAAkB;;;;WASZ,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;CAUrD"}
|
package/dest/blob.js
CHANGED
|
@@ -5,19 +5,27 @@ import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
|
5
5
|
import cKzg from 'c-kzg';
|
|
6
6
|
import { deserializeEncodedBlobToFields, extractBlobFieldsFromBuffer } from './encoding.js';
|
|
7
7
|
import { BlobDeserializationError } from './errors.js';
|
|
8
|
-
/* eslint-disable import/no-named-as-default-member */
|
|
8
|
+
/* eslint-disable import/no-named-as-default-member */
|
|
9
|
+
const { BYTES_PER_BLOB, FIELD_ELEMENTS_PER_BLOB, blobToKzgCommitment, computeKzgProof, verifyKzgProof } = cKzg;
|
|
9
10
|
// The prefix to the EVM blobHash, defined here: https://eips.ethereum.org/EIPS/eip-4844#specification
|
|
10
11
|
export const VERSIONED_HASH_VERSION_KZG = 0x01;
|
|
11
12
|
/**
|
|
12
13
|
* A class to create, manage, and prove EVM blobs.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
*/
|
|
15
|
+
export class Blob {
|
|
16
|
+
constructor(
|
|
17
|
+
/** The blob to be broadcast on L1 in bytes form. */
|
|
18
|
+
data,
|
|
19
|
+
/** The hash of all tx effects inside the blob. Used in generating the challenge z and proving that we have included all required effects. */
|
|
20
|
+
fieldsHash,
|
|
21
|
+
/** Challenge point z (= H(H(tx_effects), kzgCommmitment). Used such that p(z) = y. */
|
|
22
|
+
challengeZ,
|
|
23
|
+
/** Evaluation y = p(z), where p() is the blob polynomial. BLS12 field element, rep. as BigNum in nr, bigint in ts. */
|
|
24
|
+
evaluationY,
|
|
25
|
+
/** Commitment to the blob C. Used in compressed BLS12 point format (48 bytes). */
|
|
26
|
+
commitment,
|
|
27
|
+
/** KZG opening proof for y = p(z). The commitment to quotient polynomial Q, used in compressed BLS12 point format (48 bytes). */
|
|
28
|
+
proof) {
|
|
21
29
|
this.data = data;
|
|
22
30
|
this.fieldsHash = fieldsHash;
|
|
23
31
|
this.challengeZ = challengeZ;
|
|
@@ -26,45 +34,43 @@ export const VERSIONED_HASH_VERSION_KZG = 0x01;
|
|
|
26
34
|
this.proof = proof;
|
|
27
35
|
}
|
|
28
36
|
/**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
* The encoded version of the blob will determine the end of the blob based on the transaction encoding.
|
|
38
|
+
* This is required when the fieldsHash of a blob will contain trailing zeros.
|
|
39
|
+
*
|
|
40
|
+
* See `./encoding.ts` for more details.
|
|
41
|
+
*
|
|
42
|
+
* This method is used to create a Blob from a buffer.
|
|
43
|
+
* @param blob - The buffer to create the Blob from.
|
|
44
|
+
* @param multiBlobFieldsHash - The fields hash to use for the Blob.
|
|
45
|
+
* @returns A Blob created from the buffer.
|
|
46
|
+
*
|
|
47
|
+
* @throws If unable to deserialize the blob.
|
|
48
|
+
*/
|
|
49
|
+
static fromEncodedBlobBuffer(blob, multiBlobFieldsHash) {
|
|
41
50
|
try {
|
|
42
51
|
const fields = deserializeEncodedBlobToFields(blob);
|
|
43
52
|
return Blob.fromFields(fields, multiBlobFieldsHash);
|
|
44
|
-
}
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
45
55
|
throw new BlobDeserializationError(`Failed to create Blob from encoded blob buffer, this blob was likely not created by us`);
|
|
46
56
|
}
|
|
47
57
|
}
|
|
48
58
|
/**
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
59
|
+
* Create a Blob from an array of fields.
|
|
60
|
+
*
|
|
61
|
+
* @param fields - The array of fields to create the Blob from.
|
|
62
|
+
* @param multiBlobFieldsHash - The fields hash to use for the Blob.
|
|
63
|
+
* @returns A Blob created from the array of fields.
|
|
64
|
+
*/
|
|
65
|
+
static async fromFields(fields, multiBlobFieldsHash) {
|
|
55
66
|
if (fields.length > FIELD_ELEMENTS_PER_BLOB) {
|
|
56
67
|
throw new Error(`Attempted to overfill blob with ${fields.length} elements. The maximum is ${FIELD_ELEMENTS_PER_BLOB}`);
|
|
57
68
|
}
|
|
58
|
-
const data = Buffer.concat([
|
|
59
|
-
serializeToBuffer(fields)
|
|
60
|
-
], BYTES_PER_BLOB);
|
|
69
|
+
const data = Buffer.concat([serializeToBuffer(fields)], BYTES_PER_BLOB);
|
|
61
70
|
// This matches the output of SpongeBlob.squeeze() in the blob circuit
|
|
62
71
|
const fieldsHash = multiBlobFieldsHash ? multiBlobFieldsHash : await poseidon2Hash(fields);
|
|
63
72
|
const commitment = Buffer.from(blobToKzgCommitment(data));
|
|
64
|
-
const challengeZ = await poseidon2Hash([
|
|
65
|
-
fieldsHash,
|
|
66
|
-
...commitmentToFields(commitment)
|
|
67
|
-
]);
|
|
73
|
+
const challengeZ = await poseidon2Hash([fieldsHash, ...commitmentToFields(commitment)]);
|
|
68
74
|
const res = computeKzgProof(data, challengeZ.toBuffer());
|
|
69
75
|
if (!verifyKzgProof(commitment, challengeZ.toBuffer(), res[1], res[0])) {
|
|
70
76
|
throw new Error(`KZG proof did not verify.`);
|
|
@@ -74,17 +80,18 @@ export const VERSIONED_HASH_VERSION_KZG = 0x01;
|
|
|
74
80
|
return new Blob(data, fieldsHash, challengeZ, evaluationY, commitment, proof);
|
|
75
81
|
}
|
|
76
82
|
/**
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
83
|
+
* Create a Blob from a JSON object.
|
|
84
|
+
*
|
|
85
|
+
* Blobs will be in this form when requested from the blob sink, or from
|
|
86
|
+
* the beacon chain via `getBlobSidecars`
|
|
87
|
+
* https://ethereum.github.io/beacon-APIs/?urls.primaryName=dev#/Beacon/getBlobSidecars
|
|
88
|
+
*
|
|
89
|
+
* @dev WARNING: by default json deals with encoded buffers
|
|
90
|
+
*
|
|
91
|
+
* @param json - The JSON object to create the Blob from.
|
|
92
|
+
* @returns A Blob created from the JSON object.
|
|
93
|
+
*/
|
|
94
|
+
static async fromJson(json) {
|
|
88
95
|
const blobBuffer = Buffer.from(json.blob.slice(2), 'hex');
|
|
89
96
|
const blob = await Blob.fromEncodedBlobBuffer(blobBuffer);
|
|
90
97
|
if (blob.commitment.toString('hex') !== json.kzg_commitment.slice(2)) {
|
|
@@ -95,57 +102,62 @@ export const VERSIONED_HASH_VERSION_KZG = 0x01;
|
|
|
95
102
|
return blob;
|
|
96
103
|
}
|
|
97
104
|
/**
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
105
|
+
* Get the JSON representation of the blob.
|
|
106
|
+
*
|
|
107
|
+
* @dev WARNING: by default json deals with encoded buffers
|
|
108
|
+
* @param index - optional - The index of the blob in the block.
|
|
109
|
+
* @returns The JSON representation of the blob.
|
|
110
|
+
*/
|
|
111
|
+
toJson(index) {
|
|
104
112
|
return {
|
|
105
113
|
blob: `0x${Buffer.from(this.data).toString('hex')}`,
|
|
106
114
|
index,
|
|
107
115
|
// eslint-disable-next-line camelcase
|
|
108
116
|
kzg_commitment: `0x${this.commitment.toString('hex')}`,
|
|
109
117
|
// eslint-disable-next-line camelcase
|
|
110
|
-
kzg_proof: `0x${this.proof.toString('hex')}
|
|
118
|
+
kzg_proof: `0x${this.proof.toString('hex')}`,
|
|
111
119
|
};
|
|
112
120
|
}
|
|
113
121
|
/**
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
122
|
+
* Get the fields from the blob.
|
|
123
|
+
*
|
|
124
|
+
* @dev WARNING: this method does not take into account trailing zeros
|
|
125
|
+
*
|
|
126
|
+
* @returns The fields from the blob.
|
|
127
|
+
*/
|
|
128
|
+
toFields() {
|
|
120
129
|
return extractBlobFieldsFromBuffer(this.data);
|
|
121
130
|
}
|
|
122
131
|
/**
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
132
|
+
* Get the encoded fields from the blob.
|
|
133
|
+
*
|
|
134
|
+
* @dev This method takes into account trailing zeros
|
|
135
|
+
*
|
|
136
|
+
* @returns The encoded fields from the blob.
|
|
137
|
+
*
|
|
138
|
+
* @throws If unable to deserialize the blob.
|
|
139
|
+
*/
|
|
140
|
+
toEncodedFields() {
|
|
131
141
|
try {
|
|
132
142
|
return deserializeEncodedBlobToFields(this.data);
|
|
133
|
-
}
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
134
145
|
throw new BlobDeserializationError(`Failed to deserialize encoded blob fields, this blob was likely not created by us`);
|
|
135
146
|
}
|
|
136
147
|
}
|
|
137
148
|
/**
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
+
* Get the commitment fields from the blob.
|
|
150
|
+
*
|
|
151
|
+
* The 48-byte commitment is encoded into two field elements:
|
|
152
|
+
* +------------------+------------------+
|
|
153
|
+
* | Field Element 1 | Field Element 2 |
|
|
154
|
+
* | [bytes 0-31] | [bytes 32-47] |
|
|
155
|
+
* +------------------+------------------+
|
|
156
|
+
* | 32 bytes | 16 bytes |
|
|
157
|
+
* +------------------+------------------+
|
|
158
|
+
* @returns The commitment fields from the blob.
|
|
159
|
+
*/
|
|
160
|
+
commitmentToFields() {
|
|
149
161
|
return commitmentToFields(this.commitment);
|
|
150
162
|
}
|
|
151
163
|
// Returns ethereum's versioned blob hash, following kzg_to_versioned_hash: https://eips.ethereum.org/EIPS/eip-4844#helpers
|
|
@@ -160,75 +172,76 @@ export const VERSIONED_HASH_VERSION_KZG = 0x01;
|
|
|
160
172
|
return hash;
|
|
161
173
|
}
|
|
162
174
|
/**
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
175
|
+
* Get the buffer representation of the ENTIRE blob.
|
|
176
|
+
*
|
|
177
|
+
* @dev WARNING: this buffer contains all metadata aswell as the data itself
|
|
178
|
+
*
|
|
179
|
+
* @returns The buffer representation of the blob.
|
|
180
|
+
*/
|
|
181
|
+
toBuffer() {
|
|
169
182
|
return Buffer.from(serializeToBuffer(this.data.length, this.data, this.fieldsHash, this.challengeZ, this.evaluationY.length, this.evaluationY, this.commitment.length, this.commitment, this.proof.length, this.proof));
|
|
170
183
|
}
|
|
171
184
|
/**
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
185
|
+
* Create a Blob from a buffer.
|
|
186
|
+
*
|
|
187
|
+
* @dev WARNING: this method contains all metadata aswell as the data itself
|
|
188
|
+
*
|
|
189
|
+
* @param buf - The buffer to create the Blob from.
|
|
190
|
+
* @returns A Blob created from the buffer.
|
|
191
|
+
*/
|
|
192
|
+
static fromBuffer(buf) {
|
|
179
193
|
const reader = BufferReader.asReader(buf);
|
|
180
194
|
return new Blob(reader.readUint8Array(), reader.readObject(Fr), reader.readObject(Fr), reader.readBuffer(), reader.readBuffer(), reader.readBuffer());
|
|
181
195
|
}
|
|
182
196
|
/**
|
|
183
|
-
|
|
184
|
-
|
|
197
|
+
* Get the size of the blob in bytes
|
|
198
|
+
*/
|
|
199
|
+
getSize() {
|
|
185
200
|
return this.data.length;
|
|
186
201
|
}
|
|
187
202
|
/**
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
203
|
+
* Returns a proof of opening of the blob to verify on L1 using the point evaluation precompile:
|
|
204
|
+
*
|
|
205
|
+
* input[:32] - versioned_hash
|
|
206
|
+
* input[32:64] - z
|
|
207
|
+
* input[64:96] - y
|
|
208
|
+
* input[96:144] - commitment C
|
|
209
|
+
* input[144:192] - proof (a commitment to the quotient polynomial q(X))
|
|
210
|
+
*
|
|
211
|
+
* See https://eips.ethereum.org/EIPS/eip-4844#point-evaluation-precompile
|
|
212
|
+
*/
|
|
213
|
+
getEthBlobEvaluationInputs() {
|
|
198
214
|
const buf = Buffer.concat([
|
|
199
215
|
this.getEthVersionedBlobHash(),
|
|
200
216
|
this.challengeZ.toBuffer(),
|
|
201
217
|
this.evaluationY,
|
|
202
218
|
this.commitment,
|
|
203
|
-
this.proof
|
|
219
|
+
this.proof,
|
|
204
220
|
]);
|
|
205
221
|
return `0x${buf.toString('hex')}`;
|
|
206
222
|
}
|
|
207
223
|
static getEthBlobEvaluationInputs(blobs) {
|
|
208
224
|
let buf = Buffer.alloc(0);
|
|
209
|
-
blobs.forEach(
|
|
225
|
+
blobs.forEach(blob => {
|
|
210
226
|
buf = Buffer.concat([
|
|
211
227
|
buf,
|
|
212
228
|
blob.getEthVersionedBlobHash(),
|
|
213
229
|
blob.challengeZ.toBuffer(),
|
|
214
230
|
blob.evaluationY,
|
|
215
231
|
blob.commitment,
|
|
216
|
-
blob.proof
|
|
232
|
+
blob.proof,
|
|
217
233
|
]);
|
|
218
234
|
});
|
|
219
235
|
// For multiple blobs, we prefix the number of blobs:
|
|
220
236
|
const lenBuf = Buffer.alloc(1);
|
|
221
237
|
lenBuf.writeUint8(blobs.length);
|
|
222
|
-
buf = Buffer.concat([
|
|
223
|
-
lenBuf,
|
|
224
|
-
buf
|
|
225
|
-
]);
|
|
238
|
+
buf = Buffer.concat([lenBuf, buf]);
|
|
226
239
|
return `0x${buf.toString('hex')}`;
|
|
227
240
|
}
|
|
228
241
|
static getViemKzgInstance() {
|
|
229
242
|
return {
|
|
230
243
|
blobToKzgCommitment: cKzg.blobToKzgCommitment,
|
|
231
|
-
computeBlobKzgProof: cKzg.computeBlobKzgProof
|
|
244
|
+
computeBlobKzgProof: cKzg.computeBlobKzgProof,
|
|
232
245
|
};
|
|
233
246
|
}
|
|
234
247
|
// Returns as many blobs as we require to broadcast the given fields
|
|
@@ -237,7 +250,7 @@ export const VERSIONED_HASH_VERSION_KZG = 0x01;
|
|
|
237
250
|
const numBlobs = Math.max(Math.ceil(fields.length / FIELD_ELEMENTS_PER_BLOB), 1);
|
|
238
251
|
const multiBlobFieldsHash = await poseidon2Hash(fields);
|
|
239
252
|
const res = [];
|
|
240
|
-
for(let i = 0; i < numBlobs; i++){
|
|
253
|
+
for (let i = 0; i < numBlobs; i++) {
|
|
241
254
|
const end = fields.length < (i + 1) * FIELD_ELEMENTS_PER_BLOB ? fields.length : (i + 1) * FIELD_ELEMENTS_PER_BLOB;
|
|
242
255
|
res.push(await Blob.fromFields(fields.slice(i * FIELD_ELEMENTS_PER_BLOB, end), multiBlobFieldsHash));
|
|
243
256
|
}
|
|
@@ -246,8 +259,6 @@ export const VERSIONED_HASH_VERSION_KZG = 0x01;
|
|
|
246
259
|
}
|
|
247
260
|
// 48 bytes encoded in fields as [Fr, Fr] = [0->31, 31->48]
|
|
248
261
|
function commitmentToFields(commitment) {
|
|
249
|
-
return [
|
|
250
|
-
new Fr(commitment.subarray(0, 31)),
|
|
251
|
-
new Fr(commitment.subarray(31, 48))
|
|
252
|
-
];
|
|
262
|
+
return [new Fr(commitment.subarray(0, 31)), new Fr(commitment.subarray(31, 48))];
|
|
253
263
|
}
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ibG9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlHQUFpRztBQUNqRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFOUUsT0FBTyxJQUFJLE1BQU0sT0FBTyxDQUFDO0FBR3pCLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHdkQsc0RBQXNEO0FBQ3RELE1BQU0sRUFBRSxjQUFjLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQztBQUUvRyxzR0FBc0c7QUFDdEcsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxDQUFDO0FBRS9DOztHQUVHO0FBQ0gsTUFBTSxPQUFPLElBQUk7SUFDZjtJQUNFLG9EQUFvRDtJQUNwQyxJQUFnQjtJQUNoQyw2SUFBNkk7SUFDN0gsVUFBYztJQUM5QixzRkFBc0Y7SUFDdEUsVUFBYztJQUM5QixzSEFBc0g7SUFDdEcsV0FBbUI7SUFDbkMsa0ZBQWtGO0lBQ2xFLFVBQWtCO0lBQ2xDLGlJQUFpSTtJQUNqSCxLQUFhO1FBVmIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUVoQixlQUFVLEdBQVYsVUFBVSxDQUFJO1FBRWQsZUFBVSxHQUFWLFVBQVUsQ0FBSTtRQUVkLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBRW5CLGVBQVUsR0FBVixVQUFVLENBQVE7UUFFbEIsVUFBSyxHQUFMLEtBQUssQ0FBUTtJQUM1QixDQUFDO0lBRUo7Ozs7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
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import type { Blob as BlobBuffer } from 'c-kzg';
|
|
3
|
+
export declare const TX_START_PREFIX = 8392562855083340404n;
|
|
4
|
+
export declare const TX_START_PREFIX_BYTES_LENGTH: number;
|
|
5
|
+
export declare const TX_EFFECT_PREFIX_BYTE_LENGTH: number;
|
|
6
|
+
export declare const REVERT_CODE_PREFIX = 1;
|
|
7
|
+
/**
|
|
8
|
+
* Deserializes a blob buffer into an array of field elements.
|
|
9
|
+
*
|
|
10
|
+
* Blobs are converted into BN254 fields to perform a poseidon2 hash on them (fieldHash).
|
|
11
|
+
* This method is sparse, meaning it does not include trailing zeros at the end of the blob.
|
|
12
|
+
*
|
|
13
|
+
* However, we cannot simply trim the zero's from the end of the blob, as some logs may include zero's
|
|
14
|
+
* within them.
|
|
15
|
+
* If we end on a set of zeros, such as the log below:
|
|
16
|
+
* length 7: [ a, b, c, d, e, 0, 0]
|
|
17
|
+
*
|
|
18
|
+
* we will end up with the incorrect hash if we trim the zeros from the end.
|
|
19
|
+
*
|
|
20
|
+
* Each transactions logs contains a TX start prefix, which includes a string followed
|
|
21
|
+
* by the length ( in field elements ) of the transaction's log.
|
|
22
|
+
*
|
|
23
|
+
* This function finds the end of the last transaction's logs, and returns the array up to this point.
|
|
24
|
+
*
|
|
25
|
+
* We search for a series of Tx Prefixes progressing the cursor in the field reader until we hit
|
|
26
|
+
* a field that is not a Tx Prefix, this indicates that we have reached the end of the last transaction's logs.
|
|
27
|
+
*
|
|
28
|
+
* +------------------+------------------+------------------+------------------+
|
|
29
|
+
* | TX1 Start Prefix | TX1 Log Fields | TX2 Start Prefix | Padded zeros |
|
|
30
|
+
* | [3 a,b,c] | [3, a, b, c] | [5 d,e,f,0,0] | [0, 0, 0, .., 0] |
|
|
31
|
+
* +------------------+------------------+------------------+------------------+
|
|
32
|
+
* ^
|
|
33
|
+
* |
|
|
34
|
+
* Function reads until here --------------------------------
|
|
35
|
+
*
|
|
36
|
+
* @param blob - The blob buffer to deserialize.
|
|
37
|
+
* @returns An array of field elements.
|
|
38
|
+
*/
|
|
39
|
+
export declare function deserializeEncodedBlobToFields(blob: BlobBuffer): Fr[];
|
|
40
|
+
/**
|
|
41
|
+
* Get the length of the transaction from the first field.
|
|
42
|
+
*
|
|
43
|
+
* @param firstField - The first field of the transaction.
|
|
44
|
+
* @returns The length of the transaction.
|
|
45
|
+
*
|
|
46
|
+
* @throws If the first field does not include the correct prefix - encoding invalid.
|
|
47
|
+
*/
|
|
48
|
+
export declare function getLengthFromFirstField(firstField: Fr): number;
|
|
49
|
+
/**
|
|
50
|
+
* Determines whether a field is the first field of a tx effect
|
|
51
|
+
*/
|
|
52
|
+
export declare function isValidFirstField(field: Fr): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Extract the fields from a blob buffer, but do not take into account encoding
|
|
55
|
+
* that will include trailing zeros.
|
|
56
|
+
*
|
|
57
|
+
* +------------------+------------------+------------------+------------------+
|
|
58
|
+
* | | | | Padded zeros |
|
|
59
|
+
* | [3 a,b,c] | [3, a, b, c] | [5 d,e,f,0,0] | [0, 0, 0, .., 0] |
|
|
60
|
+
* +------------------+------------------+------------------+------------------+
|
|
61
|
+
* ^
|
|
62
|
+
* |
|
|
63
|
+
* Function reads until here ----------------------
|
|
64
|
+
*/
|
|
65
|
+
export declare function extractBlobFieldsFromBuffer(blob: BlobBuffer): Fr[];
|
|
66
|
+
//# sourceMappingURL=encoding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../src/encoding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAG9C,OAAO,KAAK,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,OAAO,CAAC;AAIhD,eAAO,MAAM,eAAe,uBAAuB,CAAC;AAEpD,eAAO,MAAM,4BAA4B,QAA0C,CAAC;AAEpF,eAAO,MAAM,4BAA4B,QAAmC,CAAC;AAC7E,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAsBrE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,EAAE,GAAG,MAAM,CAO9D;AAGD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,CAqBpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAYlE"}
|
package/dest/encoding.js
CHANGED
|
@@ -39,13 +39,14 @@ export const REVERT_CODE_PREFIX = 1;
|
|
|
39
39
|
*
|
|
40
40
|
* @param blob - The blob buffer to deserialize.
|
|
41
41
|
* @returns An array of field elements.
|
|
42
|
-
*/
|
|
42
|
+
*/
|
|
43
|
+
export function deserializeEncodedBlobToFields(blob) {
|
|
43
44
|
// Convert blob buffer to array of field elements
|
|
44
45
|
const reader = BufferReader.asReader(blob);
|
|
45
46
|
const array = reader.readArray(blob.length >> 5, Fr); // >> 5 = / 32 (bytes per field)
|
|
46
47
|
const fieldReader = FieldReader.asReader(array);
|
|
47
48
|
// Read fields until we hit zeros at the end
|
|
48
|
-
while(!fieldReader.isFinished()){
|
|
49
|
+
while (!fieldReader.isFinished()) {
|
|
49
50
|
const currentField = fieldReader.peekField();
|
|
50
51
|
// Stop when we hit a zero field
|
|
51
52
|
if (!currentField || currentField.isZero()) {
|
|
@@ -65,7 +66,8 @@ export const REVERT_CODE_PREFIX = 1;
|
|
|
65
66
|
* @returns The length of the transaction.
|
|
66
67
|
*
|
|
67
68
|
* @throws If the first field does not include the correct prefix - encoding invalid.
|
|
68
|
-
*/
|
|
69
|
+
*/
|
|
70
|
+
export function getLengthFromFirstField(firstField) {
|
|
69
71
|
// Check that the first field includes the correct prefix
|
|
70
72
|
if (!isValidFirstField(firstField)) {
|
|
71
73
|
throw new Error('Invalid prefix');
|
|
@@ -76,16 +78,22 @@ export const REVERT_CODE_PREFIX = 1;
|
|
|
76
78
|
// NOTE: duplicated from circuit-types tx effect!
|
|
77
79
|
/**
|
|
78
80
|
* Determines whether a field is the first field of a tx effect
|
|
79
|
-
*/
|
|
81
|
+
*/
|
|
82
|
+
export function isValidFirstField(field) {
|
|
80
83
|
const buf = field.toBuffer();
|
|
81
|
-
if (!buf
|
|
84
|
+
if (!buf
|
|
85
|
+
.subarray(0, field.size - TX_EFFECT_PREFIX_BYTE_LENGTH)
|
|
86
|
+
.equals(Buffer.alloc(field.size - TX_EFFECT_PREFIX_BYTE_LENGTH))) {
|
|
82
87
|
return false;
|
|
83
88
|
}
|
|
84
89
|
const sliced = buf.subarray(-TX_EFFECT_PREFIX_BYTE_LENGTH);
|
|
85
|
-
if (
|
|
86
|
-
|
|
87
|
-
sliced
|
|
88
|
-
|
|
90
|
+
if (
|
|
91
|
+
// Checking we start with the correct prefix...
|
|
92
|
+
!new Fr(sliced.subarray(0, TX_START_PREFIX_BYTES_LENGTH)).equals(new Fr(TX_START_PREFIX)) ||
|
|
93
|
+
// ...and include the revert code prefix..
|
|
94
|
+
sliced[sliced.length - 3] !== REVERT_CODE_PREFIX ||
|
|
95
|
+
// ...and the following revert code is valid.
|
|
96
|
+
sliced[sliced.length - 1] > 4) {
|
|
89
97
|
return false;
|
|
90
98
|
}
|
|
91
99
|
return true;
|
|
@@ -101,14 +109,16 @@ export const REVERT_CODE_PREFIX = 1;
|
|
|
101
109
|
* ^
|
|
102
110
|
* |
|
|
103
111
|
* Function reads until here ----------------------
|
|
104
|
-
*/
|
|
112
|
+
*/
|
|
113
|
+
export function extractBlobFieldsFromBuffer(blob) {
|
|
105
114
|
const reader = BufferReader.asReader(blob);
|
|
106
115
|
const array = reader.readArray(blob.length >> 5, Fr);
|
|
107
116
|
// Find the index of the last non-zero field
|
|
108
117
|
let lastNonZeroIndex = array.length - 1;
|
|
109
|
-
while(lastNonZeroIndex >= 0 && array[lastNonZeroIndex].isZero()){
|
|
118
|
+
while (lastNonZeroIndex >= 0 && array[lastNonZeroIndex].isZero()) {
|
|
110
119
|
lastNonZeroIndex--;
|
|
111
120
|
}
|
|
112
121
|
// Return the trimmed array
|
|
113
122
|
return array.slice(0, lastNonZeroIndex + 1);
|
|
114
123
|
}
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFJeEUsdUNBQXVDO0FBQ3ZDLGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsb0JBQW9CLENBQUM7QUFDcEQsMkVBQTJFO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNwRixxRkFBcUY7QUFDckYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsNEJBQTRCLEdBQUcsQ0FBQyxDQUFDO0FBQzdFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUVwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUNILE1BQU0sVUFBVSw4QkFBOEIsQ0FBQyxJQUFnQjtJQUM3RCxpREFBaUQ7SUFDakQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0NBQWdDO0lBQ3RGLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFaEQsNENBQTRDO0lBQzVDLE9BQU8sQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztRQUNqQyxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFN0MsZ0NBQWdDO1FB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
|
package/dest/errors.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B"}
|
package/dest/errors.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export class BlobDeserializationError extends Error {
|
|
2
|
-
constructor(message){
|
|
2
|
+
constructor(message) {
|
|
3
3
|
super(message);
|
|
4
4
|
this.name = 'BlobDeserializationError';
|
|
5
5
|
}
|
|
6
6
|
}
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsS0FBSztJQUNqRCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRywwQkFBMEIsQ0FBQztJQUN6QyxDQUFDO0NBQ0YifQ==
|
package/dest/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
|
package/dest/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import cKzg from 'c-kzg';
|
|
2
|
-
/* eslint-disable import/no-named-as-default-member */
|
|
2
|
+
/* eslint-disable import/no-named-as-default-member */
|
|
3
|
+
const { loadTrustedSetup } = cKzg;
|
|
3
4
|
export * from './blob.js';
|
|
4
5
|
export * from './mocks.js';
|
|
5
6
|
export * from './encoding.js';
|
|
@@ -7,12 +8,15 @@ export * from './interface.js';
|
|
|
7
8
|
export * from './errors.js';
|
|
8
9
|
try {
|
|
9
10
|
loadTrustedSetup();
|
|
10
|
-
}
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
11
13
|
if (error.message.includes('trusted setup is already loaded')) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
14
|
+
// NB: The c-kzg lib has no way of checking whether the setup is loaded or not,
|
|
15
|
+
// and it throws an error if it's already loaded, even though nothing is wrong.
|
|
16
|
+
// This is a rudimentary way of ensuring we load the trusted setup if we need it.
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
16
19
|
throw new Error(error);
|
|
17
20
|
}
|
|
18
21
|
}
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sT0FBTyxDQUFDO0FBRXpCLHNEQUFzRDtBQUN0RCxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFbEMsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGFBQWEsQ0FBQztBQUU1QixJQUFJLENBQUM7SUFDSCxnQkFBZ0IsRUFBRSxDQUFDO0FBQ3JCLENBQUM7QUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO0lBQ3BCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsaUNBQWlDLENBQUMsRUFBRSxDQUFDO1FBQzlELCtFQUErRTtRQUMvRSwrRUFBK0U7UUFDL0UsaUZBQWlGO0lBQ25GLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QixDQUFDO0FBQ0gsQ0FBQyJ9
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The relevant parts of a response from https://ethereum.github.io/beacon-APIs/?urls.primaryName=dev#/Beacon/getBlobSidecars
|
|
3
|
+
*/
|
|
4
|
+
export interface BlobJson {
|
|
5
|
+
blob: string;
|
|
6
|
+
index?: number;
|
|
7
|
+
kzg_commitment: string;
|
|
8
|
+
kzg_proof: string;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,cAAc,EAAE,MAAM,CAAC;IAEvB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
package/dest/interface.js
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*/ export { };
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
package/dest/mocks.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import { Blob } from './blob.js';
|
|
3
|
+
/**
|
|
4
|
+
* Make an encoded blob with the given length
|
|
5
|
+
*
|
|
6
|
+
* This will deserialise correctly in the archiver
|
|
7
|
+
* @param length
|
|
8
|
+
* @returns
|
|
9
|
+
*/
|
|
10
|
+
export declare function makeEncodedBlob(length: number): Promise<Blob>;
|
|
11
|
+
/**
|
|
12
|
+
* Make an unencoded blob with the given length
|
|
13
|
+
*
|
|
14
|
+
* This will fail deserialisation in the archiver
|
|
15
|
+
* @param length
|
|
16
|
+
* @returns
|
|
17
|
+
*/
|
|
18
|
+
export declare function makeUnencodedBlob(length: number): Promise<Blob>;
|
|
19
|
+
export declare function makeEncodedBlobFields(fields: Fr[]): Promise<Blob>;
|
|
20
|
+
//# sourceMappingURL=mocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../src/mocks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAoBjC;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjE"}
|
package/dest/mocks.js
CHANGED
|
@@ -11,11 +11,9 @@ function encodeFirstField(length) {
|
|
|
11
11
|
Buffer.alloc(1),
|
|
12
12
|
lengthBuf,
|
|
13
13
|
Buffer.alloc(1),
|
|
14
|
-
Buffer.from([
|
|
15
|
-
|
|
16
|
-
]),
|
|
14
|
+
Buffer.from([1]),
|
|
15
|
+
Buffer.alloc(1),
|
|
17
16
|
Buffer.alloc(1),
|
|
18
|
-
Buffer.alloc(1)
|
|
19
17
|
]));
|
|
20
18
|
}
|
|
21
19
|
/**
|
|
@@ -24,13 +22,9 @@ function encodeFirstField(length) {
|
|
|
24
22
|
* This will deserialise correctly in the archiver
|
|
25
23
|
* @param length
|
|
26
24
|
* @returns
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
...Array.from({
|
|
31
|
-
length: length
|
|
32
|
-
}, ()=>Fr.random())
|
|
33
|
-
]);
|
|
25
|
+
*/
|
|
26
|
+
export function makeEncodedBlob(length) {
|
|
27
|
+
return Blob.fromFields([encodeFirstField(length + 1), ...Array.from({ length: length }, () => Fr.random())]);
|
|
34
28
|
}
|
|
35
29
|
/**
|
|
36
30
|
* Make an unencoded blob with the given length
|
|
@@ -38,16 +32,11 @@ function encodeFirstField(length) {
|
|
|
38
32
|
* This will fail deserialisation in the archiver
|
|
39
33
|
* @param length
|
|
40
34
|
* @returns
|
|
41
|
-
*/
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
length: length
|
|
45
|
-
}, ()=>Fr.random())
|
|
46
|
-
]);
|
|
35
|
+
*/
|
|
36
|
+
export function makeUnencodedBlob(length) {
|
|
37
|
+
return Blob.fromFields([...Array.from({ length: length }, () => Fr.random())]);
|
|
47
38
|
}
|
|
48
39
|
export function makeEncodedBlobFields(fields) {
|
|
49
|
-
return Blob.fromFields([
|
|
50
|
-
encodeFirstField(fields.length + 1),
|
|
51
|
-
...fields
|
|
52
|
-
]);
|
|
40
|
+
return Blob.fromFields([encodeFirstField(fields.length + 1), ...fields]);
|
|
53
41
|
}
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbW9ja3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU5QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFOUUsNENBQTRDO0FBQzVDLFNBQVMsZ0JBQWdCLENBQUMsTUFBYztJQUN0QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sSUFBSSxFQUFFLENBQ1gsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNaLFVBQVUsQ0FBQyxlQUFlLEVBQUUsNEJBQTRCLENBQUM7UUFDekQsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDZixTQUFTO1FBQ1QsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDZixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUNoQixDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLE1BQWM7SUFDNUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0csQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxNQUFjO0lBQzlDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakYsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxNQUFZO0lBQ2hELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzNFLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/blob-lib",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.76.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js"
|
|
@@ -20,13 +20,13 @@
|
|
|
20
20
|
"formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
|
|
21
21
|
"start:dev": "tsc-watch -p tsconfig.json --onSuccess 'yarn start'",
|
|
22
22
|
"start": "node ./dest/index.js",
|
|
23
|
-
"test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}"
|
|
23
|
+
"test": "HARDWARE_CONCURRENCY=${HARDWARE_CONCURRENCY:-16} RAYON_NUM_THREADS=${RAYON_NUM_THREADS:-4} NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}"
|
|
24
24
|
},
|
|
25
25
|
"inherits": [
|
|
26
26
|
"../package.common.json"
|
|
27
27
|
],
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@aztec/foundation": "0.
|
|
29
|
+
"@aztec/foundation": "0.76.1",
|
|
30
30
|
"c-kzg": "4.0.0-alpha.1",
|
|
31
31
|
"tslib": "^2.4.0"
|
|
32
32
|
},
|