diff --git a/.changelog/unreleased/improvements/2141-improvements.md b/.changelog/unreleased/improvements/2141-improvements.md new file mode 100644 index 0000000000..f423a421b7 --- /dev/null +++ b/.changelog/unreleased/improvements/2141-improvements.md @@ -0,0 +1,2 @@ +- Upgraded to upstream tower-abci version. + ([\#2141](https://github.com/anoma/namada/pull/2141)) \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 38c7d1417f..c61c79759a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1070,7 +1070,7 @@ checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" dependencies = [ "once_cell", "owo-colors", - "tracing-core 0.1.31", + "tracing-core", "tracing-error", ] @@ -2090,7 +2090,7 @@ dependencies = [ "serde 1.0.190", "serde_json", "thiserror", - "tracing 0.1.37", + "tracing", ] [[package]] @@ -2115,8 +2115,8 @@ dependencies = [ "serde_json", "thiserror", "tokio", - "tracing 0.1.37", - "tracing-futures 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing", + "tracing-futures", "url", ] @@ -2146,8 +2146,8 @@ dependencies = [ "serde_json", "thiserror", "tokio", - "tracing 0.1.37", - "tracing-futures 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing", + "tracing-futures", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -2171,7 +2171,7 @@ dependencies = [ "rand 0.8.5", "sha2 0.10.6", "thiserror", - "tracing 0.1.37", + "tracing", ] [[package]] @@ -2607,7 +2607,7 @@ dependencies = [ "slab", "tokio", "tokio-util 0.7.8", - "tracing 0.1.37", + "tracing", ] [[package]] @@ -2823,7 +2823,7 @@ dependencies = [ "socket2", "tokio", "tower-service", - "tracing 0.1.37", + "tracing", "want", ] @@ -2915,7 +2915,7 @@ dependencies = [ "tendermint-proto", "tendermint-testgen", "time", - "tracing 0.1.37", + "tracing", "typed-builder", "uint", ] @@ -3555,7 +3555,7 @@ dependencies = [ "minreq", "rand_core 0.6.4", "redjubjub", - "tracing 0.1.37", + "tracing", ] [[package]] @@ -3784,7 +3784,7 @@ dependencies = [ "tiny-hderive", "tokio", "toml 0.5.9", - "tracing 0.1.37", + "tracing", "tracing-subscriber", "wasm-instrument", "wasmer", @@ -3880,7 +3880,7 @@ dependencies = [ "tonic", "tower", "tower-abci", - "tracing 0.1.37", + "tracing", "tracing-appender", "tracing-log", "tracing-subscriber", @@ -3955,7 +3955,7 @@ dependencies = [ "tiny-keccak", "toml 0.5.9", "tonic-build", - "tracing 0.1.37", + "tracing", "tracing-subscriber", "uint", "zeroize", @@ -3994,7 +3994,7 @@ dependencies = [ "tendermint-proto", "tendermint-rpc", "toml 0.5.9", - "tracing 0.1.37", + "tracing", ] [[package]] @@ -4022,7 +4022,7 @@ dependencies = [ "proptest-state-machine", "test-log", "thiserror", - "tracing 0.1.37", + "tracing", "tracing-subscriber", "yansi", ] @@ -4071,7 +4071,7 @@ dependencies = [ "tiny-hderive", "tokio", "toml 0.5.9", - "tracing 0.1.37", + "tracing", "wasmtimer", "zeroize", ] @@ -4130,7 +4130,7 @@ dependencies = [ "test-log", "tokio", "toml 0.5.9", - "tracing 0.1.37", + "tracing", "tracing-subscriber", ] @@ -6438,10 +6438,12 @@ dependencies = [ "ed25519-consensus 2.1.0", "flex-error", "futures", + "k256", "num-traits 0.2.15", "once_cell", "prost 0.12.1", "prost-types 0.12.1", + "ripemd", "serde 1.0.190", "serde_bytes", "serde_json", @@ -6491,7 +6493,7 @@ dependencies = [ "tendermint-rpc", "time", "tokio", - "tracing 0.1.37", + "tracing", ] [[package]] @@ -6551,7 +6553,7 @@ dependencies = [ "thiserror", "time", "tokio", - "tracing 0.1.37", + "tracing", "url", "uuid 0.8.2", "walkdir", @@ -6843,7 +6845,7 @@ dependencies = [ "futures-sink", "pin-project-lite", "tokio", - "tracing 0.1.37", + "tracing", ] [[package]] @@ -6917,8 +6919,8 @@ dependencies = [ "tower", "tower-layer", "tower-service", - "tracing 0.1.37", - "tracing-futures 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing", + "tracing-futures", ] [[package]] @@ -6952,25 +6954,26 @@ dependencies = [ "tokio-util 0.7.8", "tower-layer", "tower-service", - "tracing 0.1.37", + "tracing", ] [[package]] name = "tower-abci" -version = "0.1.0" -source = "git+https://github.com/heliaxdev/tower-abci.git?rev=9636f0f2000ebb7da1c51e85cce2b10b2fed4f1d#9636f0f2000ebb7da1c51e85cce2b10b2fed4f1d" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d4826f3df3e9a37083d978cae73f020bcdf6143956b7dfc1bd6050b4e16367c" dependencies = [ "bytes", "futures", "pin-project", "prost 0.12.1", + "tendermint", "tendermint-proto", "tokio", "tokio-stream", "tokio-util 0.6.10", "tower", - "tracing 0.1.30", - "tracing-tower", + "tracing", ] [[package]] @@ -6979,32 +6982,12 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" -[[package]] -name = "tower-make" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce50370d644a0364bf4877ffd4f76404156a248d104e2cc234cd391ea5cdc965" -dependencies = [ - "tower-service", -] - [[package]] name = "tower-service" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" -[[package]] -name = "tracing" -version = "0.1.30" -source = "git+https://github.com/tokio-rs/tracing/?tag=tracing-0.1.30#df4ba17d857db8ba1b553f7b293ac8ba967a42f8" -dependencies = [ - "cfg-if 1.0.0", - "pin-project-lite", - "tracing-attributes 0.1.19", - "tracing-core 0.1.22", -] - [[package]] name = "tracing" version = "0.1.37" @@ -7014,8 +6997,8 @@ dependencies = [ "cfg-if 1.0.0", "log", "pin-project-lite", - "tracing-attributes 0.1.24", - "tracing-core 0.1.31", + "tracing-attributes", + "tracing-core", ] [[package]] @@ -7029,16 +7012,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "tracing-attributes" -version = "0.1.19" -source = "git+https://github.com/tokio-rs/tracing/?tag=tracing-0.1.30#df4ba17d857db8ba1b553f7b293ac8ba967a42f8" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "tracing-attributes" version = "0.1.24" @@ -7050,14 +7023,6 @@ dependencies = [ "syn 2.0.38", ] -[[package]] -name = "tracing-core" -version = "0.1.22" -source = "git+https://github.com/tokio-rs/tracing/?tag=tracing-0.1.30#df4ba17d857db8ba1b553f7b293ac8ba967a42f8" -dependencies = [ - "lazy_static", -] - [[package]] name = "tracing-core" version = "0.1.31" @@ -7074,7 +7039,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" dependencies = [ - "tracing 0.1.37", + "tracing", "tracing-subscriber", ] @@ -7085,16 +7050,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" dependencies = [ "pin-project", - "tracing 0.1.37", -] - -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "git+https://github.com/tokio-rs/tracing/?tag=tracing-0.1.30#df4ba17d857db8ba1b553f7b293ac8ba967a42f8" -dependencies = [ - "pin-project-lite", - "tracing 0.1.30", + "tracing", ] [[package]] @@ -7105,7 +7061,7 @@ checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" dependencies = [ "lazy_static", "log", - "tracing-core 0.1.31", + "tracing-core", ] [[package]] @@ -7115,7 +7071,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" dependencies = [ "serde 1.0.190", - "tracing-core 0.1.31", + "tracing-core", ] [[package]] @@ -7132,26 +7088,12 @@ dependencies = [ "serde_json", "sharded-slab", "thread_local", - "tracing 0.1.37", - "tracing-core 0.1.31", + "tracing", + "tracing-core", "tracing-log", "tracing-serde", ] -[[package]] -name = "tracing-tower" -version = "0.1.0" -source = "git+https://github.com/tokio-rs/tracing/?tag=tracing-0.1.30#df4ba17d857db8ba1b553f7b293ac8ba967a42f8" -dependencies = [ - "futures", - "pin-project-lite", - "tower-layer", - "tower-make", - "tower-service", - "tracing 0.1.30", - "tracing-futures 0.2.5 (git+https://github.com/tokio-rs/tracing/?tag=tracing-0.1.30)", -] - [[package]] name = "try-lock" version = "0.2.4" @@ -7411,7 +7353,7 @@ dependencies = [ "tokio-tungstenite", "tokio-util 0.7.8", "tower-service", - "tracing 0.1.37", + "tracing", ] [[package]] @@ -7590,7 +7532,7 @@ dependencies = [ "rayon", "smallvec", "target-lexicon", - "tracing 0.1.37", + "tracing", "wasmer-compiler", "wasmer-types", ] @@ -7661,7 +7603,7 @@ dependencies = [ "rkyv", "serde 1.0.190", "tempfile", - "tracing 0.1.37", + "tracing", "wasmer-artifact", "wasmer-compiler", "wasmer-engine", diff --git a/Cargo.toml b/Cargo.toml index 0b27724164..45ded6de4c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -126,7 +126,7 @@ slip10_ed25519 = "0.1.3" sysinfo = {version = "0.27.8", default-features = false} tar = "0.4.37" tempfile = {version = "3.2.0"} -tendermint = "0.34.0" +tendermint = {version = "0.34.0", features = ["secp256k1"]} tendermint-config = "0.34.0" tendermint-light-client = "0.34.0" tendermint-proto = "0.34.0" @@ -142,7 +142,7 @@ tonic = "0.8.3" tonic-build = "0.8.4" tower = "0.4" # Also, using the same version of tendermint-rs as we do here. -tower-abci = {git = "https://github.com/heliaxdev/tower-abci.git", rev = "9636f0f2000ebb7da1c51e85cce2b10b2fed4f1d"} +tower-abci = "0.11.1" tracing = "0.1.30" tracing-appender = "0.2.2" tracing-log = "0.1.2" diff --git a/apps/src/lib/bench_utils.rs b/apps/src/lib/bench_utils.rs index 1b21ec4567..27d37705cf 100644 --- a/apps/src/lib/bench_utils.rs +++ b/apps/src/lib/bench_utils.rs @@ -60,7 +60,6 @@ use namada::ledger::queries::{ Client, EncodedResponseQuery, RequestCtx, RequestQuery, Router, RPC, }; use namada::ledger::storage_api::StorageRead; -use namada::proof_of_stake; use namada::proto::{Code, Data, Section, Signature, Tx}; use namada::tendermint::Hash; use namada::tendermint_rpc::{self}; @@ -76,6 +75,7 @@ use namada::types::token::DenominatedAmount; use namada::types::transaction::governance::InitProposalData; use namada::types::transaction::pos::Bond; use namada::vm::wasm::run; +use namada::{proof_of_stake, tendermint}; use namada_sdk::masp::{ self, ShieldedContext, ShieldedTransfer, ShieldedUtils, }; @@ -91,8 +91,8 @@ use crate::cli::Context; use crate::config; use crate::config::global::GlobalConfig; use crate::config::TendermintMode; +use crate::facade::tendermint::v0_37::abci::request::InitChain; use crate::facade::tendermint_proto::google::protobuf::Timestamp; -use crate::facade::tendermint_proto::v0_37::abci::RequestInitChain; use crate::node::ledger::shell::Shell; use crate::wallet::{defaults, CliWalletUtils}; @@ -183,13 +183,39 @@ impl Default for BenchShell { shell .init_chain( - RequestInitChain { - time: Some(Timestamp { + InitChain { + time: Timestamp { seconds: 0, nanos: 0, - }), + } + .try_into() + .unwrap(), chain_id: ChainId::default().to_string(), - ..Default::default() + consensus_params: tendermint::consensus::params::Params { + block: tendermint::block::Size { + max_bytes: 0, + max_gas: 0, + time_iota_ms: 0, + }, + evidence: tendermint::evidence::Params { + max_age_num_blocks: 0, + max_age_duration: tendermint::evidence::Duration( + core::time::Duration::MAX, + ), + max_bytes: 0, + }, + validator: + tendermint::consensus::params::ValidatorParams { + pub_key_types: vec![], + }, + version: None, + abci: tendermint::consensus::params::AbciParams { + vote_extensions_enable_height: None, + }, + }, + validators: vec![], + app_state_bytes: vec![].into(), + initial_height: 0_u32.into(), }, 2, ) @@ -676,9 +702,9 @@ impl Client for BenchShell { let height = height.unwrap_or_default(); let request = RequestQuery { - data, + data: data.into(), path, - height, + height: height.try_into().unwrap(), prove, }; diff --git a/apps/src/lib/mod.rs b/apps/src/lib/mod.rs index a9b2039c28..9bfb5be0ef 100644 --- a/apps/src/lib/mod.rs +++ b/apps/src/lib/mod.rs @@ -21,6 +21,11 @@ pub mod wasm_loader; pub use std; pub mod facade { + // TODO: re-import v0_37 only pub use namada::{tendermint, tendermint_proto, tendermint_rpc}; - pub use {tendermint_config, tower_abci}; + pub use tendermint_config; + pub mod tower_abci { + pub use tower_abci::v037::*; + pub use tower_abci::BoxError; + } } diff --git a/apps/src/lib/node/ledger/mod.rs b/apps/src/lib/node/ledger/mod.rs index bfbef35041..5555f49afa 100644 --- a/apps/src/lib/node/ledger/mod.rs +++ b/apps/src/lib/node/ledger/mod.rs @@ -17,6 +17,7 @@ use futures::future::TryFutureExt; use namada::core::ledger::governance::storage::keys as governance_storage; use namada::eth_bridge::ethers::providers::{Http, Provider}; use namada::types::storage::Key; +use namada_sdk::tendermint::abci::request::CheckTxKind; use once_cell::unsync::Lazy; use sysinfo::{RefreshKind, System, SystemExt}; use tokio::sync::mpsc; @@ -30,8 +31,8 @@ use self::shims::abcipp_shim::AbciService; use crate::cli::args; use crate::config::utils::{convert_tm_addr_to_socket_addr, num_of_threads}; use crate::config::{ethereum_bridge, TendermintMode}; -use crate::facade::tendermint_proto::v0_37::abci::CheckTxType; -use crate::facade::tower_abci::{response, split, Server}; +use crate::facade::tendermint::v0_37::abci::response; +use crate::facade::tower_abci::{split, Server}; use crate::node::ledger::broadcaster::Broadcaster; use crate::node::ledger::ethereum_oracle as oracle; use crate::node::ledger::shell::{Error, MempoolTxType, Shell}; @@ -106,14 +107,20 @@ impl Shell { Request::Query(query) => Ok(Response::Query(self.query(query))), Request::PrepareProposal(block) => { tracing::debug!("Request PrepareProposal"); - Ok(Response::PrepareProposal(self.prepare_proposal(block))) + // TODO: use TM domain type in the handler + Ok(Response::PrepareProposal( + self.prepare_proposal(block.into()), + )) } Request::VerifyHeader(_req) => { Ok(Response::VerifyHeader(self.verify_header(_req))) } Request::ProcessProposal(block) => { tracing::debug!("Request ProcessProposal"); - Ok(Response::ProcessProposal(self.process_proposal(block))) + // TODO: use TM domain type in the handler + let (response, _tx_results) = + self.process_proposal(block.into()); + Ok(Response::ProcessProposal(response)) } Request::RevertProposal(_req) => { Ok(Response::RevertProposal(self.revert_proposal(_req))) @@ -123,24 +130,23 @@ impl Shell { self.load_proposals(); self.finalize_block(finalize).map(Response::FinalizeBlock) } - Request::Commit(_) => { + Request::Commit => { tracing::debug!("Request Commit"); Ok(Response::Commit(self.commit())) } - Request::Flush(_) => Ok(Response::Flush(Default::default())), + Request::Flush => Ok(Response::Flush), Request::Echo(msg) => Ok(Response::Echo(response::Echo { message: msg.message, })), Request::CheckTx(tx) => { - let r#type = match CheckTxType::try_from(tx.r#type) - .expect("received unexpected CheckTxType from ABCI") - { - CheckTxType::New => MempoolTxType::NewTransaction, - CheckTxType::Recheck => MempoolTxType::RecheckTransaction, + let mempool_tx_type = match tx.kind { + CheckTxKind::New => MempoolTxType::NewTransaction, + CheckTxKind::Recheck => MempoolTxType::RecheckTransaction, }; + let r#type = mempool_tx_type; Ok(Response::CheckTx(self.mempool_validate(&tx.tx, r#type))) } - Request::ListSnapshots(_) => { + Request::ListSnapshots => { Ok(Response::ListSnapshots(Default::default())) } Request::OfferSnapshot(_) => { @@ -530,7 +536,7 @@ async fn run_abci( .mempool( ServiceBuilder::new() .load_shed() - .buffer(1024) + .buffer(5000) // matching default Comet's mempool.size .service(mempool), ) .info( @@ -544,7 +550,7 @@ async fn run_abci( .unwrap(); tokio::select! { // Run the server with the ABCI service - status = server.listen(proxy_app_address) => { + status = server.listen_tcp(proxy_app_address) => { status.map_err(|err| Error::TowerServer(err.to_string())) }, resp_sender = abort_recv => { diff --git a/apps/src/lib/node/ledger/shell/finalize_block.rs b/apps/src/lib/node/ledger/shell/finalize_block.rs index 389d543b30..bb0656bfa3 100644 --- a/apps/src/lib/node/ledger/shell/finalize_block.rs +++ b/apps/src/lib/node/ledger/shell/finalize_block.rs @@ -26,9 +26,7 @@ use namada::types::vote_extensions::ethereum_events::MultiSignedEthEvent; use super::governance::execute_governance_proposals; use super::*; -use crate::facade::tendermint_proto::v0_37::abci::{ - Misbehavior as Evidence, VoteInfo, -}; +use crate::facade::tendermint::abci::types::{Misbehavior, VoteInfo}; use crate::node::ledger::shell::stats::InternalStats; impl Shell @@ -531,7 +529,7 @@ where &mut self, header: Header, hash: BlockHash, - byzantine_validators: Vec, + byzantine_validators: Vec, ) -> (BlockHeight, bool) { let height = self.wl_storage.storage.get_last_block_height() + 1; @@ -560,7 +558,17 @@ where fn update_epoch(&mut self, response: &mut shim::response::FinalizeBlock) { // Apply validator set update response.validator_updates = self - .get_abci_validator_updates(false) + .get_abci_validator_updates(false, |pk, power| { + let pub_key = + crate::facade::tendermint_proto::v0_37::crypto::PublicKey { + sum: Some(key_to_tendermint(&pk).unwrap()), + }; + let pub_key = Some(pub_key); + namada::tendermint_proto::v0_37::abci::ValidatorUpdate { + pub_key, + power, + } + }) .expect("Must be able to update validator set"); } @@ -824,54 +832,48 @@ fn pos_votes_from_abci( .filter_map( |VoteInfo { validator, - signed_last_block, + sig_info, }| { - if let Some( - crate::facade::tendermint_proto::v0_37::abci::Validator { - address, - power, - }, - ) = validator - { - let tm_raw_hash_string = HEXUPPER.encode(address); - if *signed_last_block { - tracing::debug!( - "Looking up validator from Tendermint VoteInfo's \ - raw hash {tm_raw_hash_string}" - ); + let crate::facade::tendermint::abci::types::Validator { + address, + power, + } = validator; + let tm_raw_hash_string = HEXUPPER.encode(address); + if sig_info.is_signed() { + tracing::debug!( + "Looking up validator from Tendermint VoteInfo's raw \ + hash {tm_raw_hash_string}" + ); - // Look-up the native address - let validator_address = find_validator_by_raw_hash( - storage, - &tm_raw_hash_string, - ) - .expect( - "Must be able to read from storage to find native \ - address of validator from tendermint raw hash", - ) - .expect( - "Must be able to find the native address of \ - validator from tendermint raw hash", - ); + // Look-up the native address + let validator_address = find_validator_by_raw_hash( + storage, + &tm_raw_hash_string, + ) + .expect( + "Must be able to read from storage to find native \ + address of validator from tendermint raw hash", + ) + .expect( + "Must be able to find the native address of validator \ + from tendermint raw hash", + ); - // Try to convert voting power to u64 - let validator_vp = u64::try_from(*power).expect( - "Must be able to convert voting power from i64 to \ - u64", - ); + // Try to convert voting power to u64 + let validator_vp = u64::try_from(*power).expect( + "Must be able to convert voting power from i64 to u64", + ); - return Some(namada_proof_of_stake::types::VoteInfo { - validator_address, - validator_vp, - }); - } else { - tracing::debug!( - "Validator {tm_raw_hash_string} didn't sign last \ - block" - ) - } + Some(namada_proof_of_stake::types::VoteInfo { + validator_address, + validator_vp, + }) + } else { + tracing::debug!( + "Validator {tm_raw_hash_string} didn't sign last block" + ); + None } - None }, ) .collect() @@ -941,7 +943,7 @@ mod test_finalize_block { use test_log::test; use super::*; - use crate::facade::tendermint_proto::v0_37::abci::{ + use crate::facade::tendermint::abci::types::{ Misbehavior, Validator, VoteInfo, }; use crate::node::ledger::oracle::control::Command; @@ -1752,11 +1754,13 @@ mod test_finalize_block { .unwrap(); let votes = vec![VoteInfo { - validator: Some(Validator { - address: proposer_address.clone().into(), - power: u128::try_from(val_stake).expect("Test failed") as i64, - }), - signed_last_block: true, + validator: Validator { + address: proposer_address.clone().try_into().unwrap(), + power: (u128::try_from(val_stake).expect("Test failed") as u64) + .try_into() + .unwrap(), + }, + sig_info: tendermint::abci::types::BlockSignatureInfo::LegacySigned, }]; // Need to supply a proposer address and votes to flow through the @@ -1843,7 +1847,9 @@ mod test_finalize_block { .unwrap() .unwrap(); let hash_string = tm_consensus_key_raw_hash(&ck); - HEXUPPER.decode(hash_string.as_bytes()).unwrap() + let vec = HEXUPPER.decode(hash_string.as_bytes()).unwrap(); + let res: [u8; 20] = TryFrom::try_from(vec).unwrap(); + res }; let pkh1 = get_pkh(val1.address.clone(), Epoch::default()); @@ -1854,40 +1860,52 @@ mod test_finalize_block { // All validators sign blocks initially let votes = vec![ VoteInfo { - validator: Some(Validator { - address: pkh1.clone().into(), - power: u128::try_from(val1.bonded_stake) + validator: Validator { + address: pkh1, + power: (u128::try_from(val1.bonded_stake) .expect("Test failed") - as i64, - }), - signed_last_block: true, + as u64) + .try_into() + .unwrap(), + }, + sig_info: + tendermint::abci::types::BlockSignatureInfo::LegacySigned, }, VoteInfo { - validator: Some(Validator { - address: pkh2.clone().into(), - power: u128::try_from(val2.bonded_stake) + validator: Validator { + address: pkh2, + power: (u128::try_from(val2.bonded_stake) .expect("Test failed") - as i64, - }), - signed_last_block: true, + as u64) + .try_into() + .unwrap(), + }, + sig_info: + tendermint::abci::types::BlockSignatureInfo::LegacySigned, }, VoteInfo { - validator: Some(Validator { - address: pkh3.clone().into(), - power: u128::try_from(val3.bonded_stake) + validator: Validator { + address: pkh3, + power: (u128::try_from(val3.bonded_stake) .expect("Test failed") - as i64, - }), - signed_last_block: true, + as u64) + .try_into() + .unwrap(), + }, + sig_info: + tendermint::abci::types::BlockSignatureInfo::LegacySigned, }, VoteInfo { - validator: Some(Validator { - address: pkh4.clone().into(), - power: u128::try_from(val4.bonded_stake) + validator: Validator { + address: pkh4, + power: (u128::try_from(val4.bonded_stake) .expect("Test failed") - as i64, - }), - signed_last_block: true, + as u64) + .try_into() + .unwrap(), + }, + sig_info: + tendermint::abci::types::BlockSignatureInfo::LegacySigned, }, ]; @@ -1917,7 +1935,7 @@ mod test_finalize_block { // FINALIZE BLOCK 1. Tell Namada that val1 is the block proposer. We // won't receive votes from TM since we receive votes at a 1-block // delay, so votes will be empty here - next_block_for_inflation(&mut shell, pkh1.clone(), vec![], None); + next_block_for_inflation(&mut shell, pkh1.to_vec(), vec![], None); assert!( rewards_accumulator_handle() .is_empty(&shell.wl_storage) @@ -1927,7 +1945,12 @@ mod test_finalize_block { // FINALIZE BLOCK 2. Tell Namada that val1 is the block proposer. // Include votes that correspond to block 1. Make val2 the next block's // proposer. - next_block_for_inflation(&mut shell, pkh2.clone(), votes.clone(), None); + next_block_for_inflation( + &mut shell, + pkh2.to_vec(), + votes.clone(), + None, + ); assert!(rewards_prod_1.is_empty(&shell.wl_storage).unwrap()); assert!(rewards_prod_2.is_empty(&shell.wl_storage).unwrap()); assert!(rewards_prod_3.is_empty(&shell.wl_storage).unwrap()); @@ -1950,7 +1973,7 @@ mod test_finalize_block { ); // FINALIZE BLOCK 3, with val1 as proposer for the next block. - next_block_for_inflation(&mut shell, pkh1.clone(), votes, None); + next_block_for_inflation(&mut shell, pkh1.to_vec(), votes, None); assert!(rewards_prod_1.is_empty(&shell.wl_storage).unwrap()); assert!(rewards_prod_2.is_empty(&shell.wl_storage).unwrap()); assert!(rewards_prod_3.is_empty(&shell.wl_storage).unwrap()); @@ -1971,46 +1994,64 @@ mod test_finalize_block { // Now we don't receive a vote from val4. let votes = vec![ VoteInfo { - validator: Some(Validator { - address: pkh1.clone().into(), - power: u128::try_from(val1.bonded_stake) + validator: Validator { + address: pkh1, + power: (u128::try_from(val1.bonded_stake) .expect("Test failed") - as i64, - }), - signed_last_block: true, + as u64) + .try_into() + .unwrap(), + }, + sig_info: + tendermint::abci::types::BlockSignatureInfo::LegacySigned, }, VoteInfo { - validator: Some(Validator { - address: pkh2.into(), - power: u128::try_from(val2.bonded_stake) + validator: Validator { + address: pkh2, + power: (u128::try_from(val2.bonded_stake) .expect("Test failed") - as i64, - }), - signed_last_block: true, + as u64) + .try_into() + .unwrap(), + }, + sig_info: + tendermint::abci::types::BlockSignatureInfo::LegacySigned, }, VoteInfo { - validator: Some(Validator { - address: pkh3.into(), - power: u128::try_from(val3.bonded_stake) + validator: Validator { + address: pkh3, + power: (u128::try_from(val3.bonded_stake) .expect("Test failed") - as i64, - }), - signed_last_block: true, + as u64) + .try_into() + .unwrap(), + }, + sig_info: + tendermint::abci::types::BlockSignatureInfo::LegacySigned, }, VoteInfo { - validator: Some(Validator { - address: pkh4.into(), - power: u128::try_from(val4.bonded_stake) + validator: Validator { + address: pkh4, + power: (u128::try_from(val4.bonded_stake) .expect("Test failed") - as i64, - }), - signed_last_block: false, + as u64) + .try_into() + .unwrap(), + }, + sig_info: tendermint::abci::types::BlockSignatureInfo::Flag( + tendermint::block::BlockIdFlag::Absent, + ), }, ]; // FINALIZE BLOCK 4. The next block proposer will be val1. Only val1, // val2, and val3 vote on this block. - next_block_for_inflation(&mut shell, pkh1.clone(), votes.clone(), None); + next_block_for_inflation( + &mut shell, + pkh1.to_vec(), + votes.clone(), + None, + ); assert!(rewards_prod_1.is_empty(&shell.wl_storage).unwrap()); assert!(rewards_prod_2.is_empty(&shell.wl_storage).unwrap()); assert!(rewards_prod_3.is_empty(&shell.wl_storage).unwrap()); @@ -2045,7 +2086,7 @@ mod test_finalize_block { ); next_block_for_inflation( &mut shell, - pkh1.clone(), + pkh1.to_vec(), votes.clone(), None, ); @@ -3112,11 +3153,13 @@ mod test_finalize_block { .unwrap() .unwrap(); let hash_string = tm_consensus_key_raw_hash(&ck); - HEXUPPER.decode(hash_string.as_bytes()).unwrap() + let vec = HEXUPPER.decode(hash_string.as_bytes()).unwrap(); + let res: [u8; 20] = TryFrom::try_from(vec).unwrap(); + res }; - let mut all_pkhs: Vec> = Vec::new(); - let mut behaving_pkhs: Vec> = Vec::new(); + let mut all_pkhs: Vec<[u8; 20]> = Vec::new(); + let mut behaving_pkhs: Vec<[u8; 20]> = Vec::new(); for (idx, validator) in validator_set.iter().enumerate() { // Every validator should be in the consensus set assert_eq!( @@ -3132,11 +3175,11 @@ mod test_finalize_block { } } - let pkh1 = all_pkhs[0].clone(); - let pkh2 = all_pkhs[1].clone(); + let pkh1 = all_pkhs[0]; + let pkh2 = all_pkhs[1]; // Finalize block 1 (no votes since this is the first block) - next_block_for_inflation(&mut shell, pkh1.clone(), vec![], None); + next_block_for_inflation(&mut shell, pkh1.to_vec(), vec![], None); let votes = get_default_true_votes( &shell.wl_storage, @@ -3150,29 +3193,29 @@ mod test_finalize_block { // Misbehavior struct are used in Namada let byzantine_validators = vec![ Misbehavior { - r#type: 1, - validator: Some(Validator { - address: pkh1.clone().into(), + kind: MisbehaviorKind::DuplicateVote, + validator: Validator { + address: pkh1, power: Default::default(), - }), - height: 1, - time: Default::default(), + }, + height: 1_u32.into(), + time: tendermint::Time::unix_epoch(), total_voting_power: Default::default(), }, Misbehavior { - r#type: 2, - validator: Some(Validator { - address: pkh2.into(), + kind: MisbehaviorKind::LightClientAttack, + validator: Validator { + address: pkh2, power: Default::default(), - }), - height: 1, - time: Default::default(), + }, + height: 2_u32.into(), + time: tendermint::Time::unix_epoch(), total_voting_power: Default::default(), }, ]; next_block_for_inflation( &mut shell, - pkh1.clone(), + pkh1.to_vec(), votes, Some(byzantine_validators), ); @@ -3243,7 +3286,7 @@ mod test_finalize_block { ); next_block_for_inflation( &mut shell, - pkh1.clone(), + pkh1.to_vec(), votes.clone(), None, ); @@ -3516,7 +3559,7 @@ mod test_finalize_block { let total_initial_stake = num_validators * initial_stake; // Finalize block 1 - next_block_for_inflation(&mut shell, pkh1.clone(), vec![], None); + next_block_for_inflation(&mut shell, pkh1.to_vec(), vec![], None); let votes = get_default_true_votes(&shell.wl_storage, Epoch::default()); assert!(!votes.is_empty()); @@ -3712,13 +3755,13 @@ mod test_finalize_block { .pred_epochs .first_block_heights[misbehavior_epoch.0 as usize]; let misbehaviors = vec![Misbehavior { - r#type: 1, - validator: Some(Validator { - address: pkh1.clone().into(), + kind: MisbehaviorKind::DuplicateVote, + validator: Validator { + address: pkh1, power: Default::default(), - }), - height: height.0 as i64, - time: Default::default(), + }, + height: height.try_into().unwrap(), + time: tendermint::Time::unix_epoch(), total_voting_power: Default::default(), }]; let votes = get_default_true_votes( @@ -3727,7 +3770,7 @@ mod test_finalize_block { ); next_block_for_inflation( &mut shell, - pkh1.clone(), + pkh1.to_vec(), votes.clone(), Some(misbehaviors), ); @@ -3775,23 +3818,23 @@ mod test_finalize_block { .first_block_heights[4]; let misbehaviors = vec![ Misbehavior { - r#type: 1, - validator: Some(Validator { - address: pkh1.clone().into(), + kind: MisbehaviorKind::DuplicateVote, + validator: Validator { + address: pkh1, power: Default::default(), - }), - height: height.0 as i64, - time: Default::default(), + }, + height: height.try_into().unwrap(), + time: tendermint::Time::unix_epoch(), total_voting_power: Default::default(), }, Misbehavior { - r#type: 2, - validator: Some(Validator { - address: pkh1.clone().into(), + kind: MisbehaviorKind::DuplicateVote, + validator: Validator { + address: pkh1, power: Default::default(), - }), - height: height4.0 as i64, - time: Default::default(), + }, + height: height4.try_into().unwrap(), + time: tendermint::Time::unix_epoch(), total_voting_power: Default::default(), }, ]; @@ -3801,7 +3844,7 @@ mod test_finalize_block { ); next_block_for_inflation( &mut shell, - pkh1.clone(), + pkh1.to_vec(), votes, Some(misbehaviors), ); @@ -4327,7 +4370,7 @@ mod test_finalize_block { ); // Finalize block 1 - next_block_for_inflation(&mut shell, pkh1.clone(), vec![], None); + next_block_for_inflation(&mut shell, pkh1.to_vec(), vec![], None); let votes = get_default_true_votes(&shell.wl_storage, Epoch::default()); assert!(!votes.is_empty()); @@ -4472,11 +4515,11 @@ mod test_finalize_block { epoch, ); VoteInfo { - validator: Some(Validator { - address: pkh.into(), - power: u128::try_from(val.bonded_stake).unwrap() as i64, - }), - signed_last_block: true, + validator: Validator { + address: pkh, + power: (u128::try_from(val.bonded_stake).unwrap() as u64).try_into().unwrap(), + }, + sig_info: tendermint::abci::types::BlockSignatureInfo::LegacySigned, } }) .collect::>() @@ -4601,14 +4644,16 @@ mod test_finalize_block { let _ = control_receiver.recv().await.expect("Test failed"); // Finalize block 2 let votes = vec![VoteInfo { - validator: Some(Validator { - address: pkh1.clone().into(), - power: u128::try_from(val1.bonded_stake).expect("Test failed") - as i64, - }), - signed_last_block: true, + validator: Validator { + address: pkh1, + power: (u128::try_from(val1.bonded_stake).expect("Test failed") + as u64) + .try_into() + .unwrap(), + }, + sig_info: tendermint::abci::types::BlockSignatureInfo::LegacySigned, }]; - next_block_for_inflation(&mut shell, pkh1.clone(), votes, None); + next_block_for_inflation(&mut shell, pkh1.to_vec(), votes, None); let Command::UpdateConfig(cmd) = control_receiver.recv().await.expect("Test failed"); assert_eq!(u64::from(cmd.min_confirmations), 42); diff --git a/apps/src/lib/node/ledger/shell/init_chain.rs b/apps/src/lib/node/ledger/shell/init_chain.rs index cda19fd502..e14b74da2d 100644 --- a/apps/src/lib/node/ledger/shell/init_chain.rs +++ b/apps/src/lib/node/ledger/shell/init_chain.rs @@ -27,8 +27,8 @@ use crate::config::genesis::templates::{TokenBalances, TokenConfig}; use crate::config::genesis::transactions::{ BondTx, EstablishedAccountTx, TransferTx, ValidatorAccountTx, }; +use crate::facade::tendermint::v0_37::abci::{request, response}; use crate::facade::tendermint_proto::google::protobuf; -use crate::facade::tower_abci::{request, response}; use crate::wasm_loader; impl Shell @@ -86,7 +86,7 @@ where self.wl_storage.storage.native_token = native_token; } - let ts: protobuf::Timestamp = init.time.expect("Missing genesis time"); + let ts: protobuf::Timestamp = init.time.into(); let initial_height = init .initial_height .try_into() @@ -174,7 +174,13 @@ where // Set the initial validator set response.validators = self - .get_abci_validator_updates(true) + .get_abci_validator_updates(true, |pk, power| { + let pub_key: crate::facade::tendermint::PublicKey = pk.into(); + let power = + crate::facade::tendermint::vote::Power::try_from(power) + .unwrap(); + validator::Update { pub_key, power } + }) .expect("Must be able to set genesis validator set"); debug_assert!(!response.validators.is_empty()); Ok(response) diff --git a/apps/src/lib/node/ledger/shell/mod.rs b/apps/src/lib/node/ledger/shell/mod.rs index 18aaff3ade..4b22542ced 100644 --- a/apps/src/lib/node/ledger/shell/mod.rs +++ b/apps/src/lib/node/ledger/shell/mod.rs @@ -65,6 +65,7 @@ use namada::types::{address, token}; use namada::vm::wasm::{TxCache, VpCache}; use namada::vm::{WasmCacheAccess, WasmCacheRwAccess}; use namada_sdk::eth_bridge::{EthBridgeQueries, EthereumOracleConfig}; +use namada_sdk::tendermint::AppHash; use num_derive::{FromPrimitive, ToPrimitive}; use num_traits::{FromPrimitive, ToPrimitive}; use thiserror::Error; @@ -72,12 +73,11 @@ use tokio::sync::mpsc::{Receiver, UnboundedSender}; use super::ethereum_oracle::{self as oracle, last_processed_block}; use crate::config::{self, genesis, TendermintMode, ValidatorLocalConfig}; +use crate::facade::tendermint::abci::types::{Misbehavior, MisbehaviorKind}; +use crate::facade::tendermint::v0_37::abci::{request, response}; +use crate::facade::tendermint::{self, validator}; use crate::facade::tendermint_proto::google::protobuf::Timestamp; -use crate::facade::tendermint_proto::v0_37::abci::{ - Misbehavior as Evidence, MisbehaviorType as EvidenceType, ValidatorUpdate, -}; use crate::facade::tendermint_proto::v0_37::crypto::public_key; -use crate::facade::tower_abci::{request, response}; use crate::node::ledger::shims::abcipp_shim_types::shim; use crate::node::ledger::shims::abcipp_shim_types::shim::response::TxResult; use crate::node::ledger::{storage, tendermint_node}; @@ -184,6 +184,12 @@ impl From for String { } } +impl From for crate::facade::tendermint::abci::Code { + fn from(value: ErrorCodes) -> Self { + Self::from(u32::from(value)) + } +} + pub type Result = std::result::Result; pub fn reset(config: config::Ledger) -> Result<()> { @@ -370,7 +376,7 @@ where pub wl_storage: WlStorage, /// Byzantine validators given from ABCI++ `prepare_proposal` are stored in /// this field. They will be slashed when we finalize the block. - byzantine_validators: Vec, + byzantine_validators: Vec, /// Path to the base directory with DB data and configs #[allow(dead_code)] base_dir: PathBuf, @@ -586,7 +592,10 @@ where /// Load the Merkle root hash and the height of the last committed block, if /// any. This is returned when ABCI sends an `info` request. pub fn last_state(&mut self) -> response::Info { - let mut response = response::Info::default(); + let mut response = response::Info { + last_block_height: tendermint::block::Height::from(0_u32), + ..Default::default() + }; let result = self.wl_storage.storage.get_state(); match result { @@ -596,7 +605,9 @@ where root, height ); - response.last_block_app_hash = root.0.to_vec().into(); + response.last_block_app_hash = + AppHash::try_from(root.0.to_vec()) + .expect("expected a valid app hash"); response.last_block_height = height.try_into().expect("Invalid block height"); } @@ -707,40 +718,20 @@ where ); continue; } - let slash_type = match EvidenceType::try_from(evidence.r#type) { - Ok(r#type) => match r#type { - EvidenceType::DuplicateVote => { - pos::types::SlashType::DuplicateVote - } - EvidenceType::LightClientAttack => { - pos::types::SlashType::LightClientAttack - } - EvidenceType::Unknown => { - tracing::error!( - "Unknown evidence: {:#?}", - evidence - ); - continue; - } - }, - Err(_) => { - tracing::error!( - "Unexpected evidence type {}", - evidence.r#type - ); - continue; + let slash_type = match evidence.kind { + MisbehaviorKind::DuplicateVote => { + pos::types::SlashType::DuplicateVote } - }; - let validator_raw_hash = match evidence.validator { - Some(validator) => tm_raw_hash_to_string(validator.address), - None => { - tracing::error!( - "Evidence without a validator {:#?}", - evidence - ); + MisbehaviorKind::LightClientAttack => { + pos::types::SlashType::LightClientAttack + } + MisbehaviorKind::Unknown => { + tracing::error!("Unknown evidence: {:#?}", evidence); continue; } }; + let validator_raw_hash = + tm_raw_hash_to_string(evidence.validator.address); let validator = match proof_of_stake::find_validator_by_raw_hash( &self.wl_storage, @@ -818,7 +809,10 @@ where /// Commit a block. Persist the application state and return the Merkle root /// hash. pub fn commit(&mut self) -> response::Commit { - let mut response = response::Commit::default(); + let mut response = response::Commit { + retain_height: tendermint::block::Height::from(0_u32), + ..Default::default() + }; // commit block's data from write log and store the in DB self.wl_storage.commit_block().unwrap_or_else(|e| { tracing::error!( @@ -1322,7 +1316,7 @@ where } } - if response.code == u32::from(ErrorCodes::Ok) { + if response.code == ErrorCodes::Ok.into() { response.log = VALID_MSG.into(); } response @@ -1471,16 +1465,19 @@ where result.map_err(Error::TxApply) } - fn get_abci_validator_updates( + fn get_abci_validator_updates( &self, is_genesis: bool, - ) -> storage_api::Result< - Vec, - > { + // Generic over the validator conversion from our type to tendermint's, + // because we're using domain types in InitChain, but FinalizeBlock is + // shimmed with a different old type. The joy... + mut validator_conv: F, + ) -> storage_api::Result> + where + F: FnMut(common::PublicKey, i64) -> V, + { use namada::ledger::pos::namada_proof_of_stake; - use crate::facade::tendermint_proto::v0_37::crypto::PublicKey as TendermintPublicKey; - let (current_epoch, _gas) = self.wl_storage.storage.get_current_epoch(); let pos_params = namada_proof_of_stake::read_pos_params(&self.wl_storage) @@ -1516,11 +1513,7 @@ where (consensus_key, power) } }; - let pub_key = TendermintPublicKey { - sum: Some(key_to_tendermint(&consensus_key).unwrap()), - }; - let pub_key = Some(pub_key); - ValidatorUpdate { pub_key, power } + validator_conv(consensus_key, power) }, ) } @@ -1543,7 +1536,7 @@ mod test_utils { use namada::proof_of_stake::parameters::PosParams; use namada::proof_of_stake::validator_consensus_key_handle; use namada::proto::{Code, Data}; - use namada::tendermint_proto::v0_37::abci::VoteInfo; + use namada::tendermint::abci::types::VoteInfo; use namada::types::address; use namada::types::chain::ChainId; use namada::types::ethereum_events::Uint; @@ -1558,10 +1551,11 @@ mod test_utils { use super::*; use crate::config::ethereum_bridge::ledger::ORACLE_CHANNEL_BUFFER_SIZE; + use crate::facade::tendermint; + use crate::facade::tendermint::abci::types::Misbehavior; use crate::facade::tendermint_proto::google::protobuf::Timestamp; use crate::facade::tendermint_proto::v0_37::abci::{ - Misbehavior, RequestInitChain, RequestPrepareProposal, - RequestProcessProposal, + RequestPrepareProposal, RequestProcessProposal, }; use crate::node::ledger::shims::abcipp_shim_types; use crate::node::ledger::shims::abcipp_shim_types::shim::request::{ @@ -1750,7 +1744,7 @@ mod test_utils { /// Forward a InitChain request and expect a success pub fn init_chain( &mut self, - req: RequestInitChain, + req: request::InitChain, num_validators: u64, ) { self.shell @@ -1764,26 +1758,26 @@ mod test_utils { &self, req: ProcessProposal, ) -> std::result::Result, TestError> { - let resp = self.shell.process_proposal(RequestProcessProposal { - txs: req - .txs - .clone() - .into_iter() - .map(prost::bytes::Bytes::from) - .collect(), - proposer_address: HEXUPPER - .decode( - crate::wallet::defaults::validator_keypair() - .to_public() - .tm_raw_hash() - .as_bytes(), - ) - .unwrap() - .into(), - ..Default::default() - }); - let results = resp - .tx_results + let (resp, tx_results) = + self.shell.process_proposal(RequestProcessProposal { + txs: req + .txs + .clone() + .into_iter() + .map(prost::bytes::Bytes::from) + .collect(), + proposer_address: HEXUPPER + .decode( + crate::wallet::defaults::validator_keypair() + .to_public() + .tm_raw_hash() + .as_bytes(), + ) + .unwrap() + .into(), + ..Default::default() + }); + let results = tx_results .into_iter() .zip(req.txs.into_iter()) .map(|(res, tx_bytes)| ProcessedTx { @@ -1791,7 +1785,7 @@ mod test_utils { tx: tx_bytes.into(), }) .collect(); - if resp.status != 1 { + if resp != tendermint::abci::response::ProcessProposal::Accept { Err(TestError::RejectProposal(results)) } else { Ok(results) @@ -1919,17 +1913,40 @@ mod test_utils { _ = eth_oracle.take(); } } - test.init_chain( - RequestInitChain { - time: Some(Timestamp { - seconds: 0, - nanos: 0, - }), - chain_id: ChainId::default().to_string(), - ..Default::default() + let req = request::InitChain { + time: Timestamp { + seconds: 0, + nanos: 0, + } + .try_into() + .unwrap(), + chain_id: ChainId::default().to_string(), + consensus_params: tendermint::consensus::params::Params { + block: tendermint::block::Size { + max_bytes: 0, + max_gas: 0, + time_iota_ms: 0, + }, + evidence: tendermint::evidence::Params { + max_age_num_blocks: 0, + max_age_duration: tendermint::evidence::Duration( + core::time::Duration::MAX, + ), + max_bytes: 0, + }, + validator: tendermint::consensus::params::ValidatorParams { + pub_key_types: vec![], + }, + version: None, + abci: tendermint::consensus::params::AbciParams { + vote_extensions_enable_height: None, + }, }, - num_validators, - ); + validators: vec![], + app_state_bytes: vec![].into(), + initial_height: 0_u32.into(), + }; + test.init_chain(req, num_validators); test.wl_storage.commit_block().expect("Test failed"); (test, receiver, eth_sender, control_receiver) } @@ -2176,7 +2193,7 @@ mod test_utils { params: &PosParams, address: Address, epoch: Epoch, - ) -> Vec + ) -> [u8; 20] where S: StorageRead, { @@ -2185,7 +2202,8 @@ mod test_utils { .unwrap() .unwrap(); let hash_string = tm_consensus_key_raw_hash(&ck); - HEXUPPER.decode(hash_string.as_bytes()).unwrap() + let decoded = HEXUPPER.decode(hash_string.as_bytes()).unwrap(); + TryFrom::try_from(decoded).unwrap() } pub(super) fn next_block_for_inflation( @@ -2368,7 +2386,7 @@ mod shell_tests { for (tx_bytes, err_msg) in txs_to_validate { let rsp = shell.mempool_validate(&tx_bytes, Default::default()); assert!( - rsp.code == u32::from(ErrorCodes::InvalidVoteExtension), + rsp.code == ErrorCodes::InvalidVoteExtension.into(), "{err_msg}" ); } @@ -2403,7 +2421,7 @@ mod shell_tests { .sign(&protocol_key, shell.chain_id.clone()) .to_bytes(); let rsp = shell.mempool_validate(&tx, Default::default()); - assert_eq!(rsp.code, 0); + assert_eq!(rsp.code, 0.into()); } /// Test if Ethereum events validation fails, if the underlying @@ -2450,7 +2468,7 @@ mod shell_tests { } .to_bytes(); let rsp = shell.mempool_validate(&tx, Default::default()); - assert_eq!(rsp.code, u32::from(ErrorCodes::InvalidVoteExtension)); + assert_eq!(rsp.code, ErrorCodes::InvalidVoteExtension.into()); } /// Mempool validation must reject unsigned wrappers @@ -2481,12 +2499,12 @@ mod shell_tests { unsigned_wrapper.to_bytes().as_ref(), MempoolTxType::NewTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::InvalidSig)); + assert_eq!(result.code, ErrorCodes::InvalidSig.into()); result = shell.mempool_validate( unsigned_wrapper.to_bytes().as_ref(), MempoolTxType::RecheckTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::InvalidSig)); + assert_eq!(result.code, ErrorCodes::InvalidSig.into()); } /// Mempool validation must reject wrappers with an invalid signature @@ -2528,12 +2546,12 @@ mod shell_tests { invalid_wrapper.to_bytes().as_ref(), MempoolTxType::NewTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::InvalidSig)); + assert_eq!(result.code, ErrorCodes::InvalidSig.into()); result = shell.mempool_validate( invalid_wrapper.to_bytes().as_ref(), MempoolTxType::RecheckTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::InvalidSig)); + assert_eq!(result.code, ErrorCodes::InvalidSig.into()); } /// Mempool validation must reject non-wrapper txs @@ -2548,7 +2566,7 @@ mod shell_tests { tx.to_bytes().as_ref(), MempoolTxType::NewTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::InvalidTx),); + assert_eq!(result.code, ErrorCodes::InvalidTx.into()); assert_eq!( result.log, "Mempool validation failed: Raw transactions cannot be accepted \ @@ -2602,7 +2620,7 @@ mod shell_tests { wrapper.to_bytes().as_ref(), MempoolTxType::NewTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::ReplayTx)); + assert_eq!(result.code, ErrorCodes::ReplayTx.into()); assert_eq!( result.log, format!( @@ -2616,7 +2634,7 @@ mod shell_tests { wrapper.to_bytes().as_ref(), MempoolTxType::RecheckTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::ReplayTx)); + assert_eq!(result.code, ErrorCodes::ReplayTx.into()); assert_eq!( result.log, format!( @@ -2643,7 +2661,7 @@ mod shell_tests { wrapper.to_bytes().as_ref(), MempoolTxType::NewTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::ReplayTx)); + assert_eq!(result.code, ErrorCodes::ReplayTx.into()); assert_eq!( result.log, format!( @@ -2657,7 +2675,7 @@ mod shell_tests { wrapper.to_bytes().as_ref(), MempoolTxType::RecheckTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::ReplayTx)); + assert_eq!(result.code, ErrorCodes::ReplayTx.into()); assert_eq!( result.log, format!( @@ -2685,7 +2703,7 @@ mod shell_tests { tx.to_bytes().as_ref(), MempoolTxType::NewTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::InvalidChainId)); + assert_eq!(result.code, ErrorCodes::InvalidChainId.into()); assert_eq!( result.log, format!( @@ -2713,7 +2731,7 @@ mod shell_tests { tx.to_bytes().as_ref(), MempoolTxType::NewTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::ExpiredTx)); + assert_eq!(result.code, ErrorCodes::ExpiredTx.into()); } /// Check that a tx requiring more gas than the block limit gets rejected @@ -2750,7 +2768,7 @@ mod shell_tests { wrapper.to_bytes().as_ref(), MempoolTxType::NewTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::AllocationError)); + assert_eq!(result.code, ErrorCodes::AllocationError.into()); } // Check that a tx requiring more gas than its limit gets rejected @@ -2783,7 +2801,7 @@ mod shell_tests { wrapper.to_bytes().as_ref(), MempoolTxType::NewTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::TxGasLimit)); + assert_eq!(result.code, ErrorCodes::TxGasLimit.into()); } // Check that a wrapper using a non-whitelisted token for fee payment is @@ -2818,7 +2836,7 @@ mod shell_tests { wrapper.to_bytes().as_ref(), MempoolTxType::NewTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::FeeError)); + assert_eq!(result.code, ErrorCodes::FeeError.into()); } // Check that a wrapper setting a fee amount lower than the minimum required @@ -2853,7 +2871,7 @@ mod shell_tests { wrapper.to_bytes().as_ref(), MempoolTxType::NewTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::FeeError)); + assert_eq!(result.code, ErrorCodes::FeeError.into()); } // Check that a wrapper transactions whose fees cannot be paid is rejected @@ -2887,7 +2905,7 @@ mod shell_tests { wrapper.to_bytes().as_ref(), MempoolTxType::NewTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::FeeError)); + assert_eq!(result.code, ErrorCodes::FeeError.into()); } // Check that a fee overflow in the wrapper transaction is rejected @@ -2921,6 +2939,6 @@ mod shell_tests { wrapper.to_bytes().as_ref(), MempoolTxType::NewTransaction, ); - assert_eq!(result.code, u32::from(ErrorCodes::FeeError)); + assert_eq!(result.code, ErrorCodes::FeeError.into()); } } diff --git a/apps/src/lib/node/ledger/shell/prepare_proposal.rs b/apps/src/lib/node/ledger/shell/prepare_proposal.rs index 57c00ff867..ca9bc70114 100644 --- a/apps/src/lib/node/ledger/shell/prepare_proposal.rs +++ b/apps/src/lib/node/ledger/shell/prepare_proposal.rs @@ -418,7 +418,7 @@ mod test_prepare_proposal { ) .to_bytes(); let rsp = shell.mempool_validate(&tx, Default::default()); - assert!(rsp.code != 0, "{}", rsp.log); + assert!(rsp.code != 0.into(), "{}", rsp.log); } const GAS_LIMIT_MULTIPLIER: u64 = 300_000; @@ -570,9 +570,7 @@ mod test_prepare_proposal { /// behaves as expected, considering <= 2/3 voting power. #[test] fn test_prepare_proposal_vext_insufficient_voting_power() { - use crate::facade::tendermint_proto::v0_37::abci::{ - Validator, VoteInfo, - }; + use namada::tendermint::abci::types::{Validator, VoteInfo}; const FIRST_HEIGHT: BlockHeight = BlockHeight(1); const LAST_HEIGHT: BlockHeight = BlockHeight(FIRST_HEIGHT.0 + 11); @@ -651,26 +649,22 @@ mod test_prepare_proposal { let votes = vec![ VoteInfo { - validator: Some(Validator { - address: pkh1.clone().into(), - power: u128::try_from(val1.bonded_stake) - .expect("Test failed") - as i64, - }), - signed_last_block: true, + validator: Validator { + address: pkh1, + power: (u128::try_from(val1.bonded_stake).expect("Test failed") as u64).try_into().unwrap(), + }, + sig_info: crate::facade::tendermint::abci::types::BlockSignatureInfo::LegacySigned, }, VoteInfo { - validator: Some(Validator { - address: pkh2.into(), - power: u128::try_from(val2.bonded_stake) - .expect("Test failed") - as i64, - }), - signed_last_block: true, + validator: Validator { + address: pkh2, + power: (u128::try_from(val2.bonded_stake).expect("Test failed") as u64).try_into().unwrap(), + }, + sig_info: crate::facade::tendermint::abci::types::BlockSignatureInfo::LegacySigned, }, ]; let req = FinalizeBlock { - proposer_address: pkh1, + proposer_address: pkh1.to_vec(), votes, ..Default::default() }; diff --git a/apps/src/lib/node/ledger/shell/process_proposal.rs b/apps/src/lib/node/ledger/shell/process_proposal.rs index bfb8ac26a5..d446a75cc1 100644 --- a/apps/src/lib/node/ledger/shell/process_proposal.rs +++ b/apps/src/lib/node/ledger/shell/process_proposal.rs @@ -16,7 +16,6 @@ use namada_sdk::eth_bridge::{EthBridgeQueries, SendValsetUpd}; use super::block_alloc::{BlockSpace, EncryptedTxsBins}; use super::*; -use crate::facade::tendermint_proto::abci::response_process_proposal::ProposalStatus; use crate::facade::tendermint_proto::v0_37::abci::RequestProcessProposal; use crate::node::ledger::shell::block_alloc::{AllocFailure, TxBin}; use crate::node::ledger::shims::abcipp_shim_types::shim::response::ProcessProposal; @@ -83,7 +82,7 @@ where pub fn process_proposal( &self, req: RequestProcessProposal, - ) -> ProcessProposal { + ) -> (ProcessProposal, Vec) { tracing::info!( proposer = ?HEXUPPER.encode(&req.proposer_address), height = req.height, @@ -140,17 +139,14 @@ where } let will_reject_proposal = invalid_txs || has_remaining_decrypted_txs; - - let status = if will_reject_proposal { - ProposalStatus::Reject - } else { - ProposalStatus::Accept - }; - - ProcessProposal { - status: status as i32, + ( + if will_reject_proposal { + ProcessProposal::Reject + } else { + ProcessProposal::Accept + }, tx_results, - } + ) } /// Evaluates the corresponding [`TxResult`] for each tx in the diff --git a/apps/src/lib/node/ledger/shell/queries.rs b/apps/src/lib/node/ledger/shell/queries.rs index e7e3c7e703..84c494faca 100644 --- a/apps/src/lib/node/ledger/shell/queries.rs +++ b/apps/src/lib/node/ledger/shell/queries.rs @@ -26,36 +26,21 @@ where storage_read_past_height_limit: self.storage_read_past_height_limit, }; - // Convert request to domain-type - let request = match namada::ledger::queries::RequestQuery::try_from_tm( - &self.wl_storage, - query, - ) { - Ok(request) => request, - Err(err) => { - return response::Query { - code: 1, - info: format!("Unexpected query: {}", err), - ..Default::default() - }; - } - }; - // Invoke the root RPC handler - returns borsh-encoded data on success - let result = if request.path == "/shell/dry_run_tx" { - dry_run_tx(ctx, &request) + let result = if query.path == "/shell/dry_run_tx" { + dry_run_tx(ctx, &query) } else { - namada::ledger::queries::handle_path(ctx, &request) + namada::ledger::queries::handle_path(ctx, &query) }; match result { Ok(ResponseQuery { data, info, proof }) => response::Query { value: data.into(), info, - proof_ops: proof.map(Into::into), + proof: proof.map(Into::into), ..Default::default() }, Err(err) => response::Query { - code: 1, + code: 1.into(), info: format!("RPC error: {}", err), ..Default::default() }, @@ -85,11 +70,11 @@ mod test_queries { use namada::ledger::pos::PosQueries; use namada::proof_of_stake::read_consensus_validator_set_addresses_with_stake; use namada::proof_of_stake::types::WeightedValidator; + use namada::tendermint::abci::types::VoteInfo; use namada::types::storage::Epoch; use namada_sdk::eth_bridge::{EthBridgeQueries, SendValsetUpd}; use super::*; - use crate::facade::tendermint_proto::v0_37::abci::VoteInfo; use crate::node::ledger::shell::test_utils; use crate::node::ledger::shell::test_utils::get_pkh_from_address; use crate::node::ledger::shims::abcipp_shim_types::shim::request::FinalizeBlock; @@ -164,18 +149,14 @@ mod test_queries { Epoch::default(), ); let votes = vec![VoteInfo { - validator: Some( - namada::tendermint_proto::v0_37::abci::Validator { - address: pkh1.clone().into(), - power: u128::try_from(val1.bonded_stake) - .expect("Test failed") - as i64, - }, - ), - signed_last_block: true, + validator: namada::tendermint::abci::types::Validator { + address: pkh1.clone().into(), + power: (u128::try_from(val1.bonded_stake).expect("Test failed") as u64).try_into().unwrap(), + }, + sig_info: namada::tendermint::abci::types::BlockSignatureInfo::LegacySigned, }]; let req = FinalizeBlock { - proposer_address: pkh1, + proposer_address: pkh1.to_vec(), votes, ..Default::default() }; diff --git a/apps/src/lib/node/ledger/shell/testing/node.rs b/apps/src/lib/node/ledger/shell/testing/node.rs index 0ff85ca66a..4f8fa13342 100644 --- a/apps/src/lib/node/ledger/shell/testing/node.rs +++ b/apps/src/lib/node/ledger/shell/testing/node.rs @@ -26,7 +26,7 @@ use namada::proof_of_stake::{ validator_consensus_key_handle, }; use namada::tendermint::abci::response::Info; -use namada::tendermint_proto::v0_37::abci::VoteInfo; +use namada::tendermint::abci::types::VoteInfo; use namada::tendermint_rpc::SimpleRequest; use namada::types::control_flow::time::Duration; use namada::types::ethereum_events::EthereumEvent; @@ -39,7 +39,6 @@ use num_traits::cast::FromPrimitive; use regex::Regex; use tokio::sync::mpsc; -use crate::facade::tendermint_proto::v0_37::abci::response_process_proposal::ProposalStatus; use crate::facade::tendermint_proto::v0_37::abci::{ RequestPrepareProposal, RequestProcessProposal, }; @@ -379,11 +378,14 @@ impl MockNode { let hash_string = tm_consensus_key_raw_hash(&ck); let pkh1 = HEXUPPER.decode(hash_string.as_bytes()).unwrap(); let votes = vec![VoteInfo { - validator: Some(namada::tendermint_proto::v0_37::abci::Validator { - address: pkh1.clone().into(), - power: u128::try_from(val1.bonded_stake).unwrap() as i64, - }), - signed_last_block: true, + validator: tendermint::abci::types::Validator { + address: pkh1.clone().try_into().unwrap(), + power: (u128::try_from(val1.bonded_stake).expect("Test failed") + as u64) + .try_into() + .unwrap(), + }, + sig_info: tendermint::abci::types::BlockSignatureInfo::LegacySigned, }]; (pkh1, votes) @@ -463,10 +465,9 @@ impl MockNode { ..Default::default() }; let mut locked = self.shell.lock().unwrap(); - let result = locked.process_proposal(req); + let (result, tx_results) = locked.process_proposal(req); - let mut errors: Vec<_> = result - .tx_results + let mut errors: Vec<_> = tx_results .iter() .map(|e| { if e.code == 0 { @@ -476,7 +477,7 @@ impl MockNode { } }) .collect(); - if result.status != i32::from(ProposalStatus::Accept) { + if result != tendermint::abci::response::ProcessProposal::Accept { self.results.lock().unwrap().append(&mut errors); return; } @@ -492,7 +493,7 @@ impl MockNode { byzantine_validators: vec![], txs: txs .into_iter() - .zip(result.tx_results.into_iter()) + .zip(tx_results.into_iter()) .map(|(tx, result)| ProcessedTx { tx: tx.into(), result, @@ -582,9 +583,9 @@ impl<'a> Client for &'a MockNode { // Handle a path by invoking the `RPC.handle` directly with the // borrowed storage let request = RequestQuery { - data, + data: data.into(), path, - height, + height: height.try_into().unwrap(), prove, }; let borrowed = self.shell.lock().unwrap(); diff --git a/apps/src/lib/node/ledger/shell/vote_extensions/bridge_pool_vext.rs b/apps/src/lib/node/ledger/shell/vote_extensions/bridge_pool_vext.rs index e1aa564d01..2486d2d442 100644 --- a/apps/src/lib/node/ledger/shell/vote_extensions/bridge_pool_vext.rs +++ b/apps/src/lib/node/ledger/shell/vote_extensions/bridge_pool_vext.rs @@ -212,7 +212,7 @@ mod test_bp_vote_extensions { Epoch, }; use namada::proto::{SignableEthMessage, Signed}; - use namada::tendermint_proto::v0_37::abci::VoteInfo; + use namada::tendermint::abci::types::VoteInfo; use namada::types::ethereum_events::Uint; use namada::types::keccak::{keccak_hash, KeccakHash}; use namada::types::key::*; @@ -283,15 +283,14 @@ mod test_bp_vote_extensions { Epoch::default(), ); let votes = vec![VoteInfo { - validator: Some(namada::tendermint_proto::v0_37::abci::Validator { - address: pkh1.clone().into(), - power: u128::try_from(val1.bonded_stake).expect("Test failed") - as i64, - }), - signed_last_block: true, + validator: crate::facade::tendermint::abci::types::Validator { + address: pkh1, + power: (u128::try_from(val1.bonded_stake).expect("Test failed") as u64).try_into().unwrap(), + }, + sig_info: crate::facade::tendermint::abci::types::BlockSignatureInfo::LegacySigned, }]; let req = FinalizeBlock { - proposer_address: pkh1, + proposer_address: pkh1.to_vec(), votes, ..Default::default() }; diff --git a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs index a22881384b..f3856312aa 100644 --- a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs +++ b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs @@ -365,7 +365,7 @@ mod test_vote_extensions { consensus_validator_set_handle, read_consensus_validator_set_addresses_with_stake, }; - use namada::tendermint_proto::v0_37::abci::VoteInfo; + use namada::tendermint::abci::types::VoteInfo; use namada::types::address::testing::gen_established_address; use namada::types::ethereum_events::{ EthAddress, EthereumEvent, TransferToEthereum, Uint, @@ -626,15 +626,14 @@ mod test_vote_extensions { Epoch::default(), ); let votes = vec![VoteInfo { - validator: Some(namada::tendermint_proto::v0_37::abci::Validator { - address: pkh1.clone().into(), - power: u128::try_from(val1.bonded_stake).expect("Test failed") - as i64, - }), - signed_last_block: true, + validator: crate::facade::tendermint::abci::types::Validator { + address: pkh1, + power: (u128::try_from(val1.bonded_stake).expect("Test failed") as u64).try_into().unwrap(), + }, + sig_info: crate::facade::tendermint::abci::types::BlockSignatureInfo::LegacySigned, }]; let req = FinalizeBlock { - proposer_address: pkh1, + proposer_address: pkh1.to_vec(), votes, ..Default::default() }; diff --git a/apps/src/lib/node/ledger/shell/vote_extensions/val_set_update.rs b/apps/src/lib/node/ledger/shell/vote_extensions/val_set_update.rs index dea8cca877..b4b5595a0e 100644 --- a/apps/src/lib/node/ledger/shell/vote_extensions/val_set_update.rs +++ b/apps/src/lib/node/ledger/shell/vote_extensions/val_set_update.rs @@ -263,7 +263,7 @@ mod test_vote_extensions { consensus_validator_set_handle, read_consensus_validator_set_addresses_with_stake, Epoch, }; - use namada::tendermint_proto::v0_37::abci::VoteInfo; + use namada::tendermint::abci::types::VoteInfo; use namada::types::key::RefTo; use namada::types::vote_extensions::validator_set_update; use namada_sdk::eth_bridge::EthBridgeQueries; @@ -435,15 +435,14 @@ mod test_vote_extensions { Epoch::default(), ); let votes = vec![VoteInfo { - validator: Some(namada::tendermint_proto::v0_37::abci::Validator { - address: pkh1.clone().into(), - power: u128::try_from(val1.bonded_stake).expect("Test failed") - as i64, - }), - signed_last_block: true, + validator: crate::facade::tendermint::abci::types::Validator { + address: pkh1, + power: (u128::try_from(val1.bonded_stake).expect("Test failed") as u64).try_into().unwrap(), + }, + sig_info: crate::facade::tendermint::abci::types::BlockSignatureInfo::LegacySigned, }]; let req = FinalizeBlock { - proposer_address: pkh1, + proposer_address: pkh1.to_vec(), votes, ..Default::default() }; diff --git a/apps/src/lib/node/ledger/shims/abcipp_shim.rs b/apps/src/lib/node/ledger/shims/abcipp_shim.rs index a7ce85fbae..563d88ac59 100644 --- a/apps/src/lib/node/ledger/shims/abcipp_shim.rs +++ b/apps/src/lib/node/ledger/shims/abcipp_shim.rs @@ -19,11 +19,12 @@ use super::abcipp_shim_types::shim::request::{FinalizeBlock, ProcessedTx}; use super::abcipp_shim_types::shim::{Error, Request, Response, TxBytes}; use crate::config; use crate::config::{Action, ActionAtHeight}; -use crate::facade::tendermint_proto::v0_37::abci::{ - RequestBeginBlock, ResponseDeliverTx, +use crate::facade::tendermint::v0_37::abci::response::DeliverTx; +use crate::facade::tendermint::v0_37::abci::{ + request, Request as Req, Response as Resp, }; -use crate::facade::tower_abci::response::DeliverTx; -use crate::facade::tower_abci::{BoxError, Request as Req, Response as Resp}; +use crate::facade::tendermint_proto::v0_37::abci::ResponseDeliverTx; +use crate::facade::tower_abci::BoxError; use crate::node::ledger::shell::{EthereumOracleChannels, Shell}; /// The shim wraps the shell, which implements ABCI++. @@ -32,7 +33,7 @@ use crate::node::ledger::shell::{EthereumOracleChannels, Shell}; #[derive(Debug)] pub struct AbcippShim { service: Shell, - begin_block_request: Option, + begin_block_request: Option, delivered_txs: Vec, shell_recv: std::sync::mpsc::Receiver<( Req, @@ -100,12 +101,7 @@ impl AbcippShim { .service .call(Request::ProcessProposal(proposal)) .map_err(Error::from) - .and_then(|res| match res { - Response::ProcessProposal(resp) => { - Ok(Resp::ProcessProposal((&resp).into())) - } - _ => unreachable!(), - }), + .and_then(|resp| resp.try_into()), Req::BeginBlock(block) => { // we save this data to be forwarded to finalize later self.begin_block_request = Some(block); @@ -114,9 +110,13 @@ impl AbcippShim { Req::DeliverTx(tx) => { let mut deliver: DeliverTx = Default::default(); // Attach events to this transaction if possible - if let Ok(tx) = Tx::try_from(&tx.tx[..]) { - let resp: ResponseDeliverTx = tx.into(); - deliver.events = resp.events; + if Tx::try_from(&tx.tx[..]).is_ok() { + let resp = ResponseDeliverTx::default(); + deliver.events = resp + .events + .into_iter() + .map(|v| TryFrom::try_from(v).unwrap()) + .collect(); } self.delivered_txs.push(tx.tx); Ok(Resp::DeliverTx(deliver)) @@ -124,19 +124,14 @@ impl AbcippShim { Req::EndBlock(_) => { let begin_block_request = self.begin_block_request.take().unwrap(); - let block_time = self.service.get_block_timestamp( - begin_block_request - .header - .as_ref() - .and_then(|header| header.time.to_owned()), - ); + let block_time = begin_block_request + .header + .time + .try_into() + .expect("valid RFC3339 block time"); let tm_raw_hash_string = tm_raw_hash_to_string( - &begin_block_request - .header - .as_ref() - .expect("Missing block header") - .proposer_address, + begin_block_request.header.proposer_address, ); let block_proposer = find_validator_by_raw_hash( &self.service.wl_storage, @@ -172,7 +167,7 @@ impl AbcippShim { .map_err(Error::from) .and_then(|res| match res { Response::FinalizeBlock(resp) => { - Ok(Resp::EndBlock(resp.into())) + Ok(Resp::EndBlock(crate::facade::tendermint_proto::v0_37::abci::ResponseEndBlock::from(resp).try_into().unwrap())) } _ => Err(Error::ConvertResp(res)), }) @@ -319,14 +314,18 @@ impl AbciService { /// to possibly take an action. fn get_action(&self, req: &Req) -> Option { match req { - Req::PrepareProposal(req) => Some(CheckAction::Check(req.height)), - Req::ProcessProposal(req) => Some(CheckAction::Check(req.height)), + Req::PrepareProposal(req) => { + Some(CheckAction::Check(req.height.into())) + } + Req::ProcessProposal(req) => { + Some(CheckAction::Check(req.height.into())) + } Req::EndBlock(req) => Some(CheckAction::Check(req.height)), Req::BeginBlock(_) | Req::DeliverTx(_) | Req::InitChain(_) | Req::CheckTx(_) - | Req::Commit(_) => { + | Req::Commit => { if self.suspended { Some(CheckAction::AlreadySuspended) } else { diff --git a/apps/src/lib/node/ledger/shims/abcipp_shim_types.rs b/apps/src/lib/node/ledger/shims/abcipp_shim_types.rs index f128070898..5b0a553f55 100644 --- a/apps/src/lib/node/ledger/shims/abcipp_shim_types.rs +++ b/apps/src/lib/node/ledger/shims/abcipp_shim_types.rs @@ -1,4 +1,4 @@ -use crate::facade::tower_abci::{Request, Response}; +use crate::facade::tendermint::v0_37::abci::{Request, Response}; pub mod shim { use std::convert::TryFrom; @@ -6,15 +6,9 @@ pub mod shim { use thiserror::Error; use super::{Request as Req, Response as Resp}; - use crate::facade::tendermint_proto::v0_37::abci::{ - RequestApplySnapshotChunk, RequestCheckTx, RequestCommit, RequestEcho, - RequestFlush, RequestInfo, RequestInitChain, RequestListSnapshots, - RequestLoadSnapshotChunk, RequestOfferSnapshot, RequestPrepareProposal, - RequestProcessProposal, RequestQuery, ResponseApplySnapshotChunk, - ResponseCheckTx, ResponseCommit, ResponseEcho, ResponseEndBlock, - ResponseFlush, ResponseInfo, ResponseInitChain, ResponseListSnapshots, - ResponseLoadSnapshotChunk, ResponseOfferSnapshot, ResponseQuery, - VoteInfo, + use crate::facade::tendermint::abci::types::VoteInfo; + use crate::facade::tendermint::v0_37::abci::{ + request as tm_request, response as tm_response, }; use crate::node::ledger::shell; @@ -46,24 +40,24 @@ pub mod shim { /// Each request contains a custom payload type as well, which may /// be simply a unit struct pub enum Request { - InitChain(RequestInitChain), - Info(RequestInfo), - Query(RequestQuery), - PrepareProposal(RequestPrepareProposal), + InitChain(tm_request::InitChain), + Info(tm_request::Info), + Query(tm_request::Query), + PrepareProposal(tm_request::PrepareProposal), #[allow(dead_code)] VerifyHeader(request::VerifyHeader), - ProcessProposal(RequestProcessProposal), + ProcessProposal(tm_request::ProcessProposal), #[allow(dead_code)] RevertProposal(request::RevertProposal), FinalizeBlock(request::FinalizeBlock), - Commit(RequestCommit), - Flush(RequestFlush), - Echo(RequestEcho), - CheckTx(RequestCheckTx), - ListSnapshots(RequestListSnapshots), - OfferSnapshot(RequestOfferSnapshot), - LoadSnapshotChunk(RequestLoadSnapshotChunk), - ApplySnapshotChunk(RequestApplySnapshotChunk), + Commit, + Flush, + Echo(tm_request::Echo), + CheckTx(tm_request::CheckTx), + ListSnapshots, + OfferSnapshot(tm_request::OfferSnapshot), + LoadSnapshotChunk(tm_request::LoadSnapshotChunk), + ApplySnapshotChunk(tm_request::ApplySnapshotChunk), } /// Attempt to convert a tower-abci request to an internal one @@ -75,11 +69,11 @@ pub mod shim { Req::InitChain(inner) => Ok(Request::InitChain(inner)), Req::Info(inner) => Ok(Request::Info(inner)), Req::Query(inner) => Ok(Request::Query(inner)), - Req::Commit(inner) => Ok(Request::Commit(inner)), - Req::Flush(inner) => Ok(Request::Flush(inner)), + Req::Commit => Ok(Request::Commit), + Req::Flush => Ok(Request::Flush), Req::Echo(inner) => Ok(Request::Echo(inner)), Req::CheckTx(inner) => Ok(Request::CheckTx(inner)), - Req::ListSnapshots(inner) => Ok(Request::ListSnapshots(inner)), + Req::ListSnapshots => Ok(Request::ListSnapshots), Req::OfferSnapshot(inner) => Ok(Request::OfferSnapshot(inner)), Req::LoadSnapshotChunk(inner) => { Ok(Request::LoadSnapshotChunk(inner)) @@ -100,23 +94,23 @@ pub mod shim { /// the shim to convert these to responses understandable to tower-abci #[derive(Debug)] pub enum Response { - InitChain(ResponseInitChain), - Info(ResponseInfo), - Query(ResponseQuery), + InitChain(tm_response::InitChain), + Info(tm_response::Info), + Query(tm_response::Query), PrepareProposal(response::PrepareProposal), VerifyHeader(response::VerifyHeader), ProcessProposal(response::ProcessProposal), RevertProposal(response::RevertProposal), FinalizeBlock(response::FinalizeBlock), - EndBlock(ResponseEndBlock), - Commit(ResponseCommit), - Flush(ResponseFlush), - Echo(ResponseEcho), - CheckTx(ResponseCheckTx), - ListSnapshots(ResponseListSnapshots), - OfferSnapshot(ResponseOfferSnapshot), - LoadSnapshotChunk(ResponseLoadSnapshotChunk), - ApplySnapshotChunk(ResponseApplySnapshotChunk), + EndBlock(tm_response::EndBlock), + Commit(tm_response::Commit), + Flush, + Echo(tm_response::Echo), + CheckTx(tm_response::CheckTx), + ListSnapshots(tm_response::ListSnapshots), + OfferSnapshot(tm_response::OfferSnapshot), + LoadSnapshotChunk(tm_response::LoadSnapshotChunk), + ApplySnapshotChunk(tm_response::ApplySnapshotChunk), } /// Attempt to convert response from shell to a tower-abci response type @@ -129,7 +123,7 @@ pub mod shim { Response::Info(inner) => Ok(Resp::Info(inner)), Response::Query(inner) => Ok(Resp::Query(inner)), Response::Commit(inner) => Ok(Resp::Commit(inner)), - Response::Flush(inner) => Ok(Resp::Flush(inner)), + Response::Flush => Ok(Resp::Flush), Response::Echo(inner) => Ok(Resp::Echo(inner)), Response::CheckTx(inner) => Ok(Resp::CheckTx(inner)), Response::ListSnapshots(inner) => { @@ -145,7 +139,10 @@ pub mod shim { Ok(Resp::ApplySnapshotChunk(inner)) } Response::PrepareProposal(inner) => { - Ok(Resp::PrepareProposal(inner.into())) + Ok(Resp::PrepareProposal(inner)) + } + Response::ProcessProposal(inner) => { + Ok(Resp::ProcessProposal(inner)) } _ => Err(Error::ConvertResp(resp)), } @@ -156,13 +153,13 @@ pub mod shim { pub mod request { use std::convert::TryFrom; - use namada::tendermint_proto::v0_37::abci::RequestBeginBlock; use namada::types::hash::Hash; use namada::types::storage::{BlockHash, Header}; use namada::types::time::DateTimeUtc; use super::VoteInfo; - use crate::facade::tendermint_proto::v0_37::abci::Misbehavior as Evidence; + use crate::facade::tendermint::abci::types::Misbehavior; + use crate::facade::tendermint::v0_37::abci::request as tm_request; pub struct VerifyHeader; @@ -179,31 +176,30 @@ pub mod shim { pub struct FinalizeBlock { pub hash: BlockHash, pub header: Header, - pub byzantine_validators: Vec, + pub byzantine_validators: Vec, pub txs: Vec, pub proposer_address: Vec, pub votes: Vec, } - impl From for FinalizeBlock { - fn from(req: RequestBeginBlock) -> FinalizeBlock { - let header = req.header.unwrap(); + impl From for FinalizeBlock { + fn from(req: tm_request::BeginBlock) -> FinalizeBlock { + let header = req.header; FinalizeBlock { hash: BlockHash::default(), header: Header { - hash: Hash::try_from(header.app_hash.as_slice()) + hash: Hash::try_from(header.app_hash.as_bytes()) .unwrap_or_default(), - time: DateTimeUtc::try_from(header.time.unwrap()) - .unwrap(), + time: DateTimeUtc::try_from(header.time).unwrap(), next_validators_hash: Hash::try_from( - header.next_validators_hash.as_slice(), + header.next_validators_hash.as_bytes(), ) .unwrap(), }, byzantine_validators: req.byzantine_validators, txs: vec![], - proposer_address: header.proposer_address, - votes: req.last_commit_info.unwrap().votes, + proposer_address: header.proposer_address.into(), + votes: req.last_commit_info.votes, } } } @@ -213,22 +209,14 @@ pub mod shim { pub mod response { use namada::ledger::events::Event; + pub use crate::facade::tendermint::v0_37::abci::response::{ + PrepareProposal, ProcessProposal, + }; use crate::facade::tendermint_proto::v0_37::abci::{ - Event as TmEvent, ResponsePrepareProposal, ResponseProcessProposal, - ValidatorUpdate, + Event as TmEvent, ValidatorUpdate, }; use crate::facade::tendermint_proto::v0_37::types::ConsensusParams; - #[derive(Debug, Default)] - pub struct PrepareProposal { - pub txs: Vec, - } - - impl From for ResponsePrepareProposal { - fn from(resp: PrepareProposal) -> Self { - Self { txs: resp.txs } - } - } #[derive(Debug, Default)] pub struct VerifyHeader; @@ -238,20 +226,6 @@ pub mod shim { pub info: String, } - #[derive(Debug, Default)] - pub struct ProcessProposal { - pub status: i32, - pub tx_results: Vec, - } - - impl From<&ProcessProposal> for ResponseProcessProposal { - fn from(resp: &ProcessProposal) -> Self { - Self { - status: resp.status, - } - } - } - #[derive(Debug, Default)] pub struct RevertProposal; diff --git a/apps/src/lib/node/ledger/storage/mod.rs b/apps/src/lib/node/ledger/storage/mod.rs index af6c63a056..5e57fe8a2d 100644 --- a/apps/src/lib/node/ledger/storage/mod.rs +++ b/apps/src/lib/node/ledger/storage/mod.rs @@ -386,7 +386,8 @@ mod tests { "At height {height} will {}", if write_value { "write" } else { "delete" } ); - (BlockHeight::from(height as u64), write_value) + // start from height 1 - 0 is sentinel + (BlockHeight::from(height as u64 + 1), write_value) }); let key = Key::parse("key").expect("cannot parse the key string"); diff --git a/core/src/ledger/storage/mod.rs b/core/src/ledger/storage/mod.rs index 99a1e40d5e..d12352ee71 100644 --- a/core/src/ledger/storage/mod.rs +++ b/core/src/ledger/storage/mod.rs @@ -628,14 +628,15 @@ where } } - /// Returns a value from the specified subspace at the given height and the - /// gas cost + /// Returns a value from the specified subspace at the given height or the + /// last committed height when 0 and the gas cost. pub fn read_with_height( &self, key: &Key, height: BlockHeight, ) -> Result<(Option>, u64)> { - if height >= self.get_last_block_height() { + // `0` means last committed height + if height == BlockHeight(0) || height >= self.get_last_block_height() { self.read(key) } else { match self.db.read_subspace_val_with_height( diff --git a/core/src/proto/types.rs b/core/src/proto/types.rs index a317e93cdc..5f6ded8e7c 100644 --- a/core/src/proto/types.rs +++ b/core/src/proto/types.rs @@ -22,7 +22,6 @@ use thiserror::Error; use super::generated::types; use crate::ledger::gas::{self, GasMetering, VpGasMeter, VERIFY_TX_SIG_GAS}; use crate::ledger::storage::{KeccakHasher, Sha256Hasher, StorageHasher}; -use crate::tendermint_proto::v0_37::abci::ResponseDeliverTx; use crate::types::account::AccountPublicKeysMap; use crate::types::address::Address; use crate::types::chain::ChainId; @@ -1605,9 +1604,3 @@ impl Tx { self } } - -impl From for ResponseDeliverTx { - fn from(_tx: Tx) -> ResponseDeliverTx { - Default::default() - } -} diff --git a/core/src/types/key/common.rs b/core/src/types/key/common.rs index 583293930a..8fd921449d 100644 --- a/core/src/types/key/common.rs +++ b/core/src/types/key/common.rs @@ -138,6 +138,20 @@ impl string_encoding::Format for PublicKey { impl_display_and_from_str_via_format!(PublicKey); +impl From for crate::tendermint::PublicKey { + fn from(value: PublicKey) -> Self { + use crate::tendermint::PublicKey as TmPK; + match value { + PublicKey::Ed25519(ed25519::PublicKey(pk)) => { + TmPK::from_raw_ed25519(pk.as_bytes()).unwrap() + } + PublicKey::Secp256k1(secp256k1::PublicKey(pk)) => { + TmPK::from_raw_secp256k1(&pk.to_sec1_bytes()).unwrap() + } + } + } +} + #[allow(missing_docs)] #[derive(Error, Debug)] pub enum EthAddressConvError { diff --git a/core/src/types/storage.rs b/core/src/types/storage.rs index 6889173373..a1dbdbdeaa 100644 --- a/core/src/types/storage.rs +++ b/core/src/types/storage.rs @@ -263,6 +263,20 @@ impl From for BlockHeight { } } +impl From for BlockHeight { + fn from(height: tendermint::block::Height) -> Self { + Self(u64::from(height)) + } +} + +impl TryFrom for tendermint::block::Height { + type Error = tendermint::Error; + + fn try_from(height: BlockHeight) -> std::result::Result { + Self::try_from(height.0) + } +} + impl TryFrom for BlockHeight { type Error = String; diff --git a/sdk/src/queries/mod.rs b/sdk/src/queries/mod.rs index af22898661..eaf6bc2dbf 100644 --- a/sdk/src/queries/mod.rs +++ b/sdk/src/queries/mod.rs @@ -59,8 +59,9 @@ where D: 'static + DB + for<'iter> DBIter<'iter> + Sync, H: 'static + StorageHasher + Sync, { - if request.height != BlockHeight(0) - && request.height != ctx.wl_storage.storage.get_last_block_height() + if request.height.value() != 0 + && request.height.value() + != ctx.wl_storage.storage.get_last_block_height().0 { return Err(storage_api::Error::new_const( "This query doesn't support arbitrary block heights, only the \ @@ -169,10 +170,14 @@ mod testing { ) -> Result { let data = data.unwrap_or_default(); let height = height.unwrap_or_default(); + let height: crate::tendermint::block::Height = + height.try_into().map_err(|err| { + std::io::Error::new(std::io::ErrorKind::InvalidInput, err) + })?; // Handle a path by invoking the `RPC.handle` directly with the // borrowed storage let request = RequestQuery { - data, + data: data.into(), path, height, prove, diff --git a/sdk/src/queries/router.rs b/sdk/src/queries/router.rs index c408fbd8c7..b632097738 100644 --- a/sdk/src/queries/router.rs +++ b/sdk/src/queries/router.rs @@ -1002,6 +1002,7 @@ mod test_rpc { #[cfg(test)] mod test { use namada_core::ledger::storage_api; + use namada_core::tendermint::block; use namada_core::types::storage::Epoch; use namada_core::types::token; use namada_core::types::token::NATIVE_MAX_DECIMAL_PLACES; @@ -1018,7 +1019,9 @@ mod test { // Test request with an invalid path let request = RequestQuery { path: "/invalid".to_owned(), - ..RequestQuery::default() + data: Default::default(), + height: block::Height::from(0_u32), + prove: Default::default(), }; let ctx = RequestCtx { event_log: &client.event_log, diff --git a/sdk/src/queries/shell.rs b/sdk/src/queries/shell.rs index 31d7a7c8e4..3556d6a2bf 100644 --- a/sdk/src/queries/shell.rs +++ b/sdk/src/queries/shell.rs @@ -234,7 +234,7 @@ where H: 'static + StorageHasher + Sync, { if let Some(past_height_limit) = ctx.storage_read_past_height_limit { - if request.height.0 + past_height_limit + if request.height.value() + past_height_limit < ctx.wl_storage.storage.get_last_block_height().0 { return Err(storage_api::Error::new(std::io::Error::new( @@ -251,7 +251,7 @@ where match ctx .wl_storage .storage - .read_with_height(&storage_key, request.height) + .read_with_height(&storage_key, request.height.into()) .into_storage_result()? { (Some(value), _gas) => { @@ -259,7 +259,11 @@ where let proof = ctx .wl_storage .storage - .get_existence_proof(&storage_key, &value, request.height) + .get_existence_proof( + &storage_key, + &value, + request.height.into(), + ) .into_storage_result()?; Some(proof) } else { @@ -276,7 +280,10 @@ where let proof = ctx .wl_storage .storage - .get_non_existence_proof(&storage_key, request.height) + .get_non_existence_proof( + &storage_key, + request.height.into(), + ) .into_storage_result()?; Some(proof) } else { @@ -316,7 +323,7 @@ where let mut proof = ctx .wl_storage .storage - .get_existence_proof(key, value, request.height) + .get_existence_proof(key, value, request.height.into()) .into_storage_result()?; ops.append(&mut proof.ops); } diff --git a/sdk/src/queries/shell/eth_bridge.rs b/sdk/src/queries/shell/eth_bridge.rs index 134964da8a..b7a760126d 100644 --- a/sdk/src/queries/shell/eth_bridge.rs +++ b/sdk/src/queries/shell/eth_bridge.rs @@ -333,7 +333,7 @@ where transfers: transfer_hashes, relayer, with_appendix, - }) = BorshDeserialize::try_from_slice(request.data.as_slice()) + }) = BorshDeserialize::try_from_slice(&request.data) { // get the latest signed merkle root of the Ethereum bridge pool let (signed_root, height) = ctx diff --git a/sdk/src/queries/types.rs b/sdk/src/queries/types.rs index e442c8d2e6..a9e2fb3566 100644 --- a/sdk/src/queries/types.rs +++ b/sdk/src/queries/types.rs @@ -7,6 +7,7 @@ use thiserror::Error; use crate::events::log::EventLog; use crate::tendermint::merkle::proof::ProofOps; +pub use crate::tendermint::v0_37::abci::request::Query as RequestQuery; /// A request context provides read-only access to storage and WASM compilation /// caches to request handlers. #[derive(Debug, Clone)] @@ -76,35 +77,6 @@ pub enum Error { InvalidHeight(BlockHeight), } -/// Temporary domain-type for `tendermint_proto::abci::RequestQuery`, copied -/// from -/// until we are on a branch that has it included. -#[derive(Clone, PartialEq, Eq, Debug, Default)] -pub struct RequestQuery { - /// Raw query bytes. - /// - /// Can be used with or in lieu of `path`. - pub data: Vec, - /// Path of the request, like an HTTP `GET` path. - /// - /// Can be used with or in lieu of `data`. - /// - /// Applications MUST interpret `/store` as a query by key on the - /// underlying store. The key SHOULD be specified in the Data field. - /// Applications SHOULD allow queries over specific types like - /// `/accounts/...` or `/votes/...`. - pub path: String, - /// The block height for which the query should be executed. - /// - /// The default `0` returns data for the latest committed block. Note that - /// this is the height of the block containing the application's Merkle - /// root hash, which represents the state as it was after committing - /// the block at `height - 1`. - pub height: BlockHeight, - /// Whether to return a Merkle proof with the response, if possible. - pub prove: bool, -} - /// Generic response from a query #[derive(Clone, Debug, Default)] pub struct ResponseQuery { @@ -118,40 +90,3 @@ pub struct ResponseQuery { /// [`ResponseQuery`] with borsh-encoded `data` field pub type EncodedResponseQuery = ResponseQuery>; - -impl RequestQuery { - /// Try to convert tendermint RequestQuery into our [`RequestQuery`] - /// domain type. This tries to convert the block height into our - /// [`BlockHeight`] type, where `0` is treated as a special value to signal - /// to use the latest committed block height as per tendermint ABCI Query - /// spec. A negative block height will cause an error. - pub fn try_from_tm( - storage: &WlStorage, - crate::tendermint_proto::v0_37::abci::RequestQuery { - data, - path, - height, - prove, - }: crate::tendermint_proto::v0_37::abci::RequestQuery, - ) -> Result - where - D: DB + for<'iter> DBIter<'iter>, - H: StorageHasher, - { - let height = match height { - 0 => { - // `0` means last committed height - storage.storage.get_last_block_height() - } - _ => BlockHeight(height.try_into().map_err(|_| { - format!("Query height cannot be negative, got: {}", height) - })?), - }; - Ok(Self { - data: data.to_vec(), - path, - height, - prove, - }) - } -} diff --git a/shared/src/ledger/mod.rs b/shared/src/ledger/mod.rs index c946ddcf56..5042913c08 100644 --- a/shared/src/ledger/mod.rs +++ b/shared/src/ledger/mod.rs @@ -233,9 +233,9 @@ mod test { // Handle a path by invoking the `RPC.handle` directly with the // borrowed storage let request = RequestQuery { - data, + data: data.into(), path, - height, + height: height.try_into().unwrap(), prove, }; let ctx = RequestCtx { diff --git a/tests/src/e2e/setup.rs b/tests/src/e2e/setup.rs index 4d9dda8f66..cda8422001 100644 --- a/tests/src/e2e/setup.rs +++ b/tests/src/e2e/setup.rs @@ -990,7 +990,7 @@ where run_cmd .env("NAMADA_LOG", log_level) - .env("NAMADA_CMT_STDOUT", "false") + .env("NAMADA_CMT_STDOUT", "true") .env("CMT_LOG_LEVEL", "info") .env("NAMADA_LOG_COLOR", "false") .current_dir(working_dir) diff --git a/tests/src/integration/setup.rs b/tests/src/integration/setup.rs index 16ea9a11c2..c7c2bdbb5a 100644 --- a/tests/src/integration/setup.rs +++ b/tests/src/integration/setup.rs @@ -191,17 +191,39 @@ fn create_node( results: Arc::new(Mutex::new(vec![])), auto_drive_services, }; - let init_req = namada_apps::facade::tower_abci::request::InitChain { - time: Some(Timestamp { - seconds: 0, - nanos: 0, - }), - chain_id: chain_id.to_string(), - consensus_params: None, - validators: vec![], - app_state_bytes: vec![].into(), - initial_height: 0, - }; + let init_req = + namada_apps::facade::tendermint::v0_37::abci::request::InitChain { + time: Timestamp { + seconds: 0, + nanos: 0, + } + .try_into().unwrap(), + chain_id: chain_id.to_string(), + consensus_params: + namada_apps::facade::tendermint::consensus::params::Params { + block: namada_apps::facade::tendermint::block::Size { + max_bytes: 0, + max_gas: 0, + time_iota_ms: 0, + }, + evidence: + namada_apps::facade::tendermint::evidence::Params { + max_age_num_blocks: 0, + max_age_duration: namada_apps::facade::tendermint::evidence::Duration(core::time::Duration::MAX), + max_bytes: 0, + }, + validator: namada_apps::facade::tendermint::consensus::params::ValidatorParams { + pub_key_types: vec![] + }, + version: None, + abci: namada_apps::facade::tendermint::consensus::params::AbciParams { + vote_extensions_enable_height: None, + }, + }, + validators: vec![], + app_state_bytes: vec![].into(), + initial_height: 0_u32.into(), + }; { let mut locked = node.shell.lock().unwrap(); locked diff --git a/wasm/Cargo.lock b/wasm/Cargo.lock index 16dd7535f5..e83929fae9 100644 --- a/wasm/Cargo.lock +++ b/wasm/Cargo.lock @@ -5091,10 +5091,12 @@ dependencies = [ "ed25519-consensus 2.1.0", "flex-error", "futures", + "k256", "num-traits", "once_cell", "prost 0.12.1", "prost-types 0.12.1", + "ripemd", "serde", "serde_bytes", "serde_json", diff --git a/wasm_for_tests/wasm_source/Cargo.lock b/wasm_for_tests/wasm_source/Cargo.lock index 721c641ff1..ad0b14a010 100644 --- a/wasm_for_tests/wasm_source/Cargo.lock +++ b/wasm_for_tests/wasm_source/Cargo.lock @@ -5084,10 +5084,12 @@ dependencies = [ "ed25519-consensus 2.1.0", "flex-error", "futures", + "k256", "num-traits", "once_cell", "prost 0.12.1", "prost-types 0.12.1", + "ripemd", "serde", "serde_bytes", "serde_json",