Skip to content

Commit ca84a1b

Browse files
authored
Merge pull request #5336 from stacks-network/feat/signer-message-versions
Add version to signer messages
2 parents da15d83 + 9f9ad40 commit ca84a1b

File tree

11 files changed

+301
-90
lines changed

11 files changed

+301
-90
lines changed

libsigner/src/libsigner.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@ use std::cmp::Eq;
4949
use std::fmt::Debug;
5050
use std::hash::Hash;
5151

52+
use blockstack_lib::version_string;
5253
use clarity::codec::StacksMessageCodec;
5354
use clarity::vm::types::QualifiedContractIdentifier;
55+
use lazy_static::lazy_static;
5456

5557
pub use crate::error::{EventError, RPCError};
5658
pub use crate::events::{
@@ -74,3 +76,11 @@ pub trait SignerMessage<T: MessageSlotID>: StacksMessageCodec {
7476
/// The contract identifier for the message slot in stacker db
7577
fn msg_id(&self) -> Option<T>;
7678
}
79+
80+
lazy_static! {
81+
/// The version string for the signer
82+
pub static ref VERSION_STRING: String = {
83+
let pkg_version = option_env!("STACKS_NODE_VERSION").unwrap_or(env!("CARGO_PKG_VERSION"));
84+
version_string("stacks-signer", pkg_version)
85+
};
86+
}

libsigner/src/v0/messages.rs

Lines changed: 220 additions & 20 deletions
Large diffs are not rendered by default.

stacks-signer/src/cli.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ use clarity::util::hash::Sha256Sum;
2929
use clarity::util::secp256k1::MessageSignature;
3030
use clarity::vm::types::{QualifiedContractIdentifier, TupleData};
3131
use clarity::vm::Value;
32+
use libsigner::VERSION_STRING;
3233
use serde::{Deserialize, Serialize};
3334
use stacks_common::address::{
3435
b58, AddressHashMode, C32_ADDRESS_VERSION_MAINNET_MULTISIG,
@@ -38,8 +39,6 @@ use stacks_common::address::{
3839
use stacks_common::define_u8_enum;
3940
use stacks_common::types::chainstate::StacksPrivateKey;
4041

41-
use crate::VERSION_STRING;
42-
4342
extern crate alloc;
4443

4544
#[derive(Parser, Debug)]

stacks-signer/src/client/stackerdb.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,9 @@ mod tests {
235235
use blockstack_lib::chainstate::nakamoto::{NakamotoBlock, NakamotoBlockHeader};
236236
use clarity::util::hash::{MerkleTree, Sha512Trunc256Sum};
237237
use clarity::util::secp256k1::MessageSignature;
238-
use libsigner::v0::messages::{BlockRejection, BlockResponse, RejectCode, SignerMessage};
238+
use libsigner::v0::messages::{
239+
BlockRejection, BlockResponse, RejectCode, SignerMessage, SignerMessageMetadata,
240+
};
239241
use rand::{thread_rng, RngCore};
240242

241243
use super::*;
@@ -283,6 +285,7 @@ mod tests {
283285
signer_signature_hash: block.header.signer_signature_hash(),
284286
chain_id: thread_rng().next_u32(),
285287
signature: MessageSignature::empty(),
288+
metadata: SignerMessageMetadata::empty(),
286289
};
287290
let signer_message = SignerMessage::BlockResponse(BlockResponse::Rejected(block_reject));
288291
let ack = StackerDBChunkAckData {

stacks-signer/src/lib.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,9 @@ mod tests;
4848
use std::fmt::{Debug, Display};
4949
use std::sync::mpsc::{channel, Receiver, Sender};
5050

51-
use blockstack_lib::version_string;
5251
use chainstate::SortitionsView;
5352
use config::GlobalConfig;
54-
use lazy_static::lazy_static;
55-
use libsigner::{SignerEvent, SignerEventReceiver, SignerEventTrait};
53+
use libsigner::{SignerEvent, SignerEventReceiver, SignerEventTrait, VERSION_STRING};
5654
use runloop::SignerResult;
5755
use slog::{slog_info, slog_warn};
5856
use stacks_common::{info, warn};
@@ -61,14 +59,6 @@ use crate::client::StacksClient;
6159
use crate::config::SignerConfig;
6260
use crate::runloop::RunLoop;
6361

64-
lazy_static! {
65-
/// The version string for the signer
66-
pub static ref VERSION_STRING: String = {
67-
let pkg_version = option_env!("STACKS_NODE_VERSION").unwrap_or(env!("CARGO_PKG_VERSION"));
68-
version_string("stacks-signer", pkg_version)
69-
};
70-
}
71-
7262
/// A trait which provides a common `Signer` interface for `v0` and `v1`
7363
pub trait Signer<T: SignerEventTrait>: Debug + Display {
7464
/// Create a new `Signer` instance

stacks-signer/src/main.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use blockstack_lib::util_lib::signed_structured_data::pox4::make_pox_4_signer_ke
3232
use clap::Parser;
3333
use clarity::types::chainstate::StacksPublicKey;
3434
use clarity::util::sleep_ms;
35-
use libsigner::SignerSession;
35+
use libsigner::{SignerSession, VERSION_STRING};
3636
use libstackerdb::StackerDBChunkData;
3737
use slog::{slog_debug, slog_error};
3838
use stacks_common::util::hash::to_hex;
@@ -47,7 +47,6 @@ use stacks_signer::config::GlobalConfig;
4747
use stacks_signer::monitor_signers::SignerMonitor;
4848
use stacks_signer::utils::stackerdb_session;
4949
use stacks_signer::v0::SpawnedSigner;
50-
use stacks_signer::VERSION_STRING;
5150
use tracing_subscriber::prelude::*;
5251
use tracing_subscriber::{fmt, EnvFilter};
5352

stacks-signer/src/monitoring/server.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use std::time::Instant;
1919

2020
use clarity::util::hash::to_hex;
2121
use clarity::util::secp256k1::Secp256k1PublicKey;
22+
use libsigner::VERSION_STRING;
2223
use slog::{slog_debug, slog_error, slog_info, slog_warn};
2324
use stacks_common::{debug, error, info, warn};
2425
use tiny_http::{Response as HttpResponse, Server as HttpServer};
@@ -28,7 +29,6 @@ use crate::client::{ClientError, StacksClient};
2829
use crate::config::{GlobalConfig, Network};
2930
use crate::monitoring::prometheus::gather_metrics_string;
3031
use crate::monitoring::{update_signer_nonce, update_stacks_tip_height};
31-
use crate::VERSION_STRING;
3232

3333
#[derive(thiserror::Error, Debug)]
3434
/// Monitoring server errors

stacks-signer/src/v0/signer.rs

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,13 @@ use clarity::types::{PrivateKey, StacksEpochId};
2525
use clarity::util::hash::MerkleHashFunc;
2626
use clarity::util::secp256k1::Secp256k1PublicKey;
2727
use libsigner::v0::messages::{
28-
BlockRejection, BlockResponse, MessageSlotID, MockProposal, MockSignature, RejectCode,
29-
SignerMessage,
28+
BlockAccepted, BlockRejection, BlockResponse, MessageSlotID, MockProposal, MockSignature,
29+
RejectCode, SignerMessage,
3030
};
3131
use libsigner::{BlockProposal, SignerEvent};
3232
use slog::{slog_debug, slog_error, slog_info, slog_warn};
3333
use stacks_common::types::chainstate::StacksAddress;
3434
use stacks_common::util::get_epoch_time_secs;
35-
use stacks_common::util::hash::Sha512Trunc256Sum;
3635
use stacks_common::util::secp256k1::MessageSignature;
3736
use stacks_common::{debug, error, info, warn};
3837

@@ -494,8 +493,8 @@ impl Signer {
494493
block_response: &BlockResponse,
495494
) {
496495
match block_response {
497-
BlockResponse::Accepted((block_hash, signature)) => {
498-
self.handle_block_signature(stacks_client, block_hash, signature);
496+
BlockResponse::Accepted(accepted) => {
497+
self.handle_block_signature(stacks_client, accepted);
499498
}
500499
BlockResponse::Rejected(block_rejection) => {
501500
self.handle_block_rejection(block_rejection);
@@ -547,13 +546,10 @@ impl Signer {
547546
self.signer_db
548547
.insert_block(&block_info)
549548
.unwrap_or_else(|_| panic!("{self}: Failed to insert block in DB"));
549+
let accepted = BlockAccepted::new(block_info.signer_signature_hash(), signature);
550550
// have to save the signature _after_ the block info
551-
self.handle_block_signature(
552-
stacks_client,
553-
&block_info.signer_signature_hash(),
554-
&signature,
555-
);
556-
Some(BlockResponse::accepted(signer_signature_hash, signature))
551+
self.handle_block_signature(stacks_client, &accepted);
552+
Some(BlockResponse::Accepted(accepted))
557553
}
558554

559555
/// Handle the block validate reject response. Returns our block response if we have one
@@ -739,13 +735,16 @@ impl Signer {
739735
}
740736

741737
/// Handle an observed signature from another signer
742-
fn handle_block_signature(
743-
&mut self,
744-
stacks_client: &StacksClient,
745-
block_hash: &Sha512Trunc256Sum,
746-
signature: &MessageSignature,
747-
) {
748-
debug!("{self}: Received a block-accept signature: ({block_hash}, {signature})");
738+
fn handle_block_signature(&mut self, stacks_client: &StacksClient, accepted: &BlockAccepted) {
739+
let BlockAccepted {
740+
signer_signature_hash: block_hash,
741+
signature,
742+
metadata,
743+
} = accepted;
744+
debug!(
745+
"{self}: Received a block-accept signature: ({block_hash}, {signature}, {})",
746+
metadata.server_version
747+
);
749748

750749
// Have we already processed this block?
751750
match self

testnet/stacks-node/src/nakamoto_node/sign_coordinator.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ use std::sync::Arc;
2020
use std::time::Duration;
2121

2222
use hashbrown::{HashMap, HashSet};
23-
use libsigner::v0::messages::{BlockResponse, MinerSlotID, SignerMessage as SignerMessageV0};
23+
use libsigner::v0::messages::{
24+
BlockAccepted, BlockResponse, MinerSlotID, SignerMessage as SignerMessageV0,
25+
};
2426
use libsigner::{BlockProposal, SignerEntries, SignerEvent, SignerSession, StackerDBSession};
2527
use stacks::burnchains::Burnchain;
2628
use stacks::chainstate::burn::db::sortdb::SortitionDB;
@@ -450,10 +452,12 @@ impl SignCoordinator {
450452
}
451453

452454
match message {
453-
SignerMessageV0::BlockResponse(BlockResponse::Accepted((
454-
response_hash,
455-
signature,
456-
))) => {
455+
SignerMessageV0::BlockResponse(BlockResponse::Accepted(accepted)) => {
456+
let BlockAccepted {
457+
signer_signature_hash: response_hash,
458+
signature,
459+
metadata,
460+
} = accepted;
457461
let block_sighash = block.header.signer_signature_hash();
458462
if block_sighash != response_hash {
459463
warn!(
@@ -463,7 +467,8 @@ impl SignCoordinator {
463467
"response_hash" => %response_hash,
464468
"slot_id" => slot_id,
465469
"reward_cycle_id" => reward_cycle_id,
466-
"response_hash" => %response_hash
470+
"response_hash" => %response_hash,
471+
"server_version" => %metadata.server_version
467472
);
468473
continue;
469474
}
@@ -511,7 +516,8 @@ impl SignCoordinator {
511516
"signer_weight" => signer_entry.weight,
512517
"total_weight_signed" => total_weight_signed,
513518
"stacks_block_hash" => %block.header.block_hash(),
514-
"stacks_block_id" => %block.header.block_id()
519+
"stacks_block_id" => %block.header.block_id(),
520+
"server_version" => metadata.server_version,
515521
);
516522
gathered_signatures.insert(slot_id, signature);
517523
responded_signers.insert(signer_pubkey);

testnet/stacks-node/src/tests/signer/mod.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -578,17 +578,17 @@ impl<S: Signer<T> + Send + 'static, T: SignerEventTrait + 'static> SignerTest<Sp
578578
let message = SignerMessage::consensus_deserialize(&mut chunk.data.as_slice())
579579
.expect("Failed to deserialize SignerMessage");
580580
match message {
581-
SignerMessage::BlockResponse(BlockResponse::Accepted((
582-
hash,
583-
signature,
584-
))) => {
585-
if hash == *signer_signature_hash
581+
SignerMessage::BlockResponse(BlockResponse::Accepted(accepted)) => {
582+
if accepted.signer_signature_hash == *signer_signature_hash
586583
&& expected_signers.iter().any(|pk| {
587-
pk.verify(hash.bits(), &signature)
588-
.expect("Failed to verify signature")
584+
pk.verify(
585+
accepted.signer_signature_hash.bits(),
586+
&accepted.signature,
587+
)
588+
.expect("Failed to verify signature")
589589
})
590590
{
591-
Some(signature)
591+
Some(accepted.signature)
592592
} else {
593593
None
594594
}

0 commit comments

Comments
 (0)