diff --git a/tendermint/src/evidence.rs b/tendermint/src/evidence.rs index d274e60d2..86b2eafc8 100644 --- a/tendermint/src/evidence.rs +++ b/tendermint/src/evidence.rs @@ -2,9 +2,8 @@ use std::slice; use { - crate::serializers, - serde::{de::Error as _, Deserialize, Deserializer, Serialize, Serializer}, - subtle_encoding::base64, + crate::{serializers, PublicKey, Vote}, + serde::{Deserialize, Serialize}, }; /// Evidence of malfeasance by validators (i.e. signing conflicting votes). @@ -12,40 +11,23 @@ use { /// evidence: `DuplicateVoteEvidence`. /// /// -#[derive(Clone, Debug)] -pub struct Evidence(Vec); - -impl Evidence { - /// Create a new raw evidence value from a byte vector - pub fn new(into_vec: V) -> Evidence - where - V: Into>, - { - // TODO(tarcieri): parse/validate evidence contents from amino messages - Evidence(into_vec.into()) - } - - /// Serialize this evidence as an Amino message bytestring - pub fn to_amino_bytes(&self) -> Vec { - self.0.clone() - } +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(tag = "type", content = "value")] +pub enum Evidence { + /// Duplicate vote evidence + #[serde(rename = "tendermint/DuplicateVoteEvidence")] + DuplicateVote(DuplicateVoteEvidence), } -impl<'de> Deserialize<'de> for Evidence { - fn deserialize>(deserializer: D) -> Result { - let bytes = base64::decode(String::deserialize(deserializer)?.as_bytes()) - .map_err(|e| D::Error::custom(format!("{}", e)))?; - - Ok(Evidence::new(bytes)) - } -} - -impl Serialize for Evidence { - fn serialize(&self, serializer: S) -> Result { - String::from_utf8(base64::encode(self.to_amino_bytes())) - .unwrap() - .serialize(serializer) - } +/// Duplicate vote evidence +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct DuplicateVoteEvidence { + #[serde(rename = "PubKey")] + pub_key: PublicKey, + #[serde(rename = "VoteA")] + vote_a: Vote, + #[serde(rename = "VoteB")] + vote_b: Vote, } /// Evidence data is a wrapper for a list of `Evidence`. diff --git a/tendermint/tests/rpc.rs b/tendermint/tests/rpc.rs index 853d4293f..1aec471eb 100644 --- a/tendermint/tests/rpc.rs +++ b/tendermint/tests/rpc.rs @@ -53,6 +53,19 @@ mod endpoints { assert_eq!(last_commit.unwrap().signatures.len(), 1); } + #[test] + fn block_with_evidences() { + let response = + endpoint::block::Response::from_string(&read_json_fixture("block_with_evidences")) + .unwrap(); + + let tendermint::Block { evidence, .. } = response.block; + let evidence = evidence.iter().next().unwrap(); + match evidence { + tendermint::evidence::Evidence::DuplicateVote(_) => {} + } + } + // TODO: Update this test and its json file // #[test] // fn block_empty_block_id() {