@aztec/pxe 5.2.0 → 5.3.0-nightly.20260818

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dest/config/index.d.ts +15 -2
  2. package/dest/config/index.d.ts.map +1 -1
  3. package/dest/config/index.js +5 -0
  4. package/dest/config/package_info.js +1 -1
  5. package/dest/contract/contract_call_graph.d.ts +52 -0
  6. package/dest/contract/contract_call_graph.d.ts.map +1 -0
  7. package/dest/contract/contract_call_graph.js +91 -0
  8. package/dest/contract/contract_sync_service.d.ts +47 -12
  9. package/dest/contract/contract_sync_service.d.ts.map +1 -1
  10. package/dest/contract/contract_sync_service.js +125 -31
  11. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +1 -1
  12. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  13. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +12 -1
  14. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +1 -1
  15. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  16. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +12 -1
  17. package/dest/debug/pxe_debug_utils.d.ts +1 -1
  18. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  19. package/dest/debug/pxe_debug_utils.js +9 -1
  20. package/dest/job_coordinator/job_coordinator.d.ts +10 -1
  21. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  22. package/dest/job_coordinator/job_coordinator.js +19 -0
  23. package/dest/pxe.d.ts +1 -1
  24. package/dest/pxe.d.ts.map +1 -1
  25. package/dest/pxe.js +28 -4
  26. package/package.json +17 -17
  27. package/src/config/index.ts +25 -1
  28. package/src/config/package_info.ts +1 -1
  29. package/src/contract/contract_call_graph.ts +113 -0
  30. package/src/contract/contract_sync_service.ts +221 -58
  31. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +9 -8
  32. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +9 -8
  33. package/src/debug/pxe_debug_utils.ts +7 -6
  34. package/src/job_coordinator/job_coordinator.ts +30 -0
  35. package/src/pxe.ts +20 -16
@@ -25,7 +25,20 @@ export interface BlockSynchronizerConfig {
25
25
  */
26
26
  autoSync: boolean;
27
27
  }
28
- export type PXEConfig = KernelProverConfig & DataStoreConfig & ChainConfig & BlockSynchronizerConfig;
28
+ /**
29
+ * Configuration settings for the contract sync service.
30
+ */
31
+ export interface ContractSyncConfig {
32
+ /**
33
+ * Whether PXE speculatively syncs contracts it predicts will follow the one requested, running them concurrently
34
+ * with it instead of waiting for execution to reach them. When enabled, repeated flows sync faster, but a wrong
35
+ * prediction spends unnecessary node requests syncing contracts the job never uses.
36
+ *
37
+ * Experimental, off by default.
38
+ */
39
+ concurrentContractSyncEnabled: boolean;
40
+ }
41
+ export type PXEConfig = KernelProverConfig & DataStoreConfig & ChainConfig & BlockSynchronizerConfig & ContractSyncConfig;
29
42
  export type CliPXEOptions = {
30
43
  /** Custom Aztec Node URL to connect to */
31
44
  nodeUrl?: string;
@@ -41,4 +54,4 @@ export declare const allPxeConfigMappings: ConfigMappingsType<CliPXEOptions & PX
41
54
  * Creates an instance of CliPxeOptions out of environment variables
42
55
  */
43
56
  export declare function getCliPXEOptions(): CliPXEOptions & PXEConfig;
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLEtBQUssa0JBQWtCLEVBTXhCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLEtBQUssV0FBVyxFQUF1QixNQUFNLHNCQUFzQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx3QkFBd0IsQ0FBQztBQUVsRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsY0FBYyxtQkFBbUIsQ0FBQztBQUVsQzs7R0FFRztBQUNILE1BQU0sV0FBVyxrQkFBa0I7SUFDakMsOENBQThDO0lBQzlDLGFBQWEsQ0FBQyxFQUFFLE9BQU8sQ0FBQztDQUN6QjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxXQUFXLHVCQUF1QjtJQUN0Qyx5RkFBeUY7SUFDekYsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLDZFQUE2RTtJQUM3RSxZQUFZLENBQUMsRUFBRSxVQUFVLEdBQUcsY0FBYyxHQUFHLFFBQVEsR0FBRyxXQUFXLENBQUM7SUFDcEU7Ozs7T0FJRztJQUNILFFBQVEsRUFBRSxPQUFPLENBQUM7Q0FDbkI7QUFFRCxNQUFNLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixHQUFHLGVBQWUsR0FBRyxXQUFXLEdBQUcsdUJBQXVCLENBQUM7QUFFckcsTUFBTSxNQUFNLGFBQWEsR0FBRztJQUMxQiwyQ0FBMkM7SUFDM0MsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDO0NBQ2xCLENBQUM7QUFFRixlQUFPLE1BQU0saUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsU0FBUyxDQStCM0QsQ0FBQztBQUVGOztHQUVHO0FBQ0gsd0JBQWdCLFlBQVksSUFBSSxTQUFTLENBRXhDO0FBRUQsZUFBTyxNQUFNLG9CQUFvQixFQUFFLGtCQUFrQixDQUFDLGFBQWEsQ0FLbEUsQ0FBQztBQUVGLGVBQU8sTUFBTSxvQkFBb0IsRUFBRSxrQkFBa0IsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQVc5RSxDQUFDO0FBRUY7O0dBRUc7QUFDSCx3QkFBZ0IsZ0JBQWdCLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FRNUQifQ==
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLEtBQUssa0JBQWtCLEVBTXhCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLEtBQUssV0FBVyxFQUF1QixNQUFNLHNCQUFzQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx3QkFBd0IsQ0FBQztBQUVsRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsY0FBYyxtQkFBbUIsQ0FBQztBQUVsQzs7R0FFRztBQUNILE1BQU0sV0FBVyxrQkFBa0I7SUFDakMsOENBQThDO0lBQzlDLGFBQWEsQ0FBQyxFQUFFLE9BQU8sQ0FBQztDQUN6QjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxXQUFXLHVCQUF1QjtJQUN0Qyx5RkFBeUY7SUFDekYsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLDZFQUE2RTtJQUM3RSxZQUFZLENBQUMsRUFBRSxVQUFVLEdBQUcsY0FBYyxHQUFHLFFBQVEsR0FBRyxXQUFXLENBQUM7SUFDcEU7Ozs7T0FJRztJQUNILFFBQVEsRUFBRSxPQUFPLENBQUM7Q0FDbkI7QUFFRDs7R0FFRztBQUNILE1BQU0sV0FBVyxrQkFBa0I7SUFDakM7Ozs7OztPQU1HO0lBQ0gsNkJBQTZCLEVBQUUsT0FBTyxDQUFDO0NBQ3hDO0FBRUQsTUFBTSxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsR0FDeEMsZUFBZSxHQUNmLFdBQVcsR0FDWCx1QkFBdUIsR0FDdkIsa0JBQWtCLENBQUM7QUFFckIsTUFBTSxNQUFNLGFBQWEsR0FBRztJQUMxQiwyQ0FBMkM7SUFDM0MsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDO0NBQ2xCLENBQUM7QUFFRixlQUFPLE1BQU0saUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsU0FBUyxDQXFDM0QsQ0FBQztBQUVGOztHQUVHO0FBQ0gsd0JBQWdCLFlBQVksSUFBSSxTQUFTLENBRXhDO0FBRUQsZUFBTyxNQUFNLG9CQUFvQixFQUFFLGtCQUFrQixDQUFDLGFBQWEsQ0FLbEUsQ0FBQztBQUVGLGVBQU8sTUFBTSxvQkFBb0IsRUFBRSxrQkFBa0IsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQVc5RSxDQUFDO0FBRUY7O0dBRUc7QUFDSCx3QkFBZ0IsZ0JBQWdCLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FRNUQifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAMxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,WAAW,EAAuB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,wBAAwB,CAAC;AAElF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,cAAc,mBAAmB,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,8CAA8C;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,yFAAyF;IACzF,gBAAgB,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,UAAU,GAAG,cAAc,GAAG,QAAQ,GAAG,WAAW,CAAC;IACpE;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,SAAS,GAAG,kBAAkB,GAAG,eAAe,GAAG,WAAW,GAAG,uBAAuB,CAAC;AAErG,MAAM,MAAM,aAAa,GAAG;IAC1B,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,kBAAkB,CAAC,SAAS,CA+B3D,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAExC;AAED,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,CAAC,aAAa,CAKlE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,CAAC,aAAa,GAAG,SAAS,CAW9E,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,SAAS,CAQ5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAMxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,WAAW,EAAuB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,wBAAwB,CAAC;AAElF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,cAAc,mBAAmB,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,8CAA8C;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,yFAAyF;IACzF,gBAAgB,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,UAAU,GAAG,cAAc,GAAG,QAAQ,GAAG,WAAW,CAAC;IACpE;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,6BAA6B,EAAE,OAAO,CAAC;CACxC;AAED,MAAM,MAAM,SAAS,GAAG,kBAAkB,GACxC,eAAe,GACf,WAAW,GACX,uBAAuB,GACvB,kBAAkB,CAAC;AAErB,MAAM,MAAM,aAAa,GAAG;IAC1B,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,kBAAkB,CAAC,SAAS,CAqC3D,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAExC;AAED,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,CAAC,aAAa,CAKlE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,CAAC,aAAa,GAAG,SAAS,CAW9E,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,SAAS,CAQ5D"}
@@ -37,6 +37,11 @@ export const pxeConfigMappings = {
37
37
  env: 'PXE_AUTO_SYNC',
38
38
  description: 'Whether PXE syncs with the node automatically before each operation. Disable to let the caller (e.g. a wallet) drive syncs explicitly via pxe.sync().',
39
39
  ...booleanConfigHelper(true)
40
+ },
41
+ concurrentContractSyncEnabled: {
42
+ env: 'PXE_CONCURRENT_CONTRACT_SYNC_ENABLED',
43
+ description: 'Whether PXE speculatively syncs contracts it predicts will follow the one requested, running them concurrently with it. Repeated flows sync faster, but a wrong prediction spends unnecessary node requests. Experimental, off by default.',
44
+ ...booleanConfigHelper(false)
40
45
  }
41
46
  };
