@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.
Files changed (107) hide show
  1. package/dest/bin/get-proof-inputs.js +1 -1
  2. package/dest/block-factory/index.d.ts +2 -0
  3. package/dest/block-factory/index.d.ts.map +1 -0
  4. package/dest/block-factory/light.d.ts +36 -0
  5. package/dest/block-factory/light.d.ts.map +1 -0
  6. package/dest/{block_builder → block-factory}/light.js +35 -30
  7. package/dest/config.d.ts +6 -6
  8. package/dest/config.d.ts.map +1 -1
  9. package/dest/config.js +11 -1
  10. package/dest/mocks/fixtures.d.ts +3 -3
  11. package/dest/mocks/fixtures.d.ts.map +1 -1
  12. package/dest/mocks/fixtures.js +2 -2
  13. package/dest/mocks/test_context.d.ts +18 -13
  14. package/dest/mocks/test_context.d.ts.map +1 -1
  15. package/dest/mocks/test_context.js +44 -38
  16. package/dest/orchestrator/block-building-helpers.d.ts +18 -11
  17. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  18. package/dest/orchestrator/block-building-helpers.js +80 -63
  19. package/dest/orchestrator/block-proving-state.d.ts +19 -10
  20. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  21. package/dest/orchestrator/block-proving-state.js +63 -46
  22. package/dest/orchestrator/epoch-proving-state.d.ts +13 -6
  23. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  24. package/dest/orchestrator/epoch-proving-state.js +40 -14
  25. package/dest/orchestrator/orchestrator.d.ts +7 -5
  26. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  27. package/dest/orchestrator/orchestrator.js +78 -52
  28. package/dest/orchestrator/orchestrator_metrics.d.ts +2 -0
  29. package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
  30. package/dest/orchestrator/orchestrator_metrics.js +9 -0
  31. package/dest/orchestrator/tx-proving-state.d.ts +2 -2
  32. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  33. package/dest/orchestrator/tx-proving-state.js +9 -20
  34. package/dest/prover-client/prover-client.d.ts +3 -3
  35. package/dest/prover-client/prover-client.d.ts.map +1 -1
  36. package/dest/prover-client/prover-client.js +5 -4
  37. package/dest/prover-client/server-epoch-prover.d.ts +6 -4
  38. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
  39. package/dest/prover-client/server-epoch-prover.js +4 -4
  40. package/dest/proving_broker/broker_prover_facade.d.ts +5 -3
  41. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  42. package/dest/proving_broker/broker_prover_facade.js +31 -21
  43. package/dest/proving_broker/config.d.ts +9 -4
  44. package/dest/proving_broker/config.d.ts.map +1 -1
  45. package/dest/proving_broker/config.js +15 -4
  46. package/dest/proving_broker/factory.d.ts +1 -1
  47. package/dest/proving_broker/factory.d.ts.map +1 -1
  48. package/dest/proving_broker/factory.js +5 -1
  49. package/dest/proving_broker/proof_store/factory.js +1 -1
  50. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -1
  51. package/dest/proving_broker/proof_store/gcs_proof_store.js +1 -0
  52. package/dest/proving_broker/proving_agent.d.ts +3 -3
  53. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  54. package/dest/proving_broker/proving_agent.js +83 -47
  55. package/dest/proving_broker/proving_broker.d.ts +11 -2
  56. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  57. package/dest/proving_broker/proving_broker.js +6 -5
  58. package/dest/proving_broker/proving_broker_database/memory.js +1 -1
  59. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
  60. package/dest/proving_broker/proving_broker_database/persisted.js +9 -8
  61. package/dest/proving_broker/proving_job_controller.d.ts +7 -8
  62. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  63. package/dest/proving_broker/proving_job_controller.js +53 -45
  64. package/dest/proving_broker/rpc.d.ts +3 -5
  65. package/dest/proving_broker/rpc.d.ts.map +1 -1
  66. package/dest/proving_broker/rpc.js +1 -4
  67. package/dest/test/mock_proof_store.d.ts +9 -0
  68. package/dest/test/mock_proof_store.d.ts.map +1 -0
  69. package/dest/test/mock_proof_store.js +10 -0
  70. package/dest/test/mock_prover.d.ts +7 -5
  71. package/dest/test/mock_prover.d.ts.map +1 -1
  72. package/dest/test/mock_prover.js +6 -3
  73. package/package.json +28 -27
  74. package/src/bin/get-proof-inputs.ts +1 -1
  75. package/src/block-factory/index.ts +1 -0
  76. package/src/{block_builder → block-factory}/light.ts +42 -29
  77. package/src/config.ts +24 -8
  78. package/src/mocks/fixtures.ts +5 -5
  79. package/src/mocks/test_context.ts +79 -59
  80. package/src/orchestrator/block-building-helpers.ts +96 -92
  81. package/src/orchestrator/block-proving-state.ts +78 -52
  82. package/src/orchestrator/epoch-proving-state.ts +51 -20
  83. package/src/orchestrator/orchestrator.ts +119 -60
  84. package/src/orchestrator/orchestrator_metrics.ts +20 -1
  85. package/src/orchestrator/tx-proving-state.ts +17 -24
  86. package/src/prover-client/prover-client.ts +16 -14
  87. package/src/prover-client/server-epoch-prover.ts +16 -7
  88. package/src/proving_broker/broker_prover_facade.ts +52 -36
  89. package/src/proving_broker/config.ts +17 -6
  90. package/src/proving_broker/factory.ts +2 -1
  91. package/src/proving_broker/proof_store/factory.ts +1 -1
  92. package/src/proving_broker/proof_store/gcs_proof_store.ts +5 -1
  93. package/src/proving_broker/proof_store/inline_proof_store.ts +1 -1
  94. package/src/proving_broker/proving_agent.ts +89 -47
  95. package/src/proving_broker/proving_broker.ts +16 -15
  96. package/src/proving_broker/proving_broker_database/memory.ts +1 -1
  97. package/src/proving_broker/proving_broker_database/persisted.ts +9 -8
  98. package/src/proving_broker/proving_job_controller.ts +56 -65
  99. package/src/proving_broker/rpc.ts +1 -6
  100. package/src/test/mock_proof_store.ts +14 -0
  101. package/src/test/mock_prover.ts +27 -5
  102. package/dest/block_builder/index.d.ts +0 -6
  103. package/dest/block_builder/index.d.ts.map +0 -1
  104. package/dest/block_builder/light.d.ts +0 -33
  105. package/dest/block_builder/light.d.ts.map +0 -1
  106. package/src/block_builder/index.ts +0 -6
  107. /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":";;AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAiBxD,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,KAAK,KAAK,EAAmD,MAAM,6BAA6B,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAqD,MAAM,yBAAyB,CAAC;AAI/G,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAEjF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EACL,KAAK,6BAA6B,EAClC,KAAK,iCAAiC,EACtC,kBAAkB,EAClB,sBAAsB,EAEtB,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,sBAAsB,EACtB,YAAY,EAKb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,WAAW,EAEX,KAAK,eAAe,EACpB,qBAAqB,EACrB,KAAK,WAAW,EAChB,cAAc,EACd,QAAQ,EACT,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAInE;;GAEG;AACH,KAAK,aAAa,GAAG,cAAc,GAAG,cAAc,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAC1F;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,mBAAmB,GAAG,SAAS,CAAC;AAGxE,eAAO,MAAM,oBAAoB,4KAuJhC,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,yBAAyB,EAAE,QAAQ,EAAE,MAAM,2BAkBtF;AAED,eAAO,MAAM,cAAc;;;;;EAU1B,CAAC;AAEF,eAAO,MAAM,6BAA6B,oOAoDzC,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;EAoDrC,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAG5D;AAGD,wBAAsB,uBAAuB,CAC3C,eAAe,EAAE,iCAAiC,EAClD,WAAW,EAAE,WAAW,EACxB,EAAE,EAAE,wBAAwB,iBAM7B;AAED,eAAO,MAAM,aAAa,wEAmBzB,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,GAAG,SAAS,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,wBAAwB;;;;;;SAI/G;AAED,eAAO,MAAM,qBAAqB,iGAWjC,CAAC;AAEF,wBAAsB,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,wBAAwB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAGrH;AAED,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,wBAMrE;AA4CD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,MAAM,EACrB,EAAE,EAAE,wBAAwB,GAC3B,OAAO,CAAC,EAAE,EAAE,CAAC,CAMf;AAGD,wBAAsB,uBAAuB,CAAC,CAAC,SAAS,MAAM,EAC5D,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,CAAC,EACT,EAAE,EAAE,wBAAwB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAY/B;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,qBAAqB,EACnC,aAAa,EAAE,GAAG,CAAC,YAAY,EAAE,sBAAsB,CAAC,QASzD;AAqBD,wBAAgB,UAAU,CAAC,EAAE,EAAE,WAAW,QAczC"}
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, serializeToBuffer, toFriendlyJSON } from '@aztec/foundation/serialize';
8
- import { MembershipWitness, MerkleTreeCalculator, computeUnbalancedMerkleRoot } from '@aztec/foundation/trees';
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 { ContractClassLog } from '@aztec/stdlib/logs';
15
- import { ConstantRollupData, PrivateBaseRollupHints, PrivateBaseStateDiffHints, PublicBaseRollupHints } from '@aztec/stdlib/rollup';
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, TxEffect } from '@aztec/stdlib/tx';
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 buildBaseRollupHints = runInSpan('BlockBuilderHelpers', 'buildBaseRollupHints', async (span, tx, globalVariables, db, startSpongeBlob)=>{
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 constants = await getConstantRollupData(globalVariables, db);
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 contractClassLogsPreimages = makeTuple(MAX_CONTRACT_CLASS_LOGS_PER_TX, (i)=>tx.txEffect.contractClassLogs[i]?.toUnsiloed() || ContractClassLog.empty());
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
- contractClassLogsPreimages,
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
- contractClassLogsPreimages,
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.getBlobs(blobFields);
110
- const blobCommitments = blobs.map((b)=>b.commitmentToFields());
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 buildHeaderFromCircuitOutputs = runInSpan('BlockBuilderHelpers', 'buildHeaderFromCircuitOutputs', async (_span, previousRollupData, parityPublicInputs, rootRollupOutputs, endState, logger)=>{
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 blobsHash = rootRollupOutputs.blobPublicInputs[0].getBlobsHash();
124
- const numTxs = previousRollupData.reduce((sum, d)=>sum + d.numTxs, 0);
125
- const outHash = previousRollupData.length === 0 ? Fr.ZERO.toBuffer() : previousRollupData.length === 1 ? previousRollupData[0].outHash.toBuffer() : sha256Trunc(Buffer.concat([
126
- previousRollupData[0].outHash.toBuffer(),
127
- previousRollupData[1].outHash.toBuffer()
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
- const header = new BlockHeader(rootRollupOutputs.previousArchive, contentCommitment, endState, rootRollupOutputs.endGlobalVariables, accumulatedFees, accumulatedManaUsed);
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.toNumber());
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 numTxs = body.txEffects.length;
146
- const outHash = numTxs === 0 ? Fr.ZERO.toBuffer() : numTxs === 1 ? body.txEffects[0].txOutHash() : computeUnbalancedMerkleRoot(body.txEffects.map((tx)=>tx.txOutHash()), TxEffect.empty().txOutHash());
147
- l1ToL2Messages = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
148
- const hasher = (left, right)=>Promise.resolve(sha256Trunc(Buffer.concat([
149
- left,
150
- right
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
- const blobHashes = serializeToBuffer(inputs.map((b)=>b.getEthVersionedBlobHash()));
167
- return sha256Trunc(serializeToBuffer(blobHashes));
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.isZero()) {
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.isZero()) {
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.isZero()) {
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.isZero()) {
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 type { AppendOnlyTreeSnapshot, MerkleTreeId } from '@aztec/stdlib/trees';
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
- private readonly l1ToL2MessageTreeSnapshotAfterInsertion;
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(proverId: Fr): Promise<{
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(proverId: Fr): Promise<EmptyBlockRootRollupInputs>;
74
+ getPaddingBlockRootInputs(): PaddingBlockRootRollupInputs;
66
75
  getRootParityInputs(): RootParityInputs;
67
76
  getTxProvingState(txIndex: number): TxProvingState;
68
- buildHeaderFromProvingOutputs(logger?: Logger): Promise<BlockHeader>;
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":"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"}
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, VK_TREE_HEIGHT } from '@aztec/constants';
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 { MembershipWitness, UnbalancedTreeStore } from '@aztec/foundation/trees';
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, ConstantRollupData, EmptyBlockRootRollupInputs, MergeRollupInputs, PreviousRollupData, SingleTxBlockRootRollupInputs } from '@aztec/stdlib/rollup';
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 { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-helpers.js';
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.toNumber();
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
- // Initialise the sponge which will eventually absorb all tx effects to be added to the blob.
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(proverId) {
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(proverId);
153
+ const data = this.#getBlockRootRollupData();
124
154
  if (this.totalNumTxs === 0) {
125
- const constants = ConstantRollupData.from({
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
- async getPaddingBlockRootInputs(proverId) {
155
- if (!this.rootParityProvingOutput) {
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 EmptyBlockRootRollupInputs.from({
175
- data,
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(logger) {
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, endState, logger);
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(proverId) {
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
- proverId
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
- return new PreviousRollupData(inputs, proof, verificationKey.keyAsFields, new MembershipWitness(VK_TREE_HEIGHT, BigInt(leafIndex), getVKSiblingPath(leafIndex)));
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);