-
Notifications
You must be signed in to change notification settings - Fork 297
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Speed up transaction execution #10172
Conversation
bytecodeCommitment = poseidon2Hash([encodedBytecode[i + 1], bytecodeCommitment]); | ||
} | ||
return bytecodeCommitment; | ||
return bytecodeLength == 0 ? new Fr(0) : poseidon2HashAccumulate(encodedBytecode.slice(1, bytecodeLength + 1)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@IlyasRidhuan do we have any test (e.g. fixed hash) to know that this still works exactly as before?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not directly - but it'll be covered in the avm_proving.test
because the witgen will compute it in the loop and ASSERTs
they are the same
assert( | ||
contractClass, | ||
`Contract class not found in DB, but a contract instance was found with this class ID (${instance.contractClassId}). This should not happen!`, | ||
); | ||
|
||
assert( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@dbanks12 we'll have to add this to the list of errors to handle properly. (same with the contract class)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think we want to handle this error. This means something is broken because the contract instance "exists", but it's contract class or bytecode are missing in the DB. So there is a bug somewhere.
@@ -103,7 +103,7 @@ type OperandNativeType = number | bigint; | |||
type OperandWriter = (value: any) => void; | |||
|
|||
// Specifies how to read and write each operand type. | |||
const OPERAND_SPEC = new Map<OperandType, [number, () => OperandNativeType, OperandWriter]>([ | |||
const OPERAND_SPEC = new Map<OperandType, [number, (offset: number) => OperandNativeType, OperandWriter]>([ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@PhilWindle does having the offset here help a lot?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We could probably remove this if we think this is undesirable. I flamegraphed the buffer/cursor stuff and creating subarray
s for each instruction decode came out as the most costly part of this process. So I switched it to basically keep the same buffer with a single offset that is moved around. However, I later found that this buffer/cursor latency was marginal in the grand scheme of the decoding process.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No worries, it's ok if it helps.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM for the avm side. I'll let Palla aprove the archiver/db side.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good! There are some changes I'd push for, but they are not critical and can be addressed in another PR if you prefer.
if (process.env.LOG_LEVEL === 'debug') { | ||
this.tallyPrintFunction = this.printOpcodeTallies; | ||
this.tallyInstructionFunction = this.tallyInstruction; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This will ignore namespaces set in the debug env var, but I can take care of it as part of the upcoming logs refactor.
@@ -23,6 +27,11 @@ export class BufferCursor { | |||
assert(n < this._buffer.length); | |||
} | |||
|
|||
public peakUint8(): number { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
public peakUint8(): number { | |
public peekUint8(): number { |
@@ -46,6 +46,7 @@ export class KVArchiverDataStore implements ArchiverDataStore { | |||
#contractClassStore: ContractClassStore; | |||
#contractInstanceStore: ContractInstanceStore; | |||
#contractArtifactStore: ContractArtifactsStore; | |||
private functionNames = new Map<string, string>(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't this be persisted, as opposed to an in-memory Map? If we do it memory-only as a cache, then the getter should recalculate it on a miss.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As discussed. These are currently in memory only as they are a debugging feature that is perhaps not a full feature of the node or it's api. I've commented that this needs to be reviewed along with other similar features.
contract.functions.forEach(f => { | ||
this.functionNames.set(FunctionSelector.fromNameAndParameters(f.name, f.parameters).toString(), f.name); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This will cause issues down the road with selector clashes. A selector is just 4 bytes (we're borrowing this from Ethereum), so it's relatively easy to stumble upon a collision. Indexing the functionNames
collection by selector only will mean that the most recently stored selector will overwrite any previous ones.
Unfortunately, I think the only recourse is to store both contract class id and selector as key.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fun fact: proxies built using the DELEGATECALL pattern in Ethereum were subject to a vulnerability caused by selector clashing.
https://forum.openzeppelin.com/t/beware-of-the-proxy-learn-how-to-exploit-function-clashing/1070
getBytecodeCommitment(contractClassId: Fr): Promise<Fr | undefined> { | ||
return this.store.getBytecodeCommitment(contractClassId); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think there are any cases where we want the bytecode commitment but not the bytecode, right? If so, instead of having a separate getter for the bytecode commitment, I'd just store it along with the rest of the contract class in the same store, so we don't have to query for them separately. But this is just a cleanup, no need to do now.
…kages into pw/check-times-2
…kages into pw/check-times-2
🤖 I have created a release *beep* *boop* --- <details><summary>aztec-package: 0.65.1</summary> ## [0.65.1](aztec-package-v0.65.0...aztec-package-v0.65.1) (2024-11-27) ### Miscellaneous * Delete old serialization methods ([#9951](#9951)) ([10d3f6f](10d3f6f)) </details> <details><summary>barretenberg.js: 0.65.1</summary> ## [0.65.1](barretenberg.js-v0.65.0...barretenberg.js-v0.65.1) (2024-11-27) ### Features * Speed up transaction execution ([#10172](#10172)) ([da265b6](da265b6)) ### Bug Fixes * Add pako as a dependency in bb.js ([#10186](#10186)) ([b773c14](b773c14)) </details> <details><summary>aztec-packages: 0.65.1</summary> ## [0.65.1](aztec-packages-v0.65.0...aztec-packages-v0.65.1) (2024-11-27) ### Features * Add total mana used to header ([#9868](#9868)) ([2478d19](2478d19)) * Assert metrics in network tests ([#10215](#10215)) ([9380c0f](9380c0f)) * Avm inserts nullifiers from private ([#10129](#10129)) ([3fc0c7c](3fc0c7c)) * Burn congestion fee ([#10231](#10231)) ([20a33f2](20a33f2)) * Configure world state block history ([#10216](#10216)) ([01eb392](01eb392)) * Integrate fee into rollup ([#10176](#10176)) ([12744d6](12744d6)) * Speed up transaction execution ([#10172](#10172)) ([da265b6](da265b6)) * Using current gas prices in cli-wallet ([#10105](#10105)) ([15ffeea](15ffeea)) ### Bug Fixes * Add pako as a dependency in bb.js ([#10186](#10186)) ([b773c14](b773c14)) * **avm:** Execution test ordering ([#10226](#10226)) ([49b4a6c](49b4a6c)) * Deploy preview master ([#10227](#10227)) ([321a175](321a175)) * Use current base fee for public fee payment ([#10230](#10230)) ([f081d80](f081d80)) ### Miscellaneous * Add traces and histograms to avm simulator ([#10233](#10233)) ([e83726d](e83726d)), closes [#10146](#10146) * Avm-proving and avm-integration tests do not require simulator to export function with jest mocks ([#10228](#10228)) ([f28fcdb](f28fcdb)) * **avm:** Handle parsing error ([#10203](#10203)) ([3c623fc](3c623fc)), closes [#9770](#9770) * **avm:** Zero initialization in avm public inputs and execution test fixes ([#10238](#10238)) ([0c7c4c9](0c7c4c9)) * Bump timeout for after-hook for data store test again ([#10240](#10240)) ([52047f0](52047f0)) * CIVC VK ([#10223](#10223)) ([089c34c](089c34c)) * Declare global types ([#10206](#10206)) ([7b2e343](7b2e343)) * Delete old serialization methods ([#9951](#9951)) ([10d3f6f](10d3f6f)) * Fix migration notes ([#10252](#10252)) ([05bdcd5](05bdcd5)) * Pull out some sync changes ([#10245](#10245)) ([1bfc15e](1bfc15e)) * Remove docs from sync ([#10241](#10241)) ([eeea0aa](eeea0aa)) * Replace relative paths to noir-protocol-circuits ([e7690ca](e7690ca)) </details> <details><summary>barretenberg: 0.65.1</summary> ## [0.65.1](barretenberg-v0.65.0...barretenberg-v0.65.1) (2024-11-27) ### Features * Add total mana used to header ([#9868](#9868)) ([2478d19](2478d19)) * Configure world state block history ([#10216](#10216)) ([01eb392](01eb392)) * Speed up transaction execution ([#10172](#10172)) ([da265b6](da265b6)) ### Bug Fixes * **avm:** Execution test ordering ([#10226](#10226)) ([49b4a6c](49b4a6c)) ### Miscellaneous * **avm:** Handle parsing error ([#10203](#10203)) ([3c623fc](3c623fc)), closes [#9770](#9770) * **avm:** Zero initialization in avm public inputs and execution test fixes ([#10238](#10238)) ([0c7c4c9](0c7c4c9)) * CIVC VK ([#10223](#10223)) ([089c34c](089c34c)) * Pull out some sync changes ([#10245](#10245)) ([1bfc15e](1bfc15e)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
🤖 I have created a release *beep* *boop* --- <details><summary>aztec-package: 0.65.1</summary> ## [0.65.1](AztecProtocol/aztec-packages@aztec-package-v0.65.0...aztec-package-v0.65.1) (2024-11-27) ### Miscellaneous * Delete old serialization methods ([#9951](AztecProtocol/aztec-packages#9951)) ([10d3f6f](AztecProtocol/aztec-packages@10d3f6f)) </details> <details><summary>barretenberg.js: 0.65.1</summary> ## [0.65.1](AztecProtocol/aztec-packages@barretenberg.js-v0.65.0...barretenberg.js-v0.65.1) (2024-11-27) ### Features * Speed up transaction execution ([#10172](AztecProtocol/aztec-packages#10172)) ([da265b6](AztecProtocol/aztec-packages@da265b6)) ### Bug Fixes * Add pako as a dependency in bb.js ([#10186](AztecProtocol/aztec-packages#10186)) ([b773c14](AztecProtocol/aztec-packages@b773c14)) </details> <details><summary>aztec-packages: 0.65.1</summary> ## [0.65.1](AztecProtocol/aztec-packages@aztec-packages-v0.65.0...aztec-packages-v0.65.1) (2024-11-27) ### Features * Add total mana used to header ([#9868](AztecProtocol/aztec-packages#9868)) ([2478d19](AztecProtocol/aztec-packages@2478d19)) * Assert metrics in network tests ([#10215](AztecProtocol/aztec-packages#10215)) ([9380c0f](AztecProtocol/aztec-packages@9380c0f)) * Avm inserts nullifiers from private ([#10129](AztecProtocol/aztec-packages#10129)) ([3fc0c7c](AztecProtocol/aztec-packages@3fc0c7c)) * Burn congestion fee ([#10231](AztecProtocol/aztec-packages#10231)) ([20a33f2](AztecProtocol/aztec-packages@20a33f2)) * Configure world state block history ([#10216](AztecProtocol/aztec-packages#10216)) ([01eb392](AztecProtocol/aztec-packages@01eb392)) * Integrate fee into rollup ([#10176](AztecProtocol/aztec-packages#10176)) ([12744d6](AztecProtocol/aztec-packages@12744d6)) * Speed up transaction execution ([#10172](AztecProtocol/aztec-packages#10172)) ([da265b6](AztecProtocol/aztec-packages@da265b6)) * Using current gas prices in cli-wallet ([#10105](AztecProtocol/aztec-packages#10105)) ([15ffeea](AztecProtocol/aztec-packages@15ffeea)) ### Bug Fixes * Add pako as a dependency in bb.js ([#10186](AztecProtocol/aztec-packages#10186)) ([b773c14](AztecProtocol/aztec-packages@b773c14)) * **avm:** Execution test ordering ([#10226](AztecProtocol/aztec-packages#10226)) ([49b4a6c](AztecProtocol/aztec-packages@49b4a6c)) * Deploy preview master ([#10227](AztecProtocol/aztec-packages#10227)) ([321a175](AztecProtocol/aztec-packages@321a175)) * Use current base fee for public fee payment ([#10230](AztecProtocol/aztec-packages#10230)) ([f081d80](AztecProtocol/aztec-packages@f081d80)) ### Miscellaneous * Add traces and histograms to avm simulator ([#10233](AztecProtocol/aztec-packages#10233)) ([e83726d](AztecProtocol/aztec-packages@e83726d)), closes [#10146](AztecProtocol/aztec-packages#10146) * Avm-proving and avm-integration tests do not require simulator to export function with jest mocks ([#10228](AztecProtocol/aztec-packages#10228)) ([f28fcdb](AztecProtocol/aztec-packages@f28fcdb)) * **avm:** Handle parsing error ([#10203](AztecProtocol/aztec-packages#10203)) ([3c623fc](AztecProtocol/aztec-packages@3c623fc)), closes [#9770](AztecProtocol/aztec-packages#9770) * **avm:** Zero initialization in avm public inputs and execution test fixes ([#10238](AztecProtocol/aztec-packages#10238)) ([0c7c4c9](AztecProtocol/aztec-packages@0c7c4c9)) * Bump timeout for after-hook for data store test again ([#10240](AztecProtocol/aztec-packages#10240)) ([52047f0](AztecProtocol/aztec-packages@52047f0)) * CIVC VK ([#10223](AztecProtocol/aztec-packages#10223)) ([089c34c](AztecProtocol/aztec-packages@089c34c)) * Declare global types ([#10206](AztecProtocol/aztec-packages#10206)) ([7b2e343](AztecProtocol/aztec-packages@7b2e343)) * Delete old serialization methods ([#9951](AztecProtocol/aztec-packages#9951)) ([10d3f6f](AztecProtocol/aztec-packages@10d3f6f)) * Fix migration notes ([#10252](AztecProtocol/aztec-packages#10252)) ([05bdcd5](AztecProtocol/aztec-packages@05bdcd5)) * Pull out some sync changes ([#10245](AztecProtocol/aztec-packages#10245)) ([1bfc15e](AztecProtocol/aztec-packages@1bfc15e)) * Remove docs from sync ([#10241](AztecProtocol/aztec-packages#10241)) ([eeea0aa](AztecProtocol/aztec-packages@eeea0aa)) * Replace relative paths to noir-protocol-circuits ([e7690ca](AztecProtocol/aztec-packages@e7690ca)) </details> <details><summary>barretenberg: 0.65.1</summary> ## [0.65.1](AztecProtocol/aztec-packages@barretenberg-v0.65.0...barretenberg-v0.65.1) (2024-11-27) ### Features * Add total mana used to header ([#9868](AztecProtocol/aztec-packages#9868)) ([2478d19](AztecProtocol/aztec-packages@2478d19)) * Configure world state block history ([#10216](AztecProtocol/aztec-packages#10216)) ([01eb392](AztecProtocol/aztec-packages@01eb392)) * Speed up transaction execution ([#10172](AztecProtocol/aztec-packages#10172)) ([da265b6](AztecProtocol/aztec-packages@da265b6)) ### Bug Fixes * **avm:** Execution test ordering ([#10226](AztecProtocol/aztec-packages#10226)) ([49b4a6c](AztecProtocol/aztec-packages@49b4a6c)) ### Miscellaneous * **avm:** Handle parsing error ([#10203](AztecProtocol/aztec-packages#10203)) ([3c623fc](AztecProtocol/aztec-packages@3c623fc)), closes [#9770](AztecProtocol/aztec-packages#9770) * **avm:** Zero initialization in avm public inputs and execution test fixes ([#10238](AztecProtocol/aztec-packages#10238)) ([0c7c4c9](AztecProtocol/aztec-packages@0c7c4c9)) * CIVC VK ([#10223](AztecProtocol/aztec-packages#10223)) ([089c34c](AztecProtocol/aztec-packages@089c34c)) * Pull out some sync changes ([#10245](AztecProtocol/aztec-packages#10245)) ([1bfc15e](AztecProtocol/aztec-packages@1bfc15e)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
This PR make a number of optimisation related to the speed up of transaction execution. Namely: