@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.
- package/dest/bin/index.js +0 -0
- package/dest/oracle/txe_oracle.d.ts +6 -11
- package/dest/oracle/txe_oracle.d.ts.map +1 -1
- package/dest/oracle/txe_oracle.js +26 -49
- package/dest/txe_service/txe_service.d.ts +12 -6
- package/dest/txe_service/txe_service.d.ts.map +1 -1
- package/dest/txe_service/txe_service.js +25 -21
- package/dest/util/txe_public_contract_data_source.d.ts +1 -1
- package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
- package/dest/util/txe_public_contract_data_source.js +10 -3
- package/dest/util/txe_world_state_db.d.ts +15 -0
- package/dest/util/txe_world_state_db.d.ts.map +1 -0
- package/dest/util/txe_world_state_db.js +37 -0
- package/package.json +17 -14
- package/src/oracle/txe_oracle.ts +28 -86
- package/src/txe_service/txe_service.ts +27 -45
- package/src/util/txe_public_contract_data_source.ts +10 -2
- package/src/util/txe_world_state_db.ts +55 -0
- package/dest/util/txe_public_state_db.d.ts +0 -14
- package/dest/util/txe_public_state_db.d.ts.map +0 -1
- package/dest/util/txe_public_state_db.js +0 -37
- package/src/util/txe_public_state_db.ts +0 -57
package/src/oracle/txe_oracle.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
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 {
|
|
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
|
-
|
|
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 ${
|
|
560
|
+
`Executing external function ${await this.getDebugFunctionName(
|
|
589
561
|
targetContractAddress,
|
|
590
562
|
functionSelector,
|
|
591
|
-
)}
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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,
|
|
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:
|
|
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
|
-
}
|