From 60f2a1173e26068c80d1e0631d996b217dd99bea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Fri, 4 Nov 2022 12:24:55 +0100 Subject: [PATCH 1/6] add new crate "namada_core" for core types, storage_api, tx_env, vp_env --- Cargo.lock | 35 ++++++ Cargo.toml | 1 + core/Cargo.toml | 62 +++++++++++ core/build.rs | 55 ++++++++++ {shared => core}/proto | 0 {shared => core}/src/bytes.rs | 0 {shared => core}/src/ledger/gas.rs | 0 core/src/ledger/governance/mod.rs | 6 ++ .../src/ledger/governance/parameters.rs | 0 .../src/ledger/governance/storage.rs | 0 .../src/ledger/ibc/actions.rs | 0 .../src/types => core/src/ledger}/ibc/data.rs | 0 core/src/ledger/ibc/mod.rs | 2 + {shared => core}/src/ledger/ibc/storage.rs | 0 core/src/ledger/mod.rs | 11 ++ {shared => core}/src/ledger/parameters/mod.rs | 0 .../src/ledger/parameters/storage.rs | 0 .../src/ledger/storage/ics23_specs.rs | 0 .../src/ledger/storage/merkle_tree.rs | 19 +++- {shared => core}/src/ledger/storage/mockdb.rs | 0 {shared => core}/src/ledger/storage/mod.rs | 6 -- {shared => core}/src/ledger/storage/traits.rs | 77 +------------ {shared => core}/src/ledger/storage/types.rs | 0 .../storage_api/collections/lazy_map.rs | 0 .../storage_api/collections/lazy_vec.rs | 0 .../src/ledger/storage_api/collections/mod.rs | 0 .../src/ledger/storage_api/error.rs | 0 .../src/ledger/storage_api/key.rs | 0 .../src/ledger/storage_api/mod.rs | 0 .../src/ledger/storage_api/validation/mod.rs | 0 {shared => core}/src/ledger/tx_env.rs | 0 {shared => core}/src/ledger/vp_env.rs | 0 core/src/lib.rs | 11 ++ {shared => core}/src/proto/generated.rs | 0 .../src/proto/generated/.gitignore | 0 {shared => core}/src/proto/mod.rs | 0 {shared => core}/src/proto/types.rs | 0 {shared => core}/src/types/address.rs | 0 {shared => core}/src/types/chain.rs | 0 {shared => core}/src/types/governance.rs | 14 +-- {shared => core}/src/types/hash.rs | 22 ++-- .../ibc/event.rs => core/src/types/ibc.rs | 0 {shared => core}/src/types/internal.rs | 0 {shared => core}/src/types/key/common.rs | 13 +-- .../src/types/key/dkg_session_keys.rs | 0 {shared => core}/src/types/key/ed25519.rs | 0 {shared => core}/src/types/key/mod.rs | 0 {shared => core}/src/types/key/secp256k1.rs | 0 {shared => core}/src/types/masp.rs | 0 core/src/types/mod.rs | 12 +++ {shared => core}/src/types/named_address.rs | 0 {shared => core}/src/types/storage.rs | 23 ++-- {shared => core}/src/types/time.rs | 81 +++++++------- {shared => core}/src/types/token.rs | 0 .../src/types/transaction/decrypted.rs | 0 .../src/types/transaction/encrypted.rs | 0 .../src/types/transaction/governance.rs | 26 +++++ {shared => core}/src/types/transaction/mod.rs | 0 {shared => core}/src/types/transaction/pos.rs | 0 .../src/types/transaction/protocol.rs | 0 .../src/types/transaction/wrapper.rs | 0 .../src/types/validity_predicate.rs | 0 .../pos => proof_of_stake/src}/storage.rs | 0 shared/Cargo.toml | 1 + shared/build.rs | 49 +-------- shared/src/ledger/ibc/mod.rs | 5 +- shared/src/ledger/ibc/vp/channel.rs | 88 ++++++++------- shared/src/ledger/ibc/vp/client.rs | 6 +- shared/src/ledger/ibc/vp/connection.rs | 6 +- shared/src/ledger/ibc/vp/mod.rs | 20 ++-- shared/src/ledger/ibc/vp/packet.rs | 17 +-- shared/src/ledger/ibc/vp/sequence.rs | 2 +- shared/src/ledger/mod.rs | 11 +- .../ledger/{ => native_vp}/governance/mod.rs | 13 +-- .../{ => native_vp}/governance/utils.rs | 0 .../ledger/{native_vp.rs => native_vp/mod.rs} | 4 + shared/src/ledger/native_vp/parameters.rs | 101 ++++++++++++++++++ shared/src/ledger/pos/mod.rs | 90 ++++++++-------- shared/src/ledger/pos/vp.rs | 2 +- shared/src/ledger/protocol/mod.rs | 2 +- shared/src/ledger/queries/shell.rs | 40 ++++++- shared/src/lib.rs | 3 +- shared/src/types/dylib.rs | 16 --- shared/src/types/ibc/mod.rs | 6 +- shared/src/types/mod.rs | 17 +-- 85 files changed, 602 insertions(+), 373 deletions(-) create mode 100644 core/Cargo.toml create mode 100644 core/build.rs rename {shared => core}/proto (100%) rename {shared => core}/src/bytes.rs (100%) rename {shared => core}/src/ledger/gas.rs (100%) create mode 100644 core/src/ledger/governance/mod.rs rename {shared => core}/src/ledger/governance/parameters.rs (100%) rename {shared => core}/src/ledger/governance/storage.rs (100%) rename shared/src/ledger/ibc/handler.rs => core/src/ledger/ibc/actions.rs (100%) rename {shared/src/types => core/src/ledger}/ibc/data.rs (100%) create mode 100644 core/src/ledger/ibc/mod.rs rename {shared => core}/src/ledger/ibc/storage.rs (100%) create mode 100644 core/src/ledger/mod.rs rename {shared => core}/src/ledger/parameters/mod.rs (100%) rename {shared => core}/src/ledger/parameters/storage.rs (100%) rename {shared => core}/src/ledger/storage/ics23_specs.rs (100%) rename {shared => core}/src/ledger/storage/merkle_tree.rs (98%) rename {shared => core}/src/ledger/storage/mockdb.rs (100%) rename {shared => core}/src/ledger/storage/mod.rs (99%) rename {shared => core}/src/ledger/storage/traits.rs (80%) rename {shared => core}/src/ledger/storage/types.rs (100%) rename {shared => core}/src/ledger/storage_api/collections/lazy_map.rs (100%) rename {shared => core}/src/ledger/storage_api/collections/lazy_vec.rs (100%) rename {shared => core}/src/ledger/storage_api/collections/mod.rs (100%) rename {shared => core}/src/ledger/storage_api/error.rs (100%) rename {shared => core}/src/ledger/storage_api/key.rs (100%) rename {shared => core}/src/ledger/storage_api/mod.rs (100%) rename {shared => core}/src/ledger/storage_api/validation/mod.rs (100%) rename {shared => core}/src/ledger/tx_env.rs (100%) rename {shared => core}/src/ledger/vp_env.rs (100%) create mode 100644 core/src/lib.rs rename {shared => core}/src/proto/generated.rs (100%) rename {shared => core}/src/proto/generated/.gitignore (100%) rename {shared => core}/src/proto/mod.rs (100%) rename {shared => core}/src/proto/types.rs (100%) rename {shared => core}/src/types/address.rs (100%) rename {shared => core}/src/types/chain.rs (100%) rename {shared => core}/src/types/governance.rs (97%) rename {shared => core}/src/types/hash.rs (91%) rename shared/src/types/ibc/event.rs => core/src/types/ibc.rs (100%) rename {shared => core}/src/types/internal.rs (100%) rename {shared => core}/src/types/key/common.rs (97%) rename {shared => core}/src/types/key/dkg_session_keys.rs (100%) rename {shared => core}/src/types/key/ed25519.rs (100%) rename {shared => core}/src/types/key/mod.rs (100%) rename {shared => core}/src/types/key/secp256k1.rs (100%) rename {shared => core}/src/types/masp.rs (100%) create mode 100644 core/src/types/mod.rs rename {shared => core}/src/types/named_address.rs (100%) rename {shared => core}/src/types/storage.rs (99%) rename {shared => core}/src/types/time.rs (77%) rename {shared => core}/src/types/token.rs (100%) rename {shared => core}/src/types/transaction/decrypted.rs (100%) rename {shared => core}/src/types/transaction/encrypted.rs (100%) rename {shared => core}/src/types/transaction/governance.rs (60%) rename {shared => core}/src/types/transaction/mod.rs (100%) rename {shared => core}/src/types/transaction/pos.rs (100%) rename {shared => core}/src/types/transaction/protocol.rs (100%) rename {shared => core}/src/types/transaction/wrapper.rs (100%) rename {shared => core}/src/types/validity_predicate.rs (100%) rename {shared/src/ledger/pos => proof_of_stake/src}/storage.rs (100%) rename shared/src/ledger/{ => native_vp}/governance/mod.rs (99%) rename shared/src/ledger/{ => native_vp}/governance/utils.rs (100%) rename shared/src/ledger/{native_vp.rs => native_vp/mod.rs} (99%) create mode 100644 shared/src/ledger/native_vp/parameters.rs delete mode 100644 shared/src/types/dylib.rs diff --git a/Cargo.lock b/Cargo.lock index 75c3c2f770..6b7ca3cb7c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3659,6 +3659,7 @@ dependencies = [ "loupe", "masp_primitives", "masp_proofs", + "namada_core", "namada_proof_of_stake", "parity-wasm", "paste", @@ -3785,6 +3786,40 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "namada_core" +version = "0.9.0" +dependencies = [ + "ark-ec", + "assert_matches", + "bech32", + "borsh", + "chrono", + "data-encoding", + "derivative", + "ed25519-consensus", + "ferveo", + "group-threshold-cryptography", + "ics23", + "itertools", + "libsecp256k1", + "pretty_assertions", + "proptest", + "rand 0.8.5", + "rand_core 0.6.4", + "rust_decimal", + "serde 1.0.147", + "serde_json", + "sha2 0.9.9", + "sparse-merkle-tree", + "test-log", + "thiserror", + "tonic-build", + "tracing 0.1.37", + "tracing-subscriber 0.3.16", + "zeroize", +] + [[package]] name = "namada_encoding_spec" version = "0.10.1" diff --git a/Cargo.toml b/Cargo.toml index fab5ebd8d9..42a99343fc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ resolver = "2" members = [ "apps", + "core", "proof_of_stake", "shared", "tests", diff --git a/core/Cargo.toml b/core/Cargo.toml new file mode 100644 index 0000000000..5dbf217d34 --- /dev/null +++ b/core/Cargo.toml @@ -0,0 +1,62 @@ +[package] +authors = ["Heliax AG "] +edition = "2021" +license = "GPL-3.0" +name = "namada_core" +resolver = "2" +version = "0.9.0" + +[features] +default = [] +ferveo-tpke = [ + "ferveo", + "tpke", + "ark-ec", + "rand_core", + "rand", +] +# for integration tests and test utilies +testing = [ + "rand", + "rand_core", +] + +[dependencies] +ark-ec = {version = "0.3", optional = true} +# We switch off "blake2b" because it cannot be compiled to wasm +# branch = "bat/arse-merkle-tree" +arse-merkle-tree = {package = "sparse-merkle-tree", git = "https://github.com/heliaxdev/sparse-merkle-tree", rev = "04ad1eeb28901b57a7599bbe433b3822965dabe8", default-features = false, features = ["std", "borsh"]} +bech32 = "0.8.0" +borsh = "0.9.0" +chrono = {version = "0.4.22", default-features = false, features = ["clock", "std"]} +data-encoding = "2.3.2" +derivative = "2.2.0" +ed25519-consensus = "1.2.0" +ferveo = {optional = true, git = "https://github.com/anoma/ferveo"} +tpke = {package = "group-threshold-cryptography", optional = true, git = "https://github.com/anoma/ferveo"} +ics23 = "0.7.0" +itertools = "0.10.0" +libsecp256k1 = {git = "https://github.com/heliaxdev/libsecp256k1", rev = "bbb3bd44a49db361f21d9db80f9a087c194c0ae9", default-features = false, features = ["std", "static-context"]} +rand = {version = "0.8", optional = true} +rand_core = {version = "0.6", optional = true} +rust_decimal = "1.26.1" +serde = {version = "1.0.125", features = ["derive"]} +serde_json = "1.0.62" +sha2 = "0.9.3" +thiserror = "1.0.30" +tracing = "0.1.30" +zeroize = {version = "1.5.5", features = ["zeroize_derive"]} + +[dev-dependencies] +assert_matches = "1.5.0" +libsecp256k1 = {git = "https://github.com/heliaxdev/libsecp256k1", rev = "bbb3bd44a49db361f21d9db80f9a087c194c0ae9"} +pretty_assertions = "0.7.2" +# A fork with state machine testing +proptest = {git = "https://github.com/heliaxdev/proptest", branch = "tomas/sm"} +rand = {version = "0.8"} +rand_core = {version = "0.6"} +test-log = {version = "0.2.7", default-features = false, features = ["trace"]} +tracing-subscriber = {version = "0.3.7", default-features = false, features = ["env-filter", "fmt"]} + +[build-dependencies] +tonic-build = "0.6.0" \ No newline at end of file diff --git a/core/build.rs b/core/build.rs new file mode 100644 index 0000000000..3c6f017a22 --- /dev/null +++ b/core/build.rs @@ -0,0 +1,55 @@ +use std::fs::read_to_string; +use std::process::Command; +use std::{env, str}; + +/// Path to the .proto source files, relative to `core` directory +const PROTO_SRC: &str = "./proto"; + +/// The version should match the one we use in the `Makefile` +const RUSTFMT_TOOLCHAIN_SRC: &str = "../rust-nightly-version"; + +fn main() { + if let Ok(val) = env::var("COMPILE_PROTO") { + if val.to_ascii_lowercase() == "false" { + // Skip compiling proto files + return; + } + } + + // Tell Cargo that if the given file changes, to rerun this build script. + println!("cargo:rerun-if-changed={}", PROTO_SRC); + + let mut use_rustfmt = false; + + // The version should match the one we use in the `Makefile` + if let Ok(rustfmt_toolchain) = read_to_string(RUSTFMT_TOOLCHAIN_SRC) { + // Try to find the path to rustfmt. + if let Ok(output) = Command::new("rustup") + .args(&[ + "which", + "rustfmt", + "--toolchain", + rustfmt_toolchain.trim(), + ]) + .output() + { + if let Ok(rustfmt) = str::from_utf8(&output.stdout) { + // Set the command to be used by tonic_build below to format the + // generated files + let rustfmt = rustfmt.trim(); + if !rustfmt.is_empty() { + println!("using rustfmt from path \"{}\"", rustfmt); + env::set_var("RUSTFMT", rustfmt); + use_rustfmt = true + } + } + } + } + + tonic_build::configure() + .out_dir("src/proto/generated") + .format(use_rustfmt) + .protoc_arg("--experimental_allow_proto3_optional") + .compile(&[format!("{}/types.proto", PROTO_SRC)], &[PROTO_SRC]) + .unwrap(); +} diff --git a/shared/proto b/core/proto similarity index 100% rename from shared/proto rename to core/proto diff --git a/shared/src/bytes.rs b/core/src/bytes.rs similarity index 100% rename from shared/src/bytes.rs rename to core/src/bytes.rs diff --git a/shared/src/ledger/gas.rs b/core/src/ledger/gas.rs similarity index 100% rename from shared/src/ledger/gas.rs rename to core/src/ledger/gas.rs diff --git a/core/src/ledger/governance/mod.rs b/core/src/ledger/governance/mod.rs new file mode 100644 index 0000000000..44d20f50e0 --- /dev/null +++ b/core/src/ledger/governance/mod.rs @@ -0,0 +1,6 @@ +//! Governance library code + +/// governance parameters +pub mod parameters; +/// governance storage +pub mod storage; diff --git a/shared/src/ledger/governance/parameters.rs b/core/src/ledger/governance/parameters.rs similarity index 100% rename from shared/src/ledger/governance/parameters.rs rename to core/src/ledger/governance/parameters.rs diff --git a/shared/src/ledger/governance/storage.rs b/core/src/ledger/governance/storage.rs similarity index 100% rename from shared/src/ledger/governance/storage.rs rename to core/src/ledger/governance/storage.rs diff --git a/shared/src/ledger/ibc/handler.rs b/core/src/ledger/ibc/actions.rs similarity index 100% rename from shared/src/ledger/ibc/handler.rs rename to core/src/ledger/ibc/actions.rs diff --git a/shared/src/types/ibc/data.rs b/core/src/ledger/ibc/data.rs similarity index 100% rename from shared/src/types/ibc/data.rs rename to core/src/ledger/ibc/data.rs diff --git a/core/src/ledger/ibc/mod.rs b/core/src/ledger/ibc/mod.rs new file mode 100644 index 0000000000..efb7f7f0d5 --- /dev/null +++ b/core/src/ledger/ibc/mod.rs @@ -0,0 +1,2 @@ +pub mod actions; +pub mod storage; diff --git a/shared/src/ledger/ibc/storage.rs b/core/src/ledger/ibc/storage.rs similarity index 100% rename from shared/src/ledger/ibc/storage.rs rename to core/src/ledger/ibc/storage.rs diff --git a/core/src/ledger/mod.rs b/core/src/ledger/mod.rs new file mode 100644 index 0000000000..bbd12bc60d --- /dev/null +++ b/core/src/ledger/mod.rs @@ -0,0 +1,11 @@ +//! The ledger modules + +pub mod gas; +pub mod governance; +#[cfg(feature = "ibc-rs")] +pub mod ibc; +pub mod parameters; +pub mod storage; +pub mod storage_api; +pub mod tx_env; +pub mod vp_env; diff --git a/shared/src/ledger/parameters/mod.rs b/core/src/ledger/parameters/mod.rs similarity index 100% rename from shared/src/ledger/parameters/mod.rs rename to core/src/ledger/parameters/mod.rs diff --git a/shared/src/ledger/parameters/storage.rs b/core/src/ledger/parameters/storage.rs similarity index 100% rename from shared/src/ledger/parameters/storage.rs rename to core/src/ledger/parameters/storage.rs diff --git a/shared/src/ledger/storage/ics23_specs.rs b/core/src/ledger/storage/ics23_specs.rs similarity index 100% rename from shared/src/ledger/storage/ics23_specs.rs rename to core/src/ledger/storage/ics23_specs.rs diff --git a/shared/src/ledger/storage/merkle_tree.rs b/core/src/ledger/storage/merkle_tree.rs similarity index 98% rename from shared/src/ledger/storage/merkle_tree.rs rename to core/src/ledger/storage/merkle_tree.rs index 49afb3dcfc..3ce35ab837 100644 --- a/shared/src/ledger/storage/merkle_tree.rs +++ b/core/src/ledger/storage/merkle_tree.rs @@ -10,11 +10,11 @@ use arse_merkle_tree::{ use borsh::{BorshDeserialize, BorshSerialize}; use ics23::commitment_proof::Proof as Ics23Proof; use ics23::{CommitmentProof, ExistenceProof, NonExistenceProof}; +use namada_core::types::storage::{TreeKeyError, IBC_KEY_LIMIT}; use prost::Message; use thiserror::Error; use super::traits::{StorageHasher, SubTreeRead, SubTreeWrite}; -use super::IBC_KEY_LIMIT; use crate::bytes::ByteBuf; use crate::ledger::storage::ics23_specs::{self, ibc_leaf_spec}; use crate::ledger::storage::types; @@ -22,8 +22,7 @@ use crate::tendermint::merkle::proof::{Proof, ProofOp}; use crate::types::address::{Address, InternalAddress}; use crate::types::hash::Hash; use crate::types::storage::{ - DbKeySeg, Error as StorageError, Key, MembershipProof, MerkleValue, - StringKey, TreeBytes, + DbKeySeg, Error as StorageError, Key, MerkleValue, StringKey, TreeBytes, }; #[allow(missing_docs)] @@ -33,6 +32,8 @@ pub enum Error { InvalidKey(StorageError), #[error("Invalid key for merkle tree: {0}")] InvalidMerkleKey(String), + #[error("Storage tree key error: {0}")] + StorageTreeKey(#[from] TreeKeyError), #[error("Empty Key: {0}")] EmptyKey(String), #[error("Merkle Tree error: {0}")] @@ -829,3 +830,15 @@ mod test { assert!(basetree_verification_res); } } + +/// Type of membership proof from a merkle tree +pub enum MembershipProof { + /// ICS23 compliant membership proof + ICS23(CommitmentProof), +} + +impl From for MembershipProof { + fn from(proof: CommitmentProof) -> Self { + Self::ICS23(proof) + } +} diff --git a/shared/src/ledger/storage/mockdb.rs b/core/src/ledger/storage/mockdb.rs similarity index 100% rename from shared/src/ledger/storage/mockdb.rs rename to core/src/ledger/storage/mockdb.rs diff --git a/shared/src/ledger/storage/mod.rs b/core/src/ledger/storage/mod.rs similarity index 99% rename from shared/src/ledger/storage/mod.rs rename to core/src/ledger/storage/mod.rs index 571d33b4ab..c2a246ce15 100644 --- a/shared/src/ledger/storage/mod.rs +++ b/core/src/ledger/storage/mod.rs @@ -4,9 +4,7 @@ pub mod ics23_specs; mod merkle_tree; #[cfg(any(test, feature = "testing"))] pub mod mockdb; -pub mod traits; pub mod types; -pub mod write_log; use core::fmt::Debug; use std::array; @@ -336,7 +334,6 @@ where pub fn open( db_path: impl AsRef, chain_id: ChainId, - native_token: Address, cache: Option<&D::Cache>, ) -> Self { let block = BlockStorage { @@ -363,7 +360,6 @@ where conversion_state: ConversionState::default(), #[cfg(feature = "ferveo-tpke")] tx_queue: TxQueue::default(), - native_token, } } @@ -1158,7 +1154,6 @@ pub mod testing { use super::mockdb::MockDB; use super::*; use crate::ledger::storage::traits::Sha256Hasher; - use crate::types::address; /// Storage with a mock DB for testing pub type TestStorage = Storage; @@ -1190,7 +1185,6 @@ pub mod testing { conversion_state: ConversionState::default(), #[cfg(feature = "ferveo-tpke")] tx_queue: TxQueue::default(), - native_token: address::nam(), } } } diff --git a/shared/src/ledger/storage/traits.rs b/core/src/ledger/storage/traits.rs similarity index 80% rename from shared/src/ledger/storage/traits.rs rename to core/src/ledger/storage/traits.rs index e382f34d73..1f84c6e421 100644 --- a/shared/src/ledger/storage/traits.rs +++ b/core/src/ledger/storage/traits.rs @@ -7,14 +7,13 @@ use arse_merkle_tree::traits::{Hasher, Value}; use arse_merkle_tree::{Key as TreeKey, H256}; use ics23::commitment_proof::Proof as Ics23Proof; use ics23::{CommitmentProof, ExistenceProof}; +use namada_core::types::storage::IBC_KEY_LIMIT; use sha2::{Digest, Sha256}; -use super::merkle_tree::{Amt, Error, Smt}; -use super::{ics23_specs, IBC_KEY_LIMIT}; +use super::ics23_specs; +use super::merkle_tree::{Amt, Error, MembershipProof, Smt}; use crate::types::hash::Hash; -use crate::types::storage::{ - Key, MembershipProof, MerkleValue, StringKey, TreeBytes, -}; +use crate::types::storage::{Key, MerkleValue, StringKey, TreeBytes}; /// Trait for reading from a merkle tree that is a sub-tree /// of the global merkle tree. @@ -159,74 +158,6 @@ impl<'a, H: StorageHasher + Default> SubTreeWrite for &'a mut Amt { } } -impl TreeKey for StringKey { - type Error = Error; - - fn as_slice(&self) -> &[u8] { - &self.original.as_slice()[..self.length] - } - - fn try_from_bytes(bytes: &[u8]) -> Result { - let mut tree_key = [0u8; IBC_KEY_LIMIT]; - let mut original = [0u8; IBC_KEY_LIMIT]; - let mut length = 0; - for (i, byte) in bytes.iter().enumerate() { - if i >= IBC_KEY_LIMIT { - return Err(Error::InvalidMerkleKey( - "Input IBC key is too large".into(), - )); - } - original[i] = *byte; - tree_key[i] = byte.wrapping_add(1); - length += 1; - } - Ok(Self { - original, - tree_key: tree_key.into(), - length, - }) - } -} - -impl Value for Hash { - fn as_slice(&self) -> &[u8] { - self.0.as_slice() - } - - fn zero() -> Self { - Hash([0u8; 32]) - } -} - -impl From for H256 { - fn from(hash: Hash) -> Self { - hash.0.into() - } -} - -impl From for Hash { - fn from(hash: H256) -> Self { - Self(hash.into()) - } -} - -impl From<&H256> for Hash { - fn from(hash: &H256) -> Self { - let hash = hash.to_owned(); - Self(hash.into()) - } -} - -impl Value for TreeBytes { - fn as_slice(&self) -> &[u8] { - self.0.as_slice() - } - - fn zero() -> Self { - TreeBytes::zero() - } -} - /// The storage hasher used for the merkle tree. pub trait StorageHasher: Hasher + Default { /// Hash the value to store diff --git a/shared/src/ledger/storage/types.rs b/core/src/ledger/storage/types.rs similarity index 100% rename from shared/src/ledger/storage/types.rs rename to core/src/ledger/storage/types.rs diff --git a/shared/src/ledger/storage_api/collections/lazy_map.rs b/core/src/ledger/storage_api/collections/lazy_map.rs similarity index 100% rename from shared/src/ledger/storage_api/collections/lazy_map.rs rename to core/src/ledger/storage_api/collections/lazy_map.rs diff --git a/shared/src/ledger/storage_api/collections/lazy_vec.rs b/core/src/ledger/storage_api/collections/lazy_vec.rs similarity index 100% rename from shared/src/ledger/storage_api/collections/lazy_vec.rs rename to core/src/ledger/storage_api/collections/lazy_vec.rs diff --git a/shared/src/ledger/storage_api/collections/mod.rs b/core/src/ledger/storage_api/collections/mod.rs similarity index 100% rename from shared/src/ledger/storage_api/collections/mod.rs rename to core/src/ledger/storage_api/collections/mod.rs diff --git a/shared/src/ledger/storage_api/error.rs b/core/src/ledger/storage_api/error.rs similarity index 100% rename from shared/src/ledger/storage_api/error.rs rename to core/src/ledger/storage_api/error.rs diff --git a/shared/src/ledger/storage_api/key.rs b/core/src/ledger/storage_api/key.rs similarity index 100% rename from shared/src/ledger/storage_api/key.rs rename to core/src/ledger/storage_api/key.rs diff --git a/shared/src/ledger/storage_api/mod.rs b/core/src/ledger/storage_api/mod.rs similarity index 100% rename from shared/src/ledger/storage_api/mod.rs rename to core/src/ledger/storage_api/mod.rs diff --git a/shared/src/ledger/storage_api/validation/mod.rs b/core/src/ledger/storage_api/validation/mod.rs similarity index 100% rename from shared/src/ledger/storage_api/validation/mod.rs rename to core/src/ledger/storage_api/validation/mod.rs diff --git a/shared/src/ledger/tx_env.rs b/core/src/ledger/tx_env.rs similarity index 100% rename from shared/src/ledger/tx_env.rs rename to core/src/ledger/tx_env.rs diff --git a/shared/src/ledger/vp_env.rs b/core/src/ledger/vp_env.rs similarity index 100% rename from shared/src/ledger/vp_env.rs rename to core/src/ledger/vp_env.rs diff --git a/core/src/lib.rs b/core/src/lib.rs new file mode 100644 index 0000000000..5ee0ebba0e --- /dev/null +++ b/core/src/lib.rs @@ -0,0 +1,11 @@ +//! The core public types, storage_api, VpEnv and TxEnv. + +#![doc(html_favicon_url = "https://dev.anoma.net/master/favicon.png")] +#![doc(html_logo_url = "https://dev.anoma.net/master/rustdoc-logo.png")] +#![warn(missing_docs)] +#![deny(rustdoc::broken_intra_doc_links)] +#![deny(rustdoc::private_intra_doc_links)] + +pub mod bytes; +pub mod ledger; +pub mod types; diff --git a/shared/src/proto/generated.rs b/core/src/proto/generated.rs similarity index 100% rename from shared/src/proto/generated.rs rename to core/src/proto/generated.rs diff --git a/shared/src/proto/generated/.gitignore b/core/src/proto/generated/.gitignore similarity index 100% rename from shared/src/proto/generated/.gitignore rename to core/src/proto/generated/.gitignore diff --git a/shared/src/proto/mod.rs b/core/src/proto/mod.rs similarity index 100% rename from shared/src/proto/mod.rs rename to core/src/proto/mod.rs diff --git a/shared/src/proto/types.rs b/core/src/proto/types.rs similarity index 100% rename from shared/src/proto/types.rs rename to core/src/proto/types.rs diff --git a/shared/src/types/address.rs b/core/src/types/address.rs similarity index 100% rename from shared/src/types/address.rs rename to core/src/types/address.rs diff --git a/shared/src/types/chain.rs b/core/src/types/chain.rs similarity index 100% rename from shared/src/types/chain.rs rename to core/src/types/chain.rs diff --git a/shared/src/types/governance.rs b/core/src/types/governance.rs similarity index 97% rename from shared/src/types/governance.rs rename to core/src/types/governance.rs index a7de68c8ff..fcfa6dcb54 100644 --- a/shared/src/types/governance.rs +++ b/core/src/types/governance.rs @@ -9,13 +9,13 @@ use rust_decimal::Decimal; use serde::{Deserialize, Serialize}; use thiserror::Error; -use super::address::Address; -use super::hash::Hash; -use super::key::common::{self, Signature}; -use super::key::SigScheme; -use super::storage::Epoch; -use super::token::SCALE; -use super::transaction::governance::InitProposalData; +use crate::types::address::Address; +use crate::types::hash::Hash; +use crate::types::key::common::{self, Signature}; +use crate::types::key::SigScheme; +use crate::types::storage::Epoch; +use crate::types::token::SCALE; +use crate::types::transaction::governance::InitProposalData; /// Type alias for vote power pub type VotePower = u128; diff --git a/shared/src/types/hash.rs b/core/src/types/hash.rs similarity index 91% rename from shared/src/types/hash.rs rename to core/src/types/hash.rs index 4198cac4d5..5f8b1be95f 100644 --- a/shared/src/types/hash.rs +++ b/core/src/types/hash.rs @@ -4,16 +4,16 @@ use std::fmt::{self, Display}; use std::ops::Deref; use std::str::FromStr; -use arse_merkle_tree::traits::Value; -use arse_merkle_tree::Hash as TreeHash; +// use arse_merkle_tree::traits::Value; +// use arse_merkle_tree::Hash as TreeHash; use borsh::{BorshDeserialize, BorshSchema, BorshSerialize}; use hex::FromHex; use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; use thiserror::Error; -use crate::tendermint::abci::transaction; -use crate::tendermint::Hash as TmHash; +// use crate::tendermint::abci::transaction; +// use crate::tendermint::Hash as TmHash; /// The length of the raw transaction hash. pub const HASH_LENGTH: usize = 32; @@ -130,17 +130,21 @@ impl Hash { Self(*digest.as_ref()) } + fn zero() -> Self { + Self([0u8; 32]) + } + /// Check if the hash is all zeros pub fn is_zero(&self) -> bool { self == &Self::zero() } } -impl From for TmHash { - fn from(hash: Hash) -> Self { - TmHash::Sha256(hash.0) - } -} +// impl From for TmHash { +// fn from(hash: Hash) -> Self { +// TmHash::Sha256(hash.0) +// } +// } impl From for TreeHash { fn from(hash: Hash) -> Self { diff --git a/shared/src/types/ibc/event.rs b/core/src/types/ibc.rs similarity index 100% rename from shared/src/types/ibc/event.rs rename to core/src/types/ibc.rs diff --git a/shared/src/types/internal.rs b/core/src/types/internal.rs similarity index 100% rename from shared/src/types/internal.rs rename to core/src/types/internal.rs diff --git a/shared/src/types/key/common.rs b/core/src/types/key/common.rs similarity index 97% rename from shared/src/types/key/common.rs rename to core/src/types/key/common.rs index fc4a4732dd..7ec041d638 100644 --- a/shared/src/types/key/common.rs +++ b/core/src/types/key/common.rs @@ -5,7 +5,7 @@ use std::str::FromStr; use borsh::{BorshDeserialize, BorshSchema, BorshSerialize}; use data_encoding::HEXLOWER; -use namada_proof_of_stake::types::PublicKeyTmRawHash; +// use namada_proof_of_stake::types::PublicKeyTmRawHash; #[cfg(feature = "rand")] use rand::{CryptoRng, RngCore}; use serde::{Deserialize, Serialize}; @@ -325,8 +325,9 @@ impl super::SigScheme for SigScheme { } } -impl PublicKeyTmRawHash for PublicKey { - fn tm_raw_hash(&self) -> String { - tm_consensus_key_raw_hash(self) - } -} +// TODO +// impl PublicKeyTmRawHash for PublicKey { +// fn tm_raw_hash(&self) -> String { +// tm_consensus_key_raw_hash(self) +// } +// } diff --git a/shared/src/types/key/dkg_session_keys.rs b/core/src/types/key/dkg_session_keys.rs similarity index 100% rename from shared/src/types/key/dkg_session_keys.rs rename to core/src/types/key/dkg_session_keys.rs diff --git a/shared/src/types/key/ed25519.rs b/core/src/types/key/ed25519.rs similarity index 100% rename from shared/src/types/key/ed25519.rs rename to core/src/types/key/ed25519.rs diff --git a/shared/src/types/key/mod.rs b/core/src/types/key/mod.rs similarity index 100% rename from shared/src/types/key/mod.rs rename to core/src/types/key/mod.rs diff --git a/shared/src/types/key/secp256k1.rs b/core/src/types/key/secp256k1.rs similarity index 100% rename from shared/src/types/key/secp256k1.rs rename to core/src/types/key/secp256k1.rs diff --git a/shared/src/types/masp.rs b/core/src/types/masp.rs similarity index 100% rename from shared/src/types/masp.rs rename to core/src/types/masp.rs diff --git a/core/src/types/mod.rs b/core/src/types/mod.rs new file mode 100644 index 0000000000..6e7b71dcda --- /dev/null +++ b/core/src/types/mod.rs @@ -0,0 +1,12 @@ +//! Types definitions. + +pub mod address; +pub mod chain; +pub mod governance; +pub mod hash; +pub mod key; +pub mod masp; +pub mod storage; +pub mod time; +pub mod token; +pub mod validity_predicate; diff --git a/shared/src/types/named_address.rs b/core/src/types/named_address.rs similarity index 100% rename from shared/src/types/named_address.rs rename to core/src/types/named_address.rs diff --git a/shared/src/types/storage.rs b/core/src/types/storage.rs similarity index 99% rename from shared/src/types/storage.rs rename to core/src/types/storage.rs index bec847e8aa..5dc05ae716 100644 --- a/shared/src/types/storage.rs +++ b/core/src/types/storage.rs @@ -456,17 +456,18 @@ impl From for Vec { } } -/// Type of membership proof from a merkle tree -pub enum MembershipProof { - /// ICS23 compliant membership proof - ICS23(CommitmentProof), -} - -impl From for MembershipProof { - fn from(proof: CommitmentProof) -> Self { - Self::ICS23(proof) - } -} +// TODO not sure +// /// Type of membership proof from a merkle tree +// pub enum MembershipProof { +// /// ICS23 compliant membership proof +// ICS23(CommitmentProof), +// } + +// impl From for MembershipProof { +// fn from(proof: CommitmentProof) -> Self { +// Self::ICS23(proof) +// } +// } impl Key { /// Parses string and returns a key diff --git a/shared/src/types/time.rs b/core/src/types/time.rs similarity index 77% rename from shared/src/types/time.rs rename to core/src/types/time.rs index dfca614c82..13de2685ad 100644 --- a/shared/src/types/time.rs +++ b/core/src/types/time.rs @@ -7,10 +7,6 @@ use std::ops::{Add, Sub}; use borsh::{BorshDeserialize, BorshSchema, BorshSerialize}; pub use chrono::{DateTime, Duration, TimeZone, Utc}; -use crate::tendermint::time::Time; -use crate::tendermint::Error as TendermintError; -use crate::tendermint_proto::google::protobuf; - /// Check if the given `duration` has passed since the given `start. pub fn duration_passed( current: DateTimeUtc, @@ -179,35 +175,37 @@ impl From> for DateTimeUtc { } } -impl TryFrom for DateTimeUtc { - type Error = prost_types::TimestampOutOfSystemRangeError; +// TODO move +// impl TryFrom for DateTimeUtc { +// type Error = prost_types::TimestampOutOfSystemRangeError; - fn try_from( - timestamp: prost_types::Timestamp, - ) -> Result { - let system_time: std::time::SystemTime = timestamp.try_into()?; - Ok(Self(system_time.into())) - } -} +// fn try_from( +// timestamp: prost_types::Timestamp, +// ) -> Result { +// let system_time: std::time::SystemTime = timestamp.try_into()?; +// Ok(Self(system_time.into())) +// } +// } -impl From for prost_types::Timestamp { - fn from(dt: DateTimeUtc) -> Self { - let seconds = dt.0.timestamp(); - let nanos = dt.0.timestamp_subsec_nanos() as i32; - prost_types::Timestamp { seconds, nanos } - } -} +// impl From for prost_types::Timestamp { +// fn from(dt: DateTimeUtc) -> Self { +// let seconds = dt.0.timestamp(); +// let nanos = dt.0.timestamp_subsec_nanos() as i32; +// prost_types::Timestamp { seconds, nanos } +// } +// } -impl TryFrom for DateTimeUtc { - type Error = prost_types::TimestampOutOfSystemRangeError; +// TODO move +// impl TryFrom for DateTimeUtc { +// type Error = prost_types::TimestampOutOfSystemRangeError; - fn try_from(timestamp: protobuf::Timestamp) -> Result { - Self::try_from(prost_types::Timestamp { - seconds: timestamp.seconds, - nanos: timestamp.nanos, - }) - } -} +// fn try_from(timestamp: protobuf::Timestamp) -> Result +// { Self::try_from(prost_types::Timestamp { +// seconds: timestamp.seconds, +// nanos: timestamp.nanos, +// }) +// } +// } impl From for std::time::SystemTime { fn from(dt: DateTimeUtc) -> Self { @@ -230,18 +228,19 @@ impl From for Rfc3339String { } } -impl TryFrom for Time { - type Error = TendermintError; +// TODO move +// impl TryFrom for Time { +// type Error = TendermintError; - fn try_from(dt: DateTimeUtc) -> Result { - Self::parse_from_rfc3339(&DateTime::to_rfc3339(&dt.0)) - } -} +// fn try_from(dt: DateTimeUtc) -> Result { +// Self::parse_from_rfc3339(&DateTime::to_rfc3339(&dt.0)) +// } +// } -impl TryFrom