From e4cf277d1b7e31ed34796531ac8990e1d7cefab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 23 Jun 2021 17:59:16 +0200 Subject: [PATCH 1/6] update genesis for 0.34.x --- light-client/src/operations/voting_power.rs | 4 +-- rpc/tests/kvstore_fixtures.rs | 2 +- rpc/tests/parse_response.rs | 2 +- rpc/tests/support/genesis.json | 1 + tendermint/src/block/size.rs | 5 ++++ tendermint/src/genesis.rs | 8 ++++-- tendermint/src/validator.rs | 27 ++++++++++++--------- testgen/src/consensus.rs | 1 + testgen/src/validator.rs | 7 +++--- 9 files changed, 36 insertions(+), 21 deletions(-) diff --git a/light-client/src/operations/voting_power.rs b/light-client/src/operations/voting_power.rs index bfd6a7dcd..fafa0130c 100644 --- a/light-client/src/operations/voting_power.rs +++ b/light-client/src/operations/voting_power.rs @@ -45,9 +45,7 @@ pub trait VotingPowerCalculator: Send + Sync { validator_set .validators() .iter() - .fold(0u64, |total, val_info| { - total + val_info.voting_power.value() - }) + .fold(0u64, |total, val_info| total + val_info.power.value()) } /// Check against the given threshold that there is enough trust diff --git a/rpc/tests/kvstore_fixtures.rs b/rpc/tests/kvstore_fixtures.rs index c0e7d5e61..0f61ed8e9 100644 --- a/rpc/tests/kvstore_fixtures.rs +++ b/rpc/tests/kvstore_fixtures.rs @@ -717,7 +717,7 @@ fn incoming_fixtures() { > 0 ); assert!(result.validator_info.pub_key.ed25519().is_some()); - assert_eq!(result.validator_info.voting_power.value(), 10); + assert_eq!(result.validator_info.power.value(), 10); } "subscribe_malformed" => { let result = endpoint::subscribe::Response::from_string(content) diff --git a/rpc/tests/parse_response.rs b/rpc/tests/parse_response.rs index 4d5da7e13..a96499b01 100644 --- a/rpc/tests/parse_response.rs +++ b/rpc/tests/parse_response.rs @@ -276,7 +276,7 @@ fn status() { assert_eq!(response.node_info.network.as_str(), EXAMPLE_CHAIN); assert_eq!(response.sync_info.latest_block_height.value(), 410_744); - assert_eq!(response.validator_info.voting_power.value(), 0); + assert_eq!(response.validator_info.power.value(), 0); } #[test] diff --git a/rpc/tests/support/genesis.json b/rpc/tests/support/genesis.json index cea9ac3f4..45b7b9619 100644 --- a/rpc/tests/support/genesis.json +++ b/rpc/tests/support/genesis.json @@ -5,6 +5,7 @@ "genesis": { "genesis_time": "2019-03-13T23:00:00Z", "chain_id": "cosmoshub-2", + "initial_height": "0", "consensus_params": { "block": { "max_bytes": "200000", diff --git a/tendermint/src/block/size.rs b/tendermint/src/block/size.rs index f816e02e2..d20140c22 100644 --- a/tendermint/src/block/size.rs +++ b/tendermint/src/block/size.rs @@ -19,6 +19,10 @@ pub struct Size { /// Maximum amount of gas which can be spent on a block #[serde(with = "serializers::from_str")] pub max_gas: i64, + + /// This parameter has no value anymore in Tendermint-core + #[serde(with = "serializers::from_str")] + pub time_iota_ms: i64, } impl Protobuf for Size {} @@ -33,6 +37,7 @@ impl TryFrom for Size { .try_into() .map_err(|_| Self::Error::from(Kind::IntegerOverflow))?, max_gas: value.max_gas, + time_iota_ms: 1000, }) } } diff --git a/tendermint/src/genesis.rs b/tendermint/src/genesis.rs index cd1c357ff..231cba98e 100644 --- a/tendermint/src/genesis.rs +++ b/tendermint/src/genesis.rs @@ -1,5 +1,6 @@ //! Genesis data +use crate::serializers; use crate::{chain, consensus, validator, Time}; use chrono::DateTime; use serde::de::Error; @@ -16,6 +17,10 @@ pub struct Genesis { /// Chain ID pub chain_id: chain::Id, + /// Starting height of the blockchain + #[serde(with = "serializers::from_str")] + pub initial_height: i64, + /// Consensus parameters pub consensus_params: consensus::Params, @@ -24,8 +29,7 @@ pub struct Genesis { pub validators: Vec, /// App hash - #[serde(skip_serializing_if = "Vec::is_empty", with = "serde_bytes")] - pub app_hash: Vec, + pub app_hash: String, /// App state #[serde(default)] diff --git a/tendermint/src/validator.rs b/tendermint/src/validator.rs index ccdcaabf7..9d4595a75 100644 --- a/tendermint/src/validator.rs +++ b/tendermint/src/validator.rs @@ -66,7 +66,7 @@ impl Set { // Compute the total voting power let total_voting_power = validators .iter() - .map(|v| v.voting_power.value()) + .map(|v| v.power.value()) .sum::() .try_into() .unwrap(); @@ -118,7 +118,7 @@ impl Set { /// Sort the validators according to the current Tendermint requirements /// (v. 0.34 -> first by validator power, descending, then by address, ascending) fn sort_validators(vals: &mut Vec) { - vals.sort_by_key(|v| (std::cmp::Reverse(v.voting_power), v.address)); + vals.sort_by_key(|v| (std::cmp::Reverse(v.power), v.address)); } /// Returns the validator with the given Id if its in the Set. @@ -143,7 +143,7 @@ impl Set { /// Validator information // Todo: Remove address and make it into a function that generates it on the fly from pub_key. -#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize, Eq)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Eq)] pub struct Info { /// Validator account address pub address: account::Id, @@ -153,8 +153,11 @@ pub struct Info { /// Validator voting power // Compatibility with genesis.json https://github.com/tendermint/tendermint/issues/5549 - #[serde(alias = "power", alias = "total_voting_power")] - pub voting_power: vote::Power, + #[serde(alias = "voting_power", alias = "total_voting_power")] + pub power: vote::Power, + + /// Validator name + pub name: Option, /// Validator proposer priority #[serde(skip)] @@ -168,7 +171,8 @@ impl TryFrom for Info { Ok(Info { address: value.address.try_into()?, pub_key: value.pub_key.ok_or(Kind::MissingPublicKey)?.try_into()?, - voting_power: value.voting_power.try_into()?, + power: value.voting_power.try_into()?, + name: None, proposer_priority: value.proposer_priority.try_into()?, }) } @@ -179,7 +183,7 @@ impl From for RawValidator { RawValidator { address: value.address.into(), pub_key: Some(value.pub_key.into()), - voting_power: value.voting_power.into(), + voting_power: value.power.into(), proposer_priority: value.proposer_priority.into(), } } @@ -188,7 +192,7 @@ impl From for RawValidator { impl Info { /// Return the voting power of the validator. pub fn power(&self) -> u64 { - self.voting_power.value() + self.power.value() } /// Verify the given signature against the given sign_bytes using the validators @@ -214,7 +218,8 @@ impl Info { Info { address: account::Id::from(pk), pub_key: pk, - voting_power: vp, + power: vp, + name: None, proposer_priority: ProposerPriority::default(), } } @@ -269,7 +274,7 @@ impl From<&Info> for SimpleValidator { }; SimpleValidator { pub_key: Some(tendermint_proto::crypto::PublicKey { sum }), - voting_power: info.voting_power, + voting_power: info.power, } } } @@ -409,7 +414,7 @@ mod tests { 22, 57, 84, 71, 122, 200, 169, 192, 252, 41, 148, 223, 180, ]; - let val_set = Set::without_proposer(vec![v1, v2, v3]); + let val_set = Set::without_proposer(vec![v1.clone(), v2.clone(), v3.clone()]); let hash = val_set.hash(); assert_eq!(hash_expect, hash.as_bytes().to_vec()); diff --git a/testgen/src/consensus.rs b/testgen/src/consensus.rs index fed95d689..c0b43a801 100644 --- a/testgen/src/consensus.rs +++ b/testgen/src/consensus.rs @@ -8,6 +8,7 @@ pub fn default_consensus_params() -> consensus::Params { block: block::Size { max_bytes: 22020096, max_gas: -1, // Tendetmint-go also has TimeIotaMs: 1000, // 1s + time_iota_ms: 1000, }, evidence: evidence::Params { max_age_num_blocks: 100000, diff --git a/testgen/src/validator.rs b/testgen/src/validator.rs index e248af7c6..f67ad3db4 100644 --- a/testgen/src/validator.rs +++ b/testgen/src/validator.rs @@ -108,7 +108,8 @@ impl Generator for Validator { let info = validator::Info { address: account::Id::from(keypair.public), pub_key: PublicKey::from(keypair.public), - voting_power: vote::Power::try_from(self.voting_power.unwrap_or(0)).unwrap(), + power: vote::Power::try_from(self.voting_power.unwrap_or(0)).unwrap(), + name: None, proposer_priority: validator::ProposerPriority::from( self.proposer_priority.unwrap_or_default(), ), @@ -130,7 +131,7 @@ pub fn sort_validators(vals: &[Validator]) -> Vec { let mut sorted = vals.to_owned(); sorted.sort_by_key(|v| { let v = v.generate().unwrap(); - (std::cmp::Reverse(v.voting_power), v.address) + (std::cmp::Reverse(v.power), v.address) }); sorted } @@ -186,7 +187,7 @@ mod tests { let mut block_val = val.generate().unwrap(); - block_val.voting_power = vote::Power::from(30_u32); + block_val.power = vote::Power::from(30_u32); assert_ne!(val.generate().unwrap(), block_val); let val = val.voting_power(30); From 531fadf2fd1677211f366e79320dacecda3d2ec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 23 Jun 2021 19:11:52 +0200 Subject: [PATCH 2/6] remove dead code --- tendermint/src/genesis.rs | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/tendermint/src/genesis.rs b/tendermint/src/genesis.rs index 231cba98e..a4165932f 100644 --- a/tendermint/src/genesis.rs +++ b/tendermint/src/genesis.rs @@ -2,11 +2,7 @@ use crate::serializers; use crate::{chain, consensus, validator, Time}; -use chrono::DateTime; -use serde::de::Error; -use serde::{Deserialize, Deserializer, Serialize}; -use std::convert::TryFrom; -use tendermint_proto::google::protobuf::Timestamp; +use serde::{Deserialize, Serialize}; /// Genesis data #[derive(Clone, Debug, Serialize, Deserialize)] @@ -35,18 +31,3 @@ pub struct Genesis { #[serde(default)] pub app_state: AppState, } - -/// Deserialize string into Time through Timestamp -pub fn deserialize_time<'de, D>(deserializer: D) -> Result -where - D: Deserializer<'de>, -{ - let value_string = String::deserialize(deserializer)?; - let value_datetime = DateTime::parse_from_rfc3339(value_string.as_str()) - .map_err(|e| D::Error::custom(format!("{}", e)))?; - Time::try_from(Timestamp { - seconds: value_datetime.timestamp(), - nanos: value_datetime.timestamp_subsec_nanos() as i32, - }) - .map_err(|e| D::Error::custom(format!("{}", e))) -} From 7e1e42e5baba62d97dbd215c9143032a499486c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 23 Jun 2021 19:31:05 +0200 Subject: [PATCH 3/6] fixup! update genesis for 0.34.x --- tools/kvstore-test/tests/tendermint.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/kvstore-test/tests/tendermint.rs b/tools/kvstore-test/tests/tendermint.rs index 79781295c..774304b7b 100644 --- a/tools/kvstore-test/tests/tendermint.rs +++ b/tools/kvstore-test/tests/tendermint.rs @@ -203,7 +203,7 @@ mod rpc { let status = localhost_http_client().status().await.unwrap(); // For lack of better things to test - assert_eq!(status.validator_info.voting_power.value(), 10); + assert_eq!(status.validator_info.voting.value(), 10); } #[tokio::test] From 6833e630390ec2b9e5fdcefbfb600f37c3763db1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 23 Jun 2021 19:36:37 +0200 Subject: [PATCH 4/6] add .changelog entry --- .changelog/unreleased/bug-fixes/917-update-tendermint-genesis.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changelog/unreleased/bug-fixes/917-update-tendermint-genesis.md diff --git a/.changelog/unreleased/bug-fixes/917-update-tendermint-genesis.md b/.changelog/unreleased/bug-fixes/917-update-tendermint-genesis.md new file mode 100644 index 000000000..a1293eb22 --- /dev/null +++ b/.changelog/unreleased/bug-fixes/917-update-tendermint-genesis.md @@ -0,0 +1 @@ +- `[tendermint]` Update Genesis for Tendermint v.0.34.x ([#917](https://github.com/informalsystems/tendermint-rs/pull/917)) \ No newline at end of file From 5ff96bdabd7eba02e2cdeea90799cc8d72effea5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 23 Jun 2021 19:37:12 +0200 Subject: [PATCH 5/6] fixup! fixup! update genesis for 0.34.x --- tools/kvstore-test/tests/tendermint.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/kvstore-test/tests/tendermint.rs b/tools/kvstore-test/tests/tendermint.rs index 774304b7b..2f47416bd 100644 --- a/tools/kvstore-test/tests/tendermint.rs +++ b/tools/kvstore-test/tests/tendermint.rs @@ -203,7 +203,7 @@ mod rpc { let status = localhost_http_client().status().await.unwrap(); // For lack of better things to test - assert_eq!(status.validator_info.voting.value(), 10); + assert_eq!(status.validator_info.power.value(), 10); } #[tokio::test] From e5b64c3df038b4d4e076c67402480f4b71187f85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Fri, 25 Jun 2021 15:17:19 +0200 Subject: [PATCH 6/6] fixup! update genesis for 0.34.x --- tendermint/src/genesis.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tendermint/src/genesis.rs b/tendermint/src/genesis.rs index a4165932f..6701ced55 100644 --- a/tendermint/src/genesis.rs +++ b/tendermint/src/genesis.rs @@ -25,7 +25,8 @@ pub struct Genesis { pub validators: Vec, /// App hash - pub app_hash: String, + #[serde(with = "serializers::bytes::hexstring")] + pub app_hash: Vec, /// App state #[serde(default)]