Skip to content

Commit

Permalink
update PrecompileHandle ref: rust-ethereum/evm#122
Browse files Browse the repository at this point in the history
  • Loading branch information
zjb0807 committed Jan 11, 2024
1 parent f59e1e1 commit e666a3c
Show file tree
Hide file tree
Showing 23 changed files with 947 additions and 977 deletions.
40 changes: 29 additions & 11 deletions Cargo.lock

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

11 changes: 7 additions & 4 deletions modules/evm-utility/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@ sha3 = { workspace = true }

sp-std = { workspace = true }

evm = { git = "https://github.com/rust-blockchain/evm", rev = "13240a8a551586fdef0b5028ed73af80b248092a", default-features = false, features = ["with-codec"] }
evm-gasometer = { git = "https://github.com/rust-blockchain/evm", rev = "13240a8a551586fdef0b5028ed73af80b248092a", default-features = false }
evm-runtime = { git = "https://github.com/rust-blockchain/evm", rev = "13240a8a551586fdef0b5028ed73af80b248092a", default-features = false }
ethereum = { version = "0.14.0", default-features = false, features = ["with-codec"] }
evm = { git = "https://github.com/rust-blockchain/evm", rev = "842e03d068ddb6a3195a2dedc4a9b63caadb3355", default-features = false, features = ["with-codec"] }
evm-gasometer = { git = "https://github.com/rust-blockchain/evm", rev = "842e03d068ddb6a3195a2dedc4a9b63caadb3355", default-features = false }
evm-runtime = { git = "https://github.com/rust-blockchain/evm", rev = "842e03d068ddb6a3195a2dedc4a9b63caadb3355", default-features = false }
#evm = { version = "0.41.1", default-features = false, features = ["with-codec"] }
#evm-gasometer = { version = "0.41.0", default-features = false }
#evm-runtime = { version = "0.41.0", default-features = false }
ethereum = { version = "0.15.0", default-features = false, features = ["with-codec"] }

[features]
default = ["std"]
Expand Down
57 changes: 34 additions & 23 deletions modules/evm/src/precompiles/blake2/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use super::Precompile;
use crate::runner::state::{PrecompileFailure, PrecompileOutput, PrecompileResult};
use module_evm_utility::evm::{Context, ExitError, ExitSucceed};
use crate::runner::state::{PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileResult};
use module_evm_utility::evm::{ExitError, ExitSucceed};

mod eip_152;

