diff --git a/substrate/core/finality-grandpa/src/lib.rs b/substrate/core/finality-grandpa/src/lib.rs index 3321e9edad..8296502058 100644 --- a/substrate/core/finality-grandpa/src/lib.rs +++ b/substrate/core/finality-grandpa/src/lib.rs @@ -298,9 +298,15 @@ impl Drop for ClearOnDrop { } } +fn round_localized_payload(round: u64, message: &E) -> Vec { + let mut v = message.encode(); + round.using_encoded(|s| v.extend(s)); + v +} + // converts a message stream into a stream of signed messages. // the output stream checks signatures also. -fn checked_message_stream(inner: S, voters: Vec) +fn checked_message_stream(inner: S, round: u64, voters: Vec) -> impl Stream,Error=Error> where S: Stream,Error=()> { @@ -320,7 +326,7 @@ fn checked_message_stream(inner: S, voters: Vec) } let as_public = ::ed25519::Public::from_raw(msg.id.0); - let encoded_raw = msg.message.encode(); + let encoded_raw = round_localized_payload(round, &msg.message); if ::ed25519::verify_strong(&msg.signature, &encoded_raw, as_public) { Ok(Some(msg)) } else { @@ -349,9 +355,9 @@ fn outgoing_messages( let (tx, rx) = mpsc::unbounded(); let rx = rx .map(move |msg: Message| { - // when locals exist. sign messages on import + // when locals exist, sign messages on import if let Some((ref pair, local_id)) = locals { - let encoded = msg.encode(); + let encoded = round_localized_payload(round, &msg); let signature = pair.sign(&encoded[..]); let signed = SignedMessage:: { message: msg, @@ -477,6 +483,7 @@ impl voter::Environment for Environment( self.network.messages_for(round), + round, self.config.voters.clone(), );