@aztec/aztec-node 0.87.0 → 0.87.2
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/aztec-node/server.d.ts +13 -7
- package/dest/aztec-node/server.d.ts.map +1 -1
- package/dest/aztec-node/server.js +73 -49
- package/package.json +22 -22
- package/src/aztec-node/server.ts +89 -56
|
@@ -218,14 +218,20 @@ export declare class AztecNodeService implements AztecNode, AztecNodeAdmin, Trac
|
|
|
218
218
|
*/
|
|
219
219
|
isL1ToL2MessageSynced(l1ToL2Message: Fr): Promise<boolean>;
|
|
220
220
|
/**
|
|
221
|
-
* Returns the index
|
|
222
|
-
* @remarks
|
|
223
|
-
*
|
|
224
|
-
* The tree is
|
|
221
|
+
* Returns the index and sibling path for a L2->L1 message in a block's message tree.
|
|
222
|
+
* @remarks The message tree is constructed on-demand by taking all L2->L1 messages in a block
|
|
223
|
+
* and creating a variable depth append-only tree with the messages as leaves.
|
|
224
|
+
* The tree is constructed in two layers:
|
|
225
|
+
* 1. Subtree - For each transaction in the block, a subtree is created containing all L2->L1 messages from that
|
|
226
|
+
* transaction.
|
|
227
|
+
* 2. Top tree - A tree containing the roots of all the subtrees as leaves
|
|
228
|
+
* The final path is constructed by concatenating the path in the subtree with the path in the top tree.
|
|
229
|
+
* When there is only one transaction in the block, the subtree itself becomes the block's L2->L1 message tree,
|
|
230
|
+
* and no top tree is needed. The out hash is the root of the the block's L2->L1 message tree.
|
|
225
231
|
* TODO: Handle the case where two messages in the same tx have the same hash.
|
|
226
|
-
* @param blockNumber -
|
|
227
|
-
* @param l2ToL1Message -
|
|
228
|
-
* @returns
|
|
232
|
+
* @param blockNumber - Block number to get data from
|
|
233
|
+
* @param l2ToL1Message - Message to get index/path for
|
|
234
|
+
* @returns [index, siblingPath] for the message
|
|
229
235
|
*/
|
|
230
236
|
getL2ToL1MessageMembershipWitness(blockNumber: L2BlockNumber, l2ToL1Message: Fr): Promise<[bigint, SiblingPath<number>]>;
|
|
231
237
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,uBAAuB,EAAwB,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC7B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,KAAK,mBAAmB,EAAyC,MAAM,iBAAiB,CAAC;AAGlG,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAS,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -495,65 +495,89 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
495
495
|
return await this.l1ToL2MessageSource.getL1ToL2MessageIndex(l1ToL2Message) !== undefined;
|
|
496
496
|
}
|
|
497
497
|
/**
|
|
498
|
-
* Returns the index
|
|
499
|
-
* @remarks
|
|
500
|
-
*
|
|
501
|
-
* The tree is
|
|
498
|
+
* Returns the index and sibling path for a L2->L1 message in a block's message tree.
|
|
499
|
+
* @remarks The message tree is constructed on-demand by taking all L2->L1 messages in a block
|
|
500
|
+
* and creating a variable depth append-only tree with the messages as leaves.
|
|
501
|
+
* The tree is constructed in two layers:
|
|
502
|
+
* 1. Subtree - For each transaction in the block, a subtree is created containing all L2->L1 messages from that
|
|
503
|
+
* transaction.
|
|
504
|
+
* 2. Top tree - A tree containing the roots of all the subtrees as leaves
|
|
505
|
+
* The final path is constructed by concatenating the path in the subtree with the path in the top tree.
|
|
506
|
+
* When there is only one transaction in the block, the subtree itself becomes the block's L2->L1 message tree,
|
|
507
|
+
* and no top tree is needed. The out hash is the root of the the block's L2->L1 message tree.
|
|
502
508
|
* TODO: Handle the case where two messages in the same tx have the same hash.
|
|
503
|
-
* @param blockNumber -
|
|
504
|
-
* @param l2ToL1Message -
|
|
505
|
-
* @returns
|
|
509
|
+
* @param blockNumber - Block number to get data from
|
|
510
|
+
* @param l2ToL1Message - Message to get index/path for
|
|
511
|
+
* @returns [index, siblingPath] for the message
|
|
506
512
|
*/ async getL2ToL1MessageMembershipWitness(blockNumber, l2ToL1Message) {
|
|
507
513
|
const block = await this.blockSource.getBlock(blockNumber === 'latest' ? await this.getBlockNumber() : blockNumber);
|
|
508
514
|
if (block === undefined) {
|
|
509
|
-
throw new Error('Block
|
|
510
|
-
}
|
|
511
|
-
const
|
|
512
|
-
// Find index of message
|
|
513
|
-
let
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
515
|
+
throw new Error('Block not found in getL2ToL1MessageMembershipWitness');
|
|
516
|
+
}
|
|
517
|
+
const messagesPerTx = block.body.txEffects.map((txEffect)=>txEffect.l2ToL1Msgs);
|
|
518
|
+
// Find index of message in subtree and index of tx in a block
|
|
519
|
+
let messageIndexInTx = -1, txIndex = -1;
|
|
520
|
+
{
|
|
521
|
+
txIndex = messagesPerTx.findIndex((messages)=>{
|
|
522
|
+
const idx = messages.findIndex((msg)=>msg.equals(l2ToL1Message));
|
|
523
|
+
messageIndexInTx = Math.max(messageIndexInTx, idx);
|
|
524
|
+
return idx !== -1;
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
if (txIndex === -1) {
|
|
520
528
|
throw new Error('The L2ToL1Message you are trying to prove inclusion of does not exist');
|
|
521
529
|
}
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
const
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
530
|
+
// Get the message path in subtree and message subtree height
|
|
531
|
+
let messagePathInSubtree;
|
|
532
|
+
let messageSubtreeHeight;
|
|
533
|
+
{
|
|
534
|
+
const subtreeStore = openTmpStore(true);
|
|
535
|
+
const txMessages = messagesPerTx[txIndex];
|
|
536
|
+
messageSubtreeHeight = txMessages.length <= 1 ? 1 : Math.ceil(Math.log2(txMessages.length));
|
|
537
|
+
const subtree = new StandardTree(subtreeStore, new SHA256Trunc(), `subtree_${txIndex}`, messageSubtreeHeight, 0n, Fr);
|
|
538
|
+
subtree.appendLeaves(txMessages);
|
|
539
|
+
messagePathInSubtree = await subtree.getSiblingPath(BigInt(messageIndexInTx), true);
|
|
540
|
+
await subtreeStore.delete();
|
|
541
|
+
}
|
|
542
|
+
// If the number of txs is 1 we are dealing with a special case where the tx subtree itself is the whole block's
|
|
543
|
+
// l2 to l1 message tree.
|
|
544
|
+
const numTransactions = block.body.txEffects.length;
|
|
545
|
+
if (numTransactions === 1) {
|
|
536
546
|
return [
|
|
537
|
-
BigInt(
|
|
538
|
-
|
|
547
|
+
BigInt(messageIndexInTx),
|
|
548
|
+
messagePathInSubtree
|
|
539
549
|
];
|
|
540
550
|
}
|
|
541
|
-
//
|
|
542
|
-
const
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
551
|
+
// Calculate roots for all tx subtrees
|
|
552
|
+
const txSubtreeRoots = await Promise.all(messagesPerTx.map(async (messages, txIdx)=>{
|
|
553
|
+
// For a tx with no messages, we have to set an out hash of 0 to match what the circuit does.
|
|
554
|
+
if (messages.length === 0) {
|
|
555
|
+
return Fr.ZERO;
|
|
556
|
+
}
|
|
557
|
+
const txStore = openTmpStore(true);
|
|
558
|
+
const txTreeHeight = messages.length <= 1 ? 1 : Math.ceil(Math.log2(messages.length));
|
|
559
|
+
const txTree = new StandardTree(txStore, new SHA256Trunc(), `tx_messages_subtree_${txIdx}`, txTreeHeight, 0n, Fr);
|
|
560
|
+
txTree.appendLeaves(messages);
|
|
561
|
+
const root = Fr.fromBuffer(txTree.getRoot(true));
|
|
562
|
+
await txStore.delete();
|
|
563
|
+
return root;
|
|
564
|
+
}));
|
|
565
|
+
// Construct the top tree and compute the combined path
|
|
566
|
+
let combinedPath;
|
|
567
|
+
{
|
|
568
|
+
const topTreeHeight = Math.ceil(Math.log2(txSubtreeRoots.length));
|
|
569
|
+
// The root of this tree is the out_hash calculated in Noir => we truncate to match Noir's SHA
|
|
570
|
+
const topTree = new UnbalancedTree(new SHA256Trunc(), 'top_tree', topTreeHeight, Fr);
|
|
571
|
+
await topTree.appendLeaves(txSubtreeRoots);
|
|
572
|
+
const txPathInTopTree = await topTree.getSiblingPath(txSubtreeRoots[txIndex].toBigInt());
|
|
573
|
+
// Append subtree path to top tree path
|
|
574
|
+
combinedPath = messagePathInSubtree.toBufferArray().concat(txPathInTopTree.toBufferArray());
|
|
575
|
+
}
|
|
576
|
+
// Append binary index of subtree path to binary index of top tree path
|
|
577
|
+
const combinedIndex = parseInt(txIndex.toString(2).concat(messageIndexInTx.toString(2).padStart(messageSubtreeHeight, '0')), 2);
|
|
554
578
|
return [
|
|
555
|
-
BigInt(
|
|
556
|
-
new SiblingPath(
|
|
579
|
+
BigInt(combinedIndex),
|
|
580
|
+
new SiblingPath(combinedPath.length, combinedPath)
|
|
557
581
|
];
|
|
558
582
|
}
|
|
559
583
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/aztec-node",
|
|
3
|
-
"version": "0.87.
|
|
3
|
+
"version": "0.87.2",
|
|
4
4
|
"main": "dest/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -61,27 +61,27 @@
|
|
|
61
61
|
]
|
|
62
62
|
},
|
|
63
63
|
"dependencies": {
|
|
64
|
-
"@aztec/archiver": "0.87.
|
|
65
|
-
"@aztec/bb-prover": "0.87.
|
|
66
|
-
"@aztec/blob-sink": "0.87.
|
|
67
|
-
"@aztec/constants": "0.87.
|
|
68
|
-
"@aztec/epoch-cache": "0.87.
|
|
69
|
-
"@aztec/ethereum": "0.87.
|
|
70
|
-
"@aztec/foundation": "0.87.
|
|
71
|
-
"@aztec/kv-store": "0.87.
|
|
72
|
-
"@aztec/l1-artifacts": "0.87.
|
|
73
|
-
"@aztec/merkle-tree": "0.87.
|
|
74
|
-
"@aztec/node-lib": "0.87.
|
|
75
|
-
"@aztec/noir-protocol-circuits-types": "0.87.
|
|
76
|
-
"@aztec/p2p": "0.87.
|
|
77
|
-
"@aztec/protocol-contracts": "0.87.
|
|
78
|
-
"@aztec/prover-client": "0.87.
|
|
79
|
-
"@aztec/sequencer-client": "0.87.
|
|
80
|
-
"@aztec/simulator": "0.87.
|
|
81
|
-
"@aztec/stdlib": "0.87.
|
|
82
|
-
"@aztec/telemetry-client": "0.87.
|
|
83
|
-
"@aztec/validator-client": "0.87.
|
|
84
|
-
"@aztec/world-state": "0.87.
|
|
64
|
+
"@aztec/archiver": "0.87.2",
|
|
65
|
+
"@aztec/bb-prover": "0.87.2",
|
|
66
|
+
"@aztec/blob-sink": "0.87.2",
|
|
67
|
+
"@aztec/constants": "0.87.2",
|
|
68
|
+
"@aztec/epoch-cache": "0.87.2",
|
|
69
|
+
"@aztec/ethereum": "0.87.2",
|
|
70
|
+
"@aztec/foundation": "0.87.2",
|
|
71
|
+
"@aztec/kv-store": "0.87.2",
|
|
72
|
+
"@aztec/l1-artifacts": "0.87.2",
|
|
73
|
+
"@aztec/merkle-tree": "0.87.2",
|
|
74
|
+
"@aztec/node-lib": "0.87.2",
|
|
75
|
+
"@aztec/noir-protocol-circuits-types": "0.87.2",
|
|
76
|
+
"@aztec/p2p": "0.87.2",
|
|
77
|
+
"@aztec/protocol-contracts": "0.87.2",
|
|
78
|
+
"@aztec/prover-client": "0.87.2",
|
|
79
|
+
"@aztec/sequencer-client": "0.87.2",
|
|
80
|
+
"@aztec/simulator": "0.87.2",
|
|
81
|
+
"@aztec/stdlib": "0.87.2",
|
|
82
|
+
"@aztec/telemetry-client": "0.87.2",
|
|
83
|
+
"@aztec/validator-client": "0.87.2",
|
|
84
|
+
"@aztec/world-state": "0.87.2",
|
|
85
85
|
"koa": "^2.16.1",
|
|
86
86
|
"koa-router": "^12.0.0",
|
|
87
87
|
"tslib": "^2.4.0",
|
package/src/aztec-node/server.ts
CHANGED
|
@@ -20,7 +20,6 @@ import { SerialQueue } from '@aztec/foundation/queue';
|
|
|
20
20
|
import { count } from '@aztec/foundation/string';
|
|
21
21
|
import { DateProvider, Timer } from '@aztec/foundation/timer';
|
|
22
22
|
import { SiblingPath } from '@aztec/foundation/trees';
|
|
23
|
-
import type { AztecKVStore } from '@aztec/kv-store';
|
|
24
23
|
import { openTmpStore } from '@aztec/kv-store/lmdb';
|
|
25
24
|
import { RollupAbi } from '@aztec/l1-artifacts';
|
|
26
25
|
import { SHA256Trunc, StandardTree, UnbalancedTree } from '@aztec/merkle-tree';
|
|
@@ -699,14 +698,20 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable {
|
|
|
699
698
|
}
|
|
700
699
|
|
|
701
700
|
/**
|
|
702
|
-
* Returns the index
|
|
703
|
-
* @remarks
|
|
704
|
-
*
|
|
705
|
-
* The tree is
|
|
701
|
+
* Returns the index and sibling path for a L2->L1 message in a block's message tree.
|
|
702
|
+
* @remarks The message tree is constructed on-demand by taking all L2->L1 messages in a block
|
|
703
|
+
* and creating a variable depth append-only tree with the messages as leaves.
|
|
704
|
+
* The tree is constructed in two layers:
|
|
705
|
+
* 1. Subtree - For each transaction in the block, a subtree is created containing all L2->L1 messages from that
|
|
706
|
+
* transaction.
|
|
707
|
+
* 2. Top tree - A tree containing the roots of all the subtrees as leaves
|
|
708
|
+
* The final path is constructed by concatenating the path in the subtree with the path in the top tree.
|
|
709
|
+
* When there is only one transaction in the block, the subtree itself becomes the block's L2->L1 message tree,
|
|
710
|
+
* and no top tree is needed. The out hash is the root of the the block's L2->L1 message tree.
|
|
706
711
|
* TODO: Handle the case where two messages in the same tx have the same hash.
|
|
707
|
-
* @param blockNumber -
|
|
708
|
-
* @param l2ToL1Message -
|
|
709
|
-
* @returns
|
|
712
|
+
* @param blockNumber - Block number to get data from
|
|
713
|
+
* @param l2ToL1Message - Message to get index/path for
|
|
714
|
+
* @returns [index, siblingPath] for the message
|
|
710
715
|
*/
|
|
711
716
|
public async getL2ToL1MessageMembershipWitness(
|
|
712
717
|
blockNumber: L2BlockNumber,
|
|
@@ -715,70 +720,98 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable {
|
|
|
715
720
|
const block = await this.blockSource.getBlock(blockNumber === 'latest' ? await this.getBlockNumber() : blockNumber);
|
|
716
721
|
|
|
717
722
|
if (block === undefined) {
|
|
718
|
-
throw new Error('Block
|
|
723
|
+
throw new Error('Block not found in getL2ToL1MessageMembershipWitness');
|
|
719
724
|
}
|
|
720
725
|
|
|
721
|
-
const
|
|
726
|
+
const messagesPerTx = block.body.txEffects.map(txEffect => txEffect.l2ToL1Msgs);
|
|
722
727
|
|
|
723
|
-
// Find index of message
|
|
724
|
-
let
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
728
|
+
// Find index of message in subtree and index of tx in a block
|
|
729
|
+
let messageIndexInTx = -1,
|
|
730
|
+
txIndex = -1;
|
|
731
|
+
{
|
|
732
|
+
txIndex = messagesPerTx.findIndex(messages => {
|
|
733
|
+
const idx = messages.findIndex(msg => msg.equals(l2ToL1Message));
|
|
734
|
+
messageIndexInTx = Math.max(messageIndexInTx, idx);
|
|
735
|
+
return idx !== -1;
|
|
736
|
+
});
|
|
737
|
+
}
|
|
730
738
|
|
|
731
|
-
if (
|
|
739
|
+
if (txIndex === -1) {
|
|
732
740
|
throw new Error('The L2ToL1Message you are trying to prove inclusion of does not exist');
|
|
733
741
|
}
|
|
734
742
|
|
|
735
|
-
|
|
743
|
+
// Get the message path in subtree and message subtree height
|
|
744
|
+
let messagePathInSubtree: SiblingPath<number>;
|
|
745
|
+
let messageSubtreeHeight: number;
|
|
746
|
+
{
|
|
747
|
+
const subtreeStore = openTmpStore(true);
|
|
748
|
+
const txMessages = messagesPerTx[txIndex];
|
|
749
|
+
messageSubtreeHeight = txMessages.length <= 1 ? 1 : Math.ceil(Math.log2(txMessages.length));
|
|
750
|
+
const subtree = new StandardTree(
|
|
751
|
+
subtreeStore,
|
|
752
|
+
new SHA256Trunc(),
|
|
753
|
+
`subtree_${txIndex}`,
|
|
754
|
+
messageSubtreeHeight,
|
|
755
|
+
0n,
|
|
756
|
+
Fr,
|
|
757
|
+
);
|
|
758
|
+
subtree.appendLeaves(txMessages);
|
|
759
|
+
messagePathInSubtree = await subtree.getSiblingPath(BigInt(messageIndexInTx), true);
|
|
760
|
+
await subtreeStore.delete();
|
|
761
|
+
}
|
|
736
762
|
|
|
737
|
-
//
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
tree.appendLeaves(msgs);
|
|
744
|
-
return tree;
|
|
745
|
-
});
|
|
763
|
+
// If the number of txs is 1 we are dealing with a special case where the tx subtree itself is the whole block's
|
|
764
|
+
// l2 to l1 message tree.
|
|
765
|
+
const numTransactions = block.body.txEffects.length;
|
|
766
|
+
if (numTransactions === 1) {
|
|
767
|
+
return [BigInt(messageIndexInTx), messagePathInSubtree];
|
|
768
|
+
}
|
|
746
769
|
|
|
747
|
-
//
|
|
748
|
-
const
|
|
749
|
-
|
|
750
|
-
|
|
770
|
+
// Calculate roots for all tx subtrees
|
|
771
|
+
const txSubtreeRoots = await Promise.all(
|
|
772
|
+
messagesPerTx.map(async (messages, txIdx) => {
|
|
773
|
+
// For a tx with no messages, we have to set an out hash of 0 to match what the circuit does.
|
|
774
|
+
if (messages.length === 0) {
|
|
775
|
+
return Fr.ZERO;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
const txStore = openTmpStore(true);
|
|
779
|
+
const txTreeHeight = messages.length <= 1 ? 1 : Math.ceil(Math.log2(messages.length));
|
|
780
|
+
const txTree = new StandardTree(
|
|
781
|
+
txStore,
|
|
782
|
+
new SHA256Trunc(),
|
|
783
|
+
`tx_messages_subtree_${txIdx}`,
|
|
784
|
+
txTreeHeight,
|
|
785
|
+
0n,
|
|
786
|
+
Fr,
|
|
787
|
+
);
|
|
788
|
+
txTree.appendLeaves(messages);
|
|
789
|
+
const root = Fr.fromBuffer(txTree.getRoot(true));
|
|
790
|
+
await txStore.delete();
|
|
791
|
+
return root;
|
|
792
|
+
}),
|
|
751
793
|
);
|
|
752
794
|
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
795
|
+
// Construct the top tree and compute the combined path
|
|
796
|
+
let combinedPath: Buffer[];
|
|
797
|
+
{
|
|
798
|
+
const topTreeHeight = Math.ceil(Math.log2(txSubtreeRoots.length));
|
|
799
|
+
// The root of this tree is the out_hash calculated in Noir => we truncate to match Noir's SHA
|
|
800
|
+
const topTree = new UnbalancedTree(new SHA256Trunc(), 'top_tree', topTreeHeight, Fr);
|
|
801
|
+
await topTree.appendLeaves(txSubtreeRoots);
|
|
802
|
+
|
|
803
|
+
const txPathInTopTree = await topTree.getSiblingPath(txSubtreeRoots[txIndex].toBigInt());
|
|
804
|
+
// Append subtree path to top tree path
|
|
805
|
+
combinedPath = messagePathInSubtree.toBufferArray().concat(txPathInTopTree.toBufferArray());
|
|
756
806
|
}
|
|
757
807
|
|
|
758
|
-
//
|
|
759
|
-
const
|
|
760
|
-
|
|
761
|
-
);
|
|
762
|
-
const maxTreeHeight = Math.ceil(Math.log2(l2toL1SubtreeRoots.length));
|
|
763
|
-
// The root of this tree is the out_hash calculated in Noir => we truncate to match Noir's SHA
|
|
764
|
-
const outHashTree = new UnbalancedTree(new SHA256Trunc(), 'temp_outhash_sibling_path', maxTreeHeight, Fr);
|
|
765
|
-
await outHashTree.appendLeaves(l2toL1SubtreeRoots);
|
|
766
|
-
|
|
767
|
-
const pathOfTxInOutHashTree = await outHashTree.getSiblingPath(l2toL1SubtreeRoots[indexOfMsgTx].toBigInt());
|
|
768
|
-
// Append subtree path to out hash tree path
|
|
769
|
-
const mergedPath = subtreePathOfL2ToL1Message.toBufferArray().concat(pathOfTxInOutHashTree.toBufferArray());
|
|
770
|
-
// Append binary index of subtree path to binary index of out hash tree path
|
|
771
|
-
const mergedIndex = parseInt(
|
|
772
|
-
indexOfMsgTx
|
|
773
|
-
.toString(2)
|
|
774
|
-
.concat(indexOfMsgInSubtree.toString(2).padStart(l2toL1Subtrees[indexOfMsgTx].getDepth(), '0')),
|
|
808
|
+
// Append binary index of subtree path to binary index of top tree path
|
|
809
|
+
const combinedIndex = parseInt(
|
|
810
|
+
txIndex.toString(2).concat(messageIndexInTx.toString(2).padStart(messageSubtreeHeight, '0')),
|
|
775
811
|
2,
|
|
776
812
|
);
|
|
777
813
|
|
|
778
|
-
|
|
779
|
-
await Promise.all(tempStores.map(store => store.delete()));
|
|
780
|
-
|
|
781
|
-
return [BigInt(mergedIndex), new SiblingPath(mergedPath.length, mergedPath)];
|
|
814
|
+
return [BigInt(combinedIndex), new SiblingPath(combinedPath.length, combinedPath)];
|
|
782
815
|
}
|
|
783
816
|
|
|
784
817
|
/**
|