This commit is contained in:
Nicholas Ward 2022-11-16 14:23:15 -08:00
parent 5759fb7b3c
commit d3a7201348
4 changed files with 75 additions and 49 deletions

View File

@ -6,7 +6,7 @@ edition = "2021"
[dependencies]
anyhow = "1.0.40"
blake = "2.0.2"
blake2 = "0.10.5"
env_logger = "0.9.0"
eth_trie_utils = "0.4.0"
ethereum-types = "0.14.0"

View File

@ -114,11 +114,12 @@ compression_loop:
POP
POP
// stack: is_last_block, t_0, t_1, retdest
%mul_const(0xFFFFFFFF)
%mul_const(0xFFFFFFFFFFFFFFFF)
// stack: invert_if_last_block, t_0, t_1, retdest
%stack (l, t0, t1) -> (t0, t1, l, 0)
// stack: t_0, t_1, invert_if_last_block, 0, retdest
%blake_hash_value_addr
%add_const(7)
%rep 8
// stack: addr, ...
DUP1
@ -127,7 +128,7 @@ compression_loop:
// stack: val, addr, ...
SWAP1
// stack: addr, val, ...
%increment
%decrement
%endrep
// stack: addr, h_0, ..., h_7, t_0, t_1, invert_if_last_block, 0, retdest
POP
@ -181,6 +182,24 @@ compression_loop:
SWAP1
// stack: i + 1, loc + 1, next_val,...
%endrep
%blake_internal_state_addr
%add_const(15)
%rep 16
// stack: addr, ...
DUP1
// stack: addr, addr, ...
%mload_kernel_general
// stack: val, addr, ...
SWAP1
// stack: addr, val, ...
%decrement
%endrep
POP
STOP
// stack: 8, loc + 16, retdest
POP
POP
@ -216,21 +235,22 @@ compression_loop:
%blake_generate_new_hash_value(1)
%blake_generate_new_hash_value(0)
// stack: h_0', h_1', h_2', h_3', h_4', h_5', h_6', h_7', retdest
%shl_const(32)
%shl_const(64)
OR
%shl_const(32)
%shl_const(64)
OR
%shl_const(32)
%shl_const(64)
OR
%shl_const(32)
// stack: h_0' || h_1' || h_2' || h_3', h_4', h_5', h_6', h_7', retdest
%stack (first, second: 4) -> (second, first)
// stack: h_4', h_5', h_6', h_7', h_0' || h_1' || h_2' || h_3', retdest
%shl_const(64)
OR
%shl_const(32)
%shl_const(64)
OR
%shl_const(32)
%shl_const(64)
OR
%shl_const(32)
OR
// stack: hash, retdest
SWAP1
// stack: retdest, hash
// stack: hash_first = h_4' || h_5' || h_6' || h_7', hash_second = h_0' || h_1' || h_2' || h_3', retdest
SWAP2
// stack: retdest, hash_first, hash_second
JUMP

View File

@ -39,20 +39,20 @@ global blake_iv_const:
// stack: blake_iv_const, i, ...
SWAP1
// stack: i, blake_iv_const, ...
%mul_const(2)
%mul_const(8)
ADD
// stack: blake_iv_const + 2 * i, ...
DUP1
// stack: blake_iv_const + 2 * i, blake_iv_const + 2 * i, ...
%increment
%add_const(4)
// stack: blake_iv_const + 2 * i + 1, blake_iv_const + 2 * i, ...
%mload_kernel_code
%mload_kernel_code_u32
SWAP1
%mload_kernel_code
%mload_kernel_code_u32
// stack: IV_i[32:], IV_i[:32], ...
%shl_const(32)
// stack: IV_i[32:] << 32, IV_i[:32], ...
ADD
OR
// stack: IV_i, ...
%endmacro

View File