42
47
  /**
@@ -1,6 +1,6 @@
1
1
  export function getPackageInfo() {
2
2
  return {
3
- version: '5.2.0',
3
+ version: '5.3.0',
4
4
  name: '@aztec/pxe'
5
5
  };
6
6
  }
@@ -0,0 +1,52 @@
1
+ import { FunctionSelector } from '@aztec/stdlib/abi';
2
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
3
+ /** Confidence a call must reach to be predicted. */
4
+ export declare const PREDICTION_THRESHOLD = 2;
5
+ /** Cap on a call's confidence, so a function called by many jobs is still dropped within a few missed ones. */
6
+ export declare const MAX_CONFIDENCE = 5;
7
+ /**
8
+ * A call graph over contract functions - who calls whom - learned from the direct calls observed in past jobs, so
9
+ * a function's predicted callees can sync their contracts before execution reaches them.
10
+ *
11
+ * A function's direct calls tend to repeat across jobs: constrained delivery calls the handshake registry, a transfer
12
+ * may call an authwit, an AMM calls its tokens. The same function does not always make the same calls, though: they
13
+ * can depend on context or storage state. A call must therefore repeat often enough to earn confidence before it is
14
+ * predicted. Calls are keyed per function, not per contract, since different functions of a contract call different
15
+ * contracts. See {@link commitJob} for how each call's confidence is learned from committed jobs.
16
+ *
17
+ * Purely in-memory bookkeeping: the graph is lost when PXE is rebuilt (e.g. on restart).
18
+ */
19
+ export declare class ContractCallGraph {
20
+ private readonly enabled;
21
+ private readonly activeJobs;
22
+ private readonly callConfidence;
23
+ constructor(enabled: boolean);
24
+ /** Records that `caller` directly called `callee` in the given job. */
25
+ recordCall({ jobId, caller, callee }: {
26
+ jobId: JobId;
27
+ caller: ContractFunction;
28
+ callee: ContractFunction;
29
+ }): void;
30
+ /** Predicts the functions `caller` will call directly. */
31
+ predictDirectCallees(caller: ContractFunction): ContractFunction[];
32
+ /**
33
+ * Commits the job so the calls it observed are recorded and learned from. A function that called nothing keeps its
34
+ * callees untouched, so read-only uses (e.g. reading notes or events) erode nothing.
35
+ */
36
+ commitJob(jobId: JobId): void;
37
+ /** Drops a discarded job without learning. */
38
+ discardJob(jobId: JobId): void;
39
+ }
40
+ /** A specific function of a contract, as observed in a call. */
41
+ export type ContractFunction = {
42
+ /** The address of the contract the function belongs to. */
43
+ address: AztecAddress;
44
+ /** The selector of the function. */
45
+ selector: FunctionSelector;
46
+ };
47
+ type JobId = string;
48
+ /** A {@link ContractFunction} flattened to a `contractAddress:selector` string, so maps can key on it. */
49
+ export type CallKey = `0x${string}:${string}`;
50
+ export declare function toCallKey({ address, selector }: ContractFunction): CallKey;
51
+ export {};
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3RfY2FsbF9ncmFwaC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRyYWN0L2NvbnRyYWN0X2NhbGxfZ3JhcGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELG9EQUFvRDtBQUNwRCxlQUFPLE1BQU0sb0JBQW9CLElBQUksQ0FBQztBQUV0QywrR0FBK0c7QUFDL0csZUFBTyxNQUFNLGNBQWMsSUFBSSxDQUFDO0FBRWhDOzs7Ozs7Ozs7OztHQVdHO0FBQ0gscUJBQWEsaUJBQWlCO0lBT2hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTztJQUxwQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBcUQ7SUFHaEYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQWlEO0lBRWhGLFlBQTZCLE9BQU8sRUFBRSxPQUFPLEVBQUk7SUFFakQsdUVBQXVFO0lBQ3ZFLFVBQVUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1FBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDO1FBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFBO0tBQUUsR0FBRyxJQUFJLENBaUJoSDtJQUVELDBEQUEwRDtJQUMxRCxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEdBQUcsZ0JBQWdCLEVBQUUsQ0FLakU7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLENBc0I1QjtJQUVELDhDQUE4QztJQUM5QyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLENBRTdCO0NBQ0Y7QUFFRCxnRUFBZ0U7QUFDaEUsTUFBTSxNQUFNLGdCQUFnQixHQUFHO0lBQzdCLDJEQUEyRDtJQUMzRCxPQUFPLEVBQUUsWUFBWSxDQUFDO0lBQ3RCLG9DQUFvQztJQUNwQyxRQUFRLEVBQUUsZ0JBQWdCLENBQUM7Q0FDNUIsQ0FBQztBQUVGLEtBQUssS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUVwQiwwR0FBMEc7QUFDMUcsTUFBTSxNQUFNLE9BQU8sR0FBRyxLQUFLLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztBQUU5Qyx3QkFBZ0IsU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FFMUUifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract_call_graph.d.ts","sourceRoot":"","sources":["../../src/contract/contract_call_graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,oDAAoD;AACpD,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,+GAA+G;AAC/G,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;;;;;;;;;;GAWG;AACH,qBAAa,iBAAiB;IAOhB,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqD;IAGhF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiD;IAEhF,YAA6B,OAAO,EAAE,OAAO,EAAI;IAEjD,uEAAuE;IACvE,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAE,GAAG,IAAI,CAiBhH;IAED,0DAA0D;IAC1D,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,EAAE,CAKjE;IAED;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAsB5B;IAED,8CAA8C;IAC9C,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAE7B;CACF;AAED,gEAAgE;AAChE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,2DAA2D;IAC3D,OAAO,EAAE,YAAY,CAAC;IACtB,oCAAoC;IACpC,QAAQ,EAAE,gBAAgB,CAAC;CAC5B,CAAC;AAEF,KAAK,KAAK,GAAG,MAAM,CAAC;AAEpB,0GAA0G;AAC1G,MAAM,MAAM,OAAO,GAAG,KAAK,MAAM,IAAI,MAAM,EAAE,CAAC;AAE9C,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,gBAAgB,GAAG,OAAO,CAE1E"}
@@ -0,0 +1,91 @@
1
+ import { FunctionSelector } from '@aztec/stdlib/abi';
2
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
3
+ /** Confidence a call must reach to be predicted. */ export const PREDICTION_THRESHOLD = 2;
4
+ /** Cap on a call's confidence, so a function called by many jobs is still dropped within a few missed ones. */ export const MAX_CONFIDENCE = 5;
5
+ /**
6
+ * A call graph over contract functions - who calls whom - learned from the direct calls observed in past jobs, so
7
+ * a function's predicted callees can sync their contracts before execution reaches them.
8
+ *
9
+ * A function's direct calls tend to repeat across jobs: constrained delivery calls the handshake registry, a transfer
10
+ * may call an authwit, an AMM calls its tokens. The same function does not always make the same calls, though: they
11
+ * can depend on context or storage state. A call must therefore repeat often enough to earn confidence before it is
12
+ * predicted. Calls are keyed per function, not per contract, since different functions of a contract call different
13
+ * contracts. See {@link commitJob} for how each call's confidence is learned from committed jobs.
14
+ *
15
+ * Purely in-memory bookkeeping: the graph is lost when PXE is rebuilt (e.g. on restart).
16
+ */ export class ContractCallGraph {
17
+ enabled;
18
+ // job -> caller function -> functions it called directly
19
+ activeJobs;
20
+ // caller function -> function it calls directly -> confidence score
21
+ callConfidence;
22
+ constructor(enabled){
23
+ this.enabled = enabled;
24
+ this.activeJobs = new Map();
25
+ this.callConfidence = new Map();
26
+ }
27
+ /** Records that `caller` directly called `callee` in the given job. */ recordCall({ jobId, caller, callee }) {
28
+ // Same-contract calls are ignored: our goal is to warm a callee's contract ahead of use, and the target of such
29
+ // a call is already warm.
30
+ if (!this.enabled || caller.address.equals(callee.address)) {
31
+ return;
32
+ }
33
+ let callsInJob = this.activeJobs.get(jobId);
34
+ if (!callsInJob) {
35
+ callsInJob = new Map();
36
+ this.activeJobs.set(jobId, callsInJob);
37
+ }
38
+ let callees = callsInJob.get(toCallKey(caller));
39
+ if (!callees) {
40
+ callees = new Set();
41
+ callsInJob.set(toCallKey(caller), callees);
42
+ }
43
+ callees.add(toCallKey(callee));
44
+ }
45
+ /** Predicts the functions `caller` will call directly. */ predictDirectCallees(caller) {
46
+ const callees = this.callConfidence.get(toCallKey(caller)) ?? new Map();
47
+ return [
48
+ ...callees.entries()
49
+ ].filter(([, confidence])=>confidence >= PREDICTION_THRESHOLD).map(([callee])=>fromCallKey(callee));
50
+ }
51
+ /**
52
+ * Commits the job so the calls it observed are recorded and learned from. A function that called nothing keeps its
53
+ * callees untouched, so read-only uses (e.g. reading notes or events) erode nothing.
54
+ */ commitJob(jobId) {
55
+ const callsInJob = this.activeJobs.get(jobId);
56
+ this.activeJobs.delete(jobId);
57
+ if (!callsInJob) {
58
+ return;
59
+ }
60
+ for (const [caller, observed] of callsInJob){
61
+ const callees = this.callConfidence.get(caller) ?? new Map();
62
+ for (const [callee, confidence] of callees){
63
+ const delta = observed.has(callee) ? 1 : -1;
64
+ const updated = Math.min(confidence + delta, MAX_CONFIDENCE);
65
+ if (updated === 0) {
66
+ callees.delete(callee);
67
+ } else {
68
+ callees.set(callee, updated);
69
+ }
70
+ }
71
+ // First-time callees enter at 1, below PREDICTION_THRESHOLD: a call must repeat before it is predicted.
72
+ [
73
+ ...observed
74
+ ].filter((callee)=>!callees.has(callee)).forEach((callee)=>callees.set(callee, 1));
75
+ this.callConfidence.set(caller, callees);
76
+ }
77
+ }
78
+ /** Drops a discarded job without learning. */ discardJob(jobId) {
79
+ this.activeJobs.delete(jobId);
80
+ }
81
+ }
82
+ export function toCallKey({ address, selector }) {
83
+ return `${address.toString()}:${selector.toString()}`;
84
+ }
85
+ function fromCallKey(key) {
86
+ const [address, selector] = key.split(':');
87
+ return {
88
+ address: AztecAddress.fromStringUnsafe(address),
89
+ selector: FunctionSelector.fromString(selector)
90
+ };
91
+ }
@@ -1,17 +1,24 @@
1
1
  import type { Logger } from '@aztec/foundation/log';
