@aztec/blob-lib 0.76.4 → 0.77.0-testnet-ignition.21
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 +1 -1
- package/dest/blob.d.ts.map +1 -1
- package/dest/blob.js +125 -138
- package/dest/blob_public_inputs.d.ts +50 -0
- package/dest/blob_public_inputs.d.ts.map +1 -0
- package/dest/blob_public_inputs.js +146 -0
- package/dest/encoding.d.ts.map +1 -1
- package/dest/encoding.js +12 -23
- package/dest/errors.js +1 -2
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +8 -11
- package/dest/interface.js +3 -2
- package/dest/sponge_blob.d.ts +52 -0
- package/dest/sponge_blob.d.ts.map +1 -0
- package/dest/sponge_blob.js +148 -0
- package/dest/testing.d.ts +43 -0
- package/dest/testing.d.ts.map +1 -0
- package/dest/testing.js +81 -0
- package/package.json +7 -5
- package/src/blob.ts +1 -1
- package/src/blob_public_inputs.ts +157 -0
- package/src/encoding.ts +1 -2
- package/src/index.ts +2 -1
- package/src/sponge_blob.ts +178 -0
- package/src/testing.ts +95 -0
- package/dest/mocks.d.ts +0 -20
- package/dest/mocks.d.ts.map +0 -1
- package/dest/mocks.js +0 -42
- package/src/mocks.ts +0 -48
package/dest/blob.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { Fr } from '@aztec/foundation/fields';
|
|
|
4
4
|
import { BufferReader } from '@aztec/foundation/serialize';
|
|
5
5
|
import cKzg from 'c-kzg';
|
|
6
6
|
import type { Blob as BlobBuffer } from 'c-kzg';
|
|
7
|
-
import {
|
|
7
|
+
import type { BlobJson } from './interface.js';
|
|
8
8
|
export declare const VERSIONED_HASH_VERSION_KZG = 1;
|
|
9
9
|
/**
|
|
10
10
|
* A class to create, manage, and prove EVM blobs.
|
package/dest/blob.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blob.d.ts","sourceRoot":"","sources":["../src/blob.ts"],"names":[],"mappings":";;AACA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAG9E,OAAO,IAAI,MAAM,OAAO,CAAC;AACzB,OAAO,KAAK,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,OAAO,CAAC;AAIhD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"blob.d.ts","sourceRoot":"","sources":["../src/blob.ts"],"names":[],"mappings":";;AACA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAG9E,OAAO,IAAI,MAAM,OAAO,CAAC;AACzB,OAAO,KAAK,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,OAAO,CAAC;AAIhD,OAAO,KAAK,EAAE,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;;;;;;OAMG;IACH,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAU3C;;;;;;;;;;;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,27 +5,19 @@ 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 */
|
|
9
|
-
const { BYTES_PER_BLOB, FIELD_ELEMENTS_PER_BLOB, blobToKzgCommitment, computeKzgProof, verifyKzgProof } = cKzg;
|
|
8
|
+
/* eslint-disable import/no-named-as-default-member */ const { BYTES_PER_BLOB, FIELD_ELEMENTS_PER_BLOB, blobToKzgCommitment, computeKzgProof, verifyKzgProof } = cKzg;
|
|
10
9
|
// The prefix to the EVM blobHash, defined here: https://eips.ethereum.org/EIPS/eip-4844#specification
|
|
11
10
|
export const VERSIONED_HASH_VERSION_KZG = 0x01;
|
|
12
11
|
/**
|
|
13
12
|
* A class to create, manage, and prove EVM blobs.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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) {
|
|
13
|
+
*/ export class Blob {
|
|
14
|
+
data;
|
|
15
|
+
fieldsHash;
|
|
16
|
+
challengeZ;
|
|
17
|
+
evaluationY;
|
|
18
|
+
commitment;
|
|
19
|
+
proof;
|
|
20
|
+
constructor(/** The blob to be broadcast on L1 in bytes form. */ data, /** The hash of all tx effects inside the blob. Used in generating the challenge z and proving that we have included all required effects. */ fieldsHash, /** Challenge point z (= H(H(tx_effects), kzgCommmitment). Used such that p(z) = y. */ challengeZ, /** Evaluation y = p(z), where p() is the blob polynomial. BLS12 field element, rep. as BigNum in nr, bigint in ts. */ evaluationY, /** Commitment to the blob C. Used in compressed BLS12 point format (48 bytes). */ commitment, /** KZG opening proof for y = p(z). The commitment to quotient polynomial Q, used in compressed BLS12 point format (48 bytes). */ proof){
|
|
29
21
|
this.data = data;
|
|
30
22
|
this.fieldsHash = fieldsHash;
|
|
31
23
|
this.challengeZ = challengeZ;
|
|
@@ -34,43 +26,45 @@ export class Blob {
|
|
|
34
26
|
this.proof = proof;
|
|
35
27
|
}
|
|
36
28
|
/**
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
static fromEncodedBlobBuffer(blob, multiBlobFieldsHash) {
|
|
29
|
+
* The encoded version of the blob will determine the end of the blob based on the transaction encoding.
|
|
30
|
+
* This is required when the fieldsHash of a blob will contain trailing zeros.
|
|
31
|
+
*
|
|
32
|
+
* See `./encoding.ts` for more details.
|
|
33
|
+
*
|
|
34
|
+
* This method is used to create a Blob from a buffer.
|
|
35
|
+
* @param blob - The buffer to create the Blob from.
|
|
36
|
+
* @param multiBlobFieldsHash - The fields hash to use for the Blob.
|
|
37
|
+
* @returns A Blob created from the buffer.
|
|
38
|
+
*
|
|
39
|
+
* @throws If unable to deserialize the blob.
|
|
40
|
+
*/ static fromEncodedBlobBuffer(blob, multiBlobFieldsHash) {
|
|
50
41
|
try {
|
|
51
42
|
const fields = deserializeEncodedBlobToFields(blob);
|
|
52
43
|
return Blob.fromFields(fields, multiBlobFieldsHash);
|
|
53
|
-
}
|
|
54
|
-
catch (err) {
|
|
44
|
+
} catch (err) {
|
|
55
45
|
throw new BlobDeserializationError(`Failed to create Blob from encoded blob buffer, this blob was likely not created by us`);
|
|
56
46
|
}
|
|
57
47
|
}
|
|
58
48
|
/**
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
static async fromFields(fields, multiBlobFieldsHash) {
|
|
49
|
+
* Create a Blob from an array of fields.
|
|
50
|
+
*
|
|
51
|
+
* @param fields - The array of fields to create the Blob from.
|
|
52
|
+
* @param multiBlobFieldsHash - The fields hash to use for the Blob.
|
|
53
|
+
* @returns A Blob created from the array of fields.
|
|
54
|
+
*/ static async fromFields(fields, multiBlobFieldsHash) {
|
|
66
55
|
if (fields.length > FIELD_ELEMENTS_PER_BLOB) {
|
|
67
56
|
throw new Error(`Attempted to overfill blob with ${fields.length} elements. The maximum is ${FIELD_ELEMENTS_PER_BLOB}`);
|
|
68
57
|
}
|
|
69
|
-
const data = Buffer.concat([
|
|
58
|
+
const data = Buffer.concat([
|
|
59
|
+
serializeToBuffer(fields)
|
|
60
|
+
], BYTES_PER_BLOB);
|
|
70
61
|
// This matches the output of SpongeBlob.squeeze() in the blob circuit
|
|
71
62
|
const fieldsHash = multiBlobFieldsHash ? multiBlobFieldsHash : await poseidon2Hash(fields);
|
|
72
63
|
const commitment = Buffer.from(blobToKzgCommitment(data));
|
|
73
|
-
const challengeZ = await poseidon2Hash([
|
|
64
|
+
const challengeZ = await poseidon2Hash([
|
|
65
|
+
fieldsHash,
|
|
66
|
+
...commitmentToFields(commitment)
|
|
67
|
+
]);
|
|
74
68
|
const res = computeKzgProof(data, challengeZ.toBuffer());
|
|
75
69
|
if (!verifyKzgProof(commitment, challengeZ.toBuffer(), res[1], res[0])) {
|
|
76
70
|
throw new Error(`KZG proof did not verify.`);
|
|
@@ -80,18 +74,17 @@ export class Blob {
|
|
|
80
74
|
return new Blob(data, fieldsHash, challengeZ, evaluationY, commitment, proof);
|
|
81
75
|
}
|
|
82
76
|
/**
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
static async fromJson(json) {
|
|
77
|
+
* Create a Blob from a JSON object.
|
|
78
|
+
*
|
|
79
|
+
* Blobs will be in this form when requested from the blob sink, or from
|
|
80
|
+
* the beacon chain via `getBlobSidecars`
|
|
81
|
+
* https://ethereum.github.io/beacon-APIs/?urls.primaryName=dev#/Beacon/getBlobSidecars
|
|
82
|
+
*
|
|
83
|
+
* @dev WARNING: by default json deals with encoded buffers
|
|
84
|
+
*
|
|
85
|
+
* @param json - The JSON object to create the Blob from.
|
|
86
|
+
* @returns A Blob created from the JSON object.
|
|
87
|
+
*/ static async fromJson(json) {
|
|
95
88
|
const blobBuffer = Buffer.from(json.blob.slice(2), 'hex');
|
|
96
89
|
const blob = await Blob.fromEncodedBlobBuffer(blobBuffer);
|
|
97
90
|
if (blob.commitment.toString('hex') !== json.kzg_commitment.slice(2)) {
|
|
@@ -102,77 +95,70 @@ export class Blob {
|
|
|
102
95
|
return blob;
|
|
103
96
|
}
|
|
104
97
|
/**
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
toJson(index) {
|
|
98
|
+
* Get the JSON representation of the blob.
|
|
99
|
+
*
|
|
100
|
+
* @dev WARNING: by default json deals with encoded buffers
|
|
101
|
+
* @param index - optional - The index of the blob in the block.
|
|
102
|
+
* @returns The JSON representation of the blob.
|
|
103
|
+
*/ toJson(index) {
|
|
112
104
|
return {
|
|
113
105
|
blob: `0x${Buffer.from(this.data).toString('hex')}`,
|
|
114
106
|
index,
|
|
115
107
|
// eslint-disable-next-line camelcase
|
|
116
108
|
kzg_commitment: `0x${this.commitment.toString('hex')}`,
|
|
117
109
|
// eslint-disable-next-line camelcase
|
|
118
|
-
kzg_proof: `0x${this.proof.toString('hex')}
|
|
110
|
+
kzg_proof: `0x${this.proof.toString('hex')}`
|
|
119
111
|
};
|
|
120
112
|
}
|
|
121
113
|
/**
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
toFields() {
|
|
114
|
+
* Get the fields from the blob.
|
|
115
|
+
*
|
|
116
|
+
* @dev WARNING: this method does not take into account trailing zeros
|
|
117
|
+
*
|
|
118
|
+
* @returns The fields from the blob.
|
|
119
|
+
*/ toFields() {
|
|
129
120
|
return extractBlobFieldsFromBuffer(this.data);
|
|
130
121
|
}
|
|
131
122
|
/**
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
toEncodedFields() {
|
|
123
|
+
* Get the encoded fields from the blob.
|
|
124
|
+
*
|
|
125
|
+
* @dev This method takes into account trailing zeros
|
|
126
|
+
*
|
|
127
|
+
* @returns The encoded fields from the blob.
|
|
128
|
+
*
|
|
129
|
+
* @throws If unable to deserialize the blob.
|
|
130
|
+
*/ toEncodedFields() {
|
|
141
131
|
try {
|
|
142
132
|
return deserializeEncodedBlobToFields(this.data);
|
|
143
|
-
}
|
|
144
|
-
catch (err) {
|
|
133
|
+
} catch (err) {
|
|
145
134
|
throw new BlobDeserializationError(`Failed to deserialize encoded blob fields, this blob was likely not created by us`);
|
|
146
135
|
}
|
|
147
136
|
}
|
|
148
137
|
/**
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
static toEncodedFields(blobs) {
|
|
138
|
+
* Get the encoded fields from multiple blobs.
|
|
139
|
+
*
|
|
140
|
+
* @dev This method takes into account trailing zeros
|
|
141
|
+
*
|
|
142
|
+
* @returns The encoded fields from the blobs.
|
|
143
|
+
*/ static toEncodedFields(blobs) {
|
|
156
144
|
try {
|
|
157
|
-
return deserializeEncodedBlobToFields(Buffer.concat(blobs.map(b
|
|
158
|
-
}
|
|
159
|
-
catch (err) {
|
|
145
|
+
return deserializeEncodedBlobToFields(Buffer.concat(blobs.map((b)=>b.data)));
|
|
146
|
+
} catch (err) {
|
|
160
147
|
throw new BlobDeserializationError(`Failed to deserialize encoded blob fields, this blob was likely not created by us`);
|
|
161
148
|
}
|
|
162
149
|
}
|
|
163
150
|
/**
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
commitmentToFields() {
|
|
151
|
+
* Get the commitment fields from the blob.
|
|
152
|
+
*
|
|
153
|
+
* The 48-byte commitment is encoded into two field elements:
|
|
154
|
+
* +------------------+------------------+
|
|
155
|
+
* | Field Element 1 | Field Element 2 |
|
|
156
|
+
* | [bytes 0-31] | [bytes 32-47] |
|
|
157
|
+
* +------------------+------------------+
|
|
158
|
+
* | 32 bytes | 16 bytes |
|
|
159
|
+
* +------------------+------------------+
|
|
160
|
+
* @returns The commitment fields from the blob.
|
|
161
|
+
*/ commitmentToFields() {
|
|
176
162
|
return commitmentToFields(this.commitment);
|
|
177
163
|
}
|
|
178
164
|
// Returns ethereum's versioned blob hash, following kzg_to_versioned_hash: https://eips.ethereum.org/EIPS/eip-4844#helpers
|
|
@@ -187,76 +173,75 @@ export class Blob {
|
|
|
187
173
|
return hash;
|
|
188
174
|
}
|
|
189
175
|
/**
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
toBuffer() {
|
|
176
|
+
* Get the buffer representation of the ENTIRE blob.
|
|
177
|
+
*
|
|
178
|
+
* @dev WARNING: this buffer contains all metadata aswell as the data itself
|
|
179
|
+
*
|
|
180
|
+
* @returns The buffer representation of the blob.
|
|
181
|
+
*/ toBuffer() {
|
|
197
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));
|
|
198
183
|
}
|
|
199
184
|
/**
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
static fromBuffer(buf) {
|
|
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
|
+
*/ static fromBuffer(buf) {
|
|
208
192
|
const reader = BufferReader.asReader(buf);
|
|
209
193
|
return new Blob(reader.readUint8Array(), reader.readObject(Fr), reader.readObject(Fr), reader.readBuffer(), reader.readBuffer(), reader.readBuffer());
|
|
210
194
|
}
|
|
211
195
|
/**
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
getSize() {
|
|
196
|
+
* Get the size of the blob in bytes
|
|
197
|
+
*/ getSize() {
|
|
215
198
|
return this.data.length;
|
|
216
199
|
}
|
|
217
200
|
/**
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
getEthBlobEvaluationInputs() {
|
|
201
|
+
* Returns a proof of opening of the blob to verify on L1 using the point evaluation precompile:
|
|
202
|
+
*
|
|
203
|
+
* input[:32] - versioned_hash
|
|
204
|
+
* input[32:64] - z
|
|
205
|
+
* input[64:96] - y
|
|
206
|
+
* input[96:144] - commitment C
|
|
207
|
+
* input[144:192] - proof (a commitment to the quotient polynomial q(X))
|
|
208
|
+
*
|
|
209
|
+
* See https://eips.ethereum.org/EIPS/eip-4844#point-evaluation-precompile
|
|
210
|
+
*/ getEthBlobEvaluationInputs() {
|
|
229
211
|
const buf = Buffer.concat([
|
|
230
212
|
this.getEthVersionedBlobHash(),
|
|
231
213
|
this.challengeZ.toBuffer(),
|
|
232
214
|
this.evaluationY,
|
|
233
215
|
this.commitment,
|
|
234
|
-
this.proof
|
|
216
|
+
this.proof
|
|
235
217
|
]);
|
|
236
218
|
return `0x${buf.toString('hex')}`;
|
|
237
219
|
}
|
|
238
220
|
static getEthBlobEvaluationInputs(blobs) {
|
|
239
221
|
let buf = Buffer.alloc(0);
|
|
240
|
-
blobs.forEach(blob
|
|
222
|
+
blobs.forEach((blob)=>{
|
|
241
223
|
buf = Buffer.concat([
|
|
242
224
|
buf,
|
|
243
225
|
blob.getEthVersionedBlobHash(),
|
|
244
226
|
blob.challengeZ.toBuffer(),
|
|
245
227
|
blob.evaluationY,
|
|
246
228
|
blob.commitment,
|
|
247
|
-
blob.proof
|
|
229
|
+
blob.proof
|
|
248
230
|
]);
|
|
249
231
|
});
|
|
250
232
|
// For multiple blobs, we prefix the number of blobs:
|
|
251
233
|
const lenBuf = Buffer.alloc(1);
|
|
252
234
|
lenBuf.writeUint8(blobs.length);
|
|
253
|
-
buf = Buffer.concat([
|
|
235
|
+
buf = Buffer.concat([
|
|
236
|
+
lenBuf,
|
|
237
|
+
buf
|
|
238
|
+
]);
|
|
254
239
|
return `0x${buf.toString('hex')}`;
|
|
255
240
|
}
|
|
256
241
|
static getViemKzgInstance() {
|
|
257
242
|
return {
|
|
258
243
|
blobToKzgCommitment: cKzg.blobToKzgCommitment,
|
|
259
|
-
computeBlobKzgProof: cKzg.computeBlobKzgProof
|
|
244
|
+
computeBlobKzgProof: cKzg.computeBlobKzgProof
|
|
260
245
|
};
|
|
261
246
|
}
|
|
262
247
|
// Returns as many blobs as we require to broadcast the given fields
|
|
@@ -265,7 +250,7 @@ export class Blob {
|
|
|
265
250
|
const numBlobs = Math.max(Math.ceil(fields.length / FIELD_ELEMENTS_PER_BLOB), 1);
|
|
266
251
|
const multiBlobFieldsHash = await poseidon2Hash(fields);
|
|
267
252
|
const res = [];
|
|
268
|
-
for
|
|
253
|
+
for(let i = 0; i < numBlobs; i++){
|
|
269
254
|
const end = fields.length < (i + 1) * FIELD_ELEMENTS_PER_BLOB ? fields.length : (i + 1) * FIELD_ELEMENTS_PER_BLOB;
|
|
270
255
|
res.push(await Blob.fromFields(fields.slice(i * FIELD_ELEMENTS_PER_BLOB, end), multiBlobFieldsHash));
|
|
271
256
|
}
|
|
@@ -274,6 +259,8 @@ export class Blob {
|
|
|
274
259
|
}
|
|
275
260
|
// 48 bytes encoded in fields as [Fr, Fr] = [0->31, 31->48]
|
|
276
261
|
function commitmentToFields(commitment) {
|
|
277
|
-
return [
|
|
262
|
+
return [
|
|
263
|
+
new Fr(commitment.subarray(0, 31)),
|
|
264
|
+
new Fr(commitment.subarray(31, 48))
|
|
265
|
+
];
|
|
278
266
|
}
|
|
279
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ibG9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDakUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU5RSxpR0FBaUc7QUFDakcsT0FBTyxJQUFJLE1BQU0sT0FBTyxDQUFDO0FBR3pCLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHdkQsc0RBQXNEO0FBQ3RELE1BQU0sRUFBRSxjQUFjLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQztBQUUvRyxzR0FBc0c7QUFDdEcsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxDQUFDO0FBRS9DOztHQUVHO0FBQ0gsTUFBTSxPQUFPLElBQUk7SUFDZjtJQUNFLG9EQUFvRDtJQUNwQyxJQUFnQjtJQUNoQyw2SUFBNkk7SUFDN0gsVUFBYztJQUM5QixzRkFBc0Y7SUFDdEUsVUFBYztJQUM5QixzSEFBc0g7SUFDdEcsV0FBbUI7SUFDbkMsa0ZBQWtGO0lBQ2xFLFVBQWtCO0lBQ2xDLGlJQUFpSTtJQUNqSCxLQUFhO1FBVmIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUVoQixlQUFVLEdBQVYsVUFBVSxDQUFJO1FBRWQsZUFBVSxHQUFWLFVBQVUsQ0FBSTtRQUVkLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBRW5CLGVBQVUsR0FBVixVQUFVLENBQVE7UUFFbEIsVUFBSyxHQUFMLEtBQUssQ0FBUTtJQUM1QixDQUFDO0lBRUo7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQWdCLEVBQUUsbUJBQXdCO1FBQ3JFLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFTLDhCQUE4QixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSx3QkFBd0IsQ0FDaEMsd0ZBQXdGLENBQ3pGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQVksRUFBRSxtQkFBd0I7UUFDNUQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLHVCQUF1QixFQUFFLENBQUM7WUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FDYixtQ0FBbUMsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLHVCQUF1QixFQUFFLENBQ3ZHLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFeEUsc0VBQXNFO1FBQ3RFLE1BQU0sVUFBVSxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0YsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFELE1BQU0sVUFBVSxHQUFHLE1BQU0sYUFBYSxDQUFDLENBQUMsVUFBVSxFQUFFLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXhDLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFjO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFMUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBRUQsZ0ZBQWdGO1FBQ2hGLHdCQUF3QjtRQUV4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsS0FBYztRQUNuQixPQUFPO1lBQ0wsSUFBSSxFQUFFLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ25ELEtBQUs7WUFDTCxxQ0FBcUM7WUFDckMsY0FBYyxFQUFFLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdEQscUNBQXFDO1lBQ3JDLFNBQVMsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1NBQzdDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsUUFBUTtRQUNOLE9BQU8sMkJBQTJCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILGVBQWU7UUFDYixJQUFJLENBQUM7WUFDSCxPQUFPLDhCQUE4QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSx3QkFBd0IsQ0FDaEMsbUZBQW1GLENBQ3BGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBYTtRQUNsQyxJQUFJLENBQUM7WUFDSCxPQUFPLDhCQUE4QixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksd0JBQXdCLENBQ2hDLG1GQUFtRixDQUNwRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILGtCQUFrQjtRQUNoQixPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsMkhBQTJIO0lBQzNILHVCQUF1QjtRQUNyQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRywwQkFBMEIsQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLENBQUMsdUJBQXVCLENBQUMsVUFBa0I7UUFDL0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRywwQkFBMEIsQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxRQUFRO1FBQ04sT0FBTyxNQUFNLENBQUMsSUFBSSxDQUNoQixpQkFBaUIsQ0FDZixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFDaEIsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQ3ZCLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUN0QixJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUNqQixJQUFJLENBQUMsS0FBSyxDQUNYLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUEwQjtRQUMxQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sSUFBSSxJQUFJLENBQ2IsTUFBTSxDQUFDLGNBQWMsRUFBRSxFQUN2QixNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUNyQixNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUNyQixNQUFNLENBQUMsVUFBVSxFQUFFLEVBQ25CLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFDbkIsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCwwQkFBMEI7UUFDeEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUN4QixJQUFJLENBQUMsdUJBQXVCLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFdBQVc7WUFDaEIsSUFBSSxDQUFDLFVBQVU7WUFDZixJQUFJLENBQUMsS0FBSztTQUNYLENBQUMsQ0FBQztRQUNILE9BQU8sS0FBSyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxLQUFhO1FBQzdDLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuQixHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDbEIsR0FBRztnQkFDSCxJQUFJLENBQUMsdUJBQXVCLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO2dCQUMxQixJQUFJLENBQUMsV0FBVztnQkFDaEIsSUFBSSxDQUFDLFVBQVU7Z0JBQ2YsSUFBSSxDQUFDLEtBQUs7YUFDWCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILHFEQUFxRDtRQUNyRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsTUFBTSxDQUFDLGtCQUFrQjtRQUN2QixPQUFPO1lBQ0wsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtZQUM3QyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CO1NBQzlDLENBQUM7SUFDSixDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLHFEQUFxRDtJQUNyRCxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFZO1FBQ2hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakYsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4RCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsdUJBQXVCLENBQUM7WUFDbEgsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQ3ZHLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRjtBQUVELDJEQUEyRDtBQUMzRCxTQUFTLGtCQUFrQixDQUFDLFVBQWtCO0lBQzVDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRixDQUFDIn0=
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
import { BLOBS_PER_BLOCK } from '@aztec/constants';
|
|
4
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
5
|
+
import { BufferReader, FieldReader, type Tuple } from '@aztec/foundation/serialize';
|
|
6
|
+
import type { FieldsOf } from '@aztec/foundation/types';
|
|
7
|
+
import { type Blob } from './blob.js';
|
|
8
|
+
/**
|
|
9
|
+
* Public inputs required to be passed from our rollup circuits to verify a blob.
|
|
10
|
+
*/
|
|
11
|
+
export declare class BlobPublicInputs {
|
|
12
|
+
/** Challenge point z (= H(H(tx_effects), kzgCommmitment). */
|
|
13
|
+
z: Fr;
|
|
14
|
+
/** Evaluation y = p(z), where p() is the blob polynomial. */
|
|
15
|
+
y: bigint;
|
|
16
|
+
/** Commitment to the blob C. */
|
|
17
|
+
kzgCommitment: Tuple<Fr, 2>;
|
|
18
|
+
constructor(
|
|
19
|
+
/** Challenge point z (= H(H(tx_effects), kzgCommmitment). */
|
|
20
|
+
z: Fr,
|
|
21
|
+
/** Evaluation y = p(z), where p() is the blob polynomial. */
|
|
22
|
+
y: bigint,
|
|
23
|
+
/** Commitment to the blob C. */
|
|
24
|
+
kzgCommitment: Tuple<Fr, 2>);
|
|
25
|
+
static empty(): BlobPublicInputs;
|
|
26
|
+
isEmpty(): boolean;
|
|
27
|
+
static fromBuffer(buffer: Buffer | BufferReader): BlobPublicInputs;
|
|
28
|
+
toBuffer(): Buffer;
|
|
29
|
+
static fromFields(fields: Fr[] | FieldReader): BlobPublicInputs;
|
|
30
|
+
toFields(): Fr[];
|
|
31
|
+
static getFields(fields: FieldsOf<BlobPublicInputs>): readonly [Fr, bigint, [Fr, Fr]];
|
|
32
|
+
static fromBlob(input: Blob): BlobPublicInputs;
|
|
33
|
+
getBlobHash(): Buffer;
|
|
34
|
+
commitmentToBuffer(): Buffer;
|
|
35
|
+
equals(other: BlobPublicInputs): boolean;
|
|
36
|
+
}
|
|
37
|
+
export declare class BlockBlobPublicInputs {
|
|
38
|
+
inner: Tuple<BlobPublicInputs, typeof BLOBS_PER_BLOCK>;
|
|
39
|
+
constructor(inner: Tuple<BlobPublicInputs, typeof BLOBS_PER_BLOCK>);
|
|
40
|
+
static empty(): BlockBlobPublicInputs;
|
|
41
|
+
static fromBuffer(buffer: Buffer | BufferReader): BlockBlobPublicInputs;
|
|
42
|
+
toBuffer(): Buffer;
|
|
43
|
+
static fromFields(fields: Fr[] | FieldReader): BlockBlobPublicInputs;
|
|
44
|
+
toFields(): Fr[];
|
|
45
|
+
static getFields(fields: FieldsOf<BlockBlobPublicInputs>): readonly [[BlobPublicInputs, BlobPublicInputs, BlobPublicInputs]];
|
|
46
|
+
static fromBlobs(inputs: Blob[]): BlockBlobPublicInputs;
|
|
47
|
+
getBlobsHash(): Buffer;
|
|
48
|
+
toString(): string;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=blob_public_inputs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob_public_inputs.d.ts","sourceRoot":"","sources":["../src/blob_public_inputs.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAInD,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,KAAK,EAAqB,MAAM,6BAA6B,CAAC;AACvG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,KAAK,IAAI,EAA8B,MAAM,WAAW,CAAC;AAElE;;GAEG;AACH,qBAAa,gBAAgB;IAEzB,6DAA6D;IACtD,CAAC,EAAE,EAAE;IACZ,6DAA6D;IACtD,CAAC,EAAE,MAAM;IAChB,gCAAgC;IACzB,aAAa,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;;IALlC,6DAA6D;IACtD,CAAC,EAAE,EAAE;IACZ,6DAA6D;IACtD,CAAC,EAAE,MAAM;IAChB,gCAAgC;IACzB,aAAa,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAGpC,MAAM,CAAC,KAAK,IAAI,gBAAgB;IAIhC,OAAO,IAAI,OAAO;IAIlB,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,gBAAgB;IAKlE,QAAQ;IAIR,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW,GAAG,gBAAgB;IAa/D,QAAQ;IAUR,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC;IAInD,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,gBAAgB;IAI9C,WAAW,IAAI,MAAM;IAQrB,kBAAkB,IAAI,MAAM;IAO5B,MAAM,CAAC,KAAK,EAAE,gBAAgB;CAQ/B;AAID,qBAAa,qBAAqB;IACb,KAAK,EAAE,KAAK,CAAC,gBAAgB,EAAE,OAAO,eAAe,CAAC;gBAAtD,KAAK,EAAE,KAAK,CAAC,gBAAgB,EAAE,OAAO,eAAe,CAAC;IAEzE,MAAM,CAAC,KAAK,IAAI,qBAAqB;IAIrC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,qBAAqB;IAKvE,QAAQ;IAIR,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW,GAAG,qBAAqB;IAKpE,QAAQ;IAIR,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC;IAIxD,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,qBAAqB;IAWvD,YAAY;IAMZ,QAAQ;CAYT"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { BLOBS_PER_BLOCK } from '@aztec/constants';
|
|
2
|
+
import { makeTuple } from '@aztec/foundation/array';
|
|
3
|
+
import { toBigIntBE, toBufferBE, toHex } from '@aztec/foundation/bigint-buffer';
|
|
4
|
+
import { sha256, sha256Trunc } from '@aztec/foundation/crypto';
|
|
5
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
6
|
+
import { BufferReader, FieldReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
7
|
+
import { VERSIONED_HASH_VERSION_KZG } from './blob.js';
|
|
8
|
+
/**
|
|
9
|
+
* Public inputs required to be passed from our rollup circuits to verify a blob.
|
|
10
|
+
*/ export class BlobPublicInputs {
|
|
11
|
+
z;
|
|
12
|
+
y;
|
|
13
|
+
kzgCommitment;
|
|
14
|
+
constructor(/** Challenge point z (= H(H(tx_effects), kzgCommmitment). */ z, /** Evaluation y = p(z), where p() is the blob polynomial. */ y, /** Commitment to the blob C. */ kzgCommitment){
|
|
15
|
+
this.z = z;
|
|
16
|
+
this.y = y;
|
|
17
|
+
this.kzgCommitment = kzgCommitment;
|
|
18
|
+
}
|
|
19
|
+
static empty() {
|
|
20
|
+
return new BlobPublicInputs(Fr.ZERO, 0n, [
|
|
21
|
+
Fr.ZERO,
|
|
22
|
+
Fr.ZERO
|
|
23
|
+
]);
|
|
24
|
+
}
|
|
25
|
+
isEmpty() {
|
|
26
|
+
return this.z.isZero() && this.y == 0n && this.kzgCommitment[0].isZero() && this.kzgCommitment[1].isZero();
|
|
27
|
+
}
|
|
28
|
+
static fromBuffer(buffer) {
|
|
29
|
+
const reader = BufferReader.asReader(buffer);
|
|
30
|
+
return new BlobPublicInputs(Fr.fromBuffer(reader), toBigIntBE(reader.readBytes(32)), reader.readArray(2, Fr));
|
|
31
|
+
}
|
|
32
|
+
toBuffer() {
|
|
33
|
+
return serializeToBuffer(...BlobPublicInputs.getFields(this));
|
|
34
|
+
}
|
|
35
|
+
static fromFields(fields) {
|
|
36
|
+
const reader = FieldReader.asReader(fields);
|
|
37
|
+
// TODO: Create a BigNum to fields conversion we can use here and in type_conversion.ts
|
|
38
|
+
const fromBigNum = (fieldArr)=>{
|
|
39
|
+
return BigInt(fieldArr[2].toString().concat(fieldArr[1].toString().substring(2), fieldArr[0].toString().substring(2)));
|
|
40
|
+
};
|
|
41
|
+
return new BlobPublicInputs(reader.readField(), fromBigNum(reader.readFieldArray(3)), reader.readFieldArray(2));
|
|
42
|
+
}
|
|
43
|
+
// NB: y is NOT a BN254 field, it's a larger BLS field, we cannot use serialiseToFields here as it assumes bigints will fit
|
|
44
|
+
// TODO: Create a BigNum to fields conversion we can use here and in type_conversion.ts
|
|
45
|
+
toFields() {
|
|
46
|
+
const hex = toHex(this.y, true);
|
|
47
|
+
const bigNum = [
|
|
48
|
+
Fr.fromString('0x' + hex.substring(36)),
|
|
49
|
+
Fr.fromString('0x' + hex.substring(6, 36)),
|
|
50
|
+
Fr.fromString(hex.substring(0, 6))
|
|
51
|
+
];
|
|
52
|
+
return [
|
|
53
|
+
this.z,
|
|
54
|
+
...bigNum,
|
|
55
|
+
...this.kzgCommitment
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
static getFields(fields) {
|
|
59
|
+
return [
|
|
60
|
+
fields.z,
|
|
61
|
+
fields.y,
|
|
62
|
+
fields.kzgCommitment
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
static fromBlob(input) {
|
|
66
|
+
return new BlobPublicInputs(input.challengeZ, toBigIntBE(input.evaluationY), input.commitmentToFields());
|
|
67
|
+
}
|
|
68
|
+
getBlobHash() {
|
|
69
|
+
const hash = sha256(this.commitmentToBuffer());
|
|
70
|
+
hash[0] = VERSIONED_HASH_VERSION_KZG;
|
|
71
|
+
return hash;
|
|
72
|
+
}
|
|
73
|
+
// Performs the reverse conversion of blob.commitmentToFields()
|
|
74
|
+
// 48 bytes encoded in fields as [Fr, Fr] = [0->31, 31->48]
|
|
75
|
+
commitmentToBuffer() {
|
|
76
|
+
return Buffer.concat([
|
|
77
|
+
this.kzgCommitment[0].toBuffer().subarray(1),
|
|
78
|
+
this.kzgCommitment[1].toBuffer().subarray(-17)
|
|
79
|
+
]);
|
|
80
|
+
}
|
|
81
|
+
equals(other) {
|
|
82
|
+
return this.z.equals(other.z) && this.y == other.y && this.kzgCommitment[0].equals(other.kzgCommitment[0]) && this.kzgCommitment[1].equals(other.kzgCommitment[1]);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// NB: it is much cleaner throughout the protocol circuits to define this struct rather than use a nested array.
|
|
86
|
+
// Once we accumulate blob inputs, it should be removed, and we just use BlobPublicInputs::accumulate everywhere.
|
|
87
|
+
export class BlockBlobPublicInputs {
|
|
88
|
+
inner;
|
|
89
|
+
constructor(inner){
|
|
90
|
+
this.inner = inner;
|
|
91
|
+
}
|
|
92
|
+
static empty() {
|
|
93
|
+
return new BlockBlobPublicInputs(makeTuple(BLOBS_PER_BLOCK, BlobPublicInputs.empty));
|
|
94
|
+
}
|
|
95
|
+
static fromBuffer(buffer) {
|
|
96
|
+
const reader = BufferReader.asReader(buffer);
|
|
97
|
+
return new BlockBlobPublicInputs(reader.readArray(BLOBS_PER_BLOCK, BlobPublicInputs));
|
|
98
|
+
}
|
|
99
|
+
toBuffer() {
|
|
100
|
+
return serializeToBuffer(...BlockBlobPublicInputs.getFields(this));
|
|
101
|
+
}
|
|
102
|
+
static fromFields(fields) {
|
|
103
|
+
const reader = FieldReader.asReader(fields);
|
|
104
|
+
return new BlockBlobPublicInputs(reader.readArray(BLOBS_PER_BLOCK, BlobPublicInputs));
|
|
105
|
+
}
|
|
106
|
+
toFields() {
|
|
107
|
+
return this.inner.map((i)=>i.toFields()).flat();
|
|
108
|
+
}
|
|
109
|
+
static getFields(fields) {
|
|
110
|
+
return [
|
|
111
|
+
fields.inner
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
static fromBlobs(inputs) {
|
|
115
|
+
const inner = makeTuple(BLOBS_PER_BLOCK, BlobPublicInputs.empty);
|
|
116
|
+
if (inputs.length > BLOBS_PER_BLOCK) {
|
|
117
|
+
throw new Error(`Can only fit ${BLOBS_PER_BLOCK} in one BlockBlobPublicInputs instance (given ${inputs.length})`);
|
|
118
|
+
}
|
|
119
|
+
inputs.forEach((input, i)=>{
|
|
120
|
+
inner[i] = BlobPublicInputs.fromBlob(input);
|
|
121
|
+
});
|
|
122
|
+
return new BlockBlobPublicInputs(inner);
|
|
123
|
+
}
|
|
124
|
+
getBlobsHash() {
|
|
125
|
+
const blobHashes = this.inner.map((item)=>item.isEmpty() ? Buffer.alloc(0) : item.getBlobHash());
|
|
126
|
+
return sha256Trunc(serializeToBuffer(blobHashes));
|
|
127
|
+
}
|
|
128
|
+
// The below is used to send to L1 for proof verification
|
|
129
|
+
toString() {
|
|
130
|
+
const nonEmptyBlobs = this.inner.filter((item)=>!item.isEmpty());
|
|
131
|
+
// Write the number of blobs for L1 to verify
|
|
132
|
+
let buf = Buffer.alloc(1);
|
|
133
|
+
buf.writeUInt8(nonEmptyBlobs.length);
|
|
134
|
+
// Using standard toBuffer() does not correctly encode the commitment
|
|
135
|
+
// On L1, it's a 48 byte number, which we convert to 2 fields for use in the circuits
|
|
136
|
+
nonEmptyBlobs.forEach((blob)=>{
|
|
137
|
+
buf = Buffer.concat([
|
|
138
|
+
buf,
|
|
139
|
+
blob.z.toBuffer(),
|
|
140
|
+
toBufferBE(blob.y, 32),
|
|
141
|
+
blob.commitmentToBuffer()
|
|
142
|
+
]);
|
|
143
|
+
});
|
|
144
|
+
return buf.toString('hex');
|
|
145
|
+
}
|
|
146
|
+
}
|
package/dest/encoding.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,CAqBpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAYlE"}
|