Skip to content
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: External Contexts and simple EvmBuilder #888

Merged
merged 50 commits into from
Jan 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
e35d741
rename main Evm structs, introduce wip external type
rakita Nov 8, 2023
fc03f9b
tests
rakita Nov 8, 2023
90a81f0
Split evm and external context
rakita Nov 16, 2023
fda7f8f
continue previous commit
rakita Nov 16, 2023
99ec673
wip inspector handle register
rakita Nov 21, 2023
ee65aa5
add few more handlers for frame and host
rakita Nov 21, 2023
006a9c2
Add instruction handle
rakita Nov 23, 2023
73f5ebd
add instruction handler registration and Inspector wrap
rakita Nov 24, 2023
42dfcf4
Rm Spec generic, more handlers, start factory
rakita Nov 25, 2023
6252606
move towards the builder, allow EVM modify
rakita Nov 27, 2023
a8eba54
wip on EvmBuilder and modify functionality
rakita Nov 28, 2023
ed188d7
EvmBuilder with stages wip
rakita Nov 29, 2023
85be2c5
Merge remote-tracking branch 'origin/main' into handlers
rakita Nov 29, 2023
64a1bd6
Add wip stages for builer
rakita Nov 29, 2023
45d7209
make handle register simple function, add raw instruction table, spli…
rakita Nov 30, 2023
5ca9580
wip on simple builder functions and handler registry
rakita Dec 1, 2023
aef8257
Examples and cleanup
rakita Dec 1, 2023
bebc79d
fix lifetime and fmt
rakita Dec 1, 2023
580ddf8
Add more handlers, deduct caller, validate tx agains state
rakita Dec 5, 2023
6352f90
All handlers counted, started on docs, some cleanup
rakita Dec 6, 2023
900ff89
renaming and docs
rakita Dec 7, 2023
55f8924
Support all Inspector functionality with Handler
rakita Dec 8, 2023
c930aeb
Handler restructured. Documentation added
rakita Dec 9, 2023
5dc55bd
more docs on registers
rakita Dec 9, 2023
238ea1b
integrate builder, fmt, move optimism l1block
rakita Dec 15, 2023
66b8642
add utility builder stage functions
rakita Dec 15, 2023
697a3e3
add precompiles, fix bugs with journal spec
rakita Dec 18, 2023
9375f35
spec to generic, optimism build
rakita Dec 18, 2023
65997b7
fix optimism test
rakita Dec 18, 2023
bfc5d8b
fuck macros
rakita Dec 26, 2023
8b23136
Merge remote-tracking branch 'origin/main' into handlers
rakita Dec 26, 2023
be3af16
clippy and fmt
rakita Dec 26, 2023
74ae8b0
fix trace block example
rakita Dec 26, 2023
55fc1f7
ci fixes
rakita Dec 26, 2023
b74f7e3
Flatten builder stages to generic and handler stage
rakita Dec 27, 2023
b24c19c
EvmBuilder doc and refactor fn access
rakita Dec 30, 2023
a6feb1a
Merge remote-tracking branch 'origin/main' into handlers
rakita Dec 30, 2023
7024cad
ignore rust code in book
rakita Dec 30, 2023
a704c70
make revme compile, will refactor this in future
rakita Jan 3, 2024
6fdf87a
Rename handles to Pre/Post Execution and ExecutionLoop
rakita Jan 4, 2024
62e9eaa
fix optimism clippy
rakita Jan 4, 2024
c6385be
small rename
rakita Jan 8, 2024
648ba93
FrameData and docs
rakita Jan 9, 2024
055f0f6
check links mdbook
rakita Jan 9, 2024
0b3be0e
comments and cleanup
rakita Jan 10, 2024
8fdcea9
comment
rakita Jan 10, 2024
6cd1414
Merge remote-tracking branch 'origin/main' into handlers
rakita Jan 11, 2024
fa4c712
Add initialize interepreter to first frame
rakita Jan 12, 2024
2133f7f
clippy
rakita Jan 12, 2024
d95dae5
clippy2
rakita Jan 12, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 8 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
[workspace]
members = [
"bins/revme",
"bins/revm-test",
"crates/revm",
"crates/primitives",
"crates/interpreter",
"crates/precompile",
]
resolver = "2"
members = ["bins/*", "crates/*"]
default-members = ["crates/revm"]

