@aztec/txe 0.55.1 → 0.57.0

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.
@@ -1,8 +1,5 @@
1
1
  import {
2
2
  AuthWitness,
3
- Event,
4
- L1EventPayload,
5
- L1NotePayload,
6
3
  MerkleTreeId,
7
4
  Note,
8
5
  type NoteStatus,
@@ -10,7 +7,6 @@ import {
10
7
  PublicDataWitness,
11
8
  PublicDataWrite,
12
9
  PublicExecutionRequest,
13
- TaggedLog,
14
10
  type UnencryptedL2Log,
15
11
  } from '@aztec/circuit-types';
16
12
  import { type CircuitWitnessGenerationStats } from '@aztec/circuit-types/stats';
@@ -25,6 +21,7 @@ import {
25
21
  type NullifierLeafPreimage,
26
22
  PUBLIC_DATA_SUBTREE_HEIGHT,
27
23
  type PUBLIC_DATA_TREE_HEIGHT,
24
+ PUBLIC_DISPATCH_SELECTOR,
28
25
  PrivateCircuitPublicInputs,
29
26
  PrivateContextInputs,
30
27
  PublicDataTreeLeaf,
@@ -34,24 +31,22 @@ import {
34
31
  deriveKeys,
35
32
  getContractClassFromArtifact,
36
33
  } from '@aztec/circuits.js';
37
- import { Aes128, Schnorr } from '@aztec/circuits.js/barretenberg';
34
+ import { Schnorr } from '@aztec/circuits.js/barretenberg';
38
35
  import { computePublicDataTreeLeafSlot, siloNoteHash, siloNullifier } from '@aztec/circuits.js/hash';
39
36
  import {
40
37
  type ContractArtifact,
41
- EventSelector,
42
38
  type FunctionAbi,
43
39
  FunctionSelector,
44
40
  type NoteSelector,
45
41
  countArgumentsSize,
46
42
  } from '@aztec/foundation/abi';
47
43
  import { AztecAddress } from '@aztec/foundation/aztec-address';
48
- import { Fr, GrumpkinScalar, type Point } from '@aztec/foundation/fields';
44
+ import { Fr } from '@aztec/foundation/fields';
49
45
  import { type Logger, applyStringFormatting } from '@aztec/foundation/log';
50
46
  import { Timer } from '@aztec/foundation/timer';
51
47
  import { type KeyStore } from '@aztec/key-store';
52
48
  import { ContractDataOracle } from '@aztec/pxe';
53
49
  import {
54
- ContractsDataSourcePublicDB,
55
50
  ExecutionError,
56
51
  type ExecutionNoteCache,
57
52
  type MessageLoadOracleInputs,
@@ -60,7 +55,6 @@ import {
60
55
  type PackedValuesCache,
61
56
  PublicExecutor,
62
57
  type TypedOracle,
63
- WorldStateDB,
64
58
  acvm,
65
59
  createSimulationError,
66
60
  extractCallStack,
@@ -74,7 +68,7 @@ import { MerkleTreeSnapshotOperationsFacade, type MerkleTrees } from '@aztec/wor
74
68
 
75
69
  import { type TXEDatabase } from '../util/txe_database.js';
76
70
  import { TXEPublicContractDataSource } from '../util/txe_public_contract_data_source.js';
77
- import { TXEPublicStateDB } from '../util/txe_public_state_db.js';
71
+ import { TXEWorldStateDB } from '../util/txe_world_state_db.js';
78
72
 
79
73
  export class TXE implements TypedOracle {
80
74
  private blockNumber = 0;
@@ -82,6 +76,7 @@ export class TXE implements TypedOracle {
82
76
  private contractAddress: AztecAddress;
83
77
  private msgSender: AztecAddress;
84
78
  private functionSelector = FunctionSelector.fromField(new Fr(0));
79
+ private isStaticCall = false;
85
80
  // This will hold the _real_ calldata. That is, the one without the PublicContextInputs.
86
81
  // TODO: Remove this comment once PublicContextInputs are removed.
87
82
  private calldata: Fr[] = [];
@@ -132,9 +127,7 @@ export class TXE implements TypedOracle {
132
127
  }
133
128
 
134
129
  getCalldata() {
135
- // TODO: Remove this once PublicContextInputs are removed.
136
- const inputs = this.getPublicContextInputs();
137
- return [...inputs.toFields(), ...this.calldata];
130
+ return this.calldata;
138
131
  }
139
132
 
140
133
  setMsgSender(msgSender: Fr) {
@@ -215,17 +208,6 @@ export class TXE implements TypedOracle {
215
208
  return inputs;
216
209
  }
217
210
 
218
- getPublicContextInputs() {
219
- const inputs = {
220
- calldataLength: new Fr(this.calldata.length),
221
- isStaticCall: false,
222
- toFields: function () {
223
- return [this.calldataLength, new Fr(this.isStaticCall)];
224
- },
225
- };
226
- return inputs;
227
- }
228
-
229
211
  async avmOpcodeNullifierExists(innerNullifier: Fr, targetAddress: AztecAddress): Promise<boolean> {
230
212
  const nullifier = siloNullifier(targetAddress, innerNullifier!);
231
213
  const db = this.trees.asLatest();
@@ -283,6 +265,14 @@ export class TXE implements TypedOracle {
283
265
  return Promise.resolve(this.contractAddress);
284
266
  }
285
267
 
268
+ setIsStaticCall(isStatic: boolean) {
269
+ this.isStaticCall = isStatic;
270
+ }
271
+
272
+ getIsStaticCall() {
273
+ return this.isStaticCall;
274
+ }
275
+
286
276
  getRandomField() {
287
277
  return Fr.random();
288
278
  }
@@ -549,24 +539,6 @@ export class TXE implements TypedOracle {
549
539
  return;
550
540
  }
551
541
 
552
- computeEncryptedNoteLog(
553
- contractAddress: AztecAddress,
554
- storageSlot: Fr,
555
- noteTypeId: NoteSelector,
556
- ovKeys: KeyValidationRequest,
557
- ivpkM: Point,
558
- recipient: AztecAddress,
559
- preimage: Fr[],
560
- ): Buffer {
561
- const note = new Note(preimage);
562
- const l1NotePayload = new L1NotePayload(note, contractAddress, storageSlot, noteTypeId);
563
- const taggedNote = new TaggedLog(l1NotePayload);
564
-
565
- const ephSk = GrumpkinScalar.random();
566
-
567
- return taggedNote.encrypt(ephSk, recipient, ivpkM, ovKeys);
568
- }
569
-
570
542
  emitUnencryptedLog(_log: UnencryptedL2Log, counter: number): void {
571
543
  this.sideEffectsCounter = counter + 1;
572
544
  return;
@@ -585,10 +557,10 @@ export class TXE implements TypedOracle {
585
557
  isDelegateCall: boolean,
586
558
  ) {
587
559
  this.logger.verbose(
588
- `Executing external function ${targetContractAddress}:${functionSelector}(${await this.getDebugFunctionName(
560
+ `Executing external function ${await this.getDebugFunctionName(
589
561
  targetContractAddress,
590
562
  functionSelector,
591
- )}) isStaticCall=${isStaticCall} isDelegateCall=${isDelegateCall}`,
563
+ )}@${targetContractAddress} isStaticCall=${isStaticCall} isDelegateCall=${isDelegateCall}`,
592
564
  );
593
565
 
594
566
  // Store and modify env
@@ -708,25 +680,14 @@ export class TXE implements TypedOracle {
708
680
  return `${artifact.name}:${f.name}`;
709
681
  }
710
682
 
711
- async executePublicFunction(
712
- targetContractAddress: AztecAddress,
713
- args: Fr[],
714
- callContext: CallContext,
715
- counter: number,
716
- ) {
717
- const header = Header.empty();
718
- header.state = await this.trees.getStateReference(true);
719
- header.globalVariables.blockNumber = new Fr(await this.getBlockNumber());
683
+ executePublicFunction(targetContractAddress: AztecAddress, args: Fr[], callContext: CallContext, counter: number) {
720
684
  const executor = new PublicExecutor(
721
- new TXEPublicStateDB(this),
722
- new ContractsDataSourcePublicDB(new TXEPublicContractDataSource(this)),
723
- new WorldStateDB(this.trees.asLatest()),
724
- header,
685
+ new TXEWorldStateDB(this.trees.asLatest(), new TXEPublicContractDataSource(this)),
725
686
  new NoopTelemetryClient(),
726
687
  );
727
688
  const execution = new PublicExecutionRequest(targetContractAddress, callContext, args);
728
689
 
729
- return executor.simulate(
690
+ const executionResult = executor.simulate(
730
691
  execution,
731
692
  GlobalVariables.empty(),
732
693
  Gas.test(),
@@ -735,6 +696,7 @@ export class TXE implements TypedOracle {
735
696
  /* transactionFee */ Fr.ONE,
736
697
  counter,
737
698
  );
699
+ return Promise.resolve(executionResult);
738
700
  }
739
701
 
740
702
  async avmOpcodeCall(
@@ -785,7 +747,7 @@ export class TXE implements TypedOracle {
785
747
  sideEffectCounter: number,
786
748
  isStaticCall: boolean,
787
749
  isDelegateCall: boolean,
788
- ) {
750
+ ): Promise<Fr> {
789
751
  // Store and modify env
790
752
  const currentContractAddress = AztecAddress.fromField(this.contractAddress);
791
753
  const currentMessageSender = AztecAddress.fromField(this.msgSender);
@@ -796,12 +758,13 @@ export class TXE implements TypedOracle {
796
758
 
797
759
  const callContext = CallContext.empty();
798
760
  callContext.msgSender = this.msgSender;
799
- callContext.functionSelector = this.functionSelector;
761
+ callContext.functionSelector = FunctionSelector.fromField(new Fr(PUBLIC_DISPATCH_SELECTOR));
800
762
  callContext.storageContractAddress = targetContractAddress;
801
763
  callContext.isStaticCall = isStaticCall;
802
764
  callContext.isDelegateCall = isDelegateCall;
803
765
 
804
- const args = this.packedValuesCache.unpack(argsHash);
766
+ const args = [this.functionSelector.toField(), ...this.packedValuesCache.unpack(argsHash)];
767
+ const newArgsHash = this.packedValuesCache.pack(args);
805
768
 
806
769
  const executionResult = await this.executePublicFunction(
807
770
  targetContractAddress,
@@ -819,6 +782,8 @@ export class TXE implements TypedOracle {
819
782
  this.setContractAddress(currentContractAddress);
820
783
  this.setMsgSender(currentMessageSender);
821
784
  this.setFunctionSelector(currentFunctionSelector);
785
+
786
+ return newArgsHash;
822
787
  }
823
788
 
824
789
  async setPublicTeardownFunctionCall(
@@ -828,10 +793,10 @@ export class TXE implements TypedOracle {
828
793
  sideEffectCounter: number,
829
794
  isStaticCall: boolean,
830
795
  isDelegateCall: boolean,
831
- ) {
796
+ ): Promise<Fr> {
832
797
  // Definitely not right, in that the teardown should always be last.
833
798
  // But useful for executing flows.
834
- await this.enqueuePublicFunctionCall(
799
+ return await this.enqueuePublicFunctionCall(
835
800
  targetContractAddress,
836
801
  functionSelector,
837
802
  argsHash,
@@ -845,11 +810,6 @@ export class TXE implements TypedOracle {
845
810
  this.noteCache.setMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter);
846
811
  }
847
812
 
848
- aes128Encrypt(input: Buffer, initializationVector: Buffer, key: Buffer): Buffer {
849
- const aes128 = new Aes128();
850
- return aes128.encryptBufferCBC(input, initializationVector, key);
851
- }
852
-
853
813
  debugLog(message: string, fields: Fr[]): void {
854
814
  this.logger.verbose(`debug_log ${applyStringFormatting(message, fields)}`);
855
815
  }
@@ -863,22 +823,4 @@ export class TXE implements TypedOracle {
863
823
  this.sideEffectsCounter = counter + 1;
864
824
  return;
865
825
  }
866
-
867
- computeEncryptedEventLog(
868
- contractAddress: AztecAddress,
869
- randomness: Fr,
870
- eventTypeId: Fr,
871
- ovKeys: KeyValidationRequest,
872
- ivpkM: Point,
873
- recipient: AztecAddress,
874
- preimage: Fr[],
875
- ): Buffer {
876
- const event = new Event(preimage);
877
- const l1EventPayload = new L1EventPayload(event, contractAddress, randomness, EventSelector.fromField(eventTypeId));
878
- const taggedEvent = new TaggedLog(l1EventPayload);
879
-
880
- const ephSk = GrumpkinScalar.random();
881
-
882
- return taggedEvent.encrypt(ephSk, recipient, ivpkM, ovKeys);
883
- }
884
826
  }
@@ -4,9 +4,7 @@ import {
4
4
  Fr,
5
5
  FunctionSelector,
6
6
  Header,
7
- KeyValidationRequest,
8
7
  PUBLIC_DATA_SUBTREE_HEIGHT,
9
- Point,
10
8
  PublicDataTreeLeaf,
11
9
  computePartialAddress,
12
10
  getContractInstanceFromDeployParams,
@@ -59,11 +57,6 @@ export class TXEService {
59
57
  return toForeignCallResult(inputs.toFields().map(toSingle));
60
58
  }
61
59
 
62
- getPublicContextInputs() {
63
- const inputs = (this.typedOracle as TXE).getPublicContextInputs();
64
- return toForeignCallResult(inputs.toFields().map(toSingle));
65
- }
66
-
67
60
  async advanceBlocksBy(blocks: ForeignCallSingle) {
68
61
  const nBlocks = fromSingle(blocks).toNumber();
69
62
  this.logger.debug(`time traveling ${nBlocks} blocks`);
@@ -313,6 +306,16 @@ export class TXEService {
313
306
  return toForeignCallResult([toSingle(functionSelector.toField())]);
314
307
  }
315
308
 
309
+ setIsStaticCall(isStaticCall: ForeignCallSingle) {
310
+ (this.typedOracle as TXE).setIsStaticCall(fromSingle(isStaticCall).toBool());
311
+ return toForeignCallResult([]);
312
+ }
313
+
314
+ avmOpcodeIsStaticCall() {
315
+ const isStaticCall = (this.typedOracle as TXE).getIsStaticCall();
316
+ return toForeignCallResult([toSingle(new Fr(isStaticCall ? 1 : 0))]);
317
+ }
318
+
316
319
  async avmOpcodeChainId() {
317
320
  const chainId = await (this.typedOracle as TXE).getChainId();
318
321
  return toForeignCallResult([toSingle(chainId)]);
@@ -609,46 +612,13 @@ export class TXEService {
609
612
  return toForeignCallResult([toArray(keyValidationRequest.toFields())]);
610
613
  }
611
614
 
612
- computeEncryptedNoteLog(
613
- contractAddress: ForeignCallSingle,
614
- storageSlot: ForeignCallSingle,
615
- noteTypeId: ForeignCallSingle,
616
- ovskApp: ForeignCallSingle,
617
- ovpkMX: ForeignCallSingle,
618
- ovpkMY: ForeignCallSingle,
619
- ovpkMIsInfinite: ForeignCallSingle,
620
- ivpkMX: ForeignCallSingle,
621
- ivpkMY: ForeignCallSingle,
622
- ivpkMIsInfinite: ForeignCallSingle,
623
- recipient: ForeignCallSingle,
624
- preimage: ForeignCallArray,
625
- ) {
626
- const ovpkM = new Point(fromSingle(ovpkMX), fromSingle(ovpkMY), !fromSingle(ovpkMIsInfinite).isZero());
627
- const ovKeys = new KeyValidationRequest(ovpkM, Fr.fromString(fromSingle(ovskApp).toString()));
628
- const ivpkM = new Point(fromSingle(ivpkMX), fromSingle(ivpkMY), !fromSingle(ivpkMIsInfinite).isZero());
629
- const encLog = this.typedOracle.computeEncryptedNoteLog(
630
- AztecAddress.fromString(fromSingle(contractAddress).toString()),
631
- Fr.fromString(fromSingle(storageSlot).toString()),
632
- NoteSelector.fromField(Fr.fromString(fromSingle(noteTypeId).toString())),
633
- ovKeys,
634
- ivpkM,
635
- AztecAddress.fromString(fromSingle(recipient).toString()),
636
- fromArray(preimage),
637
- );
638
- const bytes: Fr[] = [];
639
-
640
- encLog.forEach(v => {
641
- bytes.push(new Fr(v));
642
- });
643
- return toForeignCallResult([toArray(bytes)]);
644
- }
645
-
646
615
  emitEncryptedLog(
647
616
  _contractAddress: ForeignCallSingle,
648
617
  _randomness: ForeignCallSingle,
649
618
  _encryptedLog: ForeignCallSingle,
650
619
  _counter: ForeignCallSingle,
651
620
  ) {
621
+ // TODO(#8811): Implement
652
622
  return toForeignCallResult([]);
653
623
  }
654
624
 
@@ -657,10 +627,12 @@ export class TXEService {
657
627
  _encryptedNote: ForeignCallArray,
658
628
  _counter: ForeignCallSingle,
659
629
  ) {
630
+ // TODO(#8811): Implement
660
631
  return toForeignCallResult([]);
661
632
  }
662
633
 
663
634
  emitEncryptedEventLog(_contractAddress: AztecAddress, _randomness: Fr, _encryptedEvent: Buffer, _counter: number) {
635
+ // TODO(#8811): Implement
664
636
  return toForeignCallResult([]);
665
637
  }
666
638
 
@@ -709,7 +681,7 @@ export class TXEService {
709
681
  isStaticCall: ForeignCallSingle,
710
682
  isDelegateCall: ForeignCallSingle,
711
683
  ) {
712
- await this.typedOracle.enqueuePublicFunctionCall(
684
+ const newArgsHash = await this.typedOracle.enqueuePublicFunctionCall(
713
685
  fromSingle(targetContractAddress),
714
686
  FunctionSelector.fromField(fromSingle(functionSelector)),
715
687
  fromSingle(argsHash),
@@ -717,7 +689,7 @@ export class TXEService {
717
689
  fromSingle(isStaticCall).toBool(),
718
690
  fromSingle(isDelegateCall).toBool(),
719
691
  );
720
- return toForeignCallResult([]);
692
+ return toForeignCallResult([toSingle(newArgsHash)]);
721
693
  }
722
694
 
723
695
  public async setPublicTeardownFunctionCall(
@@ -728,7 +700,7 @@ export class TXEService {
728
700
  isStaticCall: ForeignCallSingle,
729
701
  isDelegateCall: ForeignCallSingle,
730
702
  ) {
731
- await this.typedOracle.setPublicTeardownFunctionCall(
703
+ const newArgsHash = await this.typedOracle.setPublicTeardownFunctionCall(
732
704
  fromSingle(targetContractAddress),
733
705
  FunctionSelector.fromField(fromSingle(functionSelector)),
734
706
  fromSingle(argsHash),
@@ -736,7 +708,7 @@ export class TXEService {
736
708
  fromSingle(isStaticCall).toBool(),
737
709
  fromSingle(isDelegateCall).toBool(),
738
710
  );
739
- return toForeignCallResult([]);
711
+ return toForeignCallResult([toSingle(newArgsHash)]);
740
712
  }
741
713
 
742
714
  public notifySetMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter: ForeignCallSingle) {
@@ -781,4 +753,14 @@ export class TXEService {
781
753
  }
782
754
  return toForeignCallResult([toArray(witness)]);
783
755
  }
756
+
757
+ emitUnencryptedLog(_contractAddress: ForeignCallSingle, _message: ForeignCallArray, _counter: ForeignCallSingle) {
758
+ // TODO(#8811): Implement
759
+ return toForeignCallResult([]);
760
+ }
761
+
762
+ avmOpcodeEmitUnencryptedLog(_message: ForeignCallArray) {
763
+ // TODO(#8811): Implement
764
+ return toForeignCallResult([]);
765
+ }
784
766
  }
@@ -1,4 +1,4 @@
1
- import { type AztecAddress, Fr, type FunctionSelector, unpackBytecode } from '@aztec/circuits.js';
1
+ import { type AztecAddress, Fr, FunctionSelector, PUBLIC_DISPATCH_SELECTOR } from '@aztec/circuits.js';
2
2
  import { type ContractArtifact } from '@aztec/foundation/abi';
3
3
  import { PrivateFunctionsTree } from '@aztec/pxe';
4
4
  import {
@@ -31,11 +31,19 @@ export class TXEPublicContractDataSource implements ContractDataSource {
31
31
  const tree = new PrivateFunctionsTree(artifact);
32
32
  const privateFunctionsRoot = tree.getFunctionTreeRoot();
33
33
 
34
+ const publicFunctions: PublicFunction[] = [];
35
+ if (contractClass!.packedBytecode.length > 0) {
36
+ publicFunctions.push({
37
+ selector: FunctionSelector.fromField(new Fr(PUBLIC_DISPATCH_SELECTOR)),
38
+ bytecode: contractClass!.packedBytecode,
39
+ });
40
+ }
41
+
34
42
  return {
35
43
  id,
36
44
  artifactHash: contractClass!.artifactHash,
37
45
  packedBytecode: contractClass!.packedBytecode,
38
- publicFunctions: unpackBytecode(contractClass!.packedBytecode),
46
+ publicFunctions: publicFunctions,
39
47
  privateFunctionsRoot: new Fr(privateFunctionsRoot!.root),
40
48
  version: contractClass!.version,
41
49
  privateFunctions: [],
@@ -0,0 +1,55 @@
1
+ import { MerkleTreeId, type MerkleTreeOperations } from '@aztec/circuit-types';
2
+ import {
3
+ type AztecAddress,
4
+ Fr,
5
+ PUBLIC_DATA_SUBTREE_HEIGHT,
6
+ PublicDataTreeLeaf,
7
+ type PublicDataTreeLeafPreimage,
8
+ } from '@aztec/circuits.js';
9
+ import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash';
10
+ import { WorldStateDB } from '@aztec/simulator';
11
+ import { type ContractDataSource } from '@aztec/types/contracts';
12
+
13
+ export class TXEWorldStateDB extends WorldStateDB {
14
+ constructor(private merkleDb: MerkleTreeOperations, dataSource: ContractDataSource) {
15
+ super(merkleDb, dataSource);
16
+ }
17
+
18
+ override async storageRead(contract: AztecAddress, slot: Fr): Promise<Fr> {
19
+ const leafSlot = computePublicDataTreeLeafSlot(contract, slot).toBigInt();
20
+
21
+ const lowLeafResult = await this.merkleDb.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot);
22
+
23
+ let value = Fr.ZERO;
24
+ if (lowLeafResult && lowLeafResult.alreadyPresent) {
25
+ const preimage = (await this.merkleDb.getLeafPreimage(
26
+ MerkleTreeId.PUBLIC_DATA_TREE,
27
+ lowLeafResult.index,
28
+ )) as PublicDataTreeLeafPreimage;
29
+ value = preimage.value;
30
+ }
31
+ return value;
32
+ }
33
+
34
+ override async storageWrite(contract: AztecAddress, slot: Fr, newValue: Fr): Promise<bigint> {
35
+ await this.merkleDb.batchInsert(
36
+ MerkleTreeId.PUBLIC_DATA_TREE,
37
+ [new PublicDataTreeLeaf(computePublicDataTreeLeafSlot(contract, slot), newValue).toBuffer()],
38
+ PUBLIC_DATA_SUBTREE_HEIGHT,
39
+ );
40
+ return newValue.toBigInt();
41
+ }
42
+
43
+ override checkpoint(): Promise<void> {
44
+ return Promise.resolve();
45
+ }
46
+ override rollbackToCheckpoint(): Promise<void> {
47
+ throw new Error('Cannot rollback');
48
+ }
49
+ override commit(): Promise<void> {
50
+ return Promise.resolve();
51
+ }
52
+ override rollbackToCommit(): Promise<void> {
53
+ throw new Error('Cannot rollback');
54
+ }
55
+ }
@@ -1,14 +0,0 @@
1
- import { type AztecAddress, Fr } from '@aztec/circuits.js';
2
- import { type PublicStateDB } from '@aztec/simulator';
3
- import { type TXE } from '../oracle/txe_oracle.js';
4
- export declare class TXEPublicStateDB implements PublicStateDB {
5
- private txeOracle;
6
- constructor(txeOracle: TXE);
7
- storageRead(contract: AztecAddress, slot: Fr): Promise<Fr>;
8
- storageWrite(contract: AztecAddress, slot: Fr, newValue: Fr): Promise<bigint>;
9
- checkpoint(): Promise<void>;
10
- rollbackToCheckpoint(): Promise<void>;
11
- commit(): Promise<void>;
12
- rollbackToCommit(): Promise<void>;
13
- }
14
- //# sourceMappingURL=txe_public_state_db.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"txe_public_state_db.d.ts","sourceRoot":"","sources":["../../src/util/txe_public_state_db.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,YAAY,EACjB,EAAE,EAIH,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAEnD,qBAAa,gBAAiB,YAAW,aAAa;IACxC,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,GAAG;IAE5B,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;IAiB1D,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAWnF,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAG3B,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAGrC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAGvB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
@@ -1,37 +0,0 @@
1
- import { MerkleTreeId } from '@aztec/circuit-types';
2
- import { Fr, PUBLIC_DATA_SUBTREE_HEIGHT, PublicDataTreeLeaf, } from '@aztec/circuits.js';
3
- import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash';
4
- export class TXEPublicStateDB {
5
- constructor(txeOracle) {
6
- this.txeOracle = txeOracle;
7
- }
8
- async storageRead(contract, slot) {
9
- const db = this.txeOracle.getTrees().asLatest();
10
- const leafSlot = computePublicDataTreeLeafSlot(contract, slot).toBigInt();
11
- const lowLeafResult = await db.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot);
12
- let value = Fr.ZERO;
13
- if (lowLeafResult && lowLeafResult.alreadyPresent) {
14
- const preimage = (await db.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index));
15
- value = preimage.value;
16
- }
17
- return value;
18
- }
19
- async storageWrite(contract, slot, newValue) {
20
- const db = this.txeOracle.getTrees().asLatest();
21
- await db.batchInsert(MerkleTreeId.PUBLIC_DATA_TREE, [new PublicDataTreeLeaf(computePublicDataTreeLeafSlot(contract, slot), newValue).toBuffer()], PUBLIC_DATA_SUBTREE_HEIGHT);
22
- return newValue.toBigInt();
23
- }
24
- checkpoint() {
25
- return Promise.resolve();
26
- }
27
- rollbackToCheckpoint() {
28
- throw new Error('Cannot rollback');
29
- }
30
- commit() {
31
- return Promise.resolve();
32
- }
33
- rollbackToCommit() {
34
- throw new Error('Cannot rollback');
35
- }
36
- }
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhlX3B1YmxpY19zdGF0ZV9kYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL3R4ZV9wdWJsaWNfc3RhdGVfZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFFTCxFQUFFLEVBQ0YsMEJBQTBCLEVBQzFCLGtCQUFrQixHQUVuQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBS3hFLE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsWUFBb0IsU0FBYztRQUFkLGNBQVMsR0FBVCxTQUFTLENBQUs7SUFBRyxDQUFDO0lBRXRDLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBc0IsRUFBRSxJQUFRO1FBQ2hELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEQsTUFBTSxRQUFRLEdBQUcsNkJBQTZCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRTFFLE1BQU0sYUFBYSxHQUFHLE1BQU0sRUFBRSxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUU5RixJQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ3BCLElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNsRCxNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLGVBQWUsQ0FDeEMsWUFBWSxDQUFDLGdCQUFnQixFQUM3QixhQUFhLENBQUMsS0FBSyxDQUNwQixDQUErQixDQUFDO1lBQ2pDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQXNCLEVBQUUsSUFBUSxFQUFFLFFBQVk7UUFDL0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVoRCxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQ2xCLFlBQVksQ0FBQyxnQkFBZ0IsRUFDN0IsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLDZCQUE2QixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUM1RiwwQkFBMEIsQ0FDM0IsQ0FBQztRQUNGLE9BQU8sUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNELG9CQUFvQjtRQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELE1BQU07UUFDSixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ0QsZ0JBQWdCO1FBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Q0FDRiJ9
@@ -1,57 +0,0 @@
1
- import { MerkleTreeId } from '@aztec/circuit-types';
2
- import {
3
- type AztecAddress,
4
- Fr,
5
- PUBLIC_DATA_SUBTREE_HEIGHT,
6
- PublicDataTreeLeaf,
7
- type PublicDataTreeLeafPreimage,
8
- } from '@aztec/circuits.js';
9
- import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash';
10
- import { type PublicStateDB } from '@aztec/simulator';
11
-
12
- import { type TXE } from '../oracle/txe_oracle.js';
13
-
14
- export class TXEPublicStateDB implements PublicStateDB {
15
- constructor(private txeOracle: TXE) {}
16
-
17
- async storageRead(contract: AztecAddress, slot: Fr): Promise<Fr> {
18
- const db = this.txeOracle.getTrees().asLatest();
19
- const leafSlot = computePublicDataTreeLeafSlot(contract, slot).toBigInt();
20
-
21
- const lowLeafResult = await db.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot);
22
-
23
- let value = Fr.ZERO;
24
- if (lowLeafResult && lowLeafResult.alreadyPresent) {
25
- const preimage = (await db.getLeafPreimage(
26
- MerkleTreeId.PUBLIC_DATA_TREE,
27
- lowLeafResult.index,
28
- )) as PublicDataTreeLeafPreimage;
29
- value = preimage.value;
30
- }
31
- return value;
32
- }
33
-
34
- async storageWrite(contract: AztecAddress, slot: Fr, newValue: Fr): Promise<bigint> {
35
- const db = this.txeOracle.getTrees().asLatest();
36
-
37
- await db.batchInsert(
38
- MerkleTreeId.PUBLIC_DATA_TREE,
39
- [new PublicDataTreeLeaf(computePublicDataTreeLeafSlot(contract, slot), newValue).toBuffer()],
40
- PUBLIC_DATA_SUBTREE_HEIGHT,
41
- );
42
- return newValue.toBigInt();
43
- }
44
-
45
- checkpoint(): Promise<void> {
46
- return Promise.resolve();
47
- }
48
- rollbackToCheckpoint(): Promise<void> {
49
- throw new Error('Cannot rollback');
50
- }
51
- commit(): Promise<void> {
52
- return Promise.resolve();
53
- }
54
- rollbackToCommit(): Promise<void> {
55
- throw new Error('Cannot rollback');
56
- }
57
- }