diff --git a/src/privval.rs b/src/privval.rs index 5f8a7f09..892bfedb 100644 --- a/src/privval.rs +++ b/src/privval.rs @@ -89,22 +89,24 @@ impl SignableMsg { pub fn extension_bytes(&self, chain_id: chain::Id) -> Result, EncodeError> { match self { Self::Proposal(_) => Ok(None), - Self::Vote(vote) => { - // Only sign extension if actually present - if vote.extension.is_empty() { - return Ok(None); + Self::Vote(v) => { + match (v.vote_type, v.block_id) { + // Only sign extension if it's a precommit for a non-nil block. + // Note that extension can be empty. + (vote::Type::Precommit, Some(_)) => { + let canonical = proto::types::CanonicalVoteExtension { + extension: v.extension.clone(), + height: v.height.into(), + round: v.round.value().into(), + chain_id: chain_id.to_string(), + }; + + let mut bytes = BytesMut::new(); + canonical.encode_length_delimited(&mut bytes)?; + Ok(Some(bytes.into())) + } + _ => Ok(None), } - - let canonical = proto::types::CanonicalVoteExtension { - extension: vote.extension.clone(), - height: vote.height.into(), - round: vote.round.value().into(), - chain_id: chain_id.to_string(), - }; - - let mut bytes = BytesMut::new(); - canonical.encode_length_delimited(&mut bytes)?; - Ok(Some(bytes.into())) } } } diff --git a/src/session.rs b/src/session.rs index b88d9238..59a57617 100644 --- a/src/session.rs +++ b/src/session.rs @@ -149,7 +149,7 @@ impl Session { signable_msg.add_consensus_signature(consensus_sig); self.log_signing_request(&signable_msg, started_at).unwrap(); - // Add extension signature if there are any extensions defined + // Add extension signature if the message is a precommit for a non-empty block ID. if let Some(extension_msg) = signable_msg.extension_bytes(chain_id)? { let started_at = Instant::now(); let extension_sig = chain.keyring.sign(public_key, &extension_msg)?;