[workspace.metadata.docs.rs]
Expand Down
40 changes: 21 additions & 19 deletions bins/revm-test/src/bin/analysis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,29 @@ use std::time::Instant;
use revm::{
db::BenchmarkDB,
interpreter::analysis::to_analysed,
primitives::{Bytecode, Bytes, TransactTo},
primitives::{address, bytes, Bytecode, Bytes, TransactTo},
Evm,
};
extern crate alloc;

fn main() {
let contract_data : Bytes = hex::decode( "6060604052341561000f57600080fd5b604051610dd1380380610dd18339810160405280805190602001909190805182019190602001805190602001909190805182019190505083600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008190555082600390805190602001906100a79291906100e3565b5081600460006101000a81548160ff021916908360ff16021790555080600590805190602001906100d99291906100e3565b5050505050610188565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061012457805160ff1916838001178555610152565b82800160010185558215610152579182015b82811115610151578251825591602001919060010190610136565b5b50905061015f9190610163565b5090565b61018591905b80821115610181576000816000905550600101610169565b5090565b90565b610c3a806101976000396000f3006060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b4578063095ea7b31461014257806318160ddd1461019c57806323b872dd146101c557806327e235e31461023e578063313ce5671461028b5780635c658165146102ba57806370a082311461032657806395d89b4114610373578063a9059cbb14610401578063dd62ed3e1461045b575b600080fd5b34156100bf57600080fd5b6100c76104c7565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101075780820151818401526020810190506100ec565b50505050905090810190601f1680156101345780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014d57600080fd5b610182600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610565565b604051808215151515815260200191505060405180910390f35b34156101a757600080fd5b6101af610657565b6040518082815260200191505060405180910390f35b34156101d057600080fd5b610224600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061065d565b604051808215151515815260200191505060405180910390f35b341561024957600080fd5b610275600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108f7565b6040518082815260200191505060405180910390f35b341561029657600080fd5b61029e61090f565b604051808260ff1660ff16815260200191505060405180910390f35b34156102c557600080fd5b610310600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610922565b6040518082815260200191505060405180910390f35b341561033157600080fd5b61035d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610947565b6040518082815260200191505060405180910390f35b341561037e57600080fd5b610386610990565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103c65780820151818401526020810190506103ab565b50505050905090810190601f1680156103f35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561040c57600080fd5b610441600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a2e565b604051808215151515815260200191505060405180910390f35b341561046657600080fd5b6104b1600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b87565b6040518082815260200191505060405180910390f35b60038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561055d5780601f106105325761010080835404028352916020019161055d565b820191906000526020600020905b81548152906001019060200180831161054057829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60005481565b600080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015801561072e5750828110155b151561073957600080fd5b82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555082600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156108865782600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150509392505050565b60016020528060005260406000206000915090505481565b600460009054906101000a900460ff1681565b6002602052816000526040600020602052806000526040600020600091509150505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a265780601f106109fb57610100808354040283529160200191610a26565b820191906000526020600020905b815481529060010190602001808311610a0957829003601f168201915b505050505081565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a7e57600080fd5b81600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050929150505600a165627a7a72305820df254047bc8f2904ad3e966b6db116d703bebd40efadadb5e738c836ffc8f58a0029" ).unwrap().into();

// BenchmarkDB is dummy state that implements Database trait.
let mut evm = revm::new();

// execution globals block hash/gas_limit/coinbase/timestamp..
evm.env.tx.caller = "0x1000000000000000000000000000000000000000"
.parse()
.unwrap();
evm.env.tx.transact_to = TransactTo::Call(
"0x0000000000000000000000000000000000000000"
.parse()
.unwrap(),
);
//evm.env.tx.data = Bytes::from(hex::decode("30627b7c").unwrap());
evm.env.tx.data = Bytes::from(hex::decode("8035F0CE").unwrap());

let bytecode_raw = Bytecode::new_raw(contract_data.clone());
let bytecode_checked = Bytecode::new_raw(contract_data.clone()).to_checked();
let bytecode_analysed = to_analysed(Bytecode::new_raw(contract_data));

evm.database(BenchmarkDB::new_bytecode(bytecode_raw));
// BenchmarkDB is dummy state that implements Database trait.
let mut evm = Evm::builder()
.modify_tx_env(|tx| {
// execution globals block hash/gas_limit/coinbase/timestamp..
tx.caller = address!("1000000000000000000000000000000000000000");
tx.transact_to = TransactTo::Call(address!("0000000000000000000000000000000000000000"));
//evm.env.tx.data = Bytes::from(hex::decode("30627b7c").unwrap());
tx.data = bytes!("8035F0CE");
})
.with_db(BenchmarkDB::new_bytecode(bytecode_raw))
.build();

// just to spead up processor.
for _ in 0..10000 {
Expand All @@ -42,15 +38,21 @@ fn main() {
}
println!("Raw elapsed time: {:?}", timer.elapsed());

evm.database(BenchmarkDB::new_bytecode(bytecode_checked));
let mut evm = evm
.modify()
.reset_handler_with_db(BenchmarkDB::new_bytecode(bytecode_checked))
.build();

let timer = Instant::now();
for _ in 0..30000 {
let _ = evm.transact().unwrap();
}
println!("Checked elapsed time: {:?}", timer.elapsed());

evm.database(BenchmarkDB::new_bytecode(bytecode_analysed));
let mut evm = evm
.modify()
.reset_handler_with_db(BenchmarkDB::new_bytecode(bytecode_analysed))
.build();

let timer = Instant::now();
for _ in 0..30000 {
Expand Down
65 changes: 24 additions & 41 deletions bins/revm-test/src/bin/snailtracer.rs

Large diffs are not rendered by default.

42 changes: 18 additions & 24 deletions bins/revm-test/src/bin/transfer.rs
Original file line number Diff line number Diff line change
@@ -1,39 +1,33 @@
use revm::{
db::BenchmarkDB,
primitives::{Bytecode, TransactTo, U256},
Evm,
};
use std::time::{Duration, Instant};
use std::time::Duration;
extern crate alloc;

fn main() {
// BenchmarkDB is dummy state that implements Database trait.
let mut evm = revm::new();

// execution globals block hash/gas_limit/coinbase/timestamp..
evm.env.tx.caller = "0x0000000000000000000000000000000000000001"
.parse()
.unwrap();
evm.env.tx.value = U256::from(10);
evm.env.tx.transact_to = TransactTo::Call(
"0x0000000000000000000000000000000000000000"
.parse()
.unwrap(),
);
//evm.env.tx.data = Bytes::from(hex::decode("30627b7c").unwrap());

evm.database(BenchmarkDB::new_bytecode(Bytecode::new()));
let mut evm = Evm::builder()
.with_db(BenchmarkDB::new_bytecode(Bytecode::new()))
.modify_tx_env(|tx| {
// execution globals block hash/gas_limit/coinbase/timestamp..
tx.caller = "0x0000000000000000000000000000000000000001"
.parse()
.unwrap();
tx.value = U256::from(10);
tx.transact_to = TransactTo::Call(
"0x0000000000000000000000000000000000000000"
.parse()
.unwrap(),
);
})
.build();

// Microbenchmark
let bench_options = microbench::Options::default().time(Duration::from_secs(1));
let bench_options = microbench::Options::default().time(Duration::from_secs(3));

microbench::bench(&bench_options, "Simple value transfer", || {
let _ = evm.transact().unwrap();
});

let time = Instant::now();
for _ in 0..10000 {
let _ = evm.transact().unwrap();
}
let elapsed = time.elapsed();
println!("10k runs in {:?}", elapsed.as_nanos() / 10_000);
}
Loading
Loading