diff --git a/crates/pallet-bitcoin/src/lib.rs b/crates/pallet-bitcoin/src/lib.rs index dfa8daa0..7610312b 100644 --- a/crates/pallet-bitcoin/src/lib.rs +++ b/crates/pallet-bitcoin/src/lib.rs @@ -133,7 +133,7 @@ pub mod pallet { script_pubkey: txout.script_pubkey.clone().into_bytes(), height: 0u32, }; - Coins::::insert(txid.clone(), index as u32, coin); + Coins::::insert(txid, index as u32, coin); }); } } diff --git a/crates/pallet-bitcoin/src/types.rs b/crates/pallet-bitcoin/src/types.rs index 8781c247..4049d5d9 100644 --- a/crates/pallet-bitcoin/src/types.rs +++ b/crates/pallet-bitcoin/src/types.rs @@ -40,7 +40,7 @@ impl From for absolute::LockTime { } /// Wrapper type for representing [`bitcoin::Txid`] in runtime, stored in reversed byte order. -#[derive(Clone, TypeInfo, Encode, Decode, MaxEncodedLen, PartialEq)] +#[derive(Clone, Copy, TypeInfo, Encode, Decode, MaxEncodedLen, PartialEq)] pub struct Txid(H256); impl Txid { @@ -159,7 +159,11 @@ pub enum TxIn { /// Input from a coinbase transaction, which does not reference any previous output. Coinbase { /// Arbitrary data used in the coinbase transaction, such as extra nonce or miner-specific information. - coinbase_data: Vec, + data: Vec, + /// Sequence. + /// + /// Note that the value of sequence is not always Sequence::MAX, see https://www.blockchain.com/explorer/transactions/btc/0961c660358478829505e16a1f028757e54b5bbf9758341a7546573738f31429 + sequence: u32, }, /// Input from a regular transaction, which references a previous output (`OutPoint`). Regular(RegularTxIn), @@ -169,7 +173,8 @@ impl From for TxIn { fn from(txin: bitcoin::TxIn) -> Self { if txin.previous_output.is_null() { Self::Coinbase { - coinbase_data: txin.script_sig.into_bytes(), + data: txin.script_sig.into_bytes(), + sequence: txin.sequence.0, } } else { Self::Regular(RegularTxIn { @@ -185,10 +190,10 @@ impl From for TxIn { impl From for bitcoin::TxIn { fn from(val: TxIn) -> Self { match val { - TxIn::Coinbase { coinbase_data } => bitcoin::TxIn { + TxIn::Coinbase { data, sequence } => bitcoin::TxIn { previous_output: bitcoin::OutPoint::null(), - script_sig: bitcoin::ScriptBuf::from_bytes(coinbase_data), - sequence: bitcoin::Sequence::MAX, + script_sig: bitcoin::ScriptBuf::from_bytes(data), + sequence: bitcoin::Sequence(sequence), witness: bitcoin::Witness::new(), }, TxIn::Regular(RegularTxIn { diff --git a/crates/sc-consensus-nakamoto/src/verification.rs b/crates/sc-consensus-nakamoto/src/verification.rs index 8effb464..4568a3cc 100644 --- a/crates/sc-consensus-nakamoto/src/verification.rs +++ b/crates/sc-consensus-nakamoto/src/verification.rs @@ -97,6 +97,7 @@ pub enum Error { #[error("UTXO not found (#{block_number}:{txid}: {utxo:?})")] UtxoNotFound { block_number: u32, + tx_index: usize, txid: Txid, utxo: OutPoint, }, @@ -393,6 +394,7 @@ where let (spent_output, is_coinbase, coin_height) = access_coin(coin).ok_or_else(|| Error::UtxoNotFound { block_number, + tx_index, txid: get_txid(tx_index), utxo: coin, })?; diff --git a/crates/subcoin-network/src/lib.rs b/crates/subcoin-network/src/lib.rs index cd78a9e6..54506923 100644 --- a/crates/subcoin-network/src/lib.rs +++ b/crates/subcoin-network/src/lib.rs @@ -397,7 +397,7 @@ where let (sender, receiver) = oneshot::channel(); if worker_msg_sender - .unbounded_send(NetworkWorkerMessage::InboundPeersCount(sender)) + .unbounded_send(NetworkWorkerMessage::RequestInboundPeersCount(sender)) .is_err() { return; diff --git a/crates/subcoin-network/src/network.rs b/crates/subcoin-network/src/network.rs index 415b6d59..ee151811 100644 --- a/crates/subcoin-network/src/network.rs +++ b/crates/subcoin-network/src/network.rs @@ -59,13 +59,13 @@ pub(crate) struct IncomingTransaction { #[derive(Debug)] pub(crate) enum NetworkWorkerMessage { /// Request the current network status. - NetworkStatus(oneshot::Sender), + RequestNetworkStatus(oneshot::Sender), /// Request the sync peers. - SyncPeers(oneshot::Sender>), + RequestSyncPeers(oneshot::Sender>), /// Request the number of inbound connected peers. - InboundPeersCount(oneshot::Sender), + RequestInboundPeersCount(oneshot::Sender), /// Request a specific transaction by its Txid. - GetTransaction((Txid, oneshot::Sender>)), + RequestTransaction((Txid, oneshot::Sender>)), /// Submit a transaction to the transaction manager. SendTransaction((IncomingTransaction, oneshot::Sender)), /// Enable the block sync within the chain sync component. @@ -91,7 +91,7 @@ impl NetworkHandle { let (sender, receiver) = oneshot::channel(); self.worker_msg_sender - .unbounded_send(NetworkWorkerMessage::NetworkStatus(sender)) + .unbounded_send(NetworkWorkerMessage::RequestNetworkStatus(sender)) .ok(); receiver.await.ok() @@ -103,7 +103,7 @@ impl NetworkHandle { if self .worker_msg_sender - .unbounded_send(NetworkWorkerMessage::SyncPeers(sender)) + .unbounded_send(NetworkWorkerMessage::RequestSyncPeers(sender)) .is_err() { return Vec::new(); @@ -118,7 +118,7 @@ impl NetworkHandle { if self .worker_msg_sender - .unbounded_send(NetworkWorkerMessage::GetTransaction((txid, sender))) + .unbounded_send(NetworkWorkerMessage::RequestTransaction((txid, sender))) .is_err() { return None; diff --git a/crates/subcoin-network/src/worker.rs b/crates/subcoin-network/src/worker.rs index 6285f7a8..83b719e4 100644 --- a/crates/subcoin-network/src/worker.rs +++ b/crates/subcoin-network/src/worker.rs @@ -243,7 +243,7 @@ where fn process_worker_message(&mut self, worker_msg: NetworkWorkerMessage, bandwidth: &Bandwidth) { match worker_msg { - NetworkWorkerMessage::NetworkStatus(result_sender) => { + NetworkWorkerMessage::RequestNetworkStatus(result_sender) => { let net_status = NetworkStatus { num_connected_peers: self.peer_manager.connected_peers_count(), total_bytes_inbound: bandwidth.total_bytes_inbound.load(Ordering::Relaxed), @@ -252,14 +252,14 @@ where }; let _ = result_sender.send(net_status); } - NetworkWorkerMessage::SyncPeers(result_sender) => { + NetworkWorkerMessage::RequestSyncPeers(result_sender) => { let sync_peers = self.chain_sync.peers.values().cloned().collect::>(); let _ = result_sender.send(sync_peers); } - NetworkWorkerMessage::InboundPeersCount(result_sender) => { + NetworkWorkerMessage::RequestInboundPeersCount(result_sender) => { let _ = result_sender.send(self.peer_manager.inbound_peers_count()); } - NetworkWorkerMessage::GetTransaction((txid, result_sender)) => { + NetworkWorkerMessage::RequestTransaction((txid, result_sender)) => { let _ = result_sender.send(self.transaction_manager.get_transaction(&txid)); } NetworkWorkerMessage::SendTransaction((incoming_transaction, result_sender)) => {