From c6b62eaf2fefce28be30c5fa9d6e5d89c1579b01 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Fri, 23 Sep 2022 08:05:14 -0700 Subject: [PATCH] fix update --- evm/src/cpu/kernel/asm/ripemd/compression.asm | 3 ++- evm/src/cpu/kernel/asm/ripemd/memory.asm | 4 +-- evm/src/cpu/kernel/asm/ripemd/ripemd.asm | 1 + evm/src/cpu/kernel/asm/ripemd/update.asm | 18 ++++++------- evm/src/cpu/kernel/asm/util/basic_macros.asm | 4 +++ evm/src/cpu/kernel/tests/ripemd.rs | 26 +++++++++++-------- 6 files changed, 33 insertions(+), 23 deletions(-) diff --git a/evm/src/cpu/kernel/asm/ripemd/compression.asm b/evm/src/cpu/kernel/asm/ripemd/compression.asm index ff616952..d525b068 100644 --- a/evm/src/cpu/kernel/asm/ripemd/compression.asm +++ b/evm/src/cpu/kernel/asm/ripemd/compression.asm @@ -207,7 +207,8 @@ pre_rol: %mload_kernel_code_label(R_data) ADD // stack: virt + r, box, a, b, c, d, e, F, K, boxes, rounds, sides, virt - %mload_kernel_code_u32_LE(Input_Block) // %load_u32_from_block + // %mload_kernel_code_u32_LE(Input_Block) + %load_u32_from_block // stack: x, box, a, b, c, d, e, F, K, boxes, rounds, sides, virt SWAP1 SWAP2 diff --git a/evm/src/cpu/kernel/asm/ripemd/memory.asm b/evm/src/cpu/kernel/asm/ripemd/memory.asm index 2a259215..1e93d809 100644 --- a/evm/src/cpu/kernel/asm/ripemd/memory.asm +++ b/evm/src/cpu/kernel/asm/ripemd/memory.asm @@ -2,7 +2,7 @@ global ripemd_storage: // starts by initializing buffer // stack: i [init: 64] %store_zeros(64, ripemd_storage) // stack: - // %jump(store_size) + %jump(store_size) store_size: // stack: length @@ -42,7 +42,7 @@ store_input_alt: %mstore_ripemd // stack: rem, length, REM_INP %sub_const(1) - DUP1 + DUP1 // stack: rem - 1, rem - 1, length, REM_INP %jumpi(store_input_alt) // stack: 0, length diff --git a/evm/src/cpu/kernel/asm/ripemd/ripemd.asm b/evm/src/cpu/kernel/asm/ripemd/ripemd.asm index 693fde53..a33a605c 100644 --- a/evm/src/cpu/kernel/asm/ripemd/ripemd.asm +++ b/evm/src/cpu/kernel/asm/ripemd/ripemd.asm @@ -40,6 +40,7 @@ global ripemd_init: // stack: 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0, count, length, virt, LABELS %jump(ripemd_update) ripemd_1: + %break // stack: STATE, count, length , virt , LABELS DUP7 // stack: length, STATE, count, length , virt , LABELS diff --git a/evm/src/cpu/kernel/asm/ripemd/update.asm b/evm/src/cpu/kernel/asm/ripemd/update.asm index edfb64b3..2fdeab6c 100644 --- a/evm/src/cpu/kernel/asm/ripemd/update.asm +++ b/evm/src/cpu/kernel/asm/ripemd/update.asm @@ -11,7 +11,7 @@ /// update_1() /// if Q: /// update_2() -/// R = length - shift > 0 +/// R = length > shift /// if R: /// buffer_update(virt + shift, have, length - shift) /// @@ -32,24 +32,24 @@ global ripemd_update: %stack (shift, need, have, STATE: 5, count, length) -> (length, need, STATE, 0, shift, need, have, count, length) // stack: length, need, STATE, 0, shift, need, have, count, length, virt, retdest LT - NOT + ISZERO // stack: Q, STATE, 0, shift, need, have, count, length, virt, retdest - %stack (Q, STATE: 5, i, shift, need, have) -> (have, Q, Q, STATE, i, shift, need, have) + %stack (Q, STATE: 5, i, shift, need, have) -> (have, Q, Q, STATE, i, shift, need, have) + %eq_const(0) AND // stack: P, Q, STATE, 0, shift, need, have, count, length, virt, retdest %jumpi(update_1) // stack: Q, STATE, 0, shift, need, have, count, length, virt, retdest %jumpi(update_2) final_update: - // stack: shift, need, have, STATE, count, length, virt, retdest + // stack: shift, need, have, STATE, count, length, virt, retdest %stack (shift, need, have, STATE: 5, count, length) -> (length, shift, return_step, shift, need, have, STATE, count, length) SUB // stack: ARGS, shift, need, have, STATE, count, length, virt, retdest %stack (ARGS: 2, shift, need, have, STATE: 5, count, length, virt) -> (shift, virt, have, ARGS, shift, need, have, STATE, count, length, virt) ADD // stack: ARGS: 4, shift, need, have, STATE, count, length, virt, retdest - PUSH 0 - DUP4 + %stack (ARGS: 4, shift, need, have, STATE, count, length) -> (length, shift, ARGS, shift, need, have, STATE, count, length) GT // stack: R, ARGS, shift, need, have, STATE, count, length, virt, retdest %jumpi(buffer_update) @@ -57,7 +57,7 @@ final_update: %pop3 JUMP return_step: - // stack: shift, need, have, STATE, count, length, virt, retdest + // stack: shift, need, have, STATE, count , length, virt, retdest SWAP8 DUP10 %mul_const(8) @@ -103,7 +103,7 @@ update_2: // stack: offset, cond, STATE, shift, need, have, count, length, virt, retdest %stack (offset, cond, STATE: 5) -> (cond, 0, STATE, offset, compression_loop, cond) LT - NOT + ISZERO // cond >= 0, STATE, offset, compression_loop, cond, shift, need, have, count, length, virt, retdest %jumpi(compress) compression_loop: @@ -129,7 +129,7 @@ compression_loop: /// for i in range(times): /// buffer[set+i] = bytestring[get+i] -buffer_update: +buffer_update: // stack: get , set , times , retdest DUP2 DUP2 diff --git a/evm/src/cpu/kernel/asm/util/basic_macros.asm b/evm/src/cpu/kernel/asm/util/basic_macros.asm index 8eb60647..b078f133 100644 --- a/evm/src/cpu/kernel/asm/util/basic_macros.asm +++ b/evm/src/cpu/kernel/asm/util/basic_macros.asm @@ -298,3 +298,7 @@ ADD // stack: dcba %endmacro + +%macro break + %jump(0xdeadbeef) +%endmacro \ No newline at end of file diff --git a/evm/src/cpu/kernel/tests/ripemd.rs b/evm/src/cpu/kernel/tests/ripemd.rs index dd530eb3..f8019cdc 100644 --- a/evm/src/cpu/kernel/tests/ripemd.rs +++ b/evm/src/cpu/kernel/tests/ripemd.rs @@ -4,26 +4,30 @@ use ethereum_types::U256; use crate::cpu::kernel::aggregator::combined_kernel; use crate::cpu::kernel::interpreter::run_with_kernel; - #[test] fn test_ripemd() -> Result<()> { - // let expected = "0xf71c27109c692c1b56bbdceb5b9d2865b3708dbc"; - let expected: Vec<&str> = vec!["10271CF7", "1B2C699C", "EBDCBB56", "65289D5B", "BC8D70B3"]; + let expected = "0xf71c27109c692c1b56bbdceb5b9d2865b3708dbc"; + // let expected: Vec<&str> = vec!["10271CF7", "1B2C699C", "EBDCBB56", "65289D5B", "BC8D70B3"]; println!("{:#?}", expected); - let input: Vec = vec![0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0, 0, 0xdeadbeef]; + // let input: Vec = vec![0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0, 0, 0xdeadbeef]; - // let input: Vec = vec![ - // 0x1a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, - // 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, - // ]; + let input: Vec = vec![ + 26, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, + 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a + ]; let kernel = combined_kernel(); let stack_input: Vec = input.iter().map(|&x| U256::from(x as u32)).rev().collect(); - let stack_output = run_with_kernel(&kernel, kernel.global_labels["compress"], stack_input)?; - let actual: Vec = stack_output.stack().iter().map(|&x| format!("{:X}", x)).rev().collect(); + let stack_output = run_with_kernel(&kernel, kernel.global_labels["ripemd_alt"], stack_input)?; + let actual: Vec = stack_output + .stack() + .iter() + .map(|&x| format!("{:X}", x)) + .rev() + .collect(); println!("{:#?}", actual); - assert_eq!(expected, actual); + assert_eq!(expected, actual[0]); Ok(()) }