2
- import type { FunctionCall, FunctionSelector } from '@aztec/stdlib/abi';
2
+ import { type FunctionCall, FunctionSelector } from '@aztec/stdlib/abi';
3
3
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
4
4
  import type { AztecNode } from '@aztec/stdlib/interfaces/client';
5
5
  import type { BlockHeader } from '@aztec/stdlib/tx';
6
+ import type { ContractSyncConfig } from '../config/index.js';
6
7
  import type { StagedStore } from '../job_coordinator/job_coordinator.js';
7
8
  import type { ContractStore } from '../storage/contract_store/contract_store.js';
8
9
  import type { NoteStore } from '../storage/note_store/note_store.js';
10
+ import { type ContractFunction } from './contract_call_graph.js';
9
11
  import type { ContractClassService } from './contract_class_service.js';
10
12
  /**
11
13
  * Maximum number of scope syncs running concurrently within a single sync call. Sized to trade off parallelism
12
14
  * on non-ACIR work (node RPC, note store reads) against memory pressure from concurrent circuit execution.
13
15
  */
14
16
  export declare const MAX_CONCURRENT_SCOPE_SYNCS = 5;
17
+ /**
18
+ * Selector of the macro-generated `sync_state` utility function, which is the same for every contract.
19
+ * Pinned against a compiled artifact in tests, so a macro signature change fails there.
20
+ */
21
+ export declare const SYNC_STATE_SELECTOR: FunctionSelector;
15
22
  /**
16
23
  * Service for syncing the private state of contracts. It uses a cache to avoid redundant sync operations - the cache
17
24
  * is wiped when the anchor block changes.
@@ -26,23 +33,51 @@ export declare class ContractSyncService implements StagedStore {
26
33
  private noteStore;
27
34
  private log;
28
35
  readonly storeName = "contract_sync";
29
- private syncedContracts;
30
- constructor(aztecNode: AztecNode, contractStore: ContractStore, contractClassService: ContractClassService, noteStore: NoteStore, log: Logger);
36
+ private readonly syncedContracts;
37
+ private readonly speculationByJob;
38
+ private readonly callGraph;
39
+ constructor(aztecNode: AztecNode, contractStore: ContractStore, contractClassService: ContractClassService, noteStore: NoteStore, log: Logger, { concurrentContractSyncEnabled }: ContractSyncConfig);
31
40
  /**
32
41
  * Ensures a contract's private state is synchronized.
33
42
  * Uses a cache to avoid redundant sync operations - the cache is wiped when the anchor block changes.
34
- * @param contractAddress - The address of the contract to sync.
35
- * @param functionToInvokeAfterSync - The function selector that will be called after sync (used to validate it's
36
- * not sync_state itself).
37
- * @param utilityExecutor - Executor function for running the sync_state utility function.
38
- * @param scopes - Access scopes to pass through to the utility executor (affects whose account's private state is discovered).
39
43
  */
