@aztec/prover-client 0.0.0-test.1 → 0.0.1-fake-ceab37513c
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/bin/get-proof-inputs.js +1 -1
- package/dest/block-factory/index.d.ts +2 -0
- package/dest/block-factory/index.d.ts.map +1 -0
- package/dest/block-factory/light.d.ts +36 -0
- package/dest/block-factory/light.d.ts.map +1 -0
- package/dest/{block_builder → block-factory}/light.js +35 -30
- package/dest/config.d.ts +6 -6
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +11 -1
- package/dest/mocks/fixtures.d.ts +3 -3
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +2 -2
- package/dest/mocks/test_context.d.ts +18 -13
- package/dest/mocks/test_context.d.ts.map +1 -1
- package/dest/mocks/test_context.js +44 -38
- package/dest/orchestrator/block-building-helpers.d.ts +18 -11
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +80 -63
- package/dest/orchestrator/block-proving-state.d.ts +19 -10
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/block-proving-state.js +63 -46
- package/dest/orchestrator/epoch-proving-state.d.ts +13 -6
- package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/epoch-proving-state.js +40 -14
- package/dest/orchestrator/orchestrator.d.ts +7 -5
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +78 -52
- package/dest/orchestrator/orchestrator_metrics.d.ts +2 -0
- package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator_metrics.js +9 -0
- package/dest/orchestrator/tx-proving-state.d.ts +2 -2
- package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/tx-proving-state.js +9 -20
- package/dest/prover-client/prover-client.d.ts +3 -3
- package/dest/prover-client/prover-client.d.ts.map +1 -1
- package/dest/prover-client/prover-client.js +5 -4
- package/dest/prover-client/server-epoch-prover.d.ts +6 -4
- package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
- package/dest/prover-client/server-epoch-prover.js +4 -4
- package/dest/proving_broker/broker_prover_facade.d.ts +5 -3
- package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
- package/dest/proving_broker/broker_prover_facade.js +31 -21
- package/dest/proving_broker/config.d.ts +9 -4
- package/dest/proving_broker/config.d.ts.map +1 -1
- package/dest/proving_broker/config.js +15 -4
- package/dest/proving_broker/factory.d.ts +1 -1
- package/dest/proving_broker/factory.d.ts.map +1 -1
- package/dest/proving_broker/factory.js +5 -1
- package/dest/proving_broker/proof_store/factory.js +1 -1
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/gcs_proof_store.js +1 -0
- package/dest/proving_broker/proving_agent.d.ts +3 -3
- package/dest/proving_broker/proving_agent.d.ts.map +1 -1
- package/dest/proving_broker/proving_agent.js +83 -47
- package/dest/proving_broker/proving_broker.d.ts +11 -2
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +6 -5
- package/dest/proving_broker/proving_broker_database/memory.js +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.js +9 -8
- package/dest/proving_broker/proving_job_controller.d.ts +7 -8
- package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
- package/dest/proving_broker/proving_job_controller.js +53 -45
- package/dest/proving_broker/rpc.d.ts +3 -5
- package/dest/proving_broker/rpc.d.ts.map +1 -1
- package/dest/proving_broker/rpc.js +1 -4
- package/dest/test/mock_proof_store.d.ts +9 -0
- package/dest/test/mock_proof_store.d.ts.map +1 -0
- package/dest/test/mock_proof_store.js +10 -0
- package/dest/test/mock_prover.d.ts +7 -5
- package/dest/test/mock_prover.d.ts.map +1 -1
- package/dest/test/mock_prover.js +6 -3
- package/package.json +28 -27
- package/src/bin/get-proof-inputs.ts +1 -1
- package/src/block-factory/index.ts +1 -0
- package/src/{block_builder → block-factory}/light.ts +42 -29
- package/src/config.ts +24 -8
- package/src/mocks/fixtures.ts +5 -5
- package/src/mocks/test_context.ts +79 -59
- package/src/orchestrator/block-building-helpers.ts +96 -92
- package/src/orchestrator/block-proving-state.ts +78 -52
- package/src/orchestrator/epoch-proving-state.ts +51 -20
- package/src/orchestrator/orchestrator.ts +119 -60
- package/src/orchestrator/orchestrator_metrics.ts +20 -1
- package/src/orchestrator/tx-proving-state.ts +17 -24
- package/src/prover-client/prover-client.ts +16 -14
- package/src/prover-client/server-epoch-prover.ts +16 -7
- package/src/proving_broker/broker_prover_facade.ts +52 -36
- package/src/proving_broker/config.ts +17 -6
- package/src/proving_broker/factory.ts +2 -1
- package/src/proving_broker/proof_store/factory.ts +1 -1
- package/src/proving_broker/proof_store/gcs_proof_store.ts +5 -1
- package/src/proving_broker/proof_store/inline_proof_store.ts +1 -1
- package/src/proving_broker/proving_agent.ts +89 -47
- package/src/proving_broker/proving_broker.ts +16 -15
- package/src/proving_broker/proving_broker_database/memory.ts +1 -1
- package/src/proving_broker/proving_broker_database/persisted.ts +9 -8
- package/src/proving_broker/proving_job_controller.ts +56 -65
- package/src/proving_broker/rpc.ts +1 -6
- package/src/test/mock_proof_store.ts +14 -0
- package/src/test/mock_prover.ts +27 -5
- package/dest/block_builder/index.d.ts +0 -6
- package/dest/block_builder/index.d.ts.map +0 -1
- package/dest/block_builder/light.d.ts +0 -33
- package/dest/block_builder/light.d.ts.map +0 -1
- package/src/block_builder/index.ts +0 -6
- /package/dest/{block_builder → block-factory}/index.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block-building-helpers.d.ts","sourceRoot":"","sources":["../../src/orchestrator/block-building-helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"block-building-helpers.d.ts","sourceRoot":"","sources":["../../src/orchestrator/block-building-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,26 +2,25 @@ import { Blob } from '@aztec/blob-lib';
|
|
|
2
2
|
import { ARCHIVE_HEIGHT, MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NOTE_HASH_SUBTREE_HEIGHT, NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_SUBTREE_HEIGHT, NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_TREE_HEIGHT, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, PUBLIC_DATA_TREE_HEIGHT } from '@aztec/constants';
|
|
3
3
|
import { makeTuple } from '@aztec/foundation/array';
|
|
4
4
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
5
|
-
import { sha256Trunc } from '@aztec/foundation/crypto';
|
|
6
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
7
|
-
import { assertLength,
|
|
8
|
-
import { MembershipWitness, MerkleTreeCalculator,
|
|
5
|
+
import { sha256ToField, sha256Trunc } from '@aztec/foundation/crypto';
|
|
6
|
+
import { BLS12Point, Fr } from '@aztec/foundation/fields';
|
|
7
|
+
import { assertLength, toFriendlyJSON } from '@aztec/foundation/serialize';
|
|
8
|
+
import { MembershipWitness, MerkleTreeCalculator, computeUnbalancedMerkleTreeRoot } from '@aztec/foundation/trees';
|
|
9
9
|
import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
10
10
|
import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
|
|
11
11
|
import { computeFeePayerBalanceLeafSlot } from '@aztec/protocol-contracts/fee-juice';
|
|
12
12
|
import { PublicDataHint } from '@aztec/stdlib/avm';
|
|
13
13
|
import { Body } from '@aztec/stdlib/block';
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
14
|
+
import { ContractClassLogFields } from '@aztec/stdlib/logs';
|
|
15
|
+
import { BlockConstantData, PrivateBaseRollupHints, PrivateBaseStateDiffHints, PublicBaseRollupHints } from '@aztec/stdlib/rollup';
|
|
16
16
|
import { AppendOnlyTreeSnapshot, MerkleTreeId, NullifierLeafPreimage, PublicDataTreeLeaf, PublicDataTreeLeafPreimage, getTreeHeight } from '@aztec/stdlib/trees';
|
|
17
|
-
import { BlockHeader, ContentCommitment, PartialStateReference, StateReference
|
|
17
|
+
import { BlockHeader, ContentCommitment, PartialStateReference, StateReference } from '@aztec/stdlib/tx';
|
|
18
18
|
import { Attributes, runInSpan } from '@aztec/telemetry-client';
|
|
19
|
-
import { inspect } from 'util';
|
|
20
19
|
// Builds the hints for base rollup. Updating the contract, nullifier, and data trees in the process.
|
|
21
|
-
export const
|
|
20
|
+
export const insertSideEffectsAndBuildBaseRollupHints = runInSpan('BlockBuilderHelpers', 'buildBaseRollupHints', async (span, tx, globalVariables, newL1ToL2MessageTreeSnapshot, db, startSpongeBlob)=>{
|
|
22
21
|
span.setAttribute(Attributes.TX_HASH, tx.hash.toString());
|
|
23
22
|
// Get trees info before any changes hit
|
|
24
|
-
const
|
|
23
|
+
const lastArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
|
|
25
24
|
const start = new PartialStateReference(await getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE, db), await getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE, db), await getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE, db));
|
|
26
25
|
// Get the subtree sibling paths for the circuit
|
|
27
26
|
const noteHashSubtreeSiblingPathArray = await getSubtreeSiblingPath(MerkleTreeId.NOTE_HASH_TREE, NOTE_HASH_SUBTREE_HEIGHT, db);
|
|
@@ -48,15 +47,15 @@ export const buildBaseRollupHints = runInSpan('BlockBuilderHelpers', 'buildBaseR
|
|
|
48
47
|
// Append new data to startSpongeBlob
|
|
49
48
|
const inputSpongeBlob = startSpongeBlob.clone();
|
|
50
49
|
await startSpongeBlob.absorb(tx.txEffect.toBlobFields());
|
|
51
|
-
const
|
|
50
|
+
const contractClassLogsFields = makeTuple(MAX_CONTRACT_CLASS_LOGS_PER_TX, (i)=>tx.txEffect.contractClassLogs[i]?.fields || ContractClassLogFields.empty());
|
|
52
51
|
if (tx.avmProvingRequest) {
|
|
53
|
-
const blockHash = await tx.constants.historicalHeader.hash();
|
|
52
|
+
const blockHash = await tx.data.constants.historicalHeader.hash();
|
|
54
53
|
const archiveRootMembershipWitness = await getMembershipWitnessFor(blockHash, MerkleTreeId.ARCHIVE, ARCHIVE_HEIGHT, db);
|
|
55
54
|
return PublicBaseRollupHints.from({
|
|
56
55
|
startSpongeBlob: inputSpongeBlob,
|
|
56
|
+
lastArchive,
|
|
57
57
|
archiveRootMembershipWitness,
|
|
58
|
-
|
|
59
|
-
constants
|
|
58
|
+
contractClassLogsFields
|
|
60
59
|
});
|
|
61
60
|
} else {
|
|
62
61
|
if (txPublicDataUpdateRequestInfo.lowPublicDataWritesMembershipWitnesses.length > 1 || txPublicDataUpdateRequestInfo.lowPublicDataWritesPreimages.length > 1 || txPublicDataUpdateRequestInfo.publicDataWritesSiblingPaths.length > 1) {
|
|
@@ -76,15 +75,22 @@ export const buildBaseRollupHints = runInSpan('BlockBuilderHelpers', 'buildBaseR
|
|
|
76
75
|
feeWriteLowLeafMembershipWitness,
|
|
77
76
|
feeWriteSiblingPath
|
|
78
77
|
});
|
|
79
|
-
const blockHash = await tx.constants.historicalHeader.hash();
|
|
78
|
+
const blockHash = await tx.data.constants.historicalHeader.hash();
|
|
80
79
|
const archiveRootMembershipWitness = await getMembershipWitnessFor(blockHash, MerkleTreeId.ARCHIVE, ARCHIVE_HEIGHT, db);
|
|
80
|
+
const constants = BlockConstantData.from({
|
|
81
|
+
lastArchive,
|
|
82
|
+
newL1ToL2: newL1ToL2MessageTreeSnapshot,
|
|
83
|
+
vkTreeRoot: getVKTreeRoot(),
|
|
84
|
+
protocolContractTreeRoot,
|
|
85
|
+
globalVariables
|
|
86
|
+
});
|
|
81
87
|
return PrivateBaseRollupHints.from({
|
|
82
88
|
start,
|
|
83
89
|
startSpongeBlob: inputSpongeBlob,
|
|
84
90
|
stateDiffHints,
|
|
85
91
|
feePayerFeeJuiceBalanceReadHint,
|
|
86
92
|
archiveRootMembershipWitness,
|
|
87
|
-
|
|
93
|
+
contractClassLogsFields,
|
|
88
94
|
constants
|
|
89
95
|
});
|
|
90
96
|
}
|
|
@@ -100,14 +106,19 @@ export async function getPublicDataHint(db, leafSlot) {
|
|
|
100
106
|
if (!leafPreimage) {
|
|
101
107
|
throw new Error(`Cannot find the leaf preimage for public data tree at index ${index}.`);
|
|
102
108
|
}
|
|
103
|
-
const exists = leafPreimage.slot.toBigInt() === leafSlot;
|
|
104
|
-
const value = exists ? leafPreimage.value : Fr.ZERO;
|
|
109
|
+
const exists = leafPreimage.leaf.slot.toBigInt() === leafSlot;
|
|
110
|
+
const value = exists ? leafPreimage.leaf.value : Fr.ZERO;
|
|
105
111
|
return new PublicDataHint(new Fr(leafSlot), value, membershipWitness, leafPreimage);
|
|
106
112
|
}
|
|
107
113
|
export const buildBlobHints = runInSpan('BlockBuilderHelpers', 'buildBlobHints', async (_span, txEffects)=>{
|
|
108
114
|
const blobFields = txEffects.flatMap((tx)=>tx.toBlobFields());
|
|
109
|
-
const blobs = await Blob.
|
|
110
|
-
|
|
115
|
+
const blobs = await Blob.getBlobsPerBlock(blobFields);
|
|
116
|
+
// TODO(#13430): The blobsHash is confusingly similar to blobCommitmentsHash, calculated from below blobCommitments:
|
|
117
|
+
// - blobsHash := sha256([blobhash_0, ..., blobhash_m]) = a hash of all blob hashes in a block with m+1 blobs inserted into the header, exists so a user can cross check blobs.
|
|
118
|
+
// - blobCommitmentsHash := sha256( ...sha256(sha256(C_0), C_1) ... C_n) = iteratively calculated hash of all blob commitments in an epoch with n+1 blobs (see calculateBlobCommitmentsHash()),
|
|
119
|
+
// exists so we can validate injected commitments to the rollup circuits correspond to the correct real blobs.
|
|
120
|
+
// We may be able to combine these values e.g. blobCommitmentsHash := sha256( ...sha256(sha256(blobshash_0), blobshash_1) ... blobshash_l) for an epoch with l+1 blocks.
|
|
121
|
+
const blobCommitments = blobs.map((b)=>BLS12Point.decompress(b.commitment));
|
|
111
122
|
const blobsHash = new Fr(getBlobsHashFromBlobs(blobs));
|
|
112
123
|
return {
|
|
113
124
|
blobFields,
|
|
@@ -116,45 +127,37 @@ export const buildBlobHints = runInSpan('BlockBuilderHelpers', 'buildBlobHints',
|
|
|
116
127
|
blobsHash
|
|
117
128
|
};
|
|
118
129
|
});
|
|
119
|
-
export const
|
|
130
|
+
export const accumulateBlobs = runInSpan('BlockBuilderHelpers', 'accumulateBlobs', async (_span, txs, startBlobAccumulator)=>{
|
|
131
|
+
const blobFields = txs.flatMap((tx)=>tx.txEffect.toBlobFields());
|
|
132
|
+
const blobs = await Blob.getBlobsPerBlock(blobFields);
|
|
133
|
+
const endBlobAccumulator = startBlobAccumulator.accumulateBlobs(blobs);
|
|
134
|
+
return endBlobAccumulator;
|
|
135
|
+
});
|
|
136
|
+
export const buildHeaderFromCircuitOutputs = runInSpan('BlockBuilderHelpers', 'buildHeaderFromCircuitOutputs', (_span, previousRollupData, parityPublicInputs, rootRollupOutputs, blobsHash, endState)=>{
|
|
120
137
|
if (previousRollupData.length > 2) {
|
|
121
138
|
throw new Error(`There can't be more than 2 previous rollups. Received ${previousRollupData.length}.`);
|
|
122
139
|
}
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
]));
|
|
129
|
-
const contentCommitment = new ContentCommitment(new Fr(numTxs), blobsHash, parityPublicInputs.shaRoot.toBuffer(), outHash);
|
|
140
|
+
const outHash = previousRollupData.length === 0 ? Fr.ZERO : previousRollupData.length === 1 ? previousRollupData[0].outHash : sha256ToField([
|
|
141
|
+
previousRollupData[0].outHash,
|
|
142
|
+
previousRollupData[1].outHash
|
|
143
|
+
]);
|
|
144
|
+
const contentCommitment = new ContentCommitment(blobsHash, parityPublicInputs.shaRoot, outHash);
|
|
130
145
|
const accumulatedFees = previousRollupData.reduce((sum, d)=>sum.add(d.accumulatedFees), Fr.ZERO);
|
|
131
146
|
const accumulatedManaUsed = previousRollupData.reduce((sum, d)=>sum.add(d.accumulatedManaUsed), Fr.ZERO);
|
|
132
|
-
|
|
133
|
-
if (!(await header.hash()).equals(rootRollupOutputs.endBlockHash)) {
|
|
134
|
-
logger?.error(`Block header mismatch when building header from circuit outputs.` + `\n\nHeader: ${inspect(header)}` + `\n\nCircuit: ${toFriendlyJSON(rootRollupOutputs)}`);
|
|
135
|
-
throw new Error(`Block header mismatch when building from circuit outputs`);
|
|
136
|
-
}
|
|
137
|
-
return header;
|
|
147
|
+
return new BlockHeader(rootRollupOutputs.previousArchive, contentCommitment, endState, rootRollupOutputs.endGlobalVariables, accumulatedFees, accumulatedManaUsed);
|
|
138
148
|
});
|
|
139
149
|
export const buildHeaderAndBodyFromTxs = runInSpan('BlockBuilderHelpers', 'buildHeaderAndBodyFromTxs', async (span, txs, globalVariables, l1ToL2Messages, db)=>{
|
|
140
|
-
span.setAttribute(Attributes.BLOCK_NUMBER, globalVariables.blockNumber
|
|
150
|
+
span.setAttribute(Attributes.BLOCK_NUMBER, globalVariables.blockNumber);
|
|
141
151
|
const stateReference = new StateReference(await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db), new PartialStateReference(await getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE, db), await getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE, db), await getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE, db)));
|
|
142
152
|
const previousArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
|
|
143
153
|
const txEffects = txs.map((tx)=>tx.txEffect);
|
|
144
154
|
const body = new Body(txEffects);
|
|
145
|
-
const
|
|
146
|
-
const outHash =
|
|
147
|
-
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
])));
|
|
152
|
-
const parityHeight = Math.ceil(Math.log2(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP));
|
|
153
|
-
const parityCalculator = await MerkleTreeCalculator.create(parityHeight, Fr.ZERO.toBuffer(), hasher);
|
|
154
|
-
const parityShaRoot = await parityCalculator.computeTreeRoot(l1ToL2Messages.map((msg)=>msg.toBuffer()));
|
|
155
|
-
const blobsHash = getBlobsHashFromBlobs(await Blob.getBlobs(body.toBlobFields()));
|
|
156
|
-
const contentCommitment = new ContentCommitment(new Fr(numTxs), blobsHash, parityShaRoot, outHash);
|
|
157
|
-
const fees = body.txEffects.reduce((acc, tx)=>acc.add(tx.transactionFee), Fr.ZERO);
|
|
155
|
+
const txOutHashes = txEffects.map((tx)=>tx.txOutHash());
|
|
156
|
+
const outHash = txOutHashes.length === 0 ? Fr.ZERO : new Fr(computeUnbalancedMerkleTreeRoot(txOutHashes));
|
|
157
|
+
const parityShaRoot = await computeInHashFromL1ToL2Messages(l1ToL2Messages);
|
|
158
|
+
const blobsHash = getBlobsHashFromBlobs(await Blob.getBlobsPerBlock(body.toBlobFields()));
|
|
159
|
+
const contentCommitment = new ContentCommitment(blobsHash, parityShaRoot, outHash);
|
|
160
|
+
const fees = txEffects.reduce((acc, tx)=>acc.add(tx.transactionFee), Fr.ZERO);
|
|
158
161
|
const manaUsed = txs.reduce((acc, tx)=>acc.add(new Fr(tx.gasUsed.billedGas.l2Gas)), Fr.ZERO);
|
|
159
162
|
const header = new BlockHeader(previousArchive, contentCommitment, stateReference, globalVariables, fees, manaUsed);
|
|
160
163
|
return {
|
|
@@ -162,11 +165,28 @@ export const buildHeaderAndBodyFromTxs = runInSpan('BlockBuilderHelpers', 'build
|
|
|
162
165
|
body
|
|
163
166
|
};
|
|
164
167
|
});
|
|
168
|
+
/** Computes the inHash for a block's ContentCommitment given its l1 to l2 messages. */ export async function computeInHashFromL1ToL2Messages(unpaddedL1ToL2Messages) {
|
|
169
|
+
const l1ToL2Messages = padArrayEnd(unpaddedL1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
|
|
170
|
+
const hasher = (left, right)=>Promise.resolve(sha256Trunc(Buffer.concat([
|
|
171
|
+
left,
|
|
172
|
+
right
|
|
173
|
+
])));
|
|
174
|
+
const parityHeight = Math.ceil(Math.log2(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP));
|
|
175
|
+
const parityCalculator = await MerkleTreeCalculator.create(parityHeight, Fr.ZERO.toBuffer(), hasher);
|
|
176
|
+
return new Fr(await parityCalculator.computeTreeRoot(l1ToL2Messages.map((msg)=>msg.toBuffer())));
|
|
177
|
+
}
|
|
165
178
|
export function getBlobsHashFromBlobs(inputs) {
|
|
166
|
-
|
|
167
|
-
|
|
179
|
+
return sha256ToField(inputs.map((b)=>b.getEthVersionedBlobHash()));
|
|
180
|
+
}
|
|
181
|
+
// Note: tested against the constant values in block_root/empty_block_root_rollup_inputs.nr, set by block_building_helpers.test.ts.
|
|
182
|
+
// Having this separate fn hopefully makes it clear how we treat empty blocks and their blobs, and won't break if we decide to change how
|
|
183
|
+
// getBlobsPerBlock() works on empty input.
|
|
184
|
+
export async function getEmptyBlockBlobsHash() {
|
|
185
|
+
const blobHash = (await Blob.getBlobsPerBlock([])).map((b)=>b.getEthVersionedBlobHash());
|
|
186
|
+
return sha256ToField(blobHash);
|
|
168
187
|
}
|
|
169
188
|
// Validate that the roots of all local trees match the output of the root circuit simulation
|
|
189
|
+
// TODO: does this get called?
|
|
170
190
|
export async function validateBlockRootOutput(blockRootOutput, blockHeader, db) {
|
|
171
191
|
await Promise.all([
|
|
172
192
|
validateState(blockHeader.state, db),
|
|
@@ -191,19 +211,16 @@ export const validateState = runInSpan('BlockBuilderHelpers', 'validateState', a
|
|
|
191
211
|
validatePartialState(state.partial, snapshots);
|
|
192
212
|
validateSimulatedTree(await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db), state.l1ToL2MessageTree, 'L1ToL2MessageTree');
|
|
193
213
|
});
|
|
214
|
+
export async function getLastSiblingPath(treeId, db) {
|
|
215
|
+
const { size } = await db.getTreeInfo(treeId);
|
|
216
|
+
const path = await db.getSiblingPath(treeId, size - 1n);
|
|
217
|
+
return padArrayEnd(path.toFields(), Fr.ZERO, getTreeHeight(treeId));
|
|
218
|
+
}
|
|
194
219
|
export async function getRootTreeSiblingPath(treeId, db) {
|
|
195
220
|
const { size } = await db.getTreeInfo(treeId);
|
|
196
221
|
const path = await db.getSiblingPath(treeId, size);
|
|
197
222
|
return padArrayEnd(path.toFields(), Fr.ZERO, getTreeHeight(treeId));
|
|
198
223
|
}
|
|
199
|
-
export const getConstantRollupData = runInSpan('BlockBuilderHelpers', 'getConstantRollupData', async (_span, globalVariables, db)=>{
|
|
200
|
-
return ConstantRollupData.from({
|
|
201
|
-
vkTreeRoot: getVKTreeRoot(),
|
|
202
|
-
protocolContractTreeRoot,
|
|
203
|
-
lastArchive: await getTreeSnapshot(MerkleTreeId.ARCHIVE, db),
|
|
204
|
-
globalVariables
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
224
|
export async function getTreeSnapshot(id, db) {
|
|
208
225
|
const treeInfo = await db.getTreeInfo(id);
|
|
209
226
|
return new AppendOnlyTreeSnapshot(Fr.fromBuffer(treeInfo.root), Number(treeInfo.size));
|
|
@@ -269,17 +286,17 @@ function validateSimulatedTree(localTree, simulatedTree, name, label) {
|
|
|
269
286
|
}
|
|
270
287
|
}
|
|
271
288
|
export function validateTx(tx) {
|
|
272
|
-
const txHeader = tx.constants.historicalHeader;
|
|
273
|
-
if (txHeader.state.l1ToL2MessageTree.
|
|
289
|
+
const txHeader = tx.data.constants.historicalHeader;
|
|
290
|
+
if (txHeader.state.l1ToL2MessageTree.isEmpty()) {
|
|
274
291
|
throw new Error(`Empty L1 to L2 messages tree in tx: ${toFriendlyJSON(tx)}`);
|
|
275
292
|
}
|
|
276
|
-
if (txHeader.state.partial.noteHashTree.
|
|
293
|
+
if (txHeader.state.partial.noteHashTree.isEmpty()) {
|
|
277
294
|
throw new Error(`Empty note hash tree in tx: ${toFriendlyJSON(tx)}`);
|
|
278
295
|
}
|
|
279
|
-
if (txHeader.state.partial.nullifierTree.
|
|
296
|
+
if (txHeader.state.partial.nullifierTree.isEmpty()) {
|
|
280
297
|
throw new Error(`Empty nullifier tree in tx: ${toFriendlyJSON(tx)}`);
|
|
281
298
|
}
|
|
282
|
-
if (txHeader.state.partial.publicDataTree.
|
|
299
|
+
if (txHeader.state.partial.publicDataTree.isEmpty()) {
|
|
283
300
|
throw new Error(`Empty public data tree in tx: ${toFriendlyJSON(tx)}`);
|
|
284
301
|
}
|
|
285
302
|
}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import { SpongeBlob } from '@aztec/blob-lib';
|
|
1
|
+
import { BatchedBlobAccumulator, SpongeBlob } from '@aztec/blob-lib';
|
|
2
2
|
import { type ARCHIVE_HEIGHT, type L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, type NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH } from '@aztec/constants';
|
|
3
3
|
import { Fr } from '@aztec/foundation/fields';
|
|
4
|
-
import type { Logger } from '@aztec/foundation/log';
|
|
5
4
|
import type { Tuple } from '@aztec/foundation/serialize';
|
|
6
5
|
import { type TreeNodeLocation } from '@aztec/foundation/trees';
|
|
7
|
-
import type { L2Block } from '@aztec/stdlib/block';
|
|
6
|
+
import type { EthAddress, L2Block } from '@aztec/stdlib/block';
|
|
8
7
|
import type { PublicInputsAndRecursiveProof } from '@aztec/stdlib/interfaces/server';
|
|
9
8
|
import { type ParityPublicInputs, RootParityInputs } from '@aztec/stdlib/parity';
|
|
10
|
-
import { type BaseOrMergeRollupPublicInputs, type BlockRootOrBlockMergePublicInputs, BlockRootRollupInputs, EmptyBlockRootRollupInputs, MergeRollupInputs, SingleTxBlockRootRollupInputs } from '@aztec/stdlib/rollup';
|
|
11
|
-
import
|
|
9
|
+
import { type BaseOrMergeRollupPublicInputs, type BlockRootOrBlockMergePublicInputs, BlockRootRollupInputs, EmptyBlockRootRollupInputs, MergeRollupInputs, PaddingBlockRootRollupInputs, SingleTxBlockRootRollupInputs } from '@aztec/stdlib/rollup';
|
|
10
|
+
import { AppendOnlyTreeSnapshot, type MerkleTreeId } from '@aztec/stdlib/trees';
|
|
12
11
|
import { type BlockHeader, type GlobalVariables } from '@aztec/stdlib/tx';
|
|
13
12
|
import type { EpochProvingState } from './epoch-proving-state.js';
|
|
14
13
|
import type { TxProvingState } from './tx-proving-state.js';
|
|
@@ -22,11 +21,14 @@ export declare class BlockProvingState {
|
|
|
22
21
|
readonly index: number;
|
|
23
22
|
readonly globalVariables: GlobalVariables;
|
|
24
23
|
readonly newL1ToL2Messages: Fr[];
|
|
24
|
+
readonly l1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot;
|
|
25
25
|
private readonly l1ToL2MessageSubtreeSiblingPath;
|
|
26
|
-
|
|
26
|
+
readonly l1ToL2MessageTreeSnapshotAfterInsertion: AppendOnlyTreeSnapshot;
|
|
27
27
|
private readonly lastArchiveSnapshot;
|
|
28
|
+
private readonly lastArchiveSiblingPath;
|
|
28
29
|
private readonly newArchiveSiblingPath;
|
|
29
30
|
private readonly previousBlockHeader;
|
|
31
|
+
private readonly proverId;
|
|
30
32
|
private readonly parentEpoch;
|
|
31
33
|
private baseOrMergeProvingOutputs;
|
|
32
34
|
private baseParityProvingOutputs;
|
|
@@ -35,10 +37,13 @@ export declare class BlockProvingState {
|
|
|
35
37
|
blockRootRollupStarted: boolean;
|
|
36
38
|
block: L2Block | undefined;
|
|
37
39
|
spongeBlobState: SpongeBlob | undefined;
|
|
40
|
+
startBlobAccumulator: BatchedBlobAccumulator | undefined;
|
|
41
|
+
endBlobAccumulator: BatchedBlobAccumulator | undefined;
|
|
42
|
+
blobsHash: Fr | undefined;
|
|
38
43
|
totalNumTxs: number;
|
|
39
44
|
private txs;
|
|
40
45
|
error: string | undefined;
|
|
41
|
-
constructor(index: number, globalVariables: GlobalVariables, newL1ToL2Messages: Fr[], l1ToL2MessageSubtreeSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH>, l1ToL2MessageTreeSnapshotAfterInsertion: AppendOnlyTreeSnapshot, lastArchiveSnapshot: AppendOnlyTreeSnapshot, newArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>, previousBlockHeader: BlockHeader, parentEpoch: EpochProvingState);
|
|
46
|
+
constructor(index: number, globalVariables: GlobalVariables, newL1ToL2Messages: Fr[], l1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot, l1ToL2MessageSubtreeSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH>, l1ToL2MessageTreeSnapshotAfterInsertion: AppendOnlyTreeSnapshot, lastArchiveSnapshot: AppendOnlyTreeSnapshot, lastArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>, newArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>, previousBlockHeader: BlockHeader, proverId: EthAddress, parentEpoch: EpochProvingState);
|
|
42
47
|
get blockNumber(): number;
|
|
43
48
|
startNewBlock(numTxs: number, numBlobFields: number): void;
|
|
44
49
|
addNewTx(tx: TxProvingState): number;
|
|
@@ -47,12 +52,16 @@ export declare class BlockProvingState {
|
|
|
47
52
|
setBaseParityProof(index: number, provingOutput: PublicInputsAndRecursiveProof<ParityPublicInputs>): void;
|
|
48
53
|
setRootParityProof(provingOutput: PublicInputsAndRecursiveProof<ParityPublicInputs>): void;
|
|
49
54
|
setBlockRootRollupProof(provingOutput: PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): void;
|
|
55
|
+
setBlock(block: L2Block): void;
|
|
56
|
+
setStartBlobAccumulator(accumulator: BatchedBlobAccumulator): void;
|
|
57
|
+
setEndBlobAccumulator(accumulator: BatchedBlobAccumulator): void;
|
|
58
|
+
accumulateBlobs(): Promise<void>;
|
|
50
59
|
get allTxs(): TxProvingState[];
|
|
51
60
|
/** Returns the block number as an epoch number. Used for prioritizing proof requests. */
|
|
52
61
|
get epochNumber(): number;
|
|
53
62
|
getParentLocation(location: TreeNodeLocation): TreeNodeLocation;
|
|
54
63
|
getMergeRollupInputs(mergeLocation: TreeNodeLocation): MergeRollupInputs;
|
|
55
|
-
getBlockRootRollupTypeAndInputs(
|
|
64
|
+
getBlockRootRollupTypeAndInputs(): Promise<{
|
|
56
65
|
rollupType: string;
|
|
57
66
|
inputs: EmptyBlockRootRollupInputs;
|
|
58
67
|
} | {
|
|
@@ -62,10 +71,10 @@ export declare class BlockProvingState {
|
|
|
62
71
|
rollupType: string;
|
|
63
72
|
inputs: BlockRootRollupInputs;
|
|
64
73
|
}>;
|
|
65
|
-
getPaddingBlockRootInputs(
|
|
74
|
+
getPaddingBlockRootInputs(): PaddingBlockRootRollupInputs;
|
|
66
75
|
getRootParityInputs(): RootParityInputs;
|
|
67
76
|
getTxProvingState(txIndex: number): TxProvingState;
|
|
68
|
-
buildHeaderFromProvingOutputs(
|
|
77
|
+
buildHeaderFromProvingOutputs(): Promise<BlockHeader>;
|
|
69
78
|
isReadyForMergeRollup(location: TreeNodeLocation): boolean;
|
|
70
79
|
isReadyForBlockRootRollup(): boolean;
|
|
71
80
|
isReadyForRootParity(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block-proving-state.d.ts","sourceRoot":"","sources":["../../src/orchestrator/block-proving-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"block-proving-state.d.ts","sourceRoot":"","sources":["../../src/orchestrator/block-proving-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import { SpongeBlob } from '@aztec/blob-lib';
|
|
2
|
-
import { BLOBS_PER_BLOCK, FIELDS_PER_BLOB, NUM_BASE_PARITY_PER_ROOT_PARITY
|
|
1
|
+
import { BatchedBlobAccumulator, BlobAccumulatorPublicInputs, SpongeBlob } from '@aztec/blob-lib';
|
|
2
|
+
import { BLOBS_PER_BLOCK, FIELDS_PER_BLOB, NUM_BASE_PARITY_PER_ROOT_PARITY } from '@aztec/constants';
|
|
3
3
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
4
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
5
|
-
import {
|
|
4
|
+
import { BLS12Point, Fr } from '@aztec/foundation/fields';
|
|
5
|
+
import { UnbalancedTreeStore } from '@aztec/foundation/trees';
|
|
6
6
|
import { getVKIndex, getVKSiblingPath, getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
7
7
|
import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
|
|
8
8
|
import { RootParityInput, RootParityInputs } from '@aztec/stdlib/parity';
|
|
9
|
-
import { BlockRootRollupBlobData, BlockRootRollupData, BlockRootRollupInputs,
|
|
9
|
+
import { BlockConstantData, BlockRootRollupBlobData, BlockRootRollupData, BlockRootRollupInputs, EmptyBlockRootRollupInputs, EpochConstantData, MergeRollupInputs, PaddingBlockRootRollupInputs, PreviousRollupData, SingleTxBlockRootRollupInputs } from '@aztec/stdlib/rollup';
|
|
10
10
|
import { StateReference } from '@aztec/stdlib/tx';
|
|
11
|
-
import {
|
|
11
|
+
import { VkData } from '@aztec/stdlib/vks';
|
|
12
|
+
import { accumulateBlobs, buildBlobHints, buildHeaderFromCircuitOutputs, getEmptyBlockBlobsHash } from './block-building-helpers.js';
|
|
12
13
|
/**
|
|
13
14
|
* The current state of the proving schedule for a given block. Managed by ProvingState.
|
|
14
15
|
* Contains the raw inputs and intermediate state to generate every constituent proof in the tree.
|
|
@@ -16,11 +17,14 @@ import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-
|
|
|
16
17
|
index;
|
|
17
18
|
globalVariables;
|
|
18
19
|
newL1ToL2Messages;
|
|
20
|
+
l1ToL2MessageTreeSnapshot;
|
|
19
21
|
l1ToL2MessageSubtreeSiblingPath;
|
|
20
22
|
l1ToL2MessageTreeSnapshotAfterInsertion;
|
|
21
23
|
lastArchiveSnapshot;
|
|
24
|
+
lastArchiveSiblingPath;
|
|
22
25
|
newArchiveSiblingPath;
|
|
23
26
|
previousBlockHeader;
|
|
27
|
+
proverId;
|
|
24
28
|
parentEpoch;
|
|
25
29
|
baseOrMergeProvingOutputs;
|
|
26
30
|
baseParityProvingOutputs;
|
|
@@ -29,18 +33,24 @@ import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-
|
|
|
29
33
|
blockRootRollupStarted;
|
|
30
34
|
block;
|
|
31
35
|
spongeBlobState;
|
|
36
|
+
startBlobAccumulator;
|
|
37
|
+
endBlobAccumulator;
|
|
38
|
+
blobsHash;
|
|
32
39
|
totalNumTxs;
|
|
33
40
|
txs;
|
|
34
41
|
error;
|
|
35
|
-
constructor(index, globalVariables, newL1ToL2Messages, l1ToL2MessageSubtreeSiblingPath, l1ToL2MessageTreeSnapshotAfterInsertion, lastArchiveSnapshot, newArchiveSiblingPath, previousBlockHeader, parentEpoch){
|
|
42
|
+
constructor(index, globalVariables, newL1ToL2Messages, l1ToL2MessageTreeSnapshot, l1ToL2MessageSubtreeSiblingPath, l1ToL2MessageTreeSnapshotAfterInsertion, lastArchiveSnapshot, lastArchiveSiblingPath, newArchiveSiblingPath, previousBlockHeader, proverId, parentEpoch){
|
|
36
43
|
this.index = index;
|
|
37
44
|
this.globalVariables = globalVariables;
|
|
38
45
|
this.newL1ToL2Messages = newL1ToL2Messages;
|
|
46
|
+
this.l1ToL2MessageTreeSnapshot = l1ToL2MessageTreeSnapshot;
|
|
39
47
|
this.l1ToL2MessageSubtreeSiblingPath = l1ToL2MessageSubtreeSiblingPath;
|
|
40
48
|
this.l1ToL2MessageTreeSnapshotAfterInsertion = l1ToL2MessageTreeSnapshotAfterInsertion;
|
|
41
49
|
this.lastArchiveSnapshot = lastArchiveSnapshot;
|
|
50
|
+
this.lastArchiveSiblingPath = lastArchiveSiblingPath;
|
|
42
51
|
this.newArchiveSiblingPath = newArchiveSiblingPath;
|
|
43
52
|
this.previousBlockHeader = previousBlockHeader;
|
|
53
|
+
this.proverId = proverId;
|
|
44
54
|
this.parentEpoch = parentEpoch;
|
|
45
55
|
this.baseOrMergeProvingOutputs = new UnbalancedTreeStore(0);
|
|
46
56
|
this.blockRootRollupStarted = false;
|
|
@@ -49,16 +59,19 @@ import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-
|
|
|
49
59
|
length: NUM_BASE_PARITY_PER_ROOT_PARITY
|
|
50
60
|
}).map((_)=>undefined);
|
|
51
61
|
this.totalNumTxs = 0;
|
|
62
|
+
if (this.blockNumber == parentEpoch.firstBlockNumber) {
|
|
63
|
+
this.startBlobAccumulator = BatchedBlobAccumulator.newWithChallenges(parentEpoch.finalBlobBatchingChallenges);
|
|
64
|
+
}
|
|
52
65
|
}
|
|
53
66
|
get blockNumber() {
|
|
54
|
-
return this.globalVariables.blockNumber
|
|
67
|
+
return this.globalVariables.blockNumber;
|
|
55
68
|
}
|
|
56
69
|
startNewBlock(numTxs, numBlobFields) {
|
|
57
70
|
if (this.spongeBlobState) {
|
|
58
71
|
throw new Error(`Block ${this.blockNumber} already initalised.`);
|
|
59
72
|
}
|
|
60
73
|
this.baseOrMergeProvingOutputs = new UnbalancedTreeStore(numTxs);
|
|
61
|
-
//
|
|
74
|
+
// Initialize the sponge which will eventually absorb all tx effects to be added to the blob.
|
|
62
75
|
// Like l1 to l2 messages, we need to know beforehand how many effects will be absorbed.
|
|
63
76
|
this.spongeBlobState = SpongeBlob.init(numBlobFields);
|
|
64
77
|
this.totalNumTxs = numTxs;
|
|
@@ -91,6 +104,23 @@ import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-
|
|
|
91
104
|
setBlockRootRollupProof(provingOutput) {
|
|
92
105
|
this.blockRootProvingOutput = provingOutput;
|
|
93
106
|
}
|
|
107
|
+
setBlock(block) {
|
|
108
|
+
this.block = block;
|
|
109
|
+
}
|
|
110
|
+
setStartBlobAccumulator(accumulator) {
|
|
111
|
+
this.startBlobAccumulator = accumulator;
|
|
112
|
+
}
|
|
113
|
+
setEndBlobAccumulator(accumulator) {
|
|
114
|
+
this.endBlobAccumulator = accumulator;
|
|
115
|
+
}
|
|
116
|
+
async accumulateBlobs() {
|
|
117
|
+
if (!this.block || !this.startBlobAccumulator) {
|
|
118
|
+
// We only want to accumulate once we have all txs, so we wait until the block is set.
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const endBlobAccumulator = await accumulateBlobs(this.allTxs.map((t)=>t.processedTx), this.startBlobAccumulator);
|
|
122
|
+
this.setEndBlobAccumulator(endBlobAccumulator);
|
|
123
|
+
}
|
|
94
124
|
// Returns the complete set of transaction proving state objects
|
|
95
125
|
get allTxs() {
|
|
96
126
|
return this.txs;
|
|
@@ -111,7 +141,7 @@ import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-
|
|
|
111
141
|
this.#getPreviousRollupData(right)
|
|
112
142
|
]);
|
|
113
143
|
}
|
|
114
|
-
async getBlockRootRollupTypeAndInputs(
|
|
144
|
+
async getBlockRootRollupTypeAndInputs() {
|
|
115
145
|
if (!this.rootParityProvingOutput) {
|
|
116
146
|
throw new Error('Root parity is not ready.');
|
|
117
147
|
}
|
|
@@ -120,25 +150,27 @@ import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-
|
|
|
120
150
|
if (proofs.length !== nonEmptyProofs.length) {
|
|
121
151
|
throw new Error('At lease one child is not ready for the block root.');
|
|
122
152
|
}
|
|
123
|
-
const data = this.#getBlockRootRollupData(
|
|
153
|
+
const data = this.#getBlockRootRollupData();
|
|
124
154
|
if (this.totalNumTxs === 0) {
|
|
125
|
-
const constants =
|
|
155
|
+
const constants = BlockConstantData.from({
|
|
126
156
|
lastArchive: this.lastArchiveSnapshot,
|
|
157
|
+
newL1ToL2: this.l1ToL2MessageTreeSnapshotAfterInsertion,
|
|
127
158
|
globalVariables: this.globalVariables,
|
|
128
159
|
vkTreeRoot: getVKTreeRoot(),
|
|
129
160
|
protocolContractTreeRoot
|
|
130
161
|
});
|
|
162
|
+
this.blobsHash = await getEmptyBlockBlobsHash();
|
|
131
163
|
return {
|
|
132
164
|
rollupType: 'empty-block-root-rollup',
|
|
133
165
|
inputs: EmptyBlockRootRollupInputs.from({
|
|
134
166
|
data,
|
|
135
|
-
constants
|
|
136
|
-
isPadding: false
|
|
167
|
+
constants
|
|
137
168
|
})
|
|
138
169
|
};
|
|
139
170
|
}
|
|
140
171
|
const previousRollupData = await Promise.all(nonEmptyProofs.map((p)=>this.#getPreviousRollupData(p)));
|
|
141
172
|
const blobData = await this.#getBlockRootRollupBlobData();
|
|
173
|
+
this.blobsHash = blobData.blobsHash;
|
|
142
174
|
if (previousRollupData.length === 1) {
|
|
143
175
|
return {
|
|
144
176
|
rollupType: 'single-tx-block-root-rollup',
|
|
@@ -151,30 +183,14 @@ import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-
|
|
|
151
183
|
};
|
|
152
184
|
}
|
|
153
185
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
throw new Error('Root parity is not ready.');
|
|
157
|
-
}
|
|
158
|
-
// Use the new block header and archive of the current block as the previous header and archiver of the next padding block.
|
|
159
|
-
const newBlockHeader = await this.buildHeaderFromProvingOutputs();
|
|
160
|
-
const newArchive = this.blockRootProvingOutput.inputs.newArchive;
|
|
161
|
-
const data = BlockRootRollupData.from({
|
|
162
|
-
l1ToL2Roots: this.#getRootParityData(this.rootParityProvingOutput),
|
|
163
|
-
l1ToL2MessageSubtreeSiblingPath: this.l1ToL2MessageSubtreeSiblingPath,
|
|
164
|
-
newArchiveSiblingPath: this.newArchiveSiblingPath,
|
|
165
|
-
previousBlockHeader: newBlockHeader,
|
|
166
|
-
proverId
|
|
167
|
-
});
|
|
168
|
-
const constants = ConstantRollupData.from({
|
|
169
|
-
lastArchive: newArchive,
|
|
170
|
-
globalVariables: this.globalVariables,
|
|
186
|
+
getPaddingBlockRootInputs() {
|
|
187
|
+
const constants = EpochConstantData.from({
|
|
171
188
|
vkTreeRoot: getVKTreeRoot(),
|
|
172
|
-
protocolContractTreeRoot
|
|
189
|
+
protocolContractTreeRoot,
|
|
190
|
+
proverId: this.proverId.toField()
|
|
173
191
|
});
|
|
174
|
-
return
|
|
175
|
-
|
|
176
|
-
constants,
|
|
177
|
-
isPadding: true
|
|
192
|
+
return PaddingBlockRootRollupInputs.from({
|
|
193
|
+
constants
|
|
178
194
|
});
|
|
179
195
|
}
|
|
180
196
|
getRootParityInputs() {
|
|
@@ -188,7 +204,7 @@ import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-
|
|
|
188
204
|
getTxProvingState(txIndex) {
|
|
189
205
|
return this.txs[txIndex];
|
|
190
206
|
}
|
|
191
|
-
async buildHeaderFromProvingOutputs(
|
|
207
|
+
async buildHeaderFromProvingOutputs() {
|
|
192
208
|
const previousRollupData = this.totalNumTxs === 0 ? [] : await Promise.all(this.#getChildProofsForBlockRoot().map((p)=>this.#getPreviousRollupData(p)));
|
|
193
209
|
let endPartialState = this.previousBlockHeader.state.partial;
|
|
194
210
|
if (this.totalNumTxs !== 0) {
|
|
@@ -200,7 +216,7 @@ import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-
|
|
|
200
216
|
endPartialState = lastRollup.inputs.end;
|
|
201
217
|
}
|
|
202
218
|
const endState = new StateReference(this.l1ToL2MessageTreeSnapshotAfterInsertion, endPartialState);
|
|
203
|
-
return buildHeaderFromCircuitOutputs(previousRollupData.map((d)=>d.baseOrMergeRollupPublicInputs), this.rootParityProvingOutput.inputs, this.blockRootProvingOutput.inputs,
|
|
219
|
+
return buildHeaderFromCircuitOutputs(previousRollupData.map((d)=>d.baseOrMergeRollupPublicInputs), this.rootParityProvingOutput.inputs, this.blockRootProvingOutput.inputs, this.blobsHash, endState);
|
|
204
220
|
}
|
|
205
221
|
isReadyForMergeRollup(location) {
|
|
206
222
|
return this.baseOrMergeProvingOutputs.getSibling(location) !== undefined;
|
|
@@ -208,7 +224,7 @@ import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-
|
|
|
208
224
|
// Returns true if we have sufficient inputs to execute the block root rollup
|
|
209
225
|
isReadyForBlockRootRollup() {
|
|
210
226
|
const childProofs = this.#getChildProofsForBlockRoot();
|
|
211
|
-
return this.block !== undefined && this.rootParityProvingOutput !== undefined && childProofs.every((p)=>!!p);
|
|
227
|
+
return this.block !== undefined && this.rootParityProvingOutput !== undefined && this.endBlobAccumulator !== undefined && childProofs.every((p)=>!!p);
|
|
212
228
|
}
|
|
213
229
|
// Returns true if we have sufficient root parity inputs to execute the root parity circuit
|
|
214
230
|
isReadyForRootParity() {
|
|
@@ -225,13 +241,16 @@ import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-
|
|
|
225
241
|
this.error = reason;
|
|
226
242
|
this.parentEpoch.reject(reason);
|
|
227
243
|
}
|
|
228
|
-
#getBlockRootRollupData(
|
|
244
|
+
#getBlockRootRollupData() {
|
|
229
245
|
return BlockRootRollupData.from({
|
|
230
246
|
l1ToL2Roots: this.#getRootParityData(this.rootParityProvingOutput),
|
|
231
247
|
l1ToL2MessageSubtreeSiblingPath: this.l1ToL2MessageSubtreeSiblingPath,
|
|
248
|
+
previousArchiveSiblingPath: this.lastArchiveSiblingPath,
|
|
232
249
|
newArchiveSiblingPath: this.newArchiveSiblingPath,
|
|
233
250
|
previousBlockHeader: this.previousBlockHeader,
|
|
234
|
-
|
|
251
|
+
startBlobAccumulator: BlobAccumulatorPublicInputs.fromBatchedBlobAccumulator(this.startBlobAccumulator),
|
|
252
|
+
finalBlobChallenges: this.startBlobAccumulator.finalBlobChallenges,
|
|
253
|
+
proverId: this.proverId.toField()
|
|
235
254
|
});
|
|
236
255
|
}
|
|
237
256
|
async #getBlockRootRollupBlobData() {
|
|
@@ -239,10 +258,7 @@ import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-
|
|
|
239
258
|
const { blobFields, blobCommitments, blobsHash } = await buildBlobHints(txEffects);
|
|
240
259
|
return BlockRootRollupBlobData.from({
|
|
241
260
|
blobFields: padArrayEnd(blobFields, Fr.ZERO, FIELDS_PER_BLOB * BLOBS_PER_BLOCK),
|
|
242
|
-
blobCommitments: padArrayEnd(blobCommitments,
|
|
243
|
-
Fr.ZERO,
|
|
244
|
-
Fr.ZERO
|
|
245
|
-
], BLOBS_PER_BLOCK),
|
|
261
|
+
blobCommitments: padArrayEnd(blobCommitments, BLS12Point.ZERO, BLOBS_PER_BLOCK),
|
|
246
262
|
blobsHash
|
|
247
263
|
});
|
|
248
264
|
}
|
|
@@ -261,7 +277,8 @@ import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-
|
|
|
261
277
|
}
|
|
262
278
|
#getPreviousRollupData({ inputs, proof, verificationKey }) {
|
|
263
279
|
const leafIndex = getVKIndex(verificationKey.keyAsFields);
|
|
264
|
-
|
|
280
|
+
const vkData = new VkData(verificationKey, leafIndex, getVKSiblingPath(leafIndex));
|
|
281
|
+
return new PreviousRollupData(inputs, proof, vkData);
|
|
265
282
|
}
|
|
266
283
|
#getRootParityData({ inputs, proof, verificationKey }) {
|
|
267
284
|
return new RootParityInput(proof, verificationKey.keyAsFields, getVKSiblingPath(getVKIndex(verificationKey)), inputs);
|