@aztec/pxe 0.56.0 → 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/database/deferred_note_dao.d.ts +6 -2
- package/dest/database/deferred_note_dao.d.ts.map +1 -1
- package/dest/database/deferred_note_dao.js +8 -5
- package/dest/database/incoming_note_dao.d.ts +3 -1
- package/dest/database/incoming_note_dao.d.ts.map +1 -1
- package/dest/database/incoming_note_dao.js +5 -1
- package/dest/database/kv_pxe_database.d.ts.map +1 -1
- package/dest/database/kv_pxe_database.js +3 -2
- package/dest/database/outgoing_note_dao.d.ts +3 -1
- package/dest/database/outgoing_note_dao.d.ts.map +1 -1
- package/dest/database/outgoing_note_dao.js +5 -1
- package/dest/kernel_oracle/index.d.ts +1 -1
- package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.d.ts +28 -0
- package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.d.ts.map +1 -0
- package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.js +260 -0
- package/dest/kernel_prover/hints/index.d.ts +1 -2
- package/dest/kernel_prover/hints/index.d.ts.map +1 -1
- package/dest/kernel_prover/hints/index.js +2 -3
- package/dest/kernel_prover/kernel_prover.d.ts +2 -4
- package/dest/kernel_prover/kernel_prover.d.ts.map +1 -1
- package/dest/kernel_prover/kernel_prover.js +26 -25
- package/dest/kernel_prover/test/test_circuit_prover.d.ts +2 -3
- package/dest/kernel_prover/test/test_circuit_prover.d.ts.map +1 -1
- package/dest/kernel_prover/test/test_circuit_prover.js +8 -11
- package/dest/note_processor/note_processor.d.ts.map +1 -1
- package/dest/note_processor/note_processor.js +13 -15
- package/dest/note_processor/utils/add_nullable_field_to_payload.d.ts +12 -0
- package/dest/note_processor/utils/add_nullable_field_to_payload.d.ts.map +1 -0
- package/dest/note_processor/utils/add_nullable_field_to_payload.js +46 -0
- package/dest/note_processor/utils/brute_force_note_info.d.ts +26 -0
- package/dest/note_processor/utils/brute_force_note_info.d.ts.map +1 -0
- package/dest/note_processor/utils/brute_force_note_info.js +52 -0
- package/dest/note_processor/utils/index.d.ts +3 -0
- package/dest/note_processor/utils/index.d.ts.map +1 -0
- package/dest/note_processor/utils/index.js +2 -0
- package/dest/note_processor/{produce_note_dao.d.ts → utils/produce_note_daos.d.ts} +12 -8
- package/dest/note_processor/utils/produce_note_daos.d.ts.map +1 -0
- package/dest/note_processor/utils/produce_note_daos.js +53 -0
- package/dest/note_processor/utils/produce_note_daos_for_key.d.ts +9 -0
- package/dest/note_processor/utils/produce_note_daos_for_key.d.ts.map +1 -0
- package/dest/note_processor/utils/produce_note_daos_for_key.js +80 -0
- package/dest/pxe_http/pxe_http_server.d.ts.map +1 -1
- package/dest/pxe_http/pxe_http_server.js +12 -4
- package/dest/pxe_service/pxe_service.d.ts +3 -3
- package/dest/pxe_service/pxe_service.d.ts.map +1 -1
- package/dest/pxe_service/pxe_service.js +36 -38
- package/package.json +17 -14
- package/src/database/deferred_note_dao.ts +5 -1
- package/src/database/incoming_note_dao.ts +24 -1
- package/src/database/kv_pxe_database.ts +3 -1
- package/src/database/outgoing_note_dao.ts +23 -1
- package/src/kernel_prover/hints/build_private_kernel_reset_private_inputs.ts +467 -0
- package/src/kernel_prover/hints/index.ts +1 -2
- package/src/kernel_prover/kernel_prover.ts +53 -76
- package/src/kernel_prover/test/test_circuit_prover.ts +11 -15
- package/src/note_processor/note_processor.ts +30 -21
- package/src/note_processor/utils/add_nullable_field_to_payload.ts +67 -0
- package/src/note_processor/utils/brute_force_note_info.ts +82 -0
- package/src/note_processor/utils/index.ts +2 -0
- package/src/note_processor/utils/produce_note_daos.ts +114 -0
- package/src/note_processor/utils/produce_note_daos_for_key.ts +157 -0
- package/src/pxe_http/pxe_http_server.ts +18 -3
- package/src/pxe_service/pxe_service.ts +53 -71
- package/dest/kernel_prover/hints/build_private_kernel_reset_hints.d.ts +0 -5
- package/dest/kernel_prover/hints/build_private_kernel_reset_hints.d.ts.map +0 -1
- package/dest/kernel_prover/hints/build_private_kernel_reset_hints.js +0 -90
- package/dest/kernel_prover/hints/needs_reset.d.ts +0 -5
- package/dest/kernel_prover/hints/needs_reset.d.ts.map +0 -1
- package/dest/kernel_prover/hints/needs_reset.js +0 -38
- package/dest/note_processor/produce_note_dao.d.ts.map +0 -1
- package/dest/note_processor/produce_note_dao.js +0 -131
- package/src/kernel_prover/hints/build_private_kernel_reset_hints.ts +0 -249
- package/src/kernel_prover/hints/needs_reset.ts +0 -54
- package/src/note_processor/produce_note_dao.ts +0 -235
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
type AuthWitness,
|
|
3
3
|
type AztecNode,
|
|
4
|
-
EncryptedNoteTxL2Logs,
|
|
5
|
-
EncryptedTxL2Logs,
|
|
6
4
|
type EventMetadata,
|
|
7
5
|
EventType,
|
|
8
6
|
type ExtendedNote,
|
|
@@ -16,17 +14,20 @@ import {
|
|
|
16
14
|
type OutgoingNotesFilter,
|
|
17
15
|
type PXE,
|
|
18
16
|
type PXEInfo,
|
|
17
|
+
type PrivateExecutionResult,
|
|
19
18
|
type PrivateKernelProver,
|
|
19
|
+
type PrivateKernelSimulateOutput,
|
|
20
|
+
PrivateSimulationResult,
|
|
21
|
+
type PublicSimulationOutput,
|
|
20
22
|
type SiblingPath,
|
|
21
|
-
SimulatedTx,
|
|
22
23
|
SimulationError,
|
|
23
|
-
|
|
24
|
-
Tx,
|
|
24
|
+
type Tx,
|
|
25
25
|
type TxEffect,
|
|
26
26
|
type TxExecutionRequest,
|
|
27
27
|
type TxHash,
|
|
28
|
+
TxProvingResult,
|
|
28
29
|
type TxReceipt,
|
|
29
|
-
|
|
30
|
+
TxSimulationResult,
|
|
30
31
|
UniqueNote,
|
|
31
32
|
getNonNullifiedL1ToL2MessageWitness,
|
|
32
33
|
isNoirCallStackUnresolved,
|
|
@@ -36,7 +37,9 @@ import {
|
|
|
36
37
|
AztecAddress,
|
|
37
38
|
type CompleteAddress,
|
|
38
39
|
type L1_TO_L2_MSG_TREE_HEIGHT,
|
|
40
|
+
PUBLIC_DISPATCH_SELECTOR,
|
|
39
41
|
type PartialAddress,
|
|
42
|
+
type PrivateKernelTailCircuitPublicInputs,
|
|
40
43
|
computeContractAddressFromInstance,
|
|
41
44
|
computeContractClassId,
|
|
42
45
|
getContractClassFromArtifact,
|
|
@@ -57,18 +60,7 @@ import { ClassRegistererAddress } from '@aztec/protocol-contracts/class-register
|
|
|
57
60
|
import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
|
|
58
61
|
import { getCanonicalInstanceDeployer } from '@aztec/protocol-contracts/instance-deployer';
|
|
59
62
|
import { getCanonicalMultiCallEntrypointAddress } from '@aztec/protocol-contracts/multi-call-entrypoint';
|
|
60
|
-
import {
|
|
61
|
-
type AcirSimulator,
|
|
62
|
-
type ExecutionResult,
|
|
63
|
-
accumulateReturnValues,
|
|
64
|
-
collectEnqueuedPublicFunctionCalls,
|
|
65
|
-
collectPublicTeardownFunctionCall,
|
|
66
|
-
collectSortedEncryptedLogs,
|
|
67
|
-
collectSortedNoteEncryptedLogs,
|
|
68
|
-
collectSortedUnencryptedLogs,
|
|
69
|
-
resolveAssertionMessage,
|
|
70
|
-
resolveOpcodeLocations,
|
|
71
|
-
} from '@aztec/simulator';
|
|
63
|
+
import { type AcirSimulator, resolveAssertionMessage, resolveOpcodeLocations } from '@aztec/simulator';
|
|
72
64
|
import { type ContractClassWithId, type ContractInstanceWithAddress } from '@aztec/types/contracts';
|
|
73
65
|
import { type NodeInfo } from '@aztec/types/interfaces';
|
|
74
66
|
|
|
@@ -510,13 +502,21 @@ export class PXEService implements PXE {
|
|
|
510
502
|
return await this.node.getBlock(blockNumber);
|
|
511
503
|
}
|
|
512
504
|
|
|
513
|
-
|
|
505
|
+
async #simulateKernels(
|
|
506
|
+
txRequest: TxExecutionRequest,
|
|
507
|
+
privateExecutionResult: PrivateExecutionResult,
|
|
508
|
+
): Promise<PrivateKernelTailCircuitPublicInputs> {
|
|
509
|
+
const result = await this.#prove(txRequest, new TestPrivateKernelProver(), privateExecutionResult);
|
|
510
|
+
return result.publicInputs;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
public proveTx(
|
|
514
|
+
txRequest: TxExecutionRequest,
|
|
515
|
+
privateExecutionResult: PrivateExecutionResult,
|
|
516
|
+
): Promise<TxProvingResult> {
|
|
514
517
|
return this.jobQueue.put(async () => {
|
|
515
|
-
const
|
|
516
|
-
|
|
517
|
-
simulatedTx.publicOutput = await this.#simulatePublicCalls(simulatedTx.tx);
|
|
518
|
-
}
|
|
519
|
-
return simulatedTx.tx;
|
|
518
|
+
const { publicInputs, clientIvcProof } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult);
|
|
519
|
+
return new TxProvingResult(privateExecutionResult, publicInputs, clientIvcProof!);
|
|
520
520
|
});
|
|
521
521
|
}
|
|
522
522
|
|
|
@@ -527,15 +527,19 @@ export class PXEService implements PXE {
|
|
|
527
527
|
msgSender: AztecAddress | undefined = undefined,
|
|
528
528
|
skipTxValidation: boolean = false,
|
|
529
529
|
scopes?: AztecAddress[],
|
|
530
|
-
): Promise<
|
|
530
|
+
): Promise<TxSimulationResult> {
|
|
531
531
|
return await this.jobQueue.put(async () => {
|
|
532
|
-
const
|
|
532
|
+
const privateExecutionResult = await this.#executePrivate(txRequest, msgSender, scopes);
|
|
533
|
+
const publicInputs = await this.#simulateKernels(txRequest, privateExecutionResult);
|
|
534
|
+
const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
|
|
535
|
+
const simulatedTx = privateSimulationResult.toSimulatedTx();
|
|
536
|
+
let publicOutput: PublicSimulationOutput | undefined;
|
|
533
537
|
if (simulatePublic) {
|
|
534
|
-
|
|
538
|
+
publicOutput = await this.#simulatePublicCalls(simulatedTx);
|
|
535
539
|
}
|
|
536
540
|
|
|
537
541
|
if (!skipTxValidation) {
|
|
538
|
-
if (!(await this.node.isValidTx(simulatedTx
|
|
542
|
+
if (!(await this.node.isValidTx(simulatedTx, true))) {
|
|
539
543
|
throw new Error('The simulated transaction is unable to be added to state and is invalid.');
|
|
540
544
|
}
|
|
541
545
|
}
|
|
@@ -545,9 +549,9 @@ export class PXEService implements PXE {
|
|
|
545
549
|
// Meaning that it will not necessarily have produced a nullifier (and thus have no TxHash)
|
|
546
550
|
// If we log, the `getTxHash` function will throw.
|
|
547
551
|
if (!msgSender) {
|
|
548
|
-
this.log.info(`Executed local simulation for ${simulatedTx.
|
|
552
|
+
this.log.info(`Executed local simulation for ${simulatedTx.getTxHash()}`);
|
|
549
553
|
}
|
|
550
|
-
return
|
|
554
|
+
return TxSimulationResult.fromPrivateSimulationResultAndPublicOutput(privateSimulationResult, publicOutput);
|
|
551
555
|
});
|
|
552
556
|
}
|
|
553
557
|
|
|
@@ -687,11 +691,11 @@ export class PXEService implements PXE {
|
|
|
687
691
|
};
|
|
688
692
|
}
|
|
689
693
|
|
|
690
|
-
async #
|
|
694
|
+
async #executePrivate(
|
|
691
695
|
txRequest: TxExecutionRequest,
|
|
692
696
|
msgSender?: AztecAddress,
|
|
693
697
|
scopes?: AztecAddress[],
|
|
694
|
-
): Promise<
|
|
698
|
+
): Promise<PrivateExecutionResult> {
|
|
695
699
|
// TODO - Pause syncing while simulating.
|
|
696
700
|
|
|
697
701
|
const { contractAddress, functionArtifact } = await this.#getSimulationParameters(txRequest);
|
|
@@ -749,9 +753,13 @@ export class PXEService implements PXE {
|
|
|
749
753
|
if (err instanceof SimulationError) {
|
|
750
754
|
const callStack = err.getCallStack();
|
|
751
755
|
const originalFailingFunction = callStack[callStack.length - 1];
|
|
756
|
+
// TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Properly fix this.
|
|
757
|
+
// To be able to resolve the assertion message, we need to use the information from the public dispatch function,
|
|
758
|
+
// no matter what the call stack selector points to (since we've modified it to point to the target function).
|
|
759
|
+
// We should remove this because the AVM (or public protocol) shouldn't be aware of the public dispatch calling convention.
|
|
752
760
|
const debugInfo = await this.contractDataOracle.getFunctionDebugMetadata(
|
|
753
761
|
originalFailingFunction.contractAddress,
|
|
754
|
-
|
|
762
|
+
FunctionSelector.fromField(new Fr(PUBLIC_DISPATCH_SELECTOR)),
|
|
755
763
|
);
|
|
756
764
|
const noirCallStack = err.getNoirCallStack();
|
|
757
765
|
if (debugInfo) {
|
|
@@ -794,40 +802,15 @@ export class PXEService implements PXE {
|
|
|
794
802
|
* A private transaction object containing the proof, public inputs, and encrypted logs.
|
|
795
803
|
* The return values of the private execution
|
|
796
804
|
*/
|
|
797
|
-
async #
|
|
805
|
+
async #prove(
|
|
798
806
|
txExecutionRequest: TxExecutionRequest,
|
|
799
807
|
proofCreator: PrivateKernelProver,
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
): Promise<SimulatedTx> {
|
|
803
|
-
// Get values that allow us to reconstruct the block hash
|
|
804
|
-
const executionResult = await this.#simulate(txExecutionRequest, msgSender, scopes);
|
|
805
|
-
|
|
808
|
+
privateExecutionResult: PrivateExecutionResult,
|
|
809
|
+
): Promise<PrivateKernelSimulateOutput<PrivateKernelTailCircuitPublicInputs>> {
|
|
806
810
|
const kernelOracle = new KernelOracle(this.contractDataOracle, this.keyStore, this.node);
|
|
807
811
|
const kernelProver = new KernelProver(kernelOracle, proofCreator);
|
|
808
812
|
this.log.debug(`Executing kernel prover...`);
|
|
809
|
-
|
|
810
|
-
txExecutionRequest.toTxRequest(),
|
|
811
|
-
executionResult,
|
|
812
|
-
);
|
|
813
|
-
|
|
814
|
-
const noteEncryptedLogs = new EncryptedNoteTxL2Logs([collectSortedNoteEncryptedLogs(executionResult)]);
|
|
815
|
-
const unencryptedLogs = new UnencryptedTxL2Logs([collectSortedUnencryptedLogs(executionResult)]);
|
|
816
|
-
const encryptedLogs = new EncryptedTxL2Logs([collectSortedEncryptedLogs(executionResult)]);
|
|
817
|
-
const enqueuedPublicFunctions = collectEnqueuedPublicFunctionCalls(executionResult);
|
|
818
|
-
const teardownPublicFunction = collectPublicTeardownFunctionCall(executionResult);
|
|
819
|
-
|
|
820
|
-
const tx = new Tx(
|
|
821
|
-
publicInputs,
|
|
822
|
-
clientIvcProof!,
|
|
823
|
-
noteEncryptedLogs,
|
|
824
|
-
encryptedLogs,
|
|
825
|
-
unencryptedLogs,
|
|
826
|
-
enqueuedPublicFunctions,
|
|
827
|
-
teardownPublicFunction,
|
|
828
|
-
);
|
|
829
|
-
|
|
830
|
-
return new SimulatedTx(tx, accumulateReturnValues(executionResult));
|
|
813
|
+
return await kernelProver.prove(txExecutionRequest.toTxRequest(), privateExecutionResult);
|
|
831
814
|
}
|
|
832
815
|
|
|
833
816
|
/**
|
|
@@ -944,11 +927,10 @@ export class PXEService implements PXE {
|
|
|
944
927
|
|
|
945
928
|
const visibleEvents = encryptedLogs.flatMap(encryptedLog => {
|
|
946
929
|
for (const sk of vsks) {
|
|
947
|
-
const
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
return [decryptedLog];
|
|
930
|
+
const decryptedEvent =
|
|
931
|
+
L1EventPayload.decryptAsIncoming(encryptedLog, sk) ?? L1EventPayload.decryptAsOutgoing(encryptedLog, sk);
|
|
932
|
+
if (decryptedEvent !== undefined) {
|
|
933
|
+
return [decryptedEvent];
|
|
952
934
|
}
|
|
953
935
|
}
|
|
954
936
|
|
|
@@ -957,19 +939,19 @@ export class PXEService implements PXE {
|
|
|
957
939
|
|
|
958
940
|
const decodedEvents = visibleEvents
|
|
959
941
|
.map(visibleEvent => {
|
|
960
|
-
if (visibleEvent
|
|
942
|
+
if (visibleEvent === undefined) {
|
|
961
943
|
return undefined;
|
|
962
944
|
}
|
|
963
|
-
if (!visibleEvent.
|
|
945
|
+
if (!visibleEvent.eventTypeId.equals(eventMetadata.eventSelector)) {
|
|
964
946
|
return undefined;
|
|
965
947
|
}
|
|
966
|
-
if (visibleEvent.
|
|
948
|
+
if (visibleEvent.event.items.length !== eventMetadata.fieldNames.length) {
|
|
967
949
|
throw new Error(
|
|
968
950
|
'Something is weird here, we have matching EventSelectors, but the actual payload has mismatched length',
|
|
969
951
|
);
|
|
970
952
|
}
|
|
971
953
|
|
|
972
|
-
return eventMetadata.decode(visibleEvent
|
|
954
|
+
return eventMetadata.decode(visibleEvent);
|
|
973
955
|
})
|
|
974
956
|
.filter(visibleEvent => visibleEvent !== undefined) as T[];
|
|
975
957
|
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { type PrivateKernelData, type PrivateKernelResetCircuitPrivateInputsVariants } from '@aztec/circuits.js';
|
|
2
|
-
import type { ExecutionResult } from '@aztec/simulator';
|
|
3
|
-
import { type ProvingDataOracle } from '../proving_data_oracle.js';
|
|
4
|
-
export declare function buildPrivateKernelResetInputs(executionStack: ExecutionResult[], previousKernelData: PrivateKernelData, noteHashLeafIndexMap: Map<bigint, bigint>, noteHashNullifierCounterMap: Map<number, number>, validationRequestsSplitCounter: number, shouldSilo: boolean, oracle: ProvingDataOracle): Promise<PrivateKernelResetCircuitPrivateInputsVariants>;
|
|
5
|
-
//# sourceMappingURL=build_private_kernel_reset_hints.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build_private_kernel_reset_hints.d.ts","sourceRoot":"","sources":["../../../src/kernel_prover/hints/build_private_kernel_reset_hints.ts"],"names":[],"mappings":"AAAA,OAAO,EAWL,KAAK,iBAAiB,EAEtB,KAAK,8CAA8C,EAYpD,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAyDnE,wBAAsB,6BAA6B,CACjD,cAAc,EAAE,eAAe,EAAE,EACjC,kBAAkB,EAAE,iBAAiB,EACrC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACzC,2BAA2B,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChD,8BAA8B,EAAE,MAAM,EACtC,UAAU,EAAE,OAAO,EACnB,MAAM,EAAE,iBAAiB,2DA+H1B"}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { KeyValidationHint, MAX_KEY_VALIDATION_REQUESTS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, MembershipWitness, NULLIFIER_TREE_HEIGHT, PRIVATE_RESET_VARIANTS, PrivateKernelResetCircuitPrivateInputs, PrivateKernelResetHints, ScopedNoteHash, ScopedNullifier, ScopedReadRequest, buildNoteHashReadRequestHints, buildNullifierReadRequestHints, buildTransientDataHints, countAccumulatedItems, getNonEmptyItems, } from '@aztec/circuits.js';
|
|
2
|
-
import { makeTuple } from '@aztec/foundation/array';
|
|
3
|
-
function getNullifierReadRequestHints(nullifierReadRequests, nullifiers, oracle, sizePending, sizeSettled, futureNullifiers) {
|
|
4
|
-
const getNullifierMembershipWitness = async (nullifier) => {
|
|
5
|
-
const res = await oracle.getNullifierMembershipWitness(nullifier);
|
|
6
|
-
if (!res) {
|
|
7
|
-
throw new Error(`Cannot find the leaf for nullifier ${nullifier.toBigInt()}.`);
|
|
8
|
-
}
|
|
9
|
-
const { index, siblingPath, leafPreimage } = res;
|
|
10
|
-
return {
|
|
11
|
-
membershipWitness: new MembershipWitness(NULLIFIER_TREE_HEIGHT, index, siblingPath.toTuple()),
|
|
12
|
-
leafPreimage,
|
|
13
|
-
};
|
|
14
|
-
};
|
|
15
|
-
return buildNullifierReadRequestHints({ getNullifierMembershipWitness }, nullifierReadRequests, nullifiers, sizePending, sizeSettled, futureNullifiers);
|
|
16
|
-
}
|
|
17
|
-
async function getMasterSecretKeysAndAppKeyGenerators(keyValidationRequests, oracle) {
|
|
18
|
-
const keysHints = makeTuple(MAX_KEY_VALIDATION_REQUESTS_PER_TX, () => KeyValidationHint.nada(MAX_KEY_VALIDATION_REQUESTS_PER_TX));
|
|
19
|
-
let keyIndex = 0;
|
|
20
|
-
for (let i = 0; i < keyValidationRequests.length; ++i) {
|
|
21
|
-
const request = keyValidationRequests[i].request;
|
|
22
|
-
if (request.isEmpty()) {
|
|
23
|
-
break;
|
|
24
|
-
}
|
|
25
|
-
const secretKeys = await oracle.getMasterSecretKey(request.request.pkM);
|
|
26
|
-
keysHints[keyIndex] = new KeyValidationHint(secretKeys, i);
|
|
27
|
-
keyIndex++;
|
|
28
|
-
}
|
|
29
|
-
return {
|
|
30
|
-
keysCount: keyIndex,
|
|
31
|
-
keysHints,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
export async function buildPrivateKernelResetInputs(executionStack, previousKernelData, noteHashLeafIndexMap, noteHashNullifierCounterMap, validationRequestsSplitCounter, shouldSilo, oracle) {
|
|
35
|
-
const publicInputs = previousKernelData.publicInputs;
|
|
36
|
-
// Use max sizes, they will be trimmed down later.
|
|
37
|
-
const futureNoteHashes = collectNested(executionStack, executionResult => {
|
|
38
|
-
const nonEmptyNoteHashes = getNonEmptyItems(executionResult.callStackItem.publicInputs.noteHashes);
|
|
39
|
-
return nonEmptyNoteHashes.map(noteHash => new ScopedNoteHash(noteHash, executionResult.callStackItem.publicInputs.callContext.storageContractAddress));
|
|
40
|
-
});
|
|
41
|
-
const { numPendingReadHints: noteHashPendingReadHints, numSettledReadHints: noteHashSettledReadHints, hints: noteHashReadRequestHints, } = await buildNoteHashReadRequestHints(oracle, publicInputs.validationRequests.noteHashReadRequests, publicInputs.end.noteHashes, noteHashLeafIndexMap, MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX, futureNoteHashes);
|
|
42
|
-
const futureNullifiers = collectNested(executionStack, executionResult => {
|
|
43
|
-
const nonEmptyNullifiers = getNonEmptyItems(executionResult.callStackItem.publicInputs.nullifiers);
|
|
44
|
-
return nonEmptyNullifiers.map(nullifier => new ScopedNullifier(nullifier, executionResult.callStackItem.publicInputs.callContext.storageContractAddress));
|
|
45
|
-
});
|
|
46
|
-
const { numPendingReadHints: nullifierPendingReadHints, numSettledReadHints: nullifierSettledReadHints, hints: nullifierReadRequestHints, } = await getNullifierReadRequestHints(publicInputs.validationRequests.nullifierReadRequests, publicInputs.end.nullifiers, oracle, MAX_NULLIFIER_READ_REQUESTS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, futureNullifiers);
|
|
47
|
-
const { keysCount, keysHints } = await getMasterSecretKeysAndAppKeyGenerators(publicInputs.validationRequests.scopedKeyValidationRequestsAndGenerators, oracle);
|
|
48
|
-
const futureNoteHashReads = collectNestedReadRequests(executionStack, executionResult => executionResult.callStackItem.publicInputs.noteHashReadRequests);
|
|
49
|
-
const futureNullifierReads = collectNestedReadRequests(executionStack, executionResult => executionResult.callStackItem.publicInputs.nullifierReadRequests);
|
|
50
|
-
const noteHashes = publicInputs.end.noteHashes;
|
|
51
|
-
const nullifiers = publicInputs.end.nullifiers;
|
|
52
|
-
const { numTransientData, hints: transientDataIndexHints } = buildTransientDataHints(noteHashes, nullifiers, futureNoteHashReads, futureNullifierReads, noteHashNullifierCounterMap, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX);
|
|
53
|
-
const remainingNoteHashes = countAccumulatedItems(noteHashes) - numTransientData;
|
|
54
|
-
const remainingNullifiers = countAccumulatedItems(nullifiers) - numTransientData;
|
|
55
|
-
const numEncryptedLogHashes = countAccumulatedItems(publicInputs.end.encryptedLogsHashes);
|
|
56
|
-
let privateInputs;
|
|
57
|
-
for (const [sizeTag, hintSizes] of Object.entries(PRIVATE_RESET_VARIANTS)) {
|
|
58
|
-
const noSiloing = !hintSizes.NOTE_HASH_SILOING_AMOUNT &&
|
|
59
|
-
!hintSizes.NULLIFIER_SILOING_AMOUNT &&
|
|
60
|
-
!hintSizes.ENCRYPTED_LOG_SILOING_AMOUNT;
|
|
61
|
-
const enoughSiloing = hintSizes.NOTE_HASH_SILOING_AMOUNT >= remainingNoteHashes &&
|
|
62
|
-
hintSizes.NULLIFIER_SILOING_AMOUNT >= remainingNullifiers &&
|
|
63
|
-
hintSizes.ENCRYPTED_LOG_SILOING_AMOUNT >= numEncryptedLogHashes;
|
|
64
|
-
if (hintSizes.NOTE_HASH_PENDING_AMOUNT >= noteHashPendingReadHints &&
|
|
65
|
-
hintSizes.NOTE_HASH_SETTLED_AMOUNT >= noteHashSettledReadHints &&
|
|
66
|
-
hintSizes.NULLIFIER_PENDING_AMOUNT >= nullifierPendingReadHints &&
|
|
67
|
-
hintSizes.NULLIFIER_SETTLED_AMOUNT >= nullifierSettledReadHints &&
|
|
68
|
-
hintSizes.NULLIFIER_KEYS >= keysCount &&
|
|
69
|
-
hintSizes.TRANSIENT_DATA_AMOUNT >= numTransientData &&
|
|
70
|
-
((!shouldSilo && noSiloing) || (shouldSilo && enoughSiloing))) {
|
|
71
|
-
privateInputs = new PrivateKernelResetCircuitPrivateInputs(previousKernelData, new PrivateKernelResetHints(noteHashReadRequestHints, nullifierReadRequestHints, keysHints, transientDataIndexHints, validationRequestsSplitCounter).trimToSizes(hintSizes.NOTE_HASH_PENDING_AMOUNT, hintSizes.NOTE_HASH_SETTLED_AMOUNT, hintSizes.NULLIFIER_PENDING_AMOUNT, hintSizes.NULLIFIER_SETTLED_AMOUNT, hintSizes.NULLIFIER_KEYS, hintSizes.TRANSIENT_DATA_AMOUNT), sizeTag);
|
|
72
|
-
break;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (!privateInputs) {
|
|
76
|
-
throw new Error('No private inputs found for the given hint sizes.');
|
|
77
|
-
}
|
|
78
|
-
return privateInputs;
|
|
79
|
-
}
|
|
80
|
-
function collectNested(executionStack, extractExecutionItems) {
|
|
81
|
-
const thisExecutionReads = executionStack.flatMap(extractExecutionItems);
|
|
82
|
-
return thisExecutionReads.concat(executionStack.flatMap(({ nestedExecutions }) => collectNested(nestedExecutions, extractExecutionItems)));
|
|
83
|
-
}
|
|
84
|
-
function collectNestedReadRequests(executionStack, extractReadRequests) {
|
|
85
|
-
return collectNested(executionStack, executionResult => {
|
|
86
|
-
const nonEmptyReadRequests = getNonEmptyItems(extractReadRequests(executionResult));
|
|
87
|
-
return nonEmptyReadRequests.map(readRequest => new ScopedReadRequest(readRequest, executionResult.callStackItem.publicInputs.callContext.storageContractAddress));
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRfcHJpdmF0ZV9rZXJuZWxfcmVzZXRfaGludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMva2VybmVsX3Byb3Zlci9oaW50cy9idWlsZF9wcml2YXRlX2tlcm5lbF9yZXNldF9oaW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGtDQUFrQyxFQUNsQyxzQkFBc0IsRUFDdEIsa0NBQWtDLEVBQ2xDLHFCQUFxQixFQUNyQixrQ0FBa0MsRUFDbEMsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixzQkFBc0IsRUFFdEIsc0NBQXNDLEVBRXRDLHVCQUF1QixFQUd2QixjQUFjLEVBQ2QsZUFBZSxFQUNmLGlCQUFpQixFQUNqQiw2QkFBNkIsRUFDN0IsOEJBQThCLEVBQzlCLHVCQUF1QixFQUN2QixxQkFBcUIsRUFDckIsZ0JBQWdCLEdBQ2pCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBTXBELFNBQVMsNEJBQTRCLENBQ25DLHFCQUEwRixFQUMxRixVQUFnRSxFQUNoRSxNQUF5QixFQUN6QixXQUFvQixFQUNwQixXQUFvQixFQUNwQixnQkFBbUM7SUFFbkMsTUFBTSw2QkFBNkIsR0FBRyxLQUFLLEVBQUUsU0FBYSxFQUFFLEVBQUU7UUFDNUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxNQUFNLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsU0FBUyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqRixDQUFDO1FBRUQsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEdBQUcsR0FBRyxDQUFDO1FBQ2pELE9BQU87WUFDTCxpQkFBaUIsRUFBRSxJQUFJ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
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { type PrivateKernelCircuitPublicInputs } from '@aztec/circuits.js';
|
|
2
|
-
import { type ExecutionResult } from '@aztec/simulator';
|
|
3
|
-
export declare function needsReset(publicInputs: PrivateKernelCircuitPublicInputs, executionStack: ExecutionResult[]): boolean;
|
|
4
|
-
export declare function needsFinalReset(publicInputs: PrivateKernelCircuitPublicInputs): boolean;
|
|
5
|
-
//# sourceMappingURL=needs_reset.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"needs_reset.d.ts","sourceRoot":"","sources":["../../../src/kernel_prover/hints/needs_reset.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,gCAAgC,EAEtC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,wBAAgB,UAAU,CAAC,YAAY,EAAE,gCAAgC,EAAE,cAAc,EAAE,eAAe,EAAE,WAsB3G;AASD,wBAAgB,eAAe,CAAC,YAAY,EAAE,gCAAgC,WAU7E"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { MAX_KEY_VALIDATION_REQUESTS_PER_TX, MAX_NOTE_ENCRYPTED_LOGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, countAccumulatedItems, } from '@aztec/circuits.js';
|
|
2
|
-
export function needsReset(publicInputs, executionStack) {
|
|
3
|
-
const nextIteration = executionStack[executionStack.length - 1];
|
|
4
|
-
return (countAccumulatedItems(nextIteration.callStackItem.publicInputs.noteHashes) +
|
|
5
|
-
countAccumulatedItems(publicInputs.end.noteHashes) >
|
|
6
|
-
MAX_NOTE_HASHES_PER_TX ||
|
|
7
|
-
countAccumulatedItems(nextIteration.callStackItem.publicInputs.nullifiers) +
|
|
8
|
-
countAccumulatedItems(publicInputs.end.nullifiers) >
|
|
9
|
-
MAX_NULLIFIERS_PER_TX ||
|
|
10
|
-
countAccumulatedItems(nextIteration.callStackItem.publicInputs.noteEncryptedLogsHashes) +
|
|
11
|
-
countAccumulatedItems(publicInputs.end.noteEncryptedLogsHashes) >
|
|
12
|
-
MAX_NOTE_ENCRYPTED_LOGS_PER_TX ||
|
|
13
|
-
countAccumulatedItems(nextIteration.callStackItem.publicInputs.noteHashReadRequests) +
|
|
14
|
-
countAccumulatedItems(publicInputs.validationRequests.noteHashReadRequests) >
|
|
15
|
-
MAX_NOTE_HASH_READ_REQUESTS_PER_TX ||
|
|
16
|
-
countAccumulatedItems(nextIteration.callStackItem.publicInputs.nullifierReadRequests) +
|
|
17
|
-
countAccumulatedItems(publicInputs.validationRequests.nullifierReadRequests) >
|
|
18
|
-
MAX_NULLIFIER_READ_REQUESTS_PER_TX ||
|
|
19
|
-
countAccumulatedItems(nextIteration.callStackItem.publicInputs.keyValidationRequestsAndGenerators) +
|
|
20
|
-
countAccumulatedItems(publicInputs.validationRequests.scopedKeyValidationRequestsAndGenerators) >
|
|
21
|
-
MAX_KEY_VALIDATION_REQUESTS_PER_TX);
|
|
22
|
-
}
|
|
23
|
-
function hasTransientNullifier(publicInputs) {
|
|
24
|
-
const noteHashSet = new Set();
|
|
25
|
-
publicInputs.end.noteHashes.forEach(n => noteHashSet.add(n.noteHash.value.toBigInt()));
|
|
26
|
-
noteHashSet.delete(0n);
|
|
27
|
-
return publicInputs.end.nullifiers.some(n => noteHashSet.has(n.nullifiedNoteHash.toBigInt()));
|
|
28
|
-
}
|
|
29
|
-
export function needsFinalReset(publicInputs) {
|
|
30
|
-
return (countAccumulatedItems(publicInputs.end.noteHashes) > 0 ||
|
|
31
|
-
countAccumulatedItems(publicInputs.end.nullifiers) > 0 ||
|
|
32
|
-
countAccumulatedItems(publicInputs.end.encryptedLogsHashes) > 0 ||
|
|
33
|
-
countAccumulatedItems(publicInputs.validationRequests.noteHashReadRequests) > 0 ||
|
|
34
|
-
countAccumulatedItems(publicInputs.validationRequests.nullifierReadRequests) > 0 ||
|
|
35
|
-
countAccumulatedItems(publicInputs.validationRequests.scopedKeyValidationRequestsAndGenerators) > 0 ||
|
|
36
|
-
hasTransientNullifier(publicInputs));
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVlZHNfcmVzZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMva2VybmVsX3Byb3Zlci9oaW50cy9uZWVkc19yZXNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsa0NBQWtDLEVBQ2xDLDhCQUE4QixFQUM5QixzQkFBc0IsRUFDdEIsa0NBQWtDLEVBQ2xDLHFCQUFxQixFQUNyQixrQ0FBa0MsRUFFbEMscUJBQXFCLEdBQ3RCLE1BQU0sb0JBQW9CLENBQUM7QUFHNUIsTUFBTSxVQUFVLFVBQVUsQ0FBQyxZQUE4QyxFQUFFLGNBQWlDO0lBQzFHLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLE9BQU8sQ0FDTCxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7UUFDeEUscUJBQXFCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDbEQsc0JBQXNCO1FBQ3hCLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztZQUN4RSxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztZQUNsRCxxQkFBcUI7UUFDdkIscUJBQXFCLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUM7WUFDckYscUJBQXFCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQztZQUMvRCw4QkFBOEI7UUFDaEMscUJBQXFCLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUM7WUFDbEYscUJBQXFCLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDO1lBQzNFLGtDQUFrQztRQUNwQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQztZQUNuRixxQkFBcUIsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLENBQUM7WUFDNUUsa0NBQWtDO1FBQ3BDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGtDQUFrQyxDQUFDO1lBQ2hHLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyx3Q0FBd0MsQ0FBQztZQUMvRixrQ0FBa0MsQ0FDckMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLFlBQThDO0lBQzNFLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDOUIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkYsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QixPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoRyxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxZQUE4QztJQUM1RSxPQUFPLENBQ0wscUJBQXFCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQ3RELHFCQUFxQixDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUN0RCxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQztRQUMvRCxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDO1FBQy9FLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUM7UUFDaEYscUJBQXFCLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLHdDQUF3QyxDQUFDLEdBQUcsQ0FBQztRQUNuRyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsQ0FDcEMsQ0FBQztBQUNKLENBQUMifQ==
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"produce_note_dao.d.ts","sourceRoot":"","sources":["../../src/note_processor/produce_note_dao.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,KAAK,aAAa,EAAyB,MAAM,kBAAkB,CAAC;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,EAAE,EAAE,EAChB,mBAAmB,EAAE,MAAM,EAC3B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,EAC5B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IACT,YAAY,EAAE,eAAe,GAAG,SAAS,CAAC;IAC1C,YAAY,EAAE,eAAe,GAAG,SAAS,CAAC;IAC1C,oBAAoB,EAAE,eAAe,GAAG,SAAS,CAAC;IAClD,oBAAoB,EAAE,eAAe,GAAG,SAAS,CAAC;CACnD,CAAC,CA4HD"}
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import { Fr } from '@aztec/circuits.js';
|
|
2
|
-
import { computeNoteHashNonce, siloNullifier } from '@aztec/circuits.js/hash';
|
|
3
|
-
import { ContractNotFoundError } from '@aztec/simulator';
|
|
4
|
-
import { DeferredNoteDao } from '../database/deferred_note_dao.js';
|
|
5
|
-
import { IncomingNoteDao } from '../database/incoming_note_dao.js';
|
|
6
|
-
import { OutgoingNoteDao } from '../database/outgoing_note_dao.js';
|
|
7
|
-
/**
|
|
8
|
-
* Decodes a note from a transaction that we know was intended for us.
|
|
9
|
-
* Throws if we do not yet have the contract corresponding to the note in our database.
|
|
10
|
-
* Accepts a set of excluded indices, which are indices that have been assigned a note in the same tx.
|
|
11
|
-
* Inserts the index of the note into the excludedIndices set if the note is successfully decoded.
|
|
12
|
-
*
|
|
13
|
-
* @param ivpkM - The public counterpart to the secret key to be used in the decryption of incoming note logs.
|
|
14
|
-
* @param ovpkM - The public counterpart to the secret key to be used in the decryption of outgoing note logs.
|
|
15
|
-
* @param payload - An instance of l1NotePayload.
|
|
16
|
-
* @param txHash - The hash of the transaction that created the note. Equivalent to the first nullifier of the transaction.
|
|
17
|
-
* @param noteHashes - New note hashes in this transaction, one of which belongs to this note.
|
|
18
|
-
* @param dataStartIndexForTx - The next available leaf index for the note hash tree for this transaction.
|
|
19
|
-
* @param excludedIndices - Indices that have been assigned a note in the same tx. Notes in a tx can have the same l1NotePayload, we need to find a different index for each replicate.
|
|
20
|
-
* @param simulator - An instance of AcirSimulator.
|
|
21
|
-
* @returns An object containing the incoming, outgoing, and deferred notes.
|
|
22
|
-
*/
|
|
23
|
-
export async function produceNoteDaos(simulator, ivpkM, ovpkM, payload, txHash, noteHashes, dataStartIndexForTx, excludedIndices, log) {
|
|
24
|
-
if (!ivpkM && !ovpkM) {
|
|
25
|
-
throw new Error('Both ivpkM and ovpkM are undefined. Cannot create note.');
|
|
26
|
-
}
|
|
27
|
-
let incomingNote;
|
|
28
|
-
let outgoingNote;
|
|
29
|
-
let incomingDeferredNote;
|
|
30
|
-
let outgoingDeferredNote;
|
|
31
|
-
try {
|
|
32
|
-
if (ivpkM) {
|
|
33
|
-
const { noteHashIndex, nonce, noteHash, siloedNullifier } = await findNoteIndexAndNullifier(simulator, noteHashes, txHash, payload, excludedIndices, true);
|
|
34
|
-
const index = BigInt(dataStartIndexForTx + noteHashIndex);
|
|
35
|
-
excludedIndices?.add(noteHashIndex);
|
|
36
|
-
incomingNote = new IncomingNoteDao(payload.note, payload.contractAddress, payload.storageSlot, payload.noteTypeId, txHash, nonce, noteHash, siloedNullifier, index, ivpkM);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
catch (e) {
|
|
40
|
-
if (e instanceof ContractNotFoundError) {
|
|
41
|
-
log.warn(e.message);
|
|
42
|
-
if (ivpkM) {
|
|
43
|
-
incomingDeferredNote = new DeferredNoteDao(ivpkM, payload.note, payload.contractAddress, payload.storageSlot, payload.noteTypeId, txHash, noteHashes, dataStartIndexForTx);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
log.error(`Could not process note because of "${e}". Discarding note...`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
try {
|
|
51
|
-
if (ovpkM) {
|
|
52
|
-
if (incomingNote) {
|
|
53
|
-
// Incoming note is defined meaning that this PXE has both the incoming and outgoing keys. We can skip computing
|
|
54
|
-
// note hash and note index since we already have them in the incoming note.
|
|
55
|
-
outgoingNote = new OutgoingNoteDao(payload.note, payload.contractAddress, payload.storageSlot, payload.noteTypeId, txHash, incomingNote.nonce, incomingNote.noteHash, incomingNote.index, ovpkM);
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
const { noteHashIndex, nonce, noteHash } = await findNoteIndexAndNullifier(simulator, noteHashes, txHash, payload, excludedIndices, false);
|
|
59
|
-
const index = BigInt(dataStartIndexForTx + noteHashIndex);
|
|
60
|
-
excludedIndices?.add(noteHashIndex);
|
|
61
|
-
outgoingNote = new OutgoingNoteDao(payload.note, payload.contractAddress, payload.storageSlot, payload.noteTypeId, txHash, nonce, noteHash, index, ovpkM);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
catch (e) {
|
|
66
|
-
if (e instanceof ContractNotFoundError) {
|
|
67
|
-
log.warn(e.message);
|
|
68
|
-
if (ovpkM) {
|
|
69
|
-
outgoingDeferredNote = new DeferredNoteDao(ovpkM, payload.note, payload.contractAddress, payload.storageSlot, payload.noteTypeId, txHash, noteHashes, dataStartIndexForTx);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
log.error(`Could not process note because of "${e}". Discarding note...`);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return {
|
|
77
|
-
incomingNote,
|
|
78
|
-
outgoingNote,
|
|
79
|
-
incomingDeferredNote,
|
|
80
|
-
outgoingDeferredNote,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Finds nonce, index, inner hash and siloed nullifier for a given note.
|
|
85
|
-
* @dev Finds the index in the note hash tree by computing the note hash with different nonce and see which hash for
|
|
86
|
-
* the current tx matches this value.
|
|
87
|
-
* @remarks This method assists in identifying spent notes in the note hash tree.
|
|
88
|
-
* @param siloedNoteHashes - Note hashes in the tx. One of them should correspond to the note we are looking for
|
|
89
|
-
* @param txHash - Hash of a tx the note was emitted in.
|
|
90
|
-
* @param l1NotePayload - The note payload.
|
|
91
|
-
* @param excludedIndices - Indices that have been assigned a note in the same tx. Notes in a tx can have the same
|
|
92
|
-
* l1NotePayload. We need to find a different index for each replicate.
|
|
93
|
-
* @param computeNullifier - A flag indicating whether to compute the nullifier or just return 0.
|
|
94
|
-
* @returns Nonce, index, inner hash and siloed nullifier for a given note.
|
|
95
|
-
* @throws If cannot find the nonce for the note.
|
|
96
|
-
*/
|
|
97
|
-
async function findNoteIndexAndNullifier(simulator, siloedNoteHashes, txHash, { contractAddress, storageSlot, noteTypeId, note }, excludedIndices, computeNullifier) {
|
|
98
|
-
let noteHashIndex = 0;
|
|
99
|
-
let nonce;
|
|
100
|
-
let noteHash;
|
|
101
|
-
let siloedNoteHash;
|
|
102
|
-
let innerNullifier;
|
|
103
|
-
const firstNullifier = Fr.fromBuffer(txHash.toBuffer());
|
|
104
|
-
for (; noteHashIndex < siloedNoteHashes.length; ++noteHashIndex) {
|
|
105
|
-
if (excludedIndices.has(noteHashIndex)) {
|
|
106
|
-
continue;
|
|
107
|
-
}
|
|
108
|
-
const siloedNoteHashFromTxEffect = siloedNoteHashes[noteHashIndex];
|
|
109
|
-
if (siloedNoteHashFromTxEffect.equals(Fr.ZERO)) {
|
|
110
|
-
break;
|
|
111
|
-
}
|
|
112
|
-
const expectedNonce = computeNoteHashNonce(firstNullifier, noteHashIndex);
|
|
113
|
-
({ noteHash, siloedNoteHash, innerNullifier } = await simulator.computeNoteHashAndOptionallyANullifier(contractAddress, expectedNonce, storageSlot, noteTypeId, computeNullifier, note));
|
|
114
|
-
if (siloedNoteHashFromTxEffect.equals(siloedNoteHash)) {
|
|
115
|
-
nonce = expectedNonce;
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
if (!nonce) {
|
|
120
|
-
// NB: this used to warn the user that a decrypted log didn't match any notes.
|
|
121
|
-
// This was previously fine as we didn't chop transient note logs, but now we do (#1641 complete).
|
|
122
|
-
throw new Error('Cannot find a matching note hash for the note.');
|
|
123
|
-
}
|
|
124
|
-
return {
|
|
125
|
-
noteHashIndex,
|
|
126
|
-
nonce,
|
|
127
|
-
noteHash: noteHash,
|
|
128
|
-
siloedNullifier: siloNullifier(contractAddress, innerNullifier),
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjZV9ub3RlX2Rhby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ub3RlX3Byb2Nlc3Nvci9wcm9kdWNlX25vdGVfZGFvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxFQUFFLEVBQWtCLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTlFLE9BQU8sRUFBc0IscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVuRTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FDbkMsU0FBd0IsRUFDeEIsS0FBNEIsRUFDNUIsS0FBNEIsRUFDNUIsT0FBc0IsRUFDdEIsTUFBYyxFQUNkLFVBQWdCLEVBQ2hCLG1CQUEyQixFQUMzQixlQUE0QixFQUM1QixHQUFXO0lBT1gsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsSUFBSSxZQUF5QyxDQUFDO0lBQzlDLElBQUksWUFBeUMsQ0FBQztJQUM5QyxJQUFJLG9CQUFpRCxDQUFDO0lBQ3RELElBQUksb0JBQWlELENBQUM7SUFFdEQsSUFBSSxDQUFDO1FBQ0gsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsR0FBRyxNQUFNLHlCQUF5QixDQUN6RixTQUFTLEVBQ1QsVUFBVSxFQUNW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
|