From deaa74f2d20dc85d1893db3c8cab2a0744ca507f Mon Sep 17 00:00:00 2001 From: Valentin Chaboche Date: Thu, 13 Apr 2023 10:22:43 +0200 Subject: [PATCH 1/2] EVM: move basic,address to ethereum --- src/kernel_evm/Cargo.lock | 7 ++++++- src/kernel_evm/ethereum/Cargo.toml | 9 ++++++++- .../{evm_execution => ethereum}/src/address.rs | 0 src/kernel_evm/{evm_execution => ethereum}/src/basic.rs | 9 ++++----- src/kernel_evm/ethereum/src/lib.rs | 2 ++ src/kernel_evm/ethereum/src/transaction.rs | 2 +- src/kernel_evm/evm_execution/Cargo.toml | 3 +++ src/kernel_evm/evm_execution/src/account_storage.rs | 2 +- src/kernel_evm/evm_execution/src/block.rs | 2 +- src/kernel_evm/evm_execution/src/lib.rs | 9 ++++----- src/kernel_evm/evm_execution/src/signatures.rs | 4 ++-- src/kernel_evm/evm_execution/src/storage.rs | 2 +- src/kernel_evm/kernel/src/block.rs | 2 +- src/kernel_evm/kernel/src/genesis.rs | 2 +- src/kernel_evm/kernel/src/helpers.rs | 2 +- 15 files changed, 36 insertions(+), 21 deletions(-) rename src/kernel_evm/{evm_execution => ethereum}/src/address.rs (100%) rename src/kernel_evm/{evm_execution => ethereum}/src/basic.rs (98%) diff --git a/src/kernel_evm/Cargo.lock b/src/kernel_evm/Cargo.lock index 03650112b2aa..8d5ad45d6848 100644 --- a/src/kernel_evm/Cargo.lock +++ b/src/kernel_evm/Cargo.lock @@ -429,6 +429,7 @@ dependencies = [ "tezos-smart-rollup-storage", "tezos_crypto_rs", "tezos_data_encoding", + "tezos_ethereum", "thiserror", ] @@ -1516,8 +1517,12 @@ dependencies = [ name = "tezos_ethereum" version = "0.1.0" dependencies = [ - "evm-execution", + "hex", "primitive-types", + "rlp", + "sha3", + "tezos-smart-rollup-encoding", + "tezos_crypto_rs", ] [[package]] diff --git a/src/kernel_evm/ethereum/Cargo.toml b/src/kernel_evm/ethereum/Cargo.toml index 629ae29a61bc..8bd206beaffd 100644 --- a/src/kernel_evm/ethereum/Cargo.toml +++ b/src/kernel_evm/ethereum/Cargo.toml @@ -9,4 +9,11 @@ edition = "2021" [dependencies] primitive-types = { version = "0.11.1", default-features = false } -evm-execution = { path = "../evm_execution" } +rlp = "0.5.2" +hex = "0.4" +sha3 = { version = "0.10.6", default-features = false } +tezos_crypto_rs = { version = "0.4", default-features = false } + +[dependencies.tezos-smart-rollup-encoding] +path = "../../kernel_sdk/encoding" + diff --git a/src/kernel_evm/evm_execution/src/address.rs b/src/kernel_evm/ethereum/src/address.rs similarity index 100% rename from src/kernel_evm/evm_execution/src/address.rs rename to src/kernel_evm/ethereum/src/address.rs diff --git a/src/kernel_evm/evm_execution/src/basic.rs b/src/kernel_evm/ethereum/src/basic.rs similarity index 98% rename from src/kernel_evm/evm_execution/src/basic.rs rename to src/kernel_evm/ethereum/src/basic.rs index 9bac78f92685..e60465228d7a 100644 --- a/src/kernel_evm/evm_execution/src/basic.rs +++ b/src/kernel_evm/ethereum/src/basic.rs @@ -8,12 +8,11 @@ //! Many of the functions in this module (all the `one` and `zero`) can be made //! constant, but the underlying library and functions we use are not constant. //! TODO: -use crate::EthereumError; use core::ops::{Add, Div, Mul, Sub}; -use crypto::hash::BlockHash; use primitive_types::{H256 as PTH256, U256 as PTU256}; use rlp::{Decodable, DecoderError, Encodable, Rlp}; use sha3::{Digest, Keccak256}; +use tezos_crypto_rs::hash::BlockHash; use tezos_smart_rollup_encoding::timestamp::Timestamp; /// The size of one 256 bit word. Size in bytes @@ -75,15 +74,15 @@ pub struct GasLimit { impl GasLimit { /// Translate to unsigned 64 bit (should be adequate for all calls at the moment) /// Error can only be overflow. - pub fn to_u64(&self) -> Result { + pub fn to_u64(&self) -> Option { // Unfortunately, the `primitive_types` library doesn't implement u64 -> U256 // conversion in `const`. let max_u64: U256 = U256::from(core::u64::MAX); if self.value <= max_u64 { - Ok(self.value.0.low_u64()) + Some(self.value.0.low_u64()) } else { - Err(EthereumError::GasLimitOverflow(self.value)) + None } } diff --git a/src/kernel_evm/ethereum/src/lib.rs b/src/kernel_evm/ethereum/src/lib.rs index ee8cd51e3d0a..9142c7554843 100644 --- a/src/kernel_evm/ethereum/src/lib.rs +++ b/src/kernel_evm/ethereum/src/lib.rs @@ -3,6 +3,8 @@ // SPDX-License-Identifier: MIT pub mod account; +pub mod address; +pub mod basic; pub mod eth_gen; pub mod transaction; pub mod wei; diff --git a/src/kernel_evm/ethereum/src/transaction.rs b/src/kernel_evm/ethereum/src/transaction.rs index b96c936bf091..0fe698661a1d 100644 --- a/src/kernel_evm/ethereum/src/transaction.rs +++ b/src/kernel_evm/ethereum/src/transaction.rs @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: MIT -use evm_execution::address::EthereumAddress; +use crate::address::EthereumAddress; use primitive_types::U256; use crate::eth_gen::{BlockHash, L2Level, OwnedHash}; diff --git a/src/kernel_evm/evm_execution/Cargo.toml b/src/kernel_evm/evm_execution/Cargo.toml index 16e55691866a..c158019b96ab 100644 --- a/src/kernel_evm/evm_execution/Cargo.toml +++ b/src/kernel_evm/evm_execution/Cargo.toml @@ -33,6 +33,9 @@ ripemd = { version = "0.1.3", default-features = false } libsecp256k1 = { version = "0.7", default-features = false, features = ["static-context", "hmac"] } const-decoder = { version = "0.3.0" } +[dependencies.tezos_ethereum] +path = "../ethereum" + [dependencies.tezos-smart-rollup-core] path = "../../kernel_sdk/core" diff --git a/src/kernel_evm/evm_execution/src/account_storage.rs b/src/kernel_evm/evm_execution/src/account_storage.rs index a02b4a54975a..45725eae8895 100644 --- a/src/kernel_evm/evm_execution/src/account_storage.rs +++ b/src/kernel_evm/evm_execution/src/account_storage.rs @@ -4,12 +4,12 @@ //! Ethereum account state and storage -use super::basic::WORD_SIZE; use const_decoder::Decoder; use host::path::{concat, OwnedPath, Path, RefPath}; use host::runtime::{Runtime, RuntimeError, ValueType}; use primitive_types::{H160, H256, U256}; use sha3::{Digest, Keccak256}; +use tezos_ethereum::basic::WORD_SIZE; use tezos_smart_rollup_storage::storage::Storage; use thiserror::Error; diff --git a/src/kernel_evm/evm_execution/src/block.rs b/src/kernel_evm/evm_execution/src/block.rs index 5bb1d29fe41a..1d2f349df876 100644 --- a/src/kernel_evm/evm_execution/src/block.rs +++ b/src/kernel_evm/evm_execution/src/block.rs @@ -8,10 +8,10 @@ //! When then kernel "sees" an EOL from the PVM, it finalizes the current block //! and starts creating the next one. -use super::basic::{GasLimit, GasPrice, Wei}; use super::storage::blocks::get_current_number_n_timestamp; use host::runtime::Runtime; use primitive_types::{H160, U256}; +use tezos_ethereum::basic::{GasLimit, GasPrice, Wei}; /// All data for an Ethereum block. /// /// This data does not change for the duration of the block. All balues are diff --git a/src/kernel_evm/evm_execution/src/lib.rs b/src/kernel_evm/evm_execution/src/lib.rs index e1f9d6c77dc2..50023d18be79 100644 --- a/src/kernel_evm/evm_execution/src/lib.rs +++ b/src/kernel_evm/evm_execution/src/lib.rs @@ -16,8 +16,6 @@ use tezos_smart_rollup_storage::StorageError; use thiserror::Error; pub mod account_storage; -pub mod address; -pub mod basic; pub mod block; pub mod handler; pub mod precompiles; @@ -67,7 +65,7 @@ pub enum EthereumError { /// A contract call transferred too much gas to sub-context or contract /// call itself got too much gas #[error("Gas limit overflow: {0}")] - GasLimitOverflow(basic::U256), + GasLimitOverflow(tezos_ethereum::basic::U256), } impl From for EthereumError { @@ -135,6 +133,7 @@ mod test { use host::runtime::Runtime; use primitive_types::H160; use std::str::FromStr; + use tezos_ethereum::address::EthereumAddress; use tezos_smart_rollup_mock::MockHost; // The compiled initialization code for the Ethereum demo contract given @@ -517,7 +516,7 @@ mod test { test_list.iter().fold((), |_, (s, ea)| { let (_, a) = signatures::string_to_sk_and_address(s.to_string()); let value: [u8; 20] = hex::decode(ea).unwrap().try_into().unwrap(); - let ea = address::EthereumAddress::from(value); + let ea = EthereumAddress::from(value); assert_eq!(a, ea); }) } @@ -537,7 +536,7 @@ mod test { .unwrap() .try_into() .unwrap(); - let expected_address = address::EthereumAddress::from(expected_address_string); + let expected_address = EthereumAddress::from(expected_address_string); assert_eq!(expected_address, address); assert_eq!(expected_address, address_from_sk) } diff --git a/src/kernel_evm/evm_execution/src/signatures.rs b/src/kernel_evm/evm_execution/src/signatures.rs index 199a0d8cd223..d40640376621 100644 --- a/src/kernel_evm/evm_execution/src/signatures.rs +++ b/src/kernel_evm/evm_execution/src/signatures.rs @@ -9,8 +9,6 @@ //! We need to sign and write Ethereum specific values such //! as addresses and values. -use crate::address::EthereumAddress; -use crate::basic::{GasLimit, GasPrice, Wei, H256, U256}; use libsecp256k1::{ curve::Scalar, recover, sign, verify, Message, PublicKey, RecoveryId, SecretKey, Signature, @@ -18,6 +16,8 @@ use libsecp256k1::{ use primitive_types::H256 as PTH256; use rlp::{Decodable, DecoderError, Encodable, Rlp, RlpIterator, RlpStream}; use sha3::{Digest, Keccak256}; +use tezos_ethereum::address::EthereumAddress; +use tezos_ethereum::basic::{GasLimit, GasPrice, Wei, H256, U256}; /// produces address from a secret key pub fn string_to_sk_and_address(s: String) -> (SecretKey, EthereumAddress) { diff --git a/src/kernel_evm/evm_execution/src/storage.rs b/src/kernel_evm/evm_execution/src/storage.rs index 707f51afcfb2..8a2194a492c2 100644 --- a/src/kernel_evm/evm_execution/src/storage.rs +++ b/src/kernel_evm/evm_execution/src/storage.rs @@ -183,8 +183,8 @@ pub mod blocks { pub mod tests { use super::test_utils::blocks_iter; use super::*; - use crate::basic::{H256, U256}; use primitive_types::U256 as PTU256; + use tezos_ethereum::basic::{H256, U256}; use tezos_smart_rollup_mock::MockHost; #[test] diff --git a/src/kernel_evm/kernel/src/block.rs b/src/kernel_evm/kernel/src/block.rs index b80c0154a0a2..018ee8af7965 100644 --- a/src/kernel_evm/kernel/src/block.rs +++ b/src/kernel_evm/kernel/src/block.rs @@ -7,8 +7,8 @@ use crate::error::{Error, TransferError}; use crate::helpers::address_to_hash; use crate::inbox::Transaction; use crate::storage; -use evm_execution::address::EthereumAddress; use evm_execution::signatures::EthereumTransactionCommon; +use tezos_ethereum::address::EthereumAddress; use tezos_smart_rollup_debug::debug_msg; use tezos_smart_rollup_host::path::OwnedPath; use tezos_smart_rollup_host::runtime::Runtime; diff --git a/src/kernel_evm/kernel/src/genesis.rs b/src/kernel_evm/kernel/src/genesis.rs index a3cb06913c88..70f2aee6ba68 100644 --- a/src/kernel_evm/kernel/src/genesis.rs +++ b/src/kernel_evm/kernel/src/genesis.rs @@ -6,9 +6,9 @@ use crate::error::Error; use crate::storage; use crate::storage::receipt_path; use crate::L2Block; -use evm_execution::address::EthereumAddress; use primitive_types::U256; use tezos_ethereum::account::Account; +use tezos_ethereum::address::EthereumAddress; use tezos_ethereum::eth_gen::L2Level; use tezos_ethereum::transaction::TransactionHash; use tezos_ethereum::transaction::TransactionReceipt; diff --git a/src/kernel_evm/kernel/src/helpers.rs b/src/kernel_evm/kernel/src/helpers.rs index dd2473615ba9..bcae33ac1984 100644 --- a/src/kernel_evm/kernel/src/helpers.rs +++ b/src/kernel_evm/kernel/src/helpers.rs @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: MIT -use evm_execution::address::EthereumAddress; +use tezos_ethereum::address::EthereumAddress; use tezos_ethereum::eth_gen::OwnedHash; pub fn address_to_hash(address: EthereumAddress) -> OwnedHash { -- GitLab From f7ec8ad078c45ac09778bc07382160f0786d10d9 Mon Sep 17 00:00:00 2001 From: Valentin Chaboche Date: Thu, 13 Apr 2023 10:29:21 +0200 Subject: [PATCH 2/2] EVM: move signatures to ethereum --- src/kernel_evm/Cargo.lock | 1 + src/kernel_evm/ethereum/Cargo.toml | 1 + src/kernel_evm/ethereum/src/lib.rs | 1 + .../{evm_execution => ethereum}/src/signatures.rs | 4 ++-- src/kernel_evm/evm_execution/src/lib.rs | 10 +++++----- src/kernel_evm/kernel/src/block.rs | 2 +- src/kernel_evm/kernel/src/inbox.rs | 2 +- 7 files changed, 12 insertions(+), 9 deletions(-) rename src/kernel_evm/{evm_execution => ethereum}/src/signatures.rs (99%) diff --git a/src/kernel_evm/Cargo.lock b/src/kernel_evm/Cargo.lock index 8d5ad45d6848..ce6fabccfa37 100644 --- a/src/kernel_evm/Cargo.lock +++ b/src/kernel_evm/Cargo.lock @@ -1518,6 +1518,7 @@ name = "tezos_ethereum" version = "0.1.0" dependencies = [ "hex", + "libsecp256k1", "primitive-types", "rlp", "sha3", diff --git a/src/kernel_evm/ethereum/Cargo.toml b/src/kernel_evm/ethereum/Cargo.toml index 8bd206beaffd..7e8f7dabf17a 100644 --- a/src/kernel_evm/ethereum/Cargo.toml +++ b/src/kernel_evm/ethereum/Cargo.toml @@ -13,6 +13,7 @@ rlp = "0.5.2" hex = "0.4" sha3 = { version = "0.10.6", default-features = false } tezos_crypto_rs = { version = "0.4", default-features = false } +libsecp256k1 = { version = "0.7", default-features = false, features = ["static-context", "hmac"] } [dependencies.tezos-smart-rollup-encoding] path = "../../kernel_sdk/encoding" diff --git a/src/kernel_evm/ethereum/src/lib.rs b/src/kernel_evm/ethereum/src/lib.rs index 9142c7554843..1aed8524697e 100644 --- a/src/kernel_evm/ethereum/src/lib.rs +++ b/src/kernel_evm/ethereum/src/lib.rs @@ -6,5 +6,6 @@ pub mod account; pub mod address; pub mod basic; pub mod eth_gen; +pub mod signatures; pub mod transaction; pub mod wei; diff --git a/src/kernel_evm/evm_execution/src/signatures.rs b/src/kernel_evm/ethereum/src/signatures.rs similarity index 99% rename from src/kernel_evm/evm_execution/src/signatures.rs rename to src/kernel_evm/ethereum/src/signatures.rs index d40640376621..199a0d8cd223 100644 --- a/src/kernel_evm/evm_execution/src/signatures.rs +++ b/src/kernel_evm/ethereum/src/signatures.rs @@ -9,6 +9,8 @@ //! We need to sign and write Ethereum specific values such //! as addresses and values. +use crate::address::EthereumAddress; +use crate::basic::{GasLimit, GasPrice, Wei, H256, U256}; use libsecp256k1::{ curve::Scalar, recover, sign, verify, Message, PublicKey, RecoveryId, SecretKey, Signature, @@ -16,8 +18,6 @@ use libsecp256k1::{ use primitive_types::H256 as PTH256; use rlp::{Decodable, DecoderError, Encodable, Rlp, RlpIterator, RlpStream}; use sha3::{Digest, Keccak256}; -use tezos_ethereum::address::EthereumAddress; -use tezos_ethereum::basic::{GasLimit, GasPrice, Wei, H256, U256}; /// produces address from a secret key pub fn string_to_sk_and_address(s: String) -> (SecretKey, EthereumAddress) { diff --git a/src/kernel_evm/evm_execution/src/lib.rs b/src/kernel_evm/evm_execution/src/lib.rs index 50023d18be79..02cc86008dc6 100644 --- a/src/kernel_evm/evm_execution/src/lib.rs +++ b/src/kernel_evm/evm_execution/src/lib.rs @@ -19,7 +19,6 @@ pub mod account_storage; pub mod block; pub mod handler; pub mod precompiles; -pub mod signatures; pub mod storage; pub mod transaction; @@ -122,7 +121,6 @@ where #[cfg(test)] mod test { - use super::signatures::EthereumTransactionCommon; use super::*; use account_storage::{ account_path, init_account_storage as init_evm_account_storage, @@ -134,6 +132,7 @@ mod test { use primitive_types::H160; use std::str::FromStr; use tezos_ethereum::address::EthereumAddress; + use tezos_ethereum::signatures::EthereumTransactionCommon; use tezos_smart_rollup_mock::MockHost; // The compiled initialization code for the Ethereum demo contract given @@ -474,7 +473,7 @@ mod test { #[test] //this is based on https://eips.ethereum.org/EIPS/eip-155 fn test_signatures() { - let (sk, _address) = signatures::string_to_sk_and_address( + let (sk, _address) = tezos_ethereum::signatures::string_to_sk_and_address( "4646464646464646464646464646464646464646464646464646464646464646" .to_string(), ); @@ -514,7 +513,8 @@ mod test { ), ]; test_list.iter().fold((), |_, (s, ea)| { - let (_, a) = signatures::string_to_sk_and_address(s.to_string()); + let (_, a) = + tezos_ethereum::signatures::string_to_sk_and_address(s.to_string()); let value: [u8; 20] = hex::decode(ea).unwrap().try_into().unwrap(); let ea = EthereumAddress::from(value); assert_eq!(a, ea); @@ -523,7 +523,7 @@ mod test { #[test] fn test_caller_classic() { - let (_sk, address_from_sk) = signatures::string_to_sk_and_address( + let (_sk, address_from_sk) = tezos_ethereum::signatures::string_to_sk_and_address( "4646464646464646464646464646464646464646464646464646464646464646" .to_string(), ); diff --git a/src/kernel_evm/kernel/src/block.rs b/src/kernel_evm/kernel/src/block.rs index 018ee8af7965..522464b58deb 100644 --- a/src/kernel_evm/kernel/src/block.rs +++ b/src/kernel_evm/kernel/src/block.rs @@ -7,8 +7,8 @@ use crate::error::{Error, TransferError}; use crate::helpers::address_to_hash; use crate::inbox::Transaction; use crate::storage; -use evm_execution::signatures::EthereumTransactionCommon; use tezos_ethereum::address::EthereumAddress; +use tezos_ethereum::signatures::EthereumTransactionCommon; use tezos_smart_rollup_debug::debug_msg; use tezos_smart_rollup_host::path::OwnedPath; use tezos_smart_rollup_host::runtime::Runtime; diff --git a/src/kernel_evm/kernel/src/inbox.rs b/src/kernel_evm/kernel/src/inbox.rs index 3c62049e9d1d..deafcb85c775 100644 --- a/src/kernel_evm/kernel/src/inbox.rs +++ b/src/kernel_evm/kernel/src/inbox.rs @@ -3,7 +3,7 @@ // // SPDX-License-Identifier: MIT -use evm_execution::signatures::EthereumTransactionCommon; +use tezos_ethereum::signatures::EthereumTransactionCommon; use tezos_smart_rollup_host::input::Message; use tezos_smart_rollup_host::runtime::Runtime; -- GitLab