example_custom_opcodes/
main.rs

1//! Custom opcodes example
2#![cfg_attr(not(test), warn(unused_crate_dependencies))]
3
4use revm::{
5    bytecode::opcode,
6    context::{Evm, TxEnv},
7    database::{BenchmarkDB, BENCH_TARGET},
8    handler::{instructions::EthInstructions, EthPrecompiles},
9    inspector::inspectors::TracerEip3155,
10    interpreter::{
11        interpreter::EthInterpreter,
12        interpreter_types::{Immediates, Jumps},
13        Interpreter,
14    },
15    primitives::TxKind,
16    state::Bytecode,
17    Context, InspectEvm, MainContext,
18};
19
20/// Opcode hex value
21const MY_STATIC_JUMP: u8 = 0x0C;
22
23pub fn main() {
24    let ctx = Context::mainnet().with_db(BenchmarkDB::new_bytecode(Bytecode::new_raw(
25        [
26            MY_STATIC_JUMP,
27            0x00,
28            0x03,
29            opcode::STOP,
30            opcode::JUMPDEST,
31            opcode::STOP,
32        ]
33        .into(),
34    )));
35
36    // Create a new instruction set with our mainnet opcodes.
37    let mut instructions = EthInstructions::new_mainnet();
38    // insert our custom opcode
39    instructions.insert_instruction(
40        MY_STATIC_JUMP,
41        |interpreter: &mut Interpreter<EthInterpreter>, _| {
42            let offset = interpreter.bytecode.read_i16();
43            interpreter.bytecode.relative_jump(offset as isize);
44        },
45    );
46
47    // Create a new EVM instance.
48    let mut evm = Evm::new(ctx, instructions, EthPrecompiles::default())
49        .with_inspector(TracerEip3155::new_stdout().without_summary());
50
51    // inspect the transaction.
52    let _ = evm.inspect_with_tx(TxEnv {
53        kind: TxKind::Call(BENCH_TARGET),
54        ..Default::default()
55    });
56
57    // Expected output where we can see that JUMPDEST is called.
58    /*
59    "{"pc":0,"op":12,"gas":"0x1c97178","gasCost":"0x0","stack":[],"depth":1,"returnData":"0x","refund":"0x0","memSize":"0x0"}
60    {"pc":4,"op":91,"gas":"0x1c97178","gasCost":"0x1","stack":[],"depth":1,"returnData":"0x","refund":"0x0","memSize":"0x0","opName":"JUMPDEST"}
61    {"pc":5,"op":0,"gas":"0x1c97177","gasCost":"0x0","stack":[],"depth":1,"returnData":"0x","refund":"0x0","memSize":"0x0","opName":"STOP"}
62    */
63}