From 5c1ce84de500af591340abaff3780493ac9a50d5 Mon Sep 17 00:00:00 2001 From: Jeff Bencin Date: Mon, 4 Dec 2023 11:43:35 -0500 Subject: [PATCH 1/2] fix: Use `VRFProof::consensus_serialize()` to address issue #4115 --- stackslib/src/chainstate/stacks/transaction.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stackslib/src/chainstate/stacks/transaction.rs b/stackslib/src/chainstate/stacks/transaction.rs index 8d9eb6873d..00dd5e1aba 100644 --- a/stackslib/src/chainstate/stacks/transaction.rs +++ b/stackslib/src/chainstate/stacks/transaction.rs @@ -282,7 +282,7 @@ impl StacksMessageCodec for TransactionPayload { write_next(fd, &(TransactionPayloadID::NakamotoCoinbase as u8))?; write_next(fd, buf)?; write_next(fd, &Value::none())?; - write_next(fd, &vrf_proof.to_bytes().to_vec())?; + write_next(fd, vrf_proof)?; } (Some(recipient), Some(vrf_proof)) => { write_next(fd, &(TransactionPayloadID::NakamotoCoinbase as u8))?; @@ -293,7 +293,7 @@ impl StacksMessageCodec for TransactionPayload { "FATAL: failed to encode recipient principal as `optional`", ), )?; - write_next(fd, &vrf_proof.to_bytes().to_vec())?; + write_next(fd, vrf_proof)?; } } } From 396b34ba414220834de7ff96a890d55458ded51b Mon Sep 17 00:00:00 2001 From: Jeff Bencin Date: Tue, 5 Dec 2023 16:19:54 -0500 Subject: [PATCH 2/2] Fix unit tests and `TransactionPayload::deserialize()` --- stackslib/src/chainstate/stacks/transaction.rs | 17 +---------------- stackslib/src/core/mempool.rs | 3 +-- testnet/stacks-node/src/mockamoto.rs | 3 +-- testnet/stacks-node/src/mockamoto/tests.rs | 18 ++++++------------ 4 files changed, 9 insertions(+), 32 deletions(-) diff --git a/stackslib/src/chainstate/stacks/transaction.rs b/stackslib/src/chainstate/stacks/transaction.rs index 00dd5e1aba..1b7f858c54 100644 --- a/stackslib/src/chainstate/stacks/transaction.rs +++ b/stackslib/src/chainstate/stacks/transaction.rs @@ -387,12 +387,7 @@ impl StacksMessageCodec for TransactionPayload { } else { return Err(codec_error::DeserializeError("Failed to parse nakamoto coinbase transaction -- did not receive an optional recipient principal value".to_string())); }; - let vrf_proof_bytes: Vec = read_next(fd)?; - let Some(vrf_proof) = VRFProof::from_bytes(&vrf_proof_bytes) else { - return Err(codec_error::DeserializeError( - "Failed to decode coinbase VRF proof".to_string(), - )); - }; + let vrf_proof: VRFProof = read_next(fd)?; TransactionPayload::Coinbase(payload, recipient_opt, Some(vrf_proof)) } TransactionPayloadID::TenureChange => { @@ -2043,11 +2038,6 @@ mod test { 0x12, // no alt recipient, so Value::none 0x09, - // proof bytes length - 0x00, - 0x00, - 0x00, - 0x50, // proof bytes 0x92, 0x75, @@ -2227,11 +2217,6 @@ mod test { 0x61, 0x63, 0x74, - // proof bytes length - 0x00, - 0x00, - 0x00, - 0x50, // proof bytes 0x92, 0x75, diff --git a/stackslib/src/core/mempool.rs b/stackslib/src/core/mempool.rs index a481c6ae1b..f85a0e0ef9 100644 --- a/stackslib/src/core/mempool.rs +++ b/stackslib/src/core/mempool.rs @@ -43,8 +43,7 @@ use stacks_common::util::{get_epoch_time_ms, get_epoch_time_secs}; use crate::burnchains::Txid; use crate::chainstate::burn::db::sortdb::SortitionDB; use crate::chainstate::burn::ConsensusHash; -use crate::chainstate::nakamoto::NakamotoBlock; -use crate::chainstate::nakamoto::NakamotoChainState; +use crate::chainstate::nakamoto::{NakamotoBlock, NakamotoChainState}; use crate::chainstate::stacks::db::blocks::MemPoolRejection; use crate::chainstate::stacks::db::{ClarityTx, StacksChainState}; use crate::chainstate::stacks::events::StacksTransactionReceipt; diff --git a/testnet/stacks-node/src/mockamoto.rs b/testnet/stacks-node/src/mockamoto.rs index a371a77b0b..20bd7106b8 100644 --- a/testnet/stacks-node/src/mockamoto.rs +++ b/testnet/stacks-node/src/mockamoto.rs @@ -68,6 +68,7 @@ use stacks_common::util::hash::{Hash160, MerkleTree, Sha512Trunc256Sum}; use stacks_common::util::secp256k1::{MessageSignature, SchnorrSignature, Secp256k1PublicKey}; use stacks_common::util::vrf::{VRFPrivateKey, VRFProof, VRFPublicKey, VRF}; +use self::signer::SelfSigner; use crate::neon::Counters; use crate::neon_node::{ Globals, PeerThread, RelayerDirective, StacksNode, BLOCK_PROCESSOR_STACK_SIZE, @@ -75,8 +76,6 @@ use crate::neon_node::{ use crate::syncctl::PoxSyncWatchdogComms; use crate::{Config, EventDispatcher}; -use self::signer::SelfSigner; - pub mod signer; #[cfg(test)] mod tests; diff --git a/testnet/stacks-node/src/mockamoto/tests.rs b/testnet/stacks-node/src/mockamoto/tests.rs index 94253e4179..d1f3696418 100644 --- a/testnet/stacks-node/src/mockamoto/tests.rs +++ b/testnet/stacks-node/src/mockamoto/tests.rs @@ -1,25 +1,19 @@ use std::thread; -use std::time::Duration; -use std::time::Instant; +use std::time::{Duration, Instant}; use clarity::vm::costs::ExecutionCost; use stacks::chainstate::nakamoto::NakamotoChainState; use stacks::chainstate::stacks::db::StacksChainState; -use stacks_common::types::chainstate::StacksAddress; -use stacks_common::types::chainstate::StacksPrivateKey; +use stacks_common::types::chainstate::{StacksAddress, StacksPrivateKey}; use stacks_common::types::StacksEpochId; use stacks_common::util::hash::to_hex; -use crate::config::EventKeyType; -use crate::config::EventObserverConfig; +use super::MockamotoNode; +use crate::config::{EventKeyType, EventObserverConfig}; use crate::neon_node::PeerThread; -use crate::tests::make_stacks_transfer; use crate::tests::neon_integrations::test_observer; -use crate::tests::to_addr; -use crate::Config; -use crate::ConfigFile; - -use super::MockamotoNode; +use crate::tests::{make_stacks_transfer, to_addr}; +use crate::{Config, ConfigFile}; #[test] fn observe_100_blocks() {