@ -1,8 +1,8 @@
use std::str::FromStr;
use anyhow::Result;
use blake::hash as blake_hash;
use ethereum_types::U256;
use blake2::Blake2b512;
use ethereum_types::{U256, U512};
use rand::{thread_rng, Rng};
use ripemd::{Digest, Ripemd160};
use sha2::Sha256;
@ -24,11 +24,11 @@ fn ripemd(input: Vec<u8>) -> U256 {
U256::from(&hasher.finalize()[..])
}
/// Standard Blake implementation.
fn blake(input: Vec<u8>) -> U256 {
let mut result = [0; 32];
blake_hash(256, &input, &mut result).unwrap();
U256::from(result)
/// Standard Blake2b implementation.
fn blake2b(input: Vec<u8>) -> U512 {
let mut hasher = Blake2b512::new();
hasher.update(input);
U512::from(&hasher.finalize()[..])
}
fn make_random_input() -> Vec<u8> {
@ -41,9 +41,7 @@ fn make_random_input() -> Vec<u8> {
fn make_custom_input() -> Vec<u8> {
// Hardcode a custom message
vec![
86, 124, 206, 245, 74, 57, 250, 43, 60, 30, 254, 43, 143, 144, 242, 215, 13, 103, 237, 61,
90, 105, 123, 250, 189, 181, 110, 192, 227, 57, 145, 46, 221, 238, 7, 181, 146, 111, 209,
150, 31, 157, 229, 126, 206, 105, 37, 17,
1, 2, 3
]
}
@ -56,54 +54,62 @@ fn make_input_stack(message: Vec<u8>) -> Vec<U256> {
initial_stack
}
fn test_hash(hash_fn_label: &str, standard_implementation: &dyn Fn(Vec<u8>) -> U256) -> Result<()> {
fn test_hash(hash_fn_label: &str, standard_implementation: &dyn Fn(Vec<u8>) -> U512) -> Result<()> {
// Make the input.
let message_random = make_random_input();
// let message_random = make_random_input();
let message_custom = make_custom_input();
dbg!(message_random.clone());
// dbg!(message_random.clone());
// Hash the message using a standard implementation.
let expected_random = standard_implementation(message_random.clone());
// // let expected_random = standard_implementation(message_random.clone());
let expected_custom = standard_implementation(message_custom.clone());
dbg!(expected_custom);
// Load the message onto the stack.
let initial_stack_random = make_input_stack(message_random);
// // let initial_stack_random = make_input_stack(message_random);
let initial_stack_custom = make_input_stack(message_custom);
dbg!(initial_stack_random.clone());
// dbg!(initial_stack_random.clone());
// Make the kernel.
let kernel_function = KERNEL.global_labels[hash_fn_label];
// Run the kernel code.
let result_random = run_interpreter(kernel_function, initial_stack_random)?;
// // let result_random = run_interpreter(kernel_function, initial_stack_random)?;
let result_custom = run_interpreter(kernel_function, initial_stack_custom)?;
dbg!(result_random.stack());
dbg!(result_custom.stack());
// Extract the final output.
let actual_random = result_random.stack()[0];
let actual_custom = result_custom.stack()[0];
// let actual_random = result_random.stack()[0];
let actual_custom_first = result_custom.stack()[0];
let actual_custom_second = result_custom.stack()[1];
let mut actual_custom = U512::from(actual_custom_first);
actual_custom *= U512::from_big_endian(&[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);
actual_custom += U512::from(actual_custom_second);
dbg!(actual_custom);
// Check that the result is correct.
// assert_eq!(expected_random, actual_random);
assert_eq!(expected_custom, actual_custom);
// assert_eq!(expected_custom, actual_custom);
Ok(())
}
#[test]
fn test_sha2() -> Result<()> {
test_hash("sha2", &sha2)
}
// #[test]
// fn test_sha2() -> Result<()> {
// test_hash("sha2", &sha2)
// }
#[test]
fn test_ripemd() -> Result<()> {
test_hash("ripemd_stack", &ripemd)
}
// #[test]
// fn test_ripemd() -> Result<()> {
// test_hash("ripemd_stack", &ripemd)
// }
#[test]
fn test_blake() -> Result<()> {
test_hash("blake", &blake)
test_hash("blake", &blake2b)
}