40
- ensureContractSynced(contractAddress: AztecAddress, functionToInvokeAfterSync: FunctionSelector | null, utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<any>, anchorBlockHeader: BlockHeader, jobId: string, scopes: AztecAddress[]): Promise<void>;
44
+ ensureContractSynced({ contract, functionToInvokeAfterSync, utilityExecutor, anchorBlockHeader, jobId, scopes, triggeredBy }: ContractSyncRequest): Promise<void>;
45
+ /**
46
+ * Waits until every speculative sync the job fired has finished, then rejects if any failed, so the job discards
47
+ * instead of committing. This is needed because a sync that fails midway can leave partial staged writes, and a
48
+ * speculative failure might not be surfaced by any request.
49
+ */
50
+ settle(jobId: JobId): Promise<void>;
41
51
  /** Clears sync cache entries for the given scopes of a contract. */
42
52
  invalidateContractForScopes(contractAddress: AztecAddress, scopes: AztecAddress[]): void;
43
53
  /** Clears sync cache. Called by BlockSynchronizer when anchor block changes. */
44
54
  wipe(): void;
45
- commit(_jobId: string): Promise<void>;
46
- discardStaged(_jobId: string): Promise<void>;
55
+ commit(jobId: JobId): Promise<void>;
56
+ discardStaged(jobId: JobId): Promise<void>;
47
57
  }
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3Rfc3luY19zZXJ2aWNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJhY3QvY29udHJhY3Rfc3luY19zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSXBELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3hFLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXBELE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXpFLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2pGLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JFLE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHeEU7OztHQUdHO0FBQ0gsZUFBTyxNQUFNLDBCQUEwQixJQUFJLENBQUM7QUFFNUM7Ozs7O0dBS0c7QUFDSCxxQkFBYSxtQkFBb0IsWUFBVyxXQUFXOztJQVNuRCxPQUFPLENBQUMsU0FBUztJQUNqQixPQUFPLENBQUMsYUFBYTtJQUNyQixPQUFPLENBQUMsb0JBQW9CO0lBQzVCLE9BQU8sQ0FBQyxTQUFTO0lBQ2pCLE9BQU8sQ0FBQyxHQUFHO0lBWmIsUUFBUSxDQUFDLFNBQVMsbUJBQW1CO0lBS3JDLE9BQU8sQ0FBQyxlQUFlLENBQXlDO0lBRWhFLFlBQ1UsU0FBUyxFQUFFLFNBQVMsRUFDcEIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQzFDLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLEdBQUcsRUFBRSxNQUFNLEVBQ2pCO0lBRUo7Ozs7Ozs7O09BUUc7SUFDRyxvQkFBb0IsQ0FDeEIsZUFBZSxFQUFFLFlBQVksRUFDN0IseUJBQXlCLEVBQUUsZ0JBQWdCLEdBQUcsSUFBSSxFQUNsRCxlQUFlLEVBQUUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQzdFLGlCQUFpQixFQUFFLFdBQVcsRUFDOUIsS0FBSyxFQUFFLE1BQU0sRUFDYixNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FjZjtJQUVELG9FQUFvRTtJQUNwRSwyQkFBMkIsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJLENBS3ZGO0lBRUQsZ0ZBQWdGO0lBQ2hGLElBQUksSUFBSSxJQUFJLENBR1g7SUFFRCxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBRXBDO0lBRUQsYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUszQztDQWlFRiJ9
58
+ /** A request to synchronize a contract's private state. */
59
+ type ContractSyncRequest = {
60
+ /** The contract to sync. */
61
+ contract: AztecAddress;
62
+ /**
63
+ * The function that will be invoked after the sync, or null when nothing will be invoked (e.g. reading
64
+ * notes/events directly).
65
+ */
66
+ functionToInvokeAfterSync: FunctionSelector | null;
67
+ /** Executes a utility function call under the given scopes. Syncs run each contract's sync_state through it. */
68
+ utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<any>;
69
+ /** The anchor block to sync at. */
70
+ anchorBlockHeader: BlockHeader;
71
+ /** The job requesting the sync. */
72
+ jobId: JobId;
73
+ /** Access scopes to pass through to the utility executor (affects whose account's private state is discovered). */
74
+ scopes: AztecAddress[];
75
+ /**
76
+ * The function whose execution triggered this sync request, or undefined when the request is a job's top-level use
77
+ * (an entry call or a direct read) rather than a nested call.
78
+ */
79
+ triggeredBy: ContractFunction | undefined;
80
+ };
81
+ type JobId = string;
82
+ export {};
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3Rfc3luY19zZXJ2aWNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJhY3QvY29udHJhY3Rfc3luY19zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSXBELE9BQU8sRUFBRSxLQUFLLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3hFLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXBELE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDN0QsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFekUsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDakYsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckUsT0FBTyxFQUFtQyxLQUFLLGdCQUFnQixFQUFhLE1BQU0sMEJBQTBCLENBQUM7QUFDN0csT0FBTyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUd4RTs7O0dBR0c7QUFDSCxlQUFPLE1BQU0sMEJBQTBCLElBQUksQ0FBQztBQUU1Qzs7O0dBR0c7QUFDSCxlQUFPLE1BQU0sbUJBQW1CLGtCQUE0QyxDQUFDO0FBRTdFOzs7OztHQUtHO0FBQ0gscUJBQWEsbUJBQW9CLFlBQVcsV0FBVzs7SUFjbkQsT0FBTyxDQUFDLFNBQVM7SUFDakIsT0FBTyxDQUFDLGFBQWE7SUFDckIsT0FBTyxDQUFDLG9CQUFvQjtJQUM1QixPQUFPLENBQUMsU0FBUztJQUNqQixPQUFPLENBQUMsR0FBRztJQWpCYixRQUFRLENBQUMsU0FBUyxtQkFBbUI7SUFJckMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQTBDO0lBRzFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQXlDO0lBRzFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFvQjtJQUU5QyxZQUNVLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLGFBQWEsRUFBRSxhQUFhLEVBQzVCLG9CQUFvQixFQUFFLG9CQUFvQixFQUMxQyxTQUFTLEVBQUUsU0FBUyxFQUNwQixHQUFHLEVBQUUsTUFBTSxFQUNuQixFQUFFLDZCQUE2QixFQUFFLEVBQUUsa0JBQWtCLEVBR3REO0lBRUQ7OztPQUdHO0lBQ0csb0JBQW9CLENBQUMsRUFDekIsUUFBUSxFQUNSLHlCQUF5QixFQUN6QixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLEtBQUssRUFDTCxNQUFNLEVBQ04sV0FBVyxFQUNaLEVBQUUsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQWtCckM7SUFFRDs7OztPQUlHO0lBQ0csTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQWV4QztJQUVELG9FQUFvRTtJQUNwRSwyQkFBMkIsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJLENBS3ZGO0lBRUQsZ0ZBQWdGO0lBQ2hGLElBQUksSUFBSSxJQUFJLENBR1g7SUFFRCxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBSWxDO0lBRUQsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQU96QztDQXFKRjtBQUVELDJEQUEyRDtBQUMzRCxLQUFLLG1CQUFtQixHQUFHO0lBQ3pCLDRCQUE0QjtJQUM1QixRQUFRLEVBQUUsWUFBWSxDQUFDO0lBQ3ZCOzs7T0FHRztJQUNILHlCQUF5QixFQUFFLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUNuRCxnSEFBZ0g7SUFDaEgsZUFBZSxFQUFFLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlFLG1DQUFtQztJQUNuQyxpQkFBaUIsRUFBRSxXQUFXLENBQUM7SUFDL0IsbUNBQW1DO0lBQ25DLEtBQUssRUFBRSxLQUFLLENBQUM7SUFDYixtSEFBbUg7SUFDbkgsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDO0lBQ3ZCOzs7T0FHRztJQUNILFdBQVcsRUFBRSxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7Q0FDM0MsQ0FBQztBQUVGLEtBQUssS0FBSyxHQUFHLE1BQU0sQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"contract_sync_service.d.ts","sourceRoot":"","sources":["../../src/contract/contract_sync_service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAIpD,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGxE;;;GAGG;AACH,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,WAAW;;IASnD,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,GAAG;IAZb,QAAQ,CAAC,SAAS,mBAAmB;IAKrC,OAAO,CAAC,eAAe,CAAyC;IAEhE,YACU,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa,EAC5B,oBAAoB,EAAE,oBAAoB,EAC1C,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACjB;IAEJ;;;;;;;;OAQG;IACG,oBAAoB,CACxB,eAAe,EAAE,YAAY,EAC7B,yBAAyB,EAAE,gBAAgB,GAAG,IAAI,EAClD,eAAe,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EAC7E,iBAAiB,EAAE,WAAW,EAC9B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,YAAY,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC,CAcf;IAED,oEAAoE;IACpE,2BAA2B,CAAC,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAKvF;IAED,gFAAgF;IAChF,IAAI,IAAI,IAAI,CAGX;IAED,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpC;IAED,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3C;CAiEF"}
1
+ {"version":3,"file":"contract_sync_service.d.ts","sourceRoot":"","sources":["../../src/contract/contract_sync_service.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,18 @@
1
1
  import { allToCompletion } from '@aztec/foundation/promise';
2
2
  import { Semaphore } from '@aztec/foundation/queue';
3
3
  import { isProtocolContract } from '@aztec/protocol-contracts';
4
+ import { FunctionSelector } from '@aztec/stdlib/abi';
4
5
  import { NoteService } from '../notes/note_service.js';
6
+ import { ContractCallGraph, toCallKey } from './contract_call_graph.js';
5
7
  import { syncScope } from './helpers.js';
6
8
  /**
7
9
  * Maximum number of scope syncs running concurrently within a single sync call. Sized to trade off parallelism
8
10
  * on non-ACIR work (node RPC, note store reads) against memory pressure from concurrent circuit execution.
9
11
  */ export const MAX_CONCURRENT_SCOPE_SYNCS = 5;
12
+ /**
13
+ * Selector of the macro-generated `sync_state` utility function, which is the same for every contract.
14
+ * Pinned against a compiled artifact in tests, so a macro signature change fails there.
15
+ */ export const SYNC_STATE_SELECTOR = FunctionSelector.fromString('0x418ef5da');
10
16
  /**
11
17
  * Service for syncing the private state of contracts. It uses a cache to avoid redundant sync operations - the cache
12
18
  * is wiped when the anchor block changes.
@@ -20,10 +26,13 @@ import { syncScope } from './helpers.js';
20
26
  log;
21
27
  storeName;
22
28
  // Tracks contracts synced since last wipe. The cache is keyed per individual scope address
23
- // (`contractAddress:scopeAddress`), or `contractAddress:*` for all scopes (all accounts).
24
- // The value is a promise that resolves when the contract is synced.
29
+ // (`contractAddress:scopeAddress`). The value is a promise that resolves when the contract is synced.
25
30
  syncedContracts;
26
- constructor(aztecNode, contractStore, contractClassService, noteStore, log){
31
+ // Per-job speculation state, dropped when the job commits or discards.
32
+ speculationByJob;
33
+ // Predicts a function's callees from the calls observed in past jobs, driving speculative sync.
34
+ callGraph;
35
+ constructor(aztecNode, contractStore, contractClassService, noteStore, log, { concurrentContractSyncEnabled }){
27
36
  this.aztecNode = aztecNode;
28
37
  this.contractStore = contractStore;
29
38
  this.contractClassService = contractClassService;
@@ -31,18 +40,42 @@ import { syncScope } from './helpers.js';
31
40
  this.log = log;
32
41
  this.storeName = 'contract_sync';
33
42
  this.syncedContracts = new Map();
43
+ this.speculationByJob = new Map();
44
+ this.callGraph = new ContractCallGraph(concurrentContractSyncEnabled);
34
45
  }
35
46
  /**
36
47
  * Ensures a contract's private state is synchronized.
37
48
  * Uses a cache to avoid redundant sync operations - the cache is wiped when the anchor block changes.
38
- * @param contractAddress - The address of the contract to sync.
39
- * @param functionToInvokeAfterSync - The function selector that will be called after sync (used to validate it's
40
- * not sync_state itself).
41
- * @param utilityExecutor - Executor function for running the sync_state utility function.
42
- * @param scopes - Access scopes to pass through to the utility executor (affects whose account's private state is discovered).
43
- */ async ensureContractSynced(contractAddress, functionToInvokeAfterSync, utilityExecutor, anchorBlockHeader, jobId, scopes) {
44
- this.#startSyncIfNeeded(contractAddress, scopes, anchorBlockHeader, jobId, (scope)=>syncScope(contractAddress, this.contractStore, this.contractClassService, anchorBlockHeader, functionToInvokeAfterSync, utilityExecutor, scope));
45
- await this.#awaitSync(contractAddress, scopes);
49
+ */ async ensureContractSynced({ contract, functionToInvokeAfterSync, utilityExecutor, anchorBlockHeader, jobId, scopes, triggeredBy }) {
50
+ // A call is recorded only when both functions are known: the invoked callee and the caller that triggered it.
51
+ if (functionToInvokeAfterSync && triggeredBy) {
52
+ this.callGraph.recordCall({
53
+ jobId,
54
+ caller: triggeredBy,
55
+ callee: {
56
+ address: contract,
57
+ selector: functionToInvokeAfterSync
58
+ }
59
+ });
60
+ }
61
+ await this.#startSyncIfNeeded(contract, functionToInvokeAfterSync, utilityExecutor, anchorBlockHeader, jobId, scopes);
62
+ }
63
+ /**
64
+ * Waits until every speculative sync the job fired has finished, then rejects if any failed, so the job discards
65
+ * instead of committing. This is needed because a sync that fails midway can leave partial staged writes, and a
66
+ * speculative failure might not be surfaced by any request.
67
+ */ async settle(jobId) {
68
+ // A speculative sync's execution can fire more speculative syncs mid-drain, so loop until no new promises
69
+ // appear, and only escalate once nothing is still writing.
70
+ const { syncs } = this.#speculationForJob(jobId);
71
+ const failures = [];
72
+ while(syncs.length > 0){
73
+ const results = await Promise.allSettled(syncs.splice(0));
74
+ failures.push(...results.filter((result)=>result.status === 'rejected').map((result)=>result.reason));
75
+ }
76
+ if (failures.length > 0) {
77
+ throw new AggregateError(failures, 'Speculative syncs failed, so the job must discard its staged writes instead of committing');
78
+ }
46
79
  }
47
80
  /** Clears sync cache entries for the given scopes of a contract. */ invalidateContractForScopes(contractAddress, scopes) {
48
81
  if (scopes.length === 0) {
@@ -54,41 +87,91 @@ import { syncScope } from './helpers.js';
54
87
  this.log.debug(`Wiping contract sync cache (${this.syncedContracts.size} entries)`);
55
88
  this.syncedContracts.clear();
56
89
  }
57
- commit(_jobId) {
90
+ commit(jobId) {
91
+ this.callGraph.commitJob(jobId);
92
+ this.speculationByJob.delete(jobId);
58
93
  return Promise.resolve();
59
94
  }
60
- discardStaged(_jobId) {
95
+ discardStaged(jobId) {
61
96
  // We clear the synced contracts cache here because, when the job is discarded, any associated database writes from
62
97
  // the sync are also undone.
63
98
  this.syncedContracts.clear();
99
+ this.callGraph.discardJob(jobId);
100
+ this.speculationByJob.delete(jobId);
64
101
  return Promise.resolve();
65
102
  }
66
103
  /**
67
104
  * For each unsynced scope, creates a promise that waits on:
68
105
  * 1. Note nullifier sync (shared, batched across all unsynced scopes).
69
106
  * 2. Per-scope sync (individual, semaphore-bounded).
70
- */ #startSyncIfNeeded(contractAddress, scopes, anchorBlockHeader, jobId, syncScopeFn) {
107
+ * When concurrent contract sync is enabled, the predicted direct callees of the invoked function and of the
108
+ * contract's `sync_state` start speculatively too, once the contract's own syncs have started (see
109
+ * {@link #speculativelySync}).
110
+ * @returns A promise that resolves once every requested scope is synced, including syncs already in flight from
111
+ * concurrent calls. Speculative syncs are not included: those are only awaited by a later request that needs
112
+ * their contract, or by the job's {@link settle}.
113
+ */ async #startSyncIfNeeded(contractAddress, functionToInvokeAfterSync, utilityExecutor, anchorBlockHeader, jobId, scopes) {
71
114
  const scopesToSync = scopes.filter((scope)=>!this.syncedContracts.has(toKey(contractAddress, scope)));
72
- if (scopesToSync.length === 0) {
115
+ if (scopesToSync.length > 0) {
116
+ this.log.debug(`Syncing contract ${contractAddress} for ${scopesToSync.length} scope(s)`);
117
+ const syncNullifiersPromise = this.#syncNoteNullifiers(contractAddress, anchorBlockHeader, jobId, scopesToSync);
118
+ // We build a new semaphore for each sync call, so it rate-limits the scopes within that single call. We do
119
+ // this so that if these scope syncs trigger nested syncs, the nested ones can execute without causing a deadlock.
120
+ const syncSlot = new Semaphore(MAX_CONCURRENT_SCOPE_SYNCS);
121
+ for (const scope of scopesToSync){
122
+ const key = toKey(contractAddress, scope);
123
+ const syncScopePromise = runBounded(syncSlot, ()=>syncScope(contractAddress, this.contractStore, this.contractClassService, anchorBlockHeader, functionToInvokeAfterSync, utilityExecutor, scope));
124
+ // This cached promise is what every later request for this scope awaits, and both branches write staged data,
125
+ // so it must run both to completion even when one fails.
126
+ const promise = allToCompletion([
127
+ syncNullifiersPromise,
128
+ syncScopePromise
129
+ ]).then(()=>{}).catch((err)=>{
130
+ this.syncedContracts.delete(key);
131
+ throw err;
132
+ });
133
+ this.syncedContracts.set(key, promise);
134
+ }
135
+ }
136
+ // `sync_state` itself calls other contracts (e.g. most contract syncs query the handshake registry), so its
137
+ // predicted callees start syncing alongside the contract's own syncs.
138
+ this.#speculativelySync(contractAddress, SYNC_STATE_SELECTOR, utilityExecutor, anchorBlockHeader, jobId, scopes);
139
+ this.#speculativelySync(contractAddress, functionToInvokeAfterSync, utilityExecutor, anchorBlockHeader, jobId, scopes);
140
+ await this.#awaitSync(contractAddress, scopes);
141
+ }
142
+ /**
143
+ * Starts the syncs of the contracts the given function is predicted to call (see {@link ContractCallGraph} for how
144
+ * predictions are learned). Each started sync speculates from its own function in turn, so the whole predicted call
145
+ * tree syncs in parallel with the contract instead of one contract at a time as execution reaches it.
146
+ *
147
+ * A wrong prediction is cheap: the extra node requests are batched into round trips the job already makes, and the
148
+ * synced data simply goes unused.
149
+ */ #speculativelySync(contractAddress, functionToInvokeAfterSync, utilityExecutor, anchorBlockHeader, jobId, scopes) {
150
+ // Without a function there is no key to predict from (the request is a direct read).
151
+ if (!functionToInvokeAfterSync) {
73
152
  return;
74
153
  }
75
- this.log.debug(`Syncing contract ${contractAddress} for ${scopesToSync.length} scope(s)`);
76
- const syncNullifiersPromise = this.#syncNoteNullifiers(contractAddress, anchorBlockHeader, jobId, scopesToSync);
77
- // We build a new semaphore for each sync call, so it rate-limits the scopes within that single call. We do
78
- // this so that if these scope syncs trigger nested syncs, the nested ones can execute without causing a deadlock.
79
- const syncSlot = new Semaphore(MAX_CONCURRENT_SCOPE_SYNCS);
80
- for (const scope of scopesToSync){
81
- const key = toKey(contractAddress, scope);
82
- // This cached promise is what every later request for this scope awaits, and both branches write staged data,
83
- // so it must run both to completion even when one fails.
84
- const promise = allToCompletion([
85
- syncNullifiersPromise,
86
- runBounded(syncSlot, ()=>syncScopeFn(scope))
87
- ]).then(()=>{}).catch((err)=>{
88
- this.syncedContracts.delete(key);
89
- throw err;
154
+ const speculation = this.#speculationForJob(jobId);
155
+ const caller = {
156
+ address: contractAddress,
157
+ selector: functionToInvokeAfterSync
158
+ };
159
+ for (const callee of this.callGraph.predictDirectCallees(caller)){
160
+ // The job's set of already-speculated functions stops the recursion when the predicted graph has a cycle.
161
+ if (speculation.speculated.has(toCallKey(callee))) {
162
+ continue;
163
+ }
164
+ speculation.speculated.add(toCallKey(callee));
165
+ const syncPromise = this.#startSyncIfNeeded(callee.address, callee.selector, utilityExecutor, anchorBlockHeader, jobId, scopes);
166
+ speculation.syncs.push(syncPromise);
167
+ // `settle` only escalates these failures at the end of the job: catch here so one does not become an unhandled
168
+ // rejection before then, and log it.
169
+ syncPromise.catch((err)=>{
170
+ this.log.warn(`Speculative sync of ${callee.address} failed`, {
171
+ jobId,
172
+ error: err?.message
173
+ });
90
174
  });
91
- this.syncedContracts.set(key, promise);
92
175
  }
93
176
  }
94
177
  /** Syncs note nullifiers across all unsynced scopes in a single batched call. */ async #syncNoteNullifiers(contractAddress, anchorBlockHeader, jobId, scopes) {
@@ -101,6 +184,17 @@ import { syncScope } from './helpers.js';
101
184
  const noteService = new NoteService(this.noteStore, this.aztecNode, anchorBlockHeader, jobId);
102
185
  await noteService.syncNoteNullifiers(contractAddress, scopes);
103
186
  }
187
+ #speculationForJob(jobId) {
188
+ let speculation = this.speculationByJob.get(jobId);
189
+ if (!speculation) {
190
+ speculation = {
191
+ speculated: new Set(),
192
+ syncs: []
193
+ };
194
+ this.speculationByJob.set(jobId, speculation);
195
+ }
196
+ return speculation;
197
+ }
104
198
  /** Collects all relevant scope promises (including in-flight ones from concurrent calls) and awaits them. */ async #awaitSync(contractAddress, scopes) {
105
199
  const promises = scopes.map((scope)=>this.syncedContracts.get(toKey(contractAddress, scope))).filter((p)=>p !== undefined);
106
200
  await allToCompletion(promises);
@@ -222,4 +222,4 @@ export declare class PrivateExecutionOracle extends UtilityExecutionOracle imple
222
222
  getDebugFunctionName(): Promise<string>;
223
223
  protected get callerContext(): "private" | "private view";
224
224
  }
225
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZV9leGVjdXRpb25fb3JhY2xlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29udHJhY3RfZnVuY3Rpb25fc2ltdWxhdG9yL29yYWNsZS9wcml2YXRlX2V4ZWN1dGlvbl9vcmFjbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBS3BELE9BQU8sRUFDTCxLQUFLLFdBQVcsRUFFaEIsZ0JBQWdCLEVBQ2hCLEtBQUssWUFBWSxFQUVsQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBRUwsb0JBQW9CLEVBR3BCLEtBQUssaUJBQWlCLEVBQ3ZCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFRLEtBQUssVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0QsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixXQUFXLEVBQ1gsMEJBQTBCLEVBQzFCLEtBQUssU0FBUyxFQUNmLE1BQU0sa0JBQWtCLENBQUM7QUFVMUIsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUU5RixPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2pGLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzVELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDdkYsT0FBTyxLQUFLLEVBQUUsUUFBUSxF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
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZV9leGVjdXRpb25fb3JhY2xlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29udHJhY3RfZnVuY3Rpb25fc2ltdWxhdG9yL29yYWNsZS9wcml2YXRlX2V4ZWN1dGlvbl9vcmFjbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBS3BELE9BQU8sRUFDTCxLQUFLLFdBQVcsRUFFaEIsZ0JBQWdCLEVBQ2hCLEtBQUssWUFBWSxFQUVsQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBRUwsb0JBQW9CLEVBR3BCLEtBQUssaUJBQWlCLEVBQ3ZCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFRLEtBQUssVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0QsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixXQUFXLEVBQ1gsMEJBQTBCLEVBQzFCLEtBQUssU0FBUyxFQUNmLE1BQU0sa0JBQWtCLENBQUM7QUFVMUIsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUU5RixPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2pGLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzVELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDdkYsT0FBTyxLQUFLLEVBQUUsUUFBUSxF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
@@ -1 +1 @@
1
- {"version":3,"file":"private_execution_oracle.d.ts","sourceRoot":"","sources":["../../../src/contract_function_simulator/oracle/private_execution_oracle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"private_execution_oracle.d.ts","sourceRoot":"","sources":["../../../src/contract_function_simulator/oracle/private_execution_oracle.ts"],"names":[],"mappings":"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"}
@@ -473,7 +473,18 @@ import { UtilityExecutionOracle } from './utility_execution_oracle.js';
473
473
  const simulatorSetupTimer = new Timer();
474
474
  this.logger.debug(`Calling private function ${targetContractAddress}:${functionSelector} from ${this.callContext.contractAddress}`);
475
475
  isStaticCall = isStaticCall || this.callContext.isStaticCall;
476
- await this.contractSyncService.ensureContractSynced(targetContractAddress, functionSelector, this.utilityExecutor, this.anchorBlockHeader, this.jobId, this.scopes);
476
+ await this.contractSyncService.ensureContractSynced({
477
+ contract: targetContractAddress,
478
+ functionToInvokeAfterSync: functionSelector,
479
+ utilityExecutor: this.utilityExecutor,
480
+ anchorBlockHeader: this.anchorBlockHeader,
481
+ jobId: this.jobId,
482
+ scopes: this.scopes,
483
+ triggeredBy: {
484
+ address: this.callContext.contractAddress,
485
+ selector: this.callContext.functionSelector
486
+ }
487
+ });
477
488
  const targetArtifact = await this.anchoredContractData.getFunctionArtifactWithDebugMetadata(targetContractAddress, functionSelector);
478
489
  if (!targetArtifact) {
479
490
  throw new Error(`Cannot call ${targetContractAddress}:${functionSelector}: the contract is not registered. ` + `Register it via wallet.registerContract(...).`);