This repository was archived by the owner on Jul 5, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 839
Add circuit for RETURNDATASIZE opcode #703
Merged
han0110
merged 46 commits into
privacy-ethereum:main
from
xiaodino:xiaodino/returndatasize
Oct 29, 2022
Merged
Changes from all commits
Commits
Show all changes
46 commits
Select commit
Hold shift + click to select a range
219b303
Add circuit for RETURNDATASIZE opcode
xiaodino dce1366
Update tests
xiaodino 3a1d151
update last call info in return (#2)
smtmfft d162713
Update tests
xiaodino f3d78c4
Merge branch 'xiaodino/returndatasize' of github.com:xiaodino/zkevm-c…
xiaodino d8891b7
Update tests
xiaodino 69080e1
Update format in zkevm-circuits/src/evm_circuit/execution.rs
xiaodino fde42c3
Change unwrap to expect in returndatasize.rs
xiaodino aed1d7d
Add circuit for RETURNDATASIZE opcode
xiaodino 012cea4
Update tests
xiaodino 136fad9
update last call info in return (#2)
smtmfft c0b8872
Update tests
xiaodino 2955c3d
Update tests
xiaodino 7a03cb4
Update format in zkevm-circuits/src/evm_circuit/execution.rs
xiaodino fbdaa0e
Change unwrap to expect in returndatasize.rs
xiaodino c4f4237
according to RETURN spec, callee info update happens only in case C, …
smtmfft 3dda80d
Merge branch 'xiaodino/returndatasize' of github.com:xiaodino/zkevm-c…
xiaodino 6f7766c
Fix the issues with rustfmt
xiaodino 0ee04d2
Fix merge conflicts
xiaodino eb35689
Merge branch 'main' into xiaodino/returndatasize
xiaodino fddfaa7
Update
xiaodino 25371f6
Merge branch 'xiaodino/returndatasize' of github.com:xiaodino/zkevm-c…
xiaodino 0dc902b
Add tests
xiaodino bfccd63
Merge branch 'main' into xiaodino/returndatasize
roynalnaruto 2591c14
Merge branch 'main' into xiaodino/returndatasize
roynalnaruto dfdf1a7
Merge branch 'main' into xiaodino/returndatasize
CPerezz 2267a2b
Merge branch 'main' into xiaodino/returndatasize
roynalnaruto 45869a6
Merge branch 'main' into xiaodino/returndatasize
roynalnaruto 72094ed
Merge branch 'main' into xiaodino/returndatasize
CPerezz f6e55be
Resolve conflicts
xiaodino 34711d2
Merge branch 'xiaodino/returndatasize' of github.com:xiaodino/zkevm-c…
xiaodino 56cff65
Resolve merge conflicts
xiaodino 444009b
Merge branch 'main' into xiaodino/returndatasize
roynalnaruto 700b07a
Merge branch 'main' into xiaodino/returndatasize
xiaodino 2d057a0
Update bus-mapping return.rs, use N_BYTES_U64 for return_data_size an…
xiaodino 3e8f1f0
Merge branch 'xiaodino/returndatasize' of github.com:xiaodino/zkevm-c…
xiaodino c0d6421
Merge branch 'main' into xiaodino/returndatasize
z2trillion 3b5841f
Merge branch 'main' into xiaodino/returndatasize
roynalnaruto 6b9becc
Merge branch 'main' into xiaodino/returndatasize
roynalnaruto 18cdb29
Revert changes in bus-mapping return.rs
xiaodino 595847b
Merge branch 'xiaodino/returndatasize' of github.com:xiaodino/zkevm-c…
xiaodino 6696a1b
Revert change in bus-mapping return
xiaodino 0f035a1
Merge branch 'main' into xiaodino/returndatasize
adria0 f5ac803
Merge branch 'main' into xiaodino/returndatasize
xiaodino db9e3d4
Update bus-mapping returndatasize_tests
xiaodino 06f7b69
Merge branch 'xiaodino/returndatasize' of github.com:xiaodino/zkevm-c…
xiaodino File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,163 @@ | ||
| use crate::{ | ||
| circuit_input_builder::{CircuitInputStateRef, ExecStep}, | ||
| operation::CallContextField, | ||
| Error, | ||
| }; | ||
|
|
||
| use eth_types::GethExecStep; | ||
|
|
||
| use super::Opcode; | ||
|
|
||
| #[derive(Clone, Copy, Debug)] | ||
| pub(crate) struct Returndatasize; | ||
|
|
||
| impl Opcode for Returndatasize { | ||
| fn gen_associated_ops( | ||
| state: &mut CircuitInputStateRef, | ||
| geth_steps: &[GethExecStep], | ||
| ) -> Result<Vec<ExecStep>, Error> { | ||
| let geth_step = &geth_steps[0]; | ||
| let mut exec_step = state.new_step(geth_step)?; | ||
| let value = geth_steps[1].stack.last()?; | ||
| state.call_context_read( | ||
| &mut exec_step, | ||
| state.call()?.call_id, | ||
| CallContextField::LastCalleeReturnDataLength, | ||
| value, | ||
| ); | ||
|
|
||
| state.stack_write( | ||
| &mut exec_step, | ||
| geth_step.stack.last_filled().map(|a| a - 1), | ||
| value, | ||
| )?; | ||
|
|
||
| Ok(vec![exec_step]) | ||
| } | ||
| } | ||
|
|
||
| #[cfg(test)] | ||
| mod returndatasize_tests { | ||
| use crate::circuit_input_builder::CircuitsParams; | ||
| use crate::{ | ||
| circuit_input_builder::ExecState, | ||
| mock::BlockData, | ||
| operation::{CallContextField, CallContextOp, StackOp, RW}, | ||
| }; | ||
| use eth_types::{ | ||
| bytecode, | ||
| evm_types::{OpcodeId, StackAddress}, | ||
| geth_types::GethData, | ||
| word, Word, | ||
| }; | ||
| use mock::test_ctx::{helpers::*, TestContext}; | ||
| use pretty_assertions::assert_eq; | ||
|
|
||
| #[test] | ||
| fn test_ok() { | ||
| let return_data_size = 0x20; | ||
|
|
||
| // // deployed contract | ||
| // PUSH1 0x20 | ||
| // PUSH1 0 | ||
| // PUSH1 0 | ||
| // CALLDATACOPY | ||
| // PUSH1 0x20 | ||
| // PUSH1 0 | ||
| // RETURN | ||
| // | ||
| // bytecode: 0x6020600060003760206000F3 | ||
| // | ||
| // // constructor | ||
| // PUSH12 0x6020600060003760206000F3 | ||
| // PUSH1 0 | ||
| // MSTORE | ||
| // PUSH1 0xC | ||
| // PUSH1 0x14 | ||
| // RETURN | ||
| // | ||
| // bytecode: 0x6B6020600060003760206000F3600052600C6014F3 | ||
| let code = bytecode! { | ||
| PUSH21(word!("6B6020600060003760206000F3600052600C6014F3")) | ||
| PUSH1(0) | ||
| MSTORE | ||
|
|
||
| PUSH1 (0x15) | ||
| PUSH1 (0xB) | ||
| PUSH1 (0) | ||
| CREATE | ||
|
|
||
| PUSH1 (0x20) | ||
| PUSH1 (0x20) | ||
| PUSH1 (0x20) | ||
| PUSH1 (0) | ||
| PUSH1 (0) | ||
| DUP6 | ||
| PUSH2 (0xFFFF) | ||
| CALL | ||
|
|
||
| RETURNDATASIZE | ||
|
|
||
| STOP | ||
| }; | ||
| // Get the execution steps from the external tracer | ||
| let block: GethData = TestContext::<2, 1>::new( | ||
| None, | ||
| account_0_code_account_1_no_code(code), | ||
| tx_from_1_to_0, | ||
| |block, _tx| block.number(0xcafeu64), | ||
| ) | ||
| .unwrap() | ||
| .into(); | ||
|
|
||
| let mut builder = BlockData::new_from_geth_data_with_params( | ||
| block.clone(), | ||
| CircuitsParams { | ||
| max_rws: 512, | ||
| ..Default::default() | ||
| }, | ||
| ) | ||
| .new_circuit_input_builder(); | ||
| builder | ||
| .handle_block(&block.eth_block, &block.geth_traces) | ||
| .unwrap(); | ||
|
|
||
| let step = builder.block.txs()[0] | ||
| .steps() | ||
| .iter() | ||
| .find(|step| step.exec_state == ExecState::Op(OpcodeId::RETURNDATASIZE)) | ||
| .unwrap(); | ||
|
|
||
| let call_id = builder.block.txs()[0].calls()[0].call_id; | ||
| assert_eq!( | ||
| { | ||
| let operation = | ||
| &builder.block.container.call_context[step.bus_mapping_instance[0].as_usize()]; | ||
| (operation.rw(), operation.op()) | ||
| }, | ||
| ( | ||
| RW::READ, | ||
| &CallContextOp { | ||
| call_id, | ||
| field: CallContextField::LastCalleeReturnDataLength, | ||
| value: Word::from(return_data_size), | ||
| } | ||
| ) | ||
| ); | ||
| assert_eq!( | ||
| { | ||
| let operation = | ||
| &builder.block.container.stack[step.bus_mapping_instance[1].as_usize()]; | ||
| (operation.rw(), operation.op()) | ||
| }, | ||
| ( | ||
| RW::WRITE, | ||
| &StackOp::new( | ||
| call_id, | ||
| StackAddress::from(1021), | ||
| Word::from(return_data_size) | ||
| ) | ||
| ) | ||
| ); | ||
| } | ||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.