Expand All @@ -32,9 +32,10 @@ impl Precompile for Blake2F {
/// Format of `input`:
/// [4 bytes for rounds][64 bytes for h][128 bytes for m][8 bytes for t_0][8 bytes for t_1][1
/// byte for f]
fn execute(input: &[u8], target_gas: Option<u64>, _context: &Context, _is_static: bool) -> PrecompileResult {
fn execute(handle: &mut impl PrecompileHandle) -> PrecompileResult {
const BLAKE2_F_ARG_LEN: usize = 213;

let input = handle.input();
if input.len() != BLAKE2_F_ARG_LEN {
return Err(PrecompileFailure::Error {
exit_status: ExitError::Other(
Expand All @@ -48,13 +49,8 @@ impl Precompile for Blake2F {
let rounds: u32 = u32::from_be_bytes(rounds_buf);

let gas_cost: u64 = (rounds as u64) * Blake2F::GAS_COST_PER_ROUND;
if let Some(gas_left) = target_gas {
if gas_left < gas_cost {
return Err(PrecompileFailure::Error {
exit_status: ExitError::OutOfGas,
});
}
}
handle.record_cost(gas_cost)?;
let input = handle.input();

// we use from_le_bytes below to effectively swap byte order to LE if architecture is BE

Expand Down Expand Up @@ -107,17 +103,18 @@ impl Precompile for Blake2F {

Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
output: output_buf.to_vec(),
logs: Default::default(),
})
}
}

#[cfg(test)]
mod tests {
use super::*;
use crate::precompiles::tests::MockPrecompileHandle;
use frame_support::assert_ok;
use hex_literal::hex;
use module_evm_utility::evm::Context;
use sp_core::U256;

fn get_context() -> Context {
Expand All @@ -132,8 +129,10 @@ mod tests {
fn blake2f_cost() {
// 5 rounds
let input = hex!("0000000548c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001");
let result = Blake2F::execute(&input[..], None, &get_context(), false).unwrap();
assert_eq!(result.cost, 5);
let context = get_context();
let mut mock_handle = MockPrecompileHandle::new(&input[..], None, &context, false);
assert_ok!(Blake2F::execute(&mut mock_handle));
assert_eq!(mock_handle.gas_used, 5);
}

#[test]
Expand All @@ -144,15 +143,24 @@ mod tests {

// invalid input (too short)
let input = hex!("00");
assert_eq!(Blake2F::execute(&input[..], None, &get_context(), false), err);
assert_eq!(
Blake2F::execute(&mut MockPrecompileHandle::new(&input[..], None, &get_context(), false)),
err
);

// Test vector 1 and expected output from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-152.md#test-vector-1
let input = hex!("00000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001");
assert_eq!(Blake2F::execute(&input[..], None, &get_context(), false), err);
assert_eq!(
Blake2F::execute(&mut MockPrecompileHandle::new(&input[..], None, &get_context(), false)),
err
);

// Test vector 2 and expected output from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-152.md#test-vector-2
let input = hex!("000000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001");
assert_eq!(Blake2F::execute(&input[..], None, &get_context(), false), err);
assert_eq!(
Blake2F::execute(&mut MockPrecompileHandle::new(&input[..], None, &get_context(), false)),
err
);
}

#[test]
Expand All @@ -163,7 +171,10 @@ mod tests {

// Test vector 3 and expected output from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-152.md#test-vector-3
let input = hex!("0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000002");
assert_eq!(Blake2F::execute(&input[..], None, &get_context(), false), err);
assert_eq!(
Blake2F::execute(&mut MockPrecompileHandle::new(&input[..], None, &get_context(), false)),
err
);
}

#[test]
Expand All @@ -172,7 +183,7 @@ mod tests {
let input = hex!("0000000048c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001");
let expected = hex!("08c9bcf367e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d282e6ad7f520e511f6c3e2b8c68059b9442be0454267ce079217e1319cde05b");
assert_eq!(
Blake2F::execute(&input[..], None, &get_context(), false)
Blake2F::execute(&mut MockPrecompileHandle::new(&input[..], None, &get_context(), false))
.unwrap()
.output,
expected
Expand All @@ -185,7 +196,7 @@ mod tests {
let input = hex!("0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001");
let expected = hex!("ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923");
assert_eq!(
Blake2F::execute(&input[..], None, &get_context(), false)
Blake2F::execute(&mut MockPrecompileHandle::new(&input[..], None, &get_context(), false))
.unwrap()
.output,
expected
Expand All @@ -198,7 +209,7 @@ mod tests {
let input = hex!("0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000");
let expected = hex!("75ab69d3190a562c51aef8d88f1c2775876944407270c42c9844252c26d2875298743e7f6d5ea2f2d3e8d226039cd31b4e426ac4f2d3d666a610c2116fde4735");
assert_eq!(
Blake2F::execute(&input[..], None, &get_context(), false)
Blake2F::execute(&mut MockPrecompileHandle::new(&input[..], None, &get_context(), false))
.unwrap()
.output,
expected
Expand All @@ -211,7 +222,7 @@ mod tests {
let input = hex!("0000000148c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001");
let expected = hex!("b63a380cb2897d521994a85234ee2c181b5f844d2c624c002677e9703449d2fba551b3a8333bcdf5f2f7e08993d53923de3d64fcc68c034e717b9293fed7a421");
assert_eq!(
Blake2F::execute(&input[..], None, &get_context(), false)
Blake2F::execute(&mut MockPrecompileHandle::new(&input[..], None, &get_context(), false))
.unwrap()
.output,
expected
Expand All @@ -226,7 +237,7 @@ mod tests {
let input = hex!("ffffffff48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001");
let expected = hex!("fc59093aafa9ab43daae0e914c57635c5402d8e3d2130eb9b3cc181de7f0ecf9b22bf99a7815ce16419e200e01846e6b5df8cc7703041bbceb571de6631d2615");
assert_eq!(
Blake2F::execute(&input[..], None, &get_context(), false)
Blake2F::execute(&mut MockPrecompileHandle::new(&input[..], None, &get_context(), false))
.unwrap()
.output,
expected
Expand Down
Loading

0 comments on commit e666a3c

Please sign in to comment.