What changed, and why it matters
This commit is a simple renaming of two fields in the Transaction struct from singular 'input'/'output' to plural 'inputs'/'outputs'. It is a stylistic/API-breaking change, not a security fix or vulnerability. The diff updates all internal usages, examples, tests, and fuzz targets consistently. There is one stray file 'bitcoin/src/ex' containing the letter 't' that appears to be an accidental addition, but it is harmless.
No security action required. Reviewers may want to confirm the stray file bitcoin/src/ex was added unintentionally and consider removing it. Downstream users will need to update field names when upgrading.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit renames Transaction.input to Transaction.inputs and Transaction.output to Transaction.outputs across the rust-bitcoin crate and primitives. It removes the previously existing accessor methods inputs()/inputs_mut()/outputs()/outputs_mut() from primitives because the fields are now directly plural. Serialization, sighash, PSBT, block validation, BIP152/158, examples, and tests are all updated. No logic changes; no security behavior is altered. A new file bitcoin/src/ex with content ‘t’ is added, likely an accidental leftover.
Changed components
primitives/src/transaction.rsbitcoin/src/blockdata/transaction.rsbitcoin/src/blockdata/block.rsbitcoin/src/crypto/sighash.rsbitcoin/src/psbt/mod.rsbitcoin/src/psbt/map/global.rsbitcoin/src/psbt/serialize.rsbitcoin/src/bip152.rsbitcoin/src/bip158.rsbitcoin/src/consensus_validation.rsbitcoin/src/blockdata/constants.rsbitcoin/src/blockdata/witness.rsbitcoin/examples/*bitcoin/tests/*fuzz/fuzz_targets/bitcoin/deserialize_transaction.rsInspect captured patch +227 / −242
diff --git a/bitcoin/examples/ecdsa-psbt-simple.rs b/bitcoin/examples/ecdsa-psbt-simple.rs
index d5506c5b..94076b46 100644
--- a/bitcoin/examples/ecdsa-psbt-simple.rs
+++ b/bitcoin/examples/ecdsa-psbt-simple.rs
@@ -176,8 +176,8 @@ fn main() {
let unsigned_tx = Transaction {
version: transaction::Version::TWO, // Post BIP 68.
lock_time: absolute::LockTime::ZERO, // Ignore the locktime.
- input: inputs, // Input is 0-indexed.
- output: vec![spend, change], // Outputs, order does not matter.
+ inputs, // Input is 0-indexed.
+ outputs: vec![spend, change], // Outputs, order does not matter.
};
// Now we'll start the PSBT workflow.
diff --git a/bitcoin/examples/ecdsa-psbt.rs b/bitcoin/examples/ecdsa-psbt.rs
index 67c86a59..a74e9ddb 100644
--- a/bitcoin/examples/ecdsa-psbt.rs
+++ b/bitcoin/examples/ecdsa-psbt.rs
@@ -184,13 +184,13 @@ impl WatchOnly {
let tx = Transaction {
version: transaction::Version::TWO,
lock_time: absolute::LockTime::ZERO,
- input: vec![TxIn {
+ inputs: vec![TxIn {
previous_output: OutPoint { txid: INPUT_UTXO_TXID.parse()?, vout: INPUT_UTXO_VOUT },
script_sig: ScriptBuf::new(),
sequence: Sequence::MAX, // Disable LockTime and RBF.
witness: Witness::default(),
}],
- output: vec![
+ outputs: vec![
TxOut { value: to_amount, script_pubkey: to_address.script_pubkey() },
TxOut { value: change_amount, script_pubkey: change_address.script_pubkey() },
],
diff --git a/bitcoin/examples/sighash.rs b/bitcoin/examples/sighash.rs
index 0a3ef64e..433638c0 100644
--- a/bitcoin/examples/sighash.rs
+++ b/bitcoin/examples/sighash.rs
@@ -21,7 +21,7 @@ use hex_lit::hex;
/// * `amount` - the ref tx output value in sats
fn compute_sighash_p2wpkh(raw_tx: &[u8], inp_idx: usize, amount: Amount) {
let tx: Transaction = consensus::deserialize(raw_tx).unwrap();
- let inp = &tx.input[inp_idx];
+ let inp = &tx.inputs[inp_idx];
let witness = &inp.witness;
println!("Witness: {witness:?}");
@@ -60,7 +60,7 @@ fn compute_sighash_p2wpkh(raw_tx: &[u8], inp_idx: usize, amount: Amount) {
/// * `script_pubkey_bytes_opt` - the Option with scriptPubKey bytes. If None, it's p2sh case, i.e., reftx output's scriptPubKey.type is "scripthash". In this case scriptPubkey is extracted from the spending transaction's scriptSig. If Some(), it's p2ms case, i.e., reftx output's scriptPubKey.type is "multisig", and the scriptPubkey is supplied from the referenced output.
fn compute_sighash_legacy(raw_tx: &[u8], inp_idx: usize, script_pubkey_bytes_opt: Option<&[u8]>) {
let tx: Transaction = consensus::deserialize(raw_tx).unwrap();
- let inp = &tx.input[inp_idx];
+ let inp = &tx.inputs[inp_idx];
let script_sig = &inp.script_sig;
println!("scriptSig is: {script_sig}");
let cache = sighash::SighashCache::new(&tx);
@@ -105,7 +105,7 @@ fn compute_sighash_legacy(raw_tx: &[u8], inp_idx: usize, script_pubkey_bytes_opt
/// * `amount` - the ref tx output value in sats
fn compute_sighash_p2wsh(raw_tx: &[u8], inp_idx: usize, amount: Amount) {
let tx: Transaction = consensus::deserialize(raw_tx).unwrap();
- let inp = &tx.input[inp_idx];
+ let inp = &tx.inputs[inp_idx];
let witness = &inp.witness;
println!("witness {witness:?}");
diff --git a/bitcoin/examples/sign-tx-segwit-v0.rs b/bitcoin/examples/sign-tx-segwit-v0.rs
index 2355c264..7c2808d2 100644
--- a/bitcoin/examples/sign-tx-segwit-v0.rs
+++ b/bitcoin/examples/sign-tx-segwit-v0.rs
@@ -51,8 +51,8 @@ fn main() {
let mut unsigned_tx = Transaction {
version: transaction::Version::TWO, // Post BIP-68.
lock_time: absolute::LockTime::ZERO, // Ignore the locktime.
- input: vec![input], // Input goes into index 0.
- output: vec![spend, change], // Outputs, order does not matter.
+ inputs: vec![input], // Input goes into index 0.
+ outputs: vec![spend, change], // Outputs, order does not matter.
};
let input_index = 0;
diff --git a/bitcoin/examples/sign-tx-taproot.rs b/bitcoin/examples/sign-tx-taproot.rs
index 077aa38c..7f1ab505 100644
--- a/bitcoin/examples/sign-tx-taproot.rs
+++ b/bitcoin/examples/sign-tx-taproot.rs
@@ -51,8 +51,8 @@ fn main() {
let mut unsigned_tx = Transaction {
version: transaction::Version::TWO, // Post BIP-68.
lock_time: absolute::LockTime::ZERO, // Ignore the locktime.
- input: vec![input], // Input goes into index 0.
- output: vec![spend, change], // Outputs, order does not matter.
+ inputs: vec![input], // Input goes into index 0.
+ outputs: vec![spend, change], // Outputs, order does not matter.
};
let input_index = 0;
diff --git a/bitcoin/examples/taproot-psbt-simple.rs b/bitcoin/examples/taproot-psbt-simple.rs
index 7e152bb7..f9e5814d 100644
--- a/bitcoin/examples/taproot-psbt-simple.rs
+++ b/bitcoin/examples/taproot-psbt-simple.rs
@@ -196,8 +196,8 @@ fn main() {
let unsigned_tx = Transaction {
version: transaction::Version::TWO, // Post BIP 68.
lock_time: absolute::LockTime::ZERO, // Ignore the locktime.
- input: inputs, // Input is 0-indexed.
- output: vec![spend, change], // Outputs, order does not matter.
+ inputs, // Input is 0-indexed.
+ outputs: vec![spend, change], // Outputs, order does not matter.
};
// Now we'll start the PSBT workflow.
diff --git a/bitcoin/examples/taproot-psbt.rs b/bitcoin/examples/taproot-psbt.rs
index ed149d5d..c2aa11a7 100644
--- a/bitcoin/examples/taproot-psbt.rs
+++ b/bitcoin/examples/taproot-psbt.rs
@@ -230,13 +230,13 @@ fn generate_bip86_key_spend_tx(
let tx1 = Transaction {
version: transaction::Version::TWO,
lock_time: absolute::LockTime::ZERO,
- input: vec![TxIn {
+ inputs: vec![TxIn {
previous_output: OutPoint { txid: input_utxo.txid.parse()?, vout: input_utxo.vout },
script_sig: ScriptBuf::new(),
sequence: bitcoin::Sequence(0xFFFFFFFF), // Ignore nSequence.
witness: Witness::default(),
}],
- output: outputs,
+ outputs,
};
let mut psbt = Psbt::from_unsigned_tx(tx1)?;
@@ -427,13 +427,13 @@ impl BenefactorWallet {
let next_tx = Transaction {
version: transaction::Version::TWO,
lock_time,
- input: vec![TxIn {
+ inputs: vec![TxIn {
previous_output: OutPoint { txid: tx.compute_txid(), vout: 0 },
script_sig: ScriptBuf::new(),
sequence: bitcoin::Sequence(0xFFFFFFFD), // enable locktime and opt-in RBF
witness: Witness::default(),
}],
- output: vec![],
+ outputs: vec![],
};
let mut next_psbt = Psbt::from_unsigned_tx(next_tx)?;
let mut origins = BTreeMap::new();
@@ -513,7 +513,7 @@ impl BenefactorWallet {
taproot_spend_info.merkle_root(),
);
- psbt.unsigned_tx.output =
+ psbt.unsigned_tx.outputs =
vec![TxOut { script_pubkey: output_script_pubkey.clone(), value: output_value }];
psbt.outputs = vec![Output::default()];
psbt.unsigned_tx.lock_time = absolute::LockTime::ZERO;
@@ -577,13 +577,13 @@ impl BenefactorWallet {
let next_tx = Transaction {
version: transaction::Version::TWO,
lock_time,
- input: vec![TxIn {
+ inputs: vec![TxIn {
previous_output: OutPoint { txid: tx.compute_txid(), vout: 0 },
script_sig: ScriptBuf::new(),
sequence: bitcoin::Sequence(0xFFFFFFFD), // enable locktime and opt-in RBF
witness: Witness::default(),
}],
- output: vec![],
+ outputs: vec![],
};
let mut next_psbt = Psbt::from_unsigned_tx(next_tx)?;
let mut origins = BTreeMap::new();
@@ -650,7 +650,7 @@ impl BeneficiaryWallet {
let input_script_pubkey =
psbt.inputs[0].witness_utxo.as_ref().unwrap().script_pubkey.clone();
psbt.unsigned_tx.lock_time = lock_time;
- psbt.unsigned_tx.output = vec![TxOut {
+ psbt.unsigned_tx.outputs = vec![TxOut {
script_pubkey: to_address.script_pubkey(),
value: (input_value - ABSOLUTE_FEES)
.expect("ABSOLUTE_FEES must be set below input amount"),
diff --git a/bitcoin/src/bip152.rs b/bitcoin/src/bip152.rs
index 289c7097..de852123 100644
--- a/bitcoin/src/bip152.rs
+++ b/bitcoin/src/bip152.rs
@@ -242,7 +242,7 @@ impl HeaderAndShortIds {
1 => {
// strip witness for version 1
let mut no_witness = tx.clone();
- no_witness.input.iter_mut().for_each(|i| i.witness.clear());
+ no_witness.inputs.iter_mut().for_each(|i| i.witness.clear());
no_witness
}
// > Transactions inside cmpctblock messages (both those used as direct
@@ -471,13 +471,13 @@ mod test {
Transaction {
version: transaction::Version::ONE,
lock_time: absolute::LockTime::from_consensus(2),
- input: vec![TxIn {
+ inputs: vec![TxIn {
previous_output: OutPoint::new(dummy_txid, 0),
script_sig: ScriptBuf::new(),
sequence: Sequence(1),
witness: Witness::new(),
}],
- output: vec![TxOut { value: Amount::ONE_SAT, script_pubkey: ScriptBuf::new() }],
+ outputs: vec![TxOut { value: Amount::ONE_SAT, script_pubkey: ScriptBuf::new() }],
}
}
diff --git a/bitcoin/src/bip158.rs b/bitcoin/src/bip158.rs
index 8926ba6d..3de70f26 100644
--- a/bitcoin/src/bip158.rs
+++ b/bitcoin/src/bip158.rs
@@ -207,7 +207,7 @@ impl<'a, W: Write> BlockFilterWriter<'a, W> {
/// Adds output scripts of the block to filter (excluding OP_RETURN scripts).
pub fn add_output_scripts(&mut self) {
for transaction in self.block.transactions() {
- for output in &transaction.output {
+ for output in &transaction.outputs {
if !output.script_pubkey.is_op_return() {
self.add_element(output.script_pubkey.as_bytes());
}
@@ -226,7 +226,7 @@ impl<'a, W: Write> BlockFilterWriter<'a, W> {
.transactions()
.iter()
.skip(1) // skip coinbase
- .flat_map(|t| t.input.iter().map(|i| &i.previous_output))
+ .flat_map(|t| t.inputs.iter().map(|i| &i.previous_output))
.map(script_for_coin)
{
match script {
@@ -624,7 +624,7 @@ mod test {
let mut txmap = HashMap::new();
let mut si = scripts.iter();
for tx in block.transactions().iter().skip(1) {
- for input in tx.input.iter() {
+ for input in tx.inputs.iter() {
txmap.insert(
input.previous_output,
ScriptBuf::from(hex(si.next().unwrap().as_str().unwrap())),
diff --git a/bitcoin/src/blockdata/block.rs b/bitcoin/src/blockdata/block.rs
index 3411a4a0..7528a232 100644
--- a/bitcoin/src/blockdata/block.rs
+++ b/bitcoin/src/blockdata/block.rs
@@ -186,7 +186,7 @@ fn check_merkle_root(header: &Header, transactions: &[Transaction]) -> bool {
// Returns the Merkle root if it was computed (so it can be cached in `assume_checked`).
fn check_witness_commitment(transactions: &[Transaction]) -> (bool, Option<WitnessMerkleNode>) {
// Witness commitment is optional if there are no transactions using SegWit in the block.
- if transactions.iter().all(|t| t.input.iter().all(|i| i.witness.is_empty())) {
+ if transactions.iter().all(|t| t.inputs.iter().all(|i| i.witness.is_empty())) {
return (true, None);
}
@@ -198,7 +198,7 @@ fn check_witness_commitment(transactions: &[Transaction]) -> (bool, Option<Witne
let coinbase = transactions[0].clone();
if let Some(commitment) = witness_commitment_from_coinbase(&coinbase) {
// Witness reserved value is in coinbase input witness.
- let witness_vec: Vec<_> = coinbase.input[0].witness.iter().collect();
+ let witness_vec: Vec<_> = coinbase.inputs[0].witness.iter().collect();
if witness_vec.len() == 1 && witness_vec[0].len() == 32 {
if let Some((witness_root, witness_commitment)) =
compute_witness_commitment(transactions, witness_vec[0])
@@ -224,12 +224,12 @@ fn witness_commitment_from_coinbase(coinbase: &Transaction) -> Option<WitnessCom
// Commitment is in the last output that starts with magic bytes.
if let Some(pos) = coinbase
- .output
+ .outputs
.iter()
.rposition(|o| o.script_pubkey.len() >= 38 && o.script_pubkey.as_bytes()[0..6] == MAGIC)
{
let bytes =
- <[u8; 32]>::try_from(&coinbase.output[pos].script_pubkey.as_bytes()[6..38]).unwrap();
+ <[u8; 32]>::try_from(&coinbase.outputs[pos].script_pubkey.as_bytes()[6..38]).unwrap();
Some(WitnessCommitment::from_byte_array(bytes))
} else {
None
@@ -804,7 +804,7 @@ mod tests {
let non_coinbase_tx = Transaction {
version: primitives::transaction::Version::TWO,
lock_time: crate::absolute::LockTime::ZERO,
- input: vec![TxIn {
+ inputs: vec![TxIn {
previous_output: OutPoint {
txid: Txid::from_byte_array([1; 32]), // Not all zeros
vout: 0,
@@ -813,7 +813,7 @@ mod tests {
sequence: Sequence::ENABLE_LOCKTIME_AND_RBF,
witness: Witness::new(),
}],
- output: vec![TxOut { value: Amount::ONE_BTC, script_pubkey: ScriptBuf::new() }],
+ outputs: vec![TxOut { value: Amount::ONE_BTC, script_pubkey: ScriptBuf::new() }],
};
let transactions = vec![non_coinbase_tx];
@@ -880,7 +880,7 @@ mod tests {
let non_coinbase_tx = Transaction {
version: primitives::transaction::Version::TWO,
lock_time: crate::absolute::LockTime::ZERO,
- input: vec![TxIn {
+ inputs: vec![TxIn {
previous_output: OutPoint {
txid: Txid::from_byte_array([1; 32]), // Not all zeros
vout: 0,
@@ -889,7 +889,7 @@ mod tests {
sequence: Sequence::ENABLE_LOCKTIME_AND_RBF,
witness: Witness::new(),
}],
- output: vec![TxOut { value: Amount::ONE_BTC, script_pubkey: ScriptBuf::new() }],
+ outputs: vec![TxOut { value: Amount::ONE_BTC, script_pubkey: ScriptBuf::new() }],
};
let invalid_coinbase_result = Block::new_checked(header, vec![non_coinbase_tx]);
diff --git a/bitcoin/src/blockdata/constants.rs b/bitcoin/src/blockdata/constants.rs
index 7fe76a89..cd5cc668 100644
--- a/bitcoin/src/blockdata/constants.rs
+++ b/bitcoin/src/blockdata/constants.rs
@@ -79,8 +79,8 @@ fn bitcoin_genesis_tx(params: &Params) -> Transaction {
let mut ret = Transaction {
version: transaction::Version::ONE,
lock_time: absolute::LockTime::ZERO,
- input: vec![],
- output: vec![],
+ inputs: vec![],
+ outputs: vec![],
};
let (in_script, out_script) = {
@@ -105,14 +105,14 @@ fn bitcoin_genesis_tx(params: &Params) -> Transaction {
}
};
- ret.input.push(TxIn {
+ ret.inputs.push(TxIn {
previous_output: OutPoint::COINBASE_PREVOUT,
script_sig: in_script,
sequence: Sequence::MAX,
witness: Witness::default(),
});
- ret.output.push(TxOut { value: Amount::FIFTY_BTC, script_pubkey: out_script });
+ ret.outputs.push(TxOut { value: Amount::FIFTY_BTC, script_pubkey: out_script });
// end
ret
@@ -277,17 +277,17 @@ mod test {
let gen = bitcoin_genesis_tx(&Params::MAINNET);
assert_eq!(gen.version, transaction::Version::ONE);
- assert_eq!(gen.input.len(), 1);
- assert_eq!(gen.input[0].previous_output.txid, Txid::COINBASE_PREVOUT);
- assert_eq!(gen.input[0].previous_output.vout, 0xFFFFFFFF);
- assert_eq!(serialize(&gen.input[0].script_sig),
+ assert_eq!(gen.inputs.len(), 1);
+ assert_eq!(gen.inputs[0].previous_output.txid, Txid::COINBASE_PREVOUT);
+ assert_eq!(gen.inputs[0].previous_output.vout, 0xFFFFFFFF);
+ assert_eq!(serialize(&gen.inputs[0].script_sig),
hex!("4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73"));
- assert_eq!(gen.input[0].sequence, Sequence::MAX);
- assert_eq!(gen.output.len(), 1);
- assert_eq!(serialize(&gen.output[0].script_pubkey),
+ assert_eq!(gen.inputs[0].sequence, Sequence::MAX);
+ assert_eq!(gen.outputs.len(), 1);
+ assert_eq!(serialize(&gen.outputs[0].script_pubkey),
hex!("434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac"));
- assert_eq!(gen.output[0].value, "50 BTC".parse::<Amount>().unwrap());
+ assert_eq!(gen.outputs[0].value, "50 BTC".parse::<Amount>().unwrap());
assert_eq!(gen.lock_time, absolute::LockTime::ZERO);
assert_eq!(
diff --git a/bitcoin/src/blockdata/transaction.rs b/bitcoin/src/blockdata/transaction.rs
index 999696b7..246ff2d4 100644
--- a/bitcoin/src/blockdata/transaction.rs
+++ b/bitcoin/src/blockdata/transaction.rs
@@ -351,11 +351,11 @@ impl TransactionExt for Transaction {
fn base_size(&self) -> usize {
let mut size: usize = 4; // Serialized length of a u32 for the version number.
- size += compact_size::encoded_size(self.input.len());
- size += self.input.iter().map(|input| input.base_size()).sum::<usize>();
+ size += compact_size::encoded_size(self.inputs.len());
+ size += self.inputs.iter().map(|input| input.base_size()).sum::<usize>();
- size += compact_size::encoded_size(self.output.len());
- size += self.output.iter().map(|output| output.size()).sum::<usize>();
+ size += compact_size::encoded_size(self.outputs.len());
+ size += self.outputs.iter().map(|output| output.size()).sum::<usize>();
size + absolute::LockTime::SIZE
}
@@ -369,15 +369,15 @@ impl TransactionExt for Transaction {
size += 2; // 1 byte for the marker and 1 for the flag.
}
- size += compact_size::encoded_size(self.input.len());
+ size += compact_size::encoded_size(self.inputs.len());
size += self
- .input
+ .inputs
.iter()
.map(|input| if uses_segwit { input.total_size() } else { input.base_size() })
.sum::<usize>();
- size += compact_size::encoded_size(self.output.len());
- size += self.output.iter().map(|output| output.size()).sum::<usize>();
+ size += compact_size::encoded_size(self.outputs.len());
+ size += self.outputs.iter().map(|output| output.size()).sum::<usize>();
size + absolute::LockTime::SIZE
}
@@ -390,10 +390,10 @@ impl TransactionExt for Transaction {
#[doc(alias = "is_coin_base")] // method previously had this name
fn is_coinbase(&self) -> bool {
- self.input.len() == 1 && self.input[0].previous_output == OutPoint::COINBASE_PREVOUT
+ self.inputs.len() == 1 && self.inputs[0].previous_output == OutPoint::COINBASE_PREVOUT
}
- fn is_explicitly_rbf(&self) -> bool { self.input.iter().any(|input| input.sequence.is_rbf()) }
+ fn is_explicitly_rbf(&self) -> bool { self.inputs.iter().any(|input| input.sequence.is_rbf()) }
fn is_absolute_timelock_satisfied(&self, height: Height, time: MedianTimePast) -> bool {
if !self.is_lock_time_enabled() {
@@ -402,10 +402,10 @@ impl TransactionExt for Transaction {
self.lock_time.is_satisfied_by(height, time)
}
- fn is_lock_time_enabled(&self) -> bool { self.input.iter().any(|i| i.enables_lock_time()) }
+ fn is_lock_time_enabled(&self) -> bool { self.inputs.iter().any(|i| i.enables_lock_time()) }
fn script_pubkey_lens(&self) -> TxOutToScriptPubkeyLengthIter<'_> {
- TxOutToScriptPubkeyLengthIter { inner: self.output.iter() }
+ TxOutToScriptPubkeyLengthIter { inner: self.outputs.iter() }
}
fn total_sigop_cost<S>(&self, mut spent: S) -> usize
@@ -421,16 +421,16 @@ impl TransactionExt for Transaction {
#[inline]
fn tx_in(&self, input_index: usize) -> Result<&TxIn, InputsIndexError> {
- self.input
+ self.inputs
.get(input_index)
- .ok_or(IndexOutOfBoundsError { index: input_index, length: self.input.len() }.into())
+ .ok_or(IndexOutOfBoundsError { index: input_index, length: self.inputs.len() }.into())
}
#[inline]
fn tx_out(&self, output_index: usize) -> Result<&TxOut, OutputsIndexError> {
- self.output
+ self.outputs
.get(output_index)
- .ok_or(IndexOutOfBoundsError { index: output_index, length: self.output.len() }.into())
+ .ok_or(IndexOutOfBoundsError { index: output_index, length: self.outputs.len() }.into())
}
}
@@ -472,11 +472,11 @@ impl TransactionExtPriv for Transaction {
/// Gets the sigop count.
fn count_p2pk_p2pkh_sigops(&self) -> usize {
let mut count: usize = 0;
- for input in &self.input {
+ for input in &self.inputs {
// 0 for p2wpkh, p2wsh, and p2sh (including wrapped SegWit).
count = count.saturating_add(input.script_sig.count_sigops_legacy());
}
- for output in &self.output {
+ for output in &self.outputs {
count = count.saturating_add(output.script_pubkey.count_sigops_legacy());
}
count
@@ -499,7 +499,7 @@ impl TransactionExtPriv for Transaction {
}
let mut count: usize = 0;
- for input in &self.input {
+ for input in &self.inputs {
if let Some(prevout) = spent(&input.previous_output) {
count = count.saturating_add(count_sigops(&prevout, input));
}
@@ -546,7 +546,7 @@ impl TransactionExtPriv for Transaction {
}
let mut count: usize = 0;
- for input in &self.input {
+ for input in &self.inputs {
if let Some(prevout) = spent(&input.previous_output) {
count = count.saturating_add(count_sigops(prevout, input));
}
@@ -557,12 +557,12 @@ impl TransactionExtPriv for Transaction {
/// Returns whether or not to serialize transaction as specified in BIP-144.
// This is duplicated in `primitives`, if you change it please do so in both places.
fn uses_segwit_serialization(&self) -> bool {
- if self.input.iter().any(|input| !input.witness.is_empty()) {
+ if self.inputs.iter().any(|input| !input.witness.is_empty()) {
return true;
}
// To avoid serialization ambiguity, no inputs means we use BIP141 serialization (see
// `Transaction` docs for full explanation).
- self.input.is_empty()
+ self.inputs.is_empty()
}
}
@@ -696,15 +696,15 @@ impl Encodable for Transaction {
// Legacy transaction serialization format only includes inputs and outputs.
if !self.uses_segwit_serialization() {
- len += self.input.consensus_encode(w)?;
- len += self.output.consensus_encode(w)?;
+ len += self.inputs.consensus_encode(w)?;
+ len += self.outputs.consensus_encode(w)?;
} else {
// BIP-141 (SegWit) transaction serialization also includes marker, flag, and witness data.
len += SEGWIT_MARKER.consensus_encode(w)?;
len += SEGWIT_FLAG.consensus_encode(w)?;
- len += self.input.consensus_encode(w)?;
- len += self.output.consensus_encode(w)?;
- for input in &self.input {
+ len += self.inputs.consensus_encode(w)?;
+ len += self.outputs.consensus_encode(w)?;
+ for input in &self.inputs {
len += input.witness.consensus_encode(w)?;
}
}
@@ -718,27 +718,27 @@ impl Decodable for Transaction {
r: &mut R,
) -> Result<Self, encode::Error> {
let version = Version::consensus_decode_from_finite_reader(r)?;
- let input = Vec::<TxIn>::consensus_decode_from_finite_reader(r)?;
+ let inputs = Vec::<TxIn>::consensus_decode_from_finite_reader(r)?;
// SegWit
- if input.is_empty() {
+ if inputs.is_empty() {
let segwit_flag = u8::consensus_decode_from_finite_reader(r)?;
match segwit_flag {
// BIP144 input witnesses
1 => {
- let mut input = Vec::<TxIn>::consensus_decode_from_finite_reader(r)?;
- let output = Vec::<TxOut>::consensus_decode_from_finite_reader(r)?;
- for txin in input.iter_mut() {
+ let mut inputs = Vec::<TxIn>::consensus_decode_from_finite_reader(r)?;
+ let outputs = Vec::<TxOut>::consensus_decode_from_finite_reader(r)?;
+ for txin in inputs.iter_mut() {
txin.witness = Decodable::consensus_decode_from_finite_reader(r)?;
}
- if !input.is_empty() && input.iter().all(|input| input.witness.is_empty()) {
+ if !inputs.is_empty() && inputs.iter().all(|input| input.witness.is_empty()) {
Err(consensus::parse_failed_error(
"witness flag set but no witnesses present",
))
} else {
Ok(Transaction {
version,
- input,
- output,
+ inputs,
+ outputs,
lock_time: Decodable::consensus_decode_from_finite_reader(r)?,
})
}
@@ -750,8 +750,8 @@ impl Decodable for Transaction {
} else {
Ok(Transaction {
version,
- input,
- output: Decodable::consensus_decode_from_finite_reader(r)?,
+ inputs,
+ outputs: Decodable::consensus_decode_from_finite_reader(r)?,
lock_time: Decodable::consensus_decode_from_finite_reader(r)?,
})
}
@@ -1179,7 +1179,7 @@ impl Coinbase {
///
/// This method is infallible because a valid coinbase transaction is guaranteed
/// to have exactly one input.
- pub fn first_input(&self) -> &TxIn { &self.0.input[0] }
+ pub fn first_input(&self) -> &TxIn { &self.0.inputs[0] }
/// Returns a reference to the underlying transaction.
///
@@ -1359,15 +1359,15 @@ mod tests {
// All these tests aren't really needed because if they fail, the hash check at the end
// will also fail. But these will show you where the failure is so I'll leave them in.
assert_eq!(realtx.version, Version::ONE);
- assert_eq!(realtx.input.len(), 1);
+ assert_eq!(realtx.inputs.len(), 1);
// In particular this one is easy to get backward -- in bitcoin hashes are encoded
// as little-endian 256-bit numbers rather than as data strings.
assert_eq!(
- format!("{:x}", realtx.input[0].previous_output.txid),
+ format!("{:x}", realtx.inputs[0].previous_output.txid),
"ce9ea9f6f5e422c6a9dbcddb3b9a14d1c78fab9ab520cb281aa2a74a09575da1".to_string()
);
- assert_eq!(realtx.input[0].previous_output.vout, 1);
- assert_eq!(realtx.output.len(), 1);
+ assert_eq!(realtx.inputs[0].previous_output.vout, 1);
+ assert_eq!(realtx.outputs.len(), 1);
assert_eq!(realtx.lock_time, absolute::LockTime::ZERO);
assert_eq!(
@@ -1407,15 +1407,15 @@ mod tests {
// All these tests aren't really needed because if they fail, the hash check at the end
// will also fail. But these will show you where the failure is so I'll leave them in.
assert_eq!(realtx.version, Version::TWO);
- assert_eq!(realtx.input.len(), 1);
+ assert_eq!(realtx.inputs.len(), 1);
// In particular this one is easy to get backward -- in bitcoin hashes are encoded
// as little-endian 256-bit numbers rather than as data strings.
assert_eq!(
- format!("{:x}", realtx.input[0].previous_output.txid),
+ format!("{:x}", realtx.inputs[0].previous_output.txid),
"7cac3cf9a112cf04901a51d605058615d56ffe6d04b45270e89d1720ea955859".to_string()
);
- assert_eq!(realtx.input[0].previous_output.vout, 1);
- assert_eq!(realtx.output.len(), 1);
+ assert_eq!(realtx.inputs[0].previous_output.vout, 1);
+ assert_eq!(realtx.outputs.len(), 1);
assert_eq!(realtx.lock_time, absolute::LockTime::ZERO);
assert_eq!(
@@ -1436,7 +1436,7 @@ mod tests {
// Construct a transaction without the witness data.
let mut tx_without_witness = realtx;
- tx_without_witness.input.iter_mut().for_each(|input| input.witness.clear());
+ tx_without_witness.inputs.iter_mut().for_each(|input| input.witness.clear());
assert_eq!(tx_without_witness.total_size(), tx_without_witness.total_size());
assert_eq!(tx_without_witness.total_size(), expected_strippedsize);
}
@@ -1476,8 +1476,8 @@ mod tests {
);
let tx: Transaction = deserialize(&tx_bytes).expect("deserialize tx");
- assert_eq!(tx.input.len(), 0);
- assert_eq!(tx.output.len(), 1);
+ assert_eq!(tx.inputs.len(), 0);
+ assert_eq!(tx.outputs.len(), 1);
let reser = serialize(&tx);
assert_eq!(tx_bytes, *reser);
@@ -1494,10 +1494,10 @@ mod tests {
"c3573dbea28ce24425c59a189391937e00d255150fa973d59d61caf3a06b601d"
);
// changing sigs does not affect it
- tx.input[0].script_sig = ScriptBuf::new();
+ tx.inputs[0].script_sig = ScriptBuf::new();
assert_eq!(old_ntxid, tx.compute_ntxid());
// changing pks does
- tx.output[0].script_pubkey = ScriptBuf::new();
+ tx.outputs[0].script_pubkey = ScriptBuf::new();
assert!(old_ntxid != tx.compute_ntxid());
}
@@ -1658,7 +1658,7 @@ mod tests {
spending
.verify(|point: &OutPoint| {
if let Some(tx) = spent.remove(&point.txid) {
- return tx.output.get(point.vout as usize).cloned();
+ return tx.outputs.get(point.vout as usize).cloned();
}
None
})
@@ -1666,27 +1666,27 @@ mod tests {
// test that we fail with repeated use of same input
let mut double_spending = spending.clone();
- let re_use = double_spending.input[0].clone();
- double_spending.input.push(re_use);
+ let re_use = double_spending.inputs[0].clone();
+ double_spending.inputs.push(re_use);
assert!(double_spending
.verify(|point: &OutPoint| {
if let Some(tx) = spent2.remove(&point.txid) {
- return tx.output.get(point.vout as usize).cloned();
+ return tx.outputs.get(point.vout as usize).cloned();
}
None
})
.is_err());
// test that we get a failure if we corrupt a signature
- let mut witness = spending.input[1].witness.to_vec();
+ let mut witness = spending.inputs[1].witness.to_vec();
witness[0][10] = 42;
- spending.input[1].witness = Witness::from_slice(&witness);
+ spending.inputs[1].witness = Witness::from_slice(&witness);
let error = spending
.verify(|point: &OutPoint| {
if let Some(tx) = spent3.remove(&point.txid) {
- return tx.output.get(point.vout as usize).cloned();
+ return tx.outputs.get(point.vout as usize).cloned();
}
None
})
@@ -1792,8 +1792,8 @@ mod tests {
let empty_transaction_weight = Transaction {
version: Version::TWO,
lock_time: absolute::LockTime::ZERO,
- input: vec![],
- output: vec![],
+ inputs: vec![],
+ outputs: vec![],
}
.weight();
@@ -1803,8 +1803,8 @@ mod tests {
assert_eq!(*is_segwit, tx.uses_segwit_serialization());
let mut calculated_weight = empty_transaction_weight
- + tx.input.iter().fold(Weight::ZERO, |sum, i| sum + txin_weight(i))
- + tx.output.iter().fold(Weight::ZERO, |sum, o| sum + o.weight());
+ + tx.inputs.iter().fold(Weight::ZERO, |sum, i| sum + txin_weight(i))
+ + tx.outputs.iter().fold(Weight::ZERO, |sum, o| sum + o.weight());
// The empty tx uses SegWit serialization but a legacy tx does not.
if !tx.uses_segwit_serialization() {
diff --git a/bitcoin/src/blockdata/witness.rs b/bitcoin/src/blockdata/witness.rs
index a4859a02..c5663789 100644
--- a/bitcoin/src/blockdata/witness.rs
+++ b/bitcoin/src/blockdata/witness.rs
@@ -489,16 +489,16 @@ mod test {
let tx: Transaction = deserialize(&tx_bytes).unwrap();
let expected_wit = ["304502210084622878c94f4c356ce49c8e33a063ec90f6ee9c0208540888cfab056cd1fca9022014e8dbfdfa46d318c6887afd92dcfa54510e057565e091d64d2ee3a66488f82c01", "026e181ffb98ebfe5a64c983073398ea4bcd1548e7b971b4c175346a25a1c12e95"];
- for (i, wit_el) in tx.input[0].witness.iter().enumerate() {
+ for (i, wit_el) in tx.inputs[0].witness.iter().enumerate() {
assert_eq!(expected_wit[i], wit_el.to_lower_hex_string());
}
- assert_eq!(expected_wit[1], tx.input[0].witness.last().unwrap().to_lower_hex_string());
- assert_eq!(expected_wit[0], tx.input[0].witness.get_back(1).unwrap().to_lower_hex_string());
- assert_eq!(expected_wit[0], tx.input[0].witness.get(0).unwrap().to_lower_hex_string());
- assert_eq!(expected_wit[1], tx.input[0].witness.get(1).unwrap().to_lower_hex_string());
- assert_eq!(None, tx.input[0].witness.get(2));
- assert_eq!(expected_wit[0], tx.input[0].witness[0].to_lower_hex_string());
- assert_eq!(expected_wit[1], tx.input[0].witness[1].to_lower_hex_string());
+ assert_eq!(expected_wit[1], tx.inputs[0].witness.last().unwrap().to_lower_hex_string());
+ assert_eq!(expected_wit[0], tx.inputs[0].witness.get_back(1).unwrap().to_lower_hex_string());
+ assert_eq!(expected_wit[0], tx.inputs[0].witness.get(0).unwrap().to_lower_hex_string());
+ assert_eq!(expected_wit[1], tx.inputs[0].witness.get(1).unwrap().to_lower_hex_string());
+ assert_eq!(None, tx.inputs[0].witness.get(2));
+ assert_eq!(expected_wit[0], tx.inputs[0].witness[0].to_lower_hex_string());
+ assert_eq!(expected_wit[1], tx.inputs[0].witness[1].to_lower_hex_string());
let tx_bytes_back = serialize(&tx);
assert_eq!(tx_bytes_back, tx_bytes);
diff --git a/bitcoin/src/consensus_validation.rs b/bitcoin/src/consensus_validation.rs
index 0c2f6e5d..aee97852 100644
--- a/bitcoin/src/consensus_validation.rs
+++ b/bitcoin/src/consensus_validation.rs
@@ -101,7 +101,7 @@ where
{
let serialized_tx = encode::serialize(tx);
let flags: u32 = flags.into();
- for (idx, input) in tx.input.iter().enumerate() {
+ for (idx, input) in tx.inputs.iter().enumerate() {
if let Some(output) = spent(&input.previous_output) {
verify_script_with_flags(
&output.script_pubkey,
diff --git a/bitcoin/src/crypto/sighash.rs b/bitcoin/src/crypto/sighash.rs
index 66478194..8ffeb730 100644
--- a/bitcoin/src/crypto/sighash.rs
+++ b/bitcoin/src/crypto/sighash.rs
@@ -231,7 +231,7 @@ where
{
fn check_all(&self, tx: &Transaction) -> Result<(), PrevoutsSizeError> {
if let Prevouts::All(prevouts) = self {
- if prevouts.len() != tx.input.len() {
+ if prevouts.len() != tx.inputs.len() {
return Err(PrevoutsSizeError);
}
}
@@ -710,11 +710,11 @@ impl<R: Borrow<Transaction>> SighashCache<R> {
let mut enc = sha256::Hash::engine();
self.tx
.borrow()
- .output
+ .outputs
.get(input_index)
.ok_or(TaprootError::SingleMissingOutput(SingleMissingOutputError {
input_index,
- outputs_length: self.tx.borrow().output.len(),
+ outputs_length: self.tx.borrow().outputs.len(),
}))
.map_err(SigningDataError::Sighash)?
.consensus_encode(&mut enc)?;
@@ -853,10 +853,10 @@ impl<R: Borrow<Transaction>> SighashCache<R> {
if sighash != EcdsaSighashType::Single && sighash != EcdsaSighashType::None {
self.segwit_cache().outputs.consensus_encode(writer)?;
- } else if sighash == EcdsaSighashType::Single && input_index < self.tx.borrow().output.len()
+ } else if sighash == EcdsaSighashType::Single && input_index < self.tx.borrow().outputs.len()
{
let mut single_enc = LegacySighash::engine();
- self.tx.borrow().output[input_index].consensus_encode(&mut single_enc)?;
+ self.tx.borrow().outputs[input_index].consensus_encode(&mut single_enc)?;
let hash = LegacySighash::from_engine(single_enc);
writer.write_all(hash.as_byte_array())?;
} else {
@@ -954,7 +954,7 @@ impl<R: Borrow<Transaction>> SighashCache<R> {
if is_invalid_use_of_sighash_single(
sighash_type,
input_index,
- self.tx.borrow().output.len(),
+ self.tx.borrow().outputs.len(),
) {
// We cannot correctly handle the SIGHASH_SINGLE bug here because usage of this function
// will result in the data written to the writer being hashed, however the correct
@@ -979,12 +979,12 @@ impl<R: Borrow<Transaction>> SighashCache<R> {
// Add all inputs necessary..
if anyone_can_pay {
writer.emit_compact_size(1u8)?;
- self_.input[input_index].previous_output.consensus_encode(writer)?;
+ self_.inputs[input_index].previous_output.consensus_encode(writer)?;
script_pubkey.consensus_encode(writer)?;
- self_.input[input_index].sequence.consensus_encode(writer)?;
+ self_.inputs[input_index].sequence.consensus_encode(writer)?;
} else {
- writer.emit_compact_size(self_.input.len())?;
- for (n, input) in self_.input.iter().enumerate() {
+ writer.emit_compact_size(self_.inputs.len())?;
+ for (n, input) in self_.inputs.iter().enumerate() {
input.previous_output.consensus_encode(writer)?;
if n == input_index {
script_pubkey.consensus_encode(writer)?;
@@ -1004,19 +1004,19 @@ impl<R: Borrow<Transaction>> SighashCache<R> {
// ..then all outputs
match sighash {
EcdsaSighashType::All => {
- self_.output.consensus_encode(writer)?;
+ self_.outputs.consensus_encode(writer)?;
}
EcdsaSighashType::Single => {
// sign all outputs up to and including this one, but erase
// all of them except for this one
- let count = input_index.min(self_.output.len() - 1);
+ let count = input_index.min(self_.outputs.len() - 1);
writer.emit_compact_size(count + 1)?;
for _ in 0..count {
// consensus encoding of the "NULL txout" - max amount, empty script_pubkey
writer
.write_all(&[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00])?;
}
- self_.output[count].consensus_encode(writer)?;
+ self_.outputs[count].consensus_encode(writer)?;
}
EcdsaSighashType::None => {
writer.emit_compact_size(0u8)?;
@@ -1088,7 +1088,7 @@ impl<R: Borrow<Transaction>> SighashCache<R> {
common_cache.get_or_insert_with(|| {
let mut enc_prevouts = sha256::Hash::engine();
let mut enc_sequences = sha256::Hash::engine();
- for txin in tx.input.iter() {
+ for txin in tx.inputs.iter() {
txin.previous_output.consensus_encode(&mut enc_prevouts).unwrap();
txin.sequence.consensus_encode(&mut enc_sequences).unwrap();
}
@@ -1097,7 +1097,7 @@ impl<R: Borrow<Transaction>> SighashCache<R> {
sequences: sha256::Hash::from_engine(enc_sequences),
outputs: {
let mut enc = sha256::Hash::engine();
- for txout in tx.output.iter() {
+ for txout in tx.outputs.iter() {
txout.consensus_encode(&mut enc).unwrap();
}
sha256::Hash::from_engine(enc)
@@ -1166,7 +1166,7 @@ impl<R: BorrowMut<Transaction>> SighashCache<R> {
/// [`SegWit v0`]: <https://github.com/rust-bitcoin/rust-bitcoin/blob/master/bitcoin/examples/sign-tx-segwit-v0.rs>
/// [`taproot`]: <https://github.com/rust-bitcoin/rust-bitcoin/blob/master/bitcoin/examples/sign-tx-taproot.rs>
pub fn witness_mut(&mut self, input_index: usize) -> Option<&mut Witness> {
- self.tx.borrow_mut().input.get_mut(input_index).map(|i| &mut i.witness)
+ self.tx.borrow_mut().inputs.get_mut(input_index).map(|i| &mut i.witness)
}
}
@@ -1551,8 +1551,8 @@ mod tests {
let tx = Transaction {
version: transaction::Version::ONE,
lock_time: absolute::LockTime::ZERO,
- input: vec![TxIn::EMPTY_COINBASE, TxIn::EMPTY_COINBASE],
- output: vec![DUMMY_TXOUT],
+ inputs: vec![TxIn::EMPTY_COINBASE, TxIn::EMPTY_COINBASE],
+ outputs: vec![DUMMY_TXOUT],
};
let script = ScriptBuf::new();
let cache = SighashCache::new(&tx);
@@ -1747,8 +1747,8 @@ mod tests {
let dumb_tx = Transaction {
version: transaction::Version::TWO,
lock_time: absolute::LockTime::ZERO,
- input: vec![TxIn::EMPTY_COINBASE],
- output: vec![],
+ inputs: vec![TxIn::EMPTY_COINBASE],
+ outputs: vec![],
};
let mut c = SighashCache::new(&dumb_tx);
diff --git a/bitcoin/src/ex b/bitcoin/src/ex
new file mode 100644
index 00000000..32f64f4d
--- /dev/null
+++ b/bitcoin/src/ex
@@ -0,0 +1 @@
+t
\ No newline at end of file
diff --git a/bitcoin/src/psbt/map/global.rs b/bitcoin/src/psbt/map/global.rs
index 866c77d1..f3ca7b24 100644
--- a/bitcoin/src/psbt/map/global.rs
+++ b/bitcoin/src/psbt/map/global.rs
@@ -31,8 +31,8 @@ impl Map for Psbt {
// without witnesses.
let mut ret = Vec::new();
ret.extend(encode::serialize(&self.unsigned_tx.version));
- ret.extend(encode::serialize(&self.unsigned_tx.input));
- ret.extend(encode::serialize(&self.unsigned_tx.output));
+ ret.extend(encode::serialize(&self.unsigned_tx.inputs));
+ ret.extend(encode::serialize(&self.unsigned_tx.outputs));
ret.extend(encode::serialize(&self.unsigned_tx.lock_time));
ret
},
@@ -96,8 +96,8 @@ impl Psbt {
// properly.
tx = Some(Transaction {
version: Decodable::consensus_decode(&mut decoder)?,
- input: Decodable::consensus_decode(&mut decoder)?,
- output: Decodable::consensus_decode(&mut decoder)?,
+ inputs: Decodable::consensus_decode(&mut decoder)?,
+ outputs: Decodable::consensus_decode(&mut decoder)?,
lock_time: Decodable::consensus_decode(&mut decoder)?,
});
diff --git a/bitcoin/src/psbt/mod.rs b/bitcoin/src/psbt/mod.rs
index f6423170..3ba09f28 100644
--- a/bitcoin/src/psbt/mod.rs
+++ b/bitcoin/src/psbt/mod.rs
@@ -73,13 +73,13 @@ impl Psbt {
///
/// The function panics if the length of transaction inputs is not equal to the length of PSBT inputs.
pub fn iter_funding_utxos(&self) -> impl Iterator<Item = Result<&TxOut, Error>> {
- assert_eq!(self.inputs.len(), self.unsigned_tx.input.len());
- self.unsigned_tx.input.iter().zip(&self.inputs).map(|(tx_input, psbt_input)| {
+ assert_eq!(self.inputs.len(), self.unsigned_tx.inputs.len());
+ self.unsigned_tx.inputs.iter().zip(&self.inputs).map(|(tx_input, psbt_input)| {
match (&psbt_input.witness_utxo, &psbt_input.non_witness_utxo) {
(Some(witness_utxo), _) => Ok(witness_utxo),
(None, Some(non_witness_utxo)) => {
let vout = tx_input.previous_output.vout as usize;
- non_witness_utxo.output.get(vout).ok_or(Error::PsbtUtxoOutOfbounds)
+ non_witness_utxo.outputs.get(vout).ok_or(Error::PsbtUtxoOutOfbounds)
}
(None, None) => Err(Error::MissingUtxo),
}
@@ -88,7 +88,7 @@ impl Psbt {
/// Checks that unsigned transaction does not have scriptSig's or witness data.
fn unsigned_tx_checks(&self) -> Result<(), Error> {
- for txin in &self.unsigned_tx.input {
+ for txin in &self.unsigned_tx.inputs {
if !txin.script_sig.is_empty() {
return Err(Error::UnsignedTxHasScriptSigs);
}
@@ -108,8 +108,8 @@ impl Psbt {
/// If transactions is not unsigned.
pub fn from_unsigned_tx(tx: Transaction) -> Result<Self, Error> {
let psbt = Psbt {
- inputs: vec![Default::default(); tx.input.len()],
- outputs: vec![Default::default(); tx.output.len()],
+ inputs: vec![Default::default(); tx.inputs.len()],
+ outputs: vec![Default::default(); tx.outputs.len()],
unsigned_tx: tx,
xpub: Default::default(),
@@ -175,7 +175,7 @@ impl Psbt {
fn internal_extract_tx(self) -> Transaction {
let mut tx: Transaction = self.unsigned_tx;
- for (vin, psbtin) in tx.input.iter_mut().zip(self.inputs.into_iter()) {
+ for (vin, psbtin) in tx.inputs.iter_mut().zip(self.inputs.into_iter()) {
vin.script_sig = psbtin.final_script_sig.unwrap_or_default();
vin.witness = psbtin.final_script_witness.unwrap_or_default();
}
@@ -618,8 +618,8 @@ impl Psbt {
let utxo = if let Some(witness_utxo) = &input.witness_utxo {
witness_utxo
} else if let Some(non_witness_utxo) = &input.non_witness_utxo {
- let vout = self.unsigned_tx.input[input_index].previous_output.vout;
- &non_witness_utxo.output[vout as usize]
+ let vout = self.unsigned_tx.inputs[input_index].previous_output.vout;
+ &non_witness_utxo.outputs[vout as usize]
} else {
return Err(SignError::MissingSpendUtxo);
};
@@ -648,10 +648,10 @@ impl Psbt {
});
}
- if input_index >= self.unsigned_tx.input.len() {
+ if input_index >= self.unsigned_tx.inputs.len() {
return Err(IndexOutOfBoundsError::TxInput {
index: input_index,
- length: self.unsigned_tx.input.len(),
+ length: self.unsigned_tx.inputs.len(),
});
}
@@ -718,7 +718,7 @@ impl Psbt {
inputs = inputs.checked_add(utxo?.value).ok_or(Error::FeeOverflow)?;
}
let mut outputs = Amount::ZERO;
- for out in &self.unsigned_tx.output {
+ for out in &self.unsigned_tx.outputs {
outputs = outputs.checked_add(out.value).ok_or(Error::FeeOverflow)?;
}
inputs.checked_sub(outputs).ok_or(Error::NegativeFee)
@@ -1360,7 +1360,7 @@ mod tests {
unsigned_tx: Transaction {
version: transaction::Version::TWO,
lock_time: absolute::LockTime::ZERO,
- input: vec![TxIn {
+ inputs: vec![TxIn {
previous_output: OutPoint {
txid: "f61b1742ca13176464adb3cb66050c00787bb3a4eead37e985f2df1e37718126"
.parse()
@@ -1371,7 +1371,7 @@ mod tests {
sequence: Sequence::ENABLE_LOCKTIME_NO_RBF,
witness: Witness::default(),
}],
- output: vec![TxOut {
+ outputs: vec![TxOut {
value: Amount::from_sat(output).unwrap(),
script_pubkey: ScriptBuf::from_hex_no_length_prefix(
"a9143545e6e33b832c47050f24d3eeb93c9c03948bc787",
@@ -1404,8 +1404,8 @@ mod tests {
unsigned_tx: Transaction {
version: transaction::Version::TWO,
lock_time: absolute::LockTime::ZERO,
- input: vec![],
- output: vec![],
+ inputs: vec![],
+ outputs: vec![],
},
xpub: Default::default(),
version: 0,
@@ -1536,7 +1536,7 @@ mod tests {
unsigned_tx: Transaction {
version: transaction::Version::TWO,
lock_time: absolute::LockTime::from_consensus(1257139),
- input: vec![TxIn {
+ inputs: vec![TxIn {
previous_output: OutPoint {
txid: "f61b1742ca13176464adb3cb66050c00787bb3a4eead37e985f2df1e37718126"
.parse()
@@ -1547,7 +1547,7 @@ mod tests {
sequence: Sequence::ENABLE_LOCKTIME_NO_RBF,
witness: Witness::default(),
}],
- output: vec![
+ outputs: vec![
TxOut {
value: Amount::from_sat_u32(99_999_699),
script_pubkey: ScriptBuf::from_hex_no_length_prefix(
@@ -1607,7 +1607,7 @@ mod tests {
let tx = Transaction {
version: transaction::Version::ONE,
lock_time: absolute::LockTime::ZERO,
- input: vec![TxIn {
+ inputs: vec![TxIn {
previous_output: OutPoint {
txid: "e567952fb6cc33857f392efa3a46c995a28f69cca4bb1b37e0204dab1ec7a389"
.parse()
@@ -1623,7 +1623,7 @@ mod tests {
"03d2e15674941bad4a996372cb87e1856d3652606d98562fe39c5e9e7e413f2105"
)]),
}],
- output: vec![TxOut {
+ outputs: vec![TxOut {
value: Amount::from_sat(190_303_501_938).unwrap(),
script_pubkey: ScriptBuf::from_hex_no_length_prefix(
"a914339725ba21efd62ac753a9bcd067d6c7a6a39d0587",
@@ -1664,9 +1664,9 @@ mod tests {
},
unsigned_tx: {
let mut unsigned = tx.clone();
- unsigned.input[0].previous_output.txid = tx.compute_txid();
- unsigned.input[0].script_sig = ScriptBuf::new();
- unsigned.input[0].witness = Witness::default();
+ unsigned.inputs[0].previous_output.txid = tx.compute_txid();
+ unsigned.inputs[0].script_sig = ScriptBuf::new();
+ unsigned.inputs[0].witness = Witness::default();
unsigned
},
proprietary: proprietary.clone(),
@@ -1788,7 +1788,7 @@ mod tests {
unsigned_tx: Transaction {
version: transaction::Version::TWO,
lock_time: absolute::LockTime::from_consensus(1257139),
- input: vec![
+ inputs: vec![
TxIn {
previous_output: OutPoint {
txid: "f61b1742ca13176464adb3cb66050c00787bb3a4eead37e985f2df1e37718126".parse().unwrap(),
@@ -1799,7 +1799,7 @@ mod tests {
witness: Witness::default(),
}
],
- output: vec![
+ outputs: vec![
TxOut {
value: Amount::from_sat_u32(99_999_699),
script_pubkey: ScriptBuf::from_hex_no_length_prefix("76a914d0c59903c5bac2868760e90fd521a4665aa7652088ac").unwrap(),
@@ -1820,7 +1820,7 @@ mod tests {
non_witness_utxo: Some(Transaction {
version: transaction::Version::ONE,
lock_time: absolute::LockTime::ZERO,
- input: vec![
+ inputs: vec![
TxIn {
previous_output: OutPoint {
txid: "e567952fb6cc33857f392efa3a46c995a28f69cca4bb1b37e0204dab1ec7a389".parse().unwrap(),
@@ -1846,7 +1846,7 @@ mod tests {
]),
}
],
- output: vec![
+ outputs: vec![
TxOut {
value: Amount::from_sat_u32(200_000_000),
script_pubkey: ScriptBuf::from_hex_no_length_prefix("76a91485cff1097fd9e008bb34af709c62197b38978a4888ac").unwrap(),
@@ -1918,11 +1918,11 @@ mod tests {
assert_eq!(psbt.inputs.len(), 1);
assert_eq!(psbt.outputs.len(), 2);
- let tx_input = &psbt.unsigned_tx.input[0];
+ let tx_input = &psbt.unsigned_tx.inputs[0];
let psbt_non_witness_utxo = psbt.inputs[0].non_witness_utxo.as_ref().unwrap();
assert_eq!(tx_input.previous_output.txid, psbt_non_witness_utxo.compute_txid());
- assert!(psbt_non_witness_utxo.output[tx_input.previous_output.vout as usize]
+ assert!(psbt_non_witness_utxo.outputs[tx_input.previous_output.vout as usize]
.script_pubkey
.is_p2pkh());
assert_eq!(
@@ -2149,7 +2149,7 @@ mod tests {
unsigned_tx: Transaction {
version: transaction::Version::TWO,
lock_time: absolute::LockTime::from_consensus(1257139),
- input: vec![
+ inputs: vec![
TxIn {
previous_output: OutPoint {
txid: "f61b1742ca13176464adb3cb66050c00787bb3a4eead37e985f2df1e37718126".parse().unwrap(),
@@ -2160,7 +2160,7 @@ mod tests {
witness: Witness::default(),
}
],
- output: vec![
+ outputs: vec![
TxOut {
value: Amount::from_sat_u32(99_999_699),
script_pubkey: ScriptBuf::from_hex_no_length_prefix("76a914d0c59903c5bac2868760e90fd521a4665aa7652088ac").unwrap(),
@@ -2181,7 +2181,7 @@ mod tests {
non_witness_utxo: Some(Transaction {
version: transaction::Version::ONE,
lock_time: absolute::LockTime::ZERO,
- input: vec![
+ inputs: vec![
TxIn {
previous_output: OutPoint {
txid: "e567952fb6cc33857f392efa3a46c995a28f69cca4bb1b37e0204dab1ec7a389".parse().unwrap(),
@@ -2207,7 +2207,7 @@ mod tests {
]),
}
],
- output: vec![
+ outputs: vec![
TxOut {
value: Amount::from_sat_u32(200_000_000),
script_pubkey: ScriptBuf::from_hex_no_length_prefix("76a91485cff1097fd9e008bb34af709c62197b38978a4888ac").unwrap(),
@@ -2448,7 +2448,7 @@ mod tests {
unsigned_tx: Transaction {
version: transaction::Version::TWO,
lock_time: absolute::LockTime::from_consensus(1257139),
- input: vec![
+ inputs: vec![
TxIn {
previous_output: OutPoint {
txid: "f61b1742ca13176464adb3cb66050c00787bb3a4eead37e985f2df1e37718126".parse().unwrap(),
@@ -2458,7 +2458,7 @@ mod tests {
..TxIn::EMPTY_COINBASE
}
],
- output: vec![
+ outputs: vec![
TxOut {
value: output_0_val,
script_pubkey: ScriptBuf::new()
@@ -2479,7 +2479,7 @@ mod tests {
non_witness_utxo: Some(Transaction {
version: transaction::Version::ONE,
lock_time: absolute::LockTime::ZERO,
- input: vec![
+ inputs: vec![
TxIn {
previous_output: OutPoint {
txid: "e567952fb6cc33857f392efa3a46c995a28f69cca4bb1b37e0204dab1ec7a389".parse().unwrap(),
@@ -2497,7 +2497,7 @@ mod tests {
..TxIn::EMPTY_COINBASE
}
],
- output: vec![
+ outputs: vec![
TxOut {
value: prev_output_val,
script_pubkey: ScriptBuf::new()
@@ -2533,7 +2533,7 @@ mod tests {
}
// negative fee
let mut t3 = t.clone();
- t3.unsigned_tx.output[0].value = prev_output_val;
+ t3.unsigned_tx.outputs[0].value = prev_output_val;
match t3.fee().unwrap_err() {
Error::NegativeFee => {}
e => panic!("unexpected error: {:?}", e),
@@ -2549,8 +2549,8 @@ mod tests {
let tx = Transaction {
version: transaction::Version::TWO,
lock_time: locktime::absolute::LockTime::ZERO,
- input: vec![TxIn::EMPTY_COINBASE],
- output: vec![TxOut { value: Amount::ZERO, script_pubkey: ScriptBuf::new() }],
+ inputs: vec![TxIn::EMPTY_COINBASE],
+ outputs: vec![TxOut { value: Amount::ZERO, script_pubkey: ScriptBuf::new() }],
};
let mut psbt = Psbt::from_unsigned_tx(tx).unwrap();
@@ -2582,8 +2582,8 @@ mod tests {
let tx = Transaction {
version: transaction::Version::TWO,
lock_time: locktime::absolute::LockTime::ZERO,
- input: vec![TxIn::EMPTY_COINBASE],
- output: vec![TxOut { value: Amount::ZERO, script_pubkey: ScriptBuf::new() }],
+ inputs: vec![TxIn::EMPTY_COINBASE],
+ outputs: vec![TxOut { value: Amount::ZERO, script_pubkey: ScriptBuf::new() }],
};
let mut psbt = Psbt::from_unsigned_tx(tx).unwrap();
@@ -2612,8 +2612,8 @@ mod tests {
let unsigned_tx = Transaction {
version: transaction::Version::TWO,
lock_time: absolute::LockTime::ZERO,
- input: vec![TxIn::EMPTY_COINBASE, TxIn::EMPTY_COINBASE],
- output: vec![TxOut { value: Amount::ZERO, script_pubkey: ScriptBuf::new() }],
+ inputs: vec![TxIn::EMPTY_COINBASE, TxIn::EMPTY_COINBASE],
+ outputs: vec![TxOut { value: Amount::ZERO, script_pubkey: ScriptBuf::new() }],
};
let mut psbt = Psbt::from_unsigned_tx(unsigned_tx).unwrap();
diff --git a/bitcoin/src/psbt/serialize.rs b/bitcoin/src/psbt/serialize.rs
index 468afae2..7eec8f00 100644
--- a/bitcoin/src/psbt/serialize.rs
+++ b/bitcoin/src/psbt/serialize.rs
@@ -99,14 +99,14 @@ impl Psbt {
global.unsigned_tx_checks()?;
let inputs: Vec<Input> = {
- let inputs_len: usize = (global.unsigned_tx.input).len();
+ let inputs_len: usize = (global.unsigned_tx.inputs).len();
let mut inputs: Vec<Input> = Vec::with_capacity(inputs_len);
for i in 0..inputs_len {
let input = Input::decode(r)?;
if let Some(ref tx) = input.non_witness_utxo {
- let input_outpoint = global.unsigned_tx.input[i].previous_output;
+ let input_outpoint = global.unsigned_tx.inputs[i].previous_output;
let txid = tx.compute_txid();
if txid != input_outpoint.txid {
return Err(Error::IncorrectNonWitnessUtxo {
@@ -123,7 +123,7 @@ impl Psbt {
};
let outputs: Vec<Output> = {
- let outputs_len: usize = (global.unsigned_tx.output).len();
+ let outputs_len: usize = (global.unsigned_tx.outputs).len();
let mut outputs: Vec<Output> = Vec::with_capacity(outputs_len);
diff --git a/bitcoin/tests/bip_174.rs b/bitcoin/tests/bip_174.rs
index 0eacb878..16931b44 100644
--- a/bitcoin/tests/bip_174.rs
+++ b/bitcoin/tests/bip_174.rs
@@ -160,7 +160,7 @@ fn create_transaction() -> Transaction {
Transaction {
version: transaction::Version::TWO,
lock_time: absolute::LockTime::ZERO,
- input: vec![
+ inputs: vec![
TxIn {
previous_output: OutPoint {
txid: input_0.txid.parse().expect("failed to parse txid"),
@@ -180,7 +180,7 @@ fn create_transaction() -> Transaction {
witness: Witness::default(),
},
],
- output: vec![
+ outputs: vec![
TxOut {
value: Amount::from_str_in(output_0.amount, Denomination::Bitcoin)
.expect("failed to parse amount"),
@@ -246,7 +246,7 @@ fn update_psbt(mut psbt: Psbt, fingerprint: Fingerprint) -> Psbt {
let v = Vec::from_hex(previous_tx_0).unwrap();
let tx: Transaction = deserialize(&v).unwrap();
- input_1.witness_utxo = Some(tx.output[1].clone());
+ input_1.witness_utxo = Some(tx.outputs[1].clone());
input_1.redeem_script = Some(hex_script(redeem_script_1));
input_1.witness_script = Some(hex_script(witness_script));
diff --git a/bitcoin/tests/psbt-sign-taproot.rs b/bitcoin/tests/psbt-sign-taproot.rs
index e692cb1b..0caabd7a 100644
--- a/bitcoin/tests/psbt-sign-taproot.rs
+++ b/bitcoin/tests/psbt-sign-taproot.rs
@@ -211,13 +211,13 @@ fn create_psbt_for_taproot_key_path_spend(
let transaction = Transaction {
version: Version::TWO,
lock_time: absolute::LockTime::ZERO,
- input: vec![TxIn {
+ inputs: vec![TxIn {
previous_output: OutPoint { txid: prev_tx_id.parse().unwrap(), vout: 0 },
script_sig: ScriptBuf::new(),
sequence: Sequence(0xFFFFFFFF), // Ignore nSequence.
witness: Witness::default(),
}],
- output: out_puts,
+ outputs: out_puts,
};
let mut psbt = Psbt::from_unsigned_tx(transaction).unwrap();
@@ -289,13 +289,13 @@ fn create_psbt_for_taproot_script_path_spend<K: Into<XOnlyPublicKey>>(
let transaction = Transaction {
version: Version::TWO,
lock_time: absolute::LockTime::ZERO,
- input: vec![TxIn {
+ inputs: vec![TxIn {
previous_output: OutPoint { txid: prev_tx_id.parse().unwrap(), vout: 0 },
script_sig: ScriptBuf::new(),
sequence: Sequence(0xFFFFFFFF), // Ignore nSequence.
witness: Witness::default(),
}],
- output: out_puts,
+ outputs: out_puts,
};
let mut psbt = Psbt::from_unsigned_tx(transaction).unwrap();
diff --git a/bitcoin/tests/serde.rs b/bitcoin/tests/serde.rs
index 0a4f4bbb..99053cea 100644
--- a/bitcoin/tests/serde.rs
+++ b/bitcoin/tests/serde.rs
@@ -228,7 +228,7 @@ fn serde_regression_psbt() {
let tx = Transaction {
version: transaction::Version::ONE,
lock_time: absolute::LockTime::ZERO,
- input: vec![TxIn {
+ inputs: vec![TxIn {
previous_output: OutPoint {
txid: "e567952fb6cc33857f392efa3a46c995a28f69cca4bb1b37e0204dab1ec7a389"
.parse::<Txid>()
@@ -245,7 +245,7 @@ fn serde_regression_psbt() {
)
.unwrap()]),
}],
- output: vec![TxOut {
+ outputs: vec![TxOut {
value: Amount::from_sat(190_303_501_938).unwrap(),
script_pubkey: ScriptBuf::from_hex_no_length_prefix(
"a914339725ba21efd62ac753a9bcd067d6c7a6a39d0587",
@@ -285,9 +285,9 @@ fn serde_regression_psbt() {
},
unsigned_tx: {
let mut unsigned = tx.clone();
- unsigned.input[0].previous_output.txid = tx.compute_txid();
- unsigned.input[0].script_sig = ScriptBuf::new();
- unsigned.input[0].witness = Witness::default();
+ unsigned.inputs[0].previous_output.txid = tx.compute_txid();
+ unsigned.inputs[0].script_sig = ScriptBuf::new();
+ unsigned.inputs[0].witness = Witness::default();
unsigned
},
proprietary: proprietary.clone(),
diff --git a/fuzz/fuzz_targets/bitcoin/deserialize_transaction.rs b/fuzz/fuzz_targets/bitcoin/deserialize_transaction.rs
index c37e8e7e..606c2b20 100644
--- a/fuzz/fuzz_targets/bitcoin/deserialize_transaction.rs
+++ b/fuzz/fuzz_targets/bitcoin/deserialize_transaction.rs
@@ -11,7 +11,7 @@ fn do_test(data: &[u8]) {
assert_eq!(&ser[..], data);
let len = ser.len();
let calculated_weight = tx.weight().to_wu() as usize;
- for input in &mut tx.input {
+ for input in &mut tx.inputs {
input.witness = bitcoin::witness::Witness::default();
}
let no_witness_len = bitcoin::consensus::encode::serialize(&tx).len();
@@ -19,7 +19,7 @@ fn do_test(data: &[u8]) {
// we serialize as SegWit even after "stripping the witnesses". We need
// to drop two bytes (i.e. eight weight). Similarly, calculated_weight is
// incorrect and needs 2 wu removing for the marker/flag bytes.
- if tx.input.is_empty() {
+ if tx.inputs.is_empty() {
assert_eq!(no_witness_len * 3 + len - 8, calculated_weight - 2);
} else {
assert_eq!(no_witness_len * 3 + len, calculated_weight);
diff --git a/primitives/src/transaction.rs b/primitives/src/transaction.rs
index 26dbfcdb..29cd7a9c 100644
--- a/primitives/src/transaction.rs
+++ b/primitives/src/transaction.rs
@@ -109,9 +109,9 @@ pub struct Transaction {
/// * [BIP-113 Median time-past as endpoint for lock-time calculations](https://github.com/bitcoin/bips/blob/master/bip-0113.mediawiki)
pub lock_time: absolute::LockTime,
/// List of transaction inputs.
- pub input: Vec<TxIn>,
+ pub inputs: Vec<TxIn>,
/// List of transaction outputs.
- pub output: Vec<TxOut>,
+ pub outputs: Vec<TxOut>,
}
#[cfg(feature = "alloc")]
@@ -120,22 +120,6 @@ impl Transaction {
/// Maximum transaction weight for Bitcoin Core 25.0.
pub const MAX_STANDARD_WEIGHT: Weight = Weight::from_wu(400_000);
- /// Returns a reference to the transaction inputs.
- #[inline]
- pub fn inputs(&self) -> &[TxIn] { &self.input }
-
- /// Returns a mutable reference to the transaction inputs.
- #[inline]
- pub fn inputs_mut(&mut self) -> &mut [TxIn] { &mut self.input }
-
- /// Returns a reference to the transaction outputs.
- #[inline]
- pub fn outputs(&self) -> &[TxOut] { &self.output }
-
- /// Returns a mutable reference to the transaction outputs.
- #[inline]
- pub fn outputs_mut(&mut self) -> &mut [TxOut] { &mut self.output }
-
/// Computes a "normalized TXID" which does not include any signatures.
///
/// This gives a way to identify a transaction that is "the same" as
@@ -145,8 +129,8 @@ impl Transaction {
let cloned_tx = Transaction {
version: self.version,
lock_time: self.lock_time,
- input: self
- .input
+ inputs: self
+ .inputs
.iter()
.map(|txin| TxIn {
script_sig: ScriptBuf::new(),
@@ -154,7 +138,7 @@ impl Transaction {
..*txin
})
.collect(),
- output: self.output.clone(),
+ outputs: self.outputs.clone(),
};
sha256d::Hash::from_byte_array(cloned_tx.compute_txid().to_byte_array())
}
@@ -187,12 +171,12 @@ impl Transaction {
// This is duplicated in `bitcoin`, if you change it please do so in both places.
#[inline]
fn uses_segwit_serialization(&self) -> bool {
- if self.input.iter().any(|input| !input.witness.is_empty()) {
+ if self.inputs.iter().any(|input| !input.witness.is_empty()) {
return true;
}
// To avoid serialization ambiguity, no inputs means we use BIP141 serialization (see
// `Transaction` docs for full explanation).
- self.input.is_empty()
+ self.inputs.is_empty()
}
}
@@ -208,8 +192,8 @@ impl cmp::Ord for Transaction {
self.version
.cmp(&other.version)
.then(self.lock_time.to_consensus_u32().cmp(&other.lock_time.to_consensus_u32()))
- .then(self.input.cmp(&other.input))
- .then(self.output.cmp(&other.output))
+ .then(self.inputs.cmp(&other.inputs))
+ .then(self.outputs.cmp(&other.outputs))
}
}
@@ -260,9 +244,9 @@ fn hash_transaction(tx: &Transaction, uses_segwit_serialization: bool) -> sha256
}
// Encode inputs (excluding witness data) with leading compact size encoded int.
- let input_len = tx.input.len();
+ let input_len = tx.inputs.len();
enc.input(compact_size::encode(input_len).as_slice());
- for input in &tx.input {
+ for input in &tx.inputs {
// Encode each input same as we do in `Encodable for TxIn`.
enc.input(input.previous_output.txid.as_byte_array());
enc.input(&input.previous_output.vout.to_le_bytes());
@@ -275,9 +259,9 @@ fn hash_transaction(tx: &Transaction, uses_segwit_serialization: bool) -> sha256
}
// Encode outputs with leading compact size encoded int.
- let output_len = tx.output.len();
+ let output_len = tx.outputs.len();
enc.input(compact_size::encode(output_len).as_slice());
- for output in &tx.output {
+ for output in &tx.outputs {
// Encode each output same as we do in `Encodable for TxOut`.
enc.input(&output.value.to_sat().to_le_bytes());
@@ -288,7 +272,7 @@ fn hash_transaction(tx: &Transaction, uses_segwit_serialization: bool) -> sha256
if uses_segwit_serialization {
// BIP-141 (SegWit) transaction serialization also includes the witness data.
- for input in &tx.input {
+ for input in &tx.inputs {
// Same as `Encodable for Witness`.
enc.input(compact_size::encode(input.witness.len()).as_slice());
for element in &input.witness {
@@ -595,8 +579,8 @@ impl<'a> Arbitrary<'a> for Transaction {
Ok(Transaction {
version: Version::arbitrary(u)?,
lock_time: absolute::LockTime::arbitrary(u)?,
- input: Vec::<TxIn>::arbitrary(u)?,
- output: Vec::<TxOut>::arbitrary(u)?,
+ inputs: Vec::<TxIn>::arbitrary(u)?,
+ outputs: Vec::<TxOut>::arbitrary(u)?,
})
}
}
@@ -696,20 +680,20 @@ mod tests {
let tx_orig = Transaction {
version: Version::ONE,
lock_time: absolute::LockTime::from_consensus(1_738_968_231), // The time this was written
- input: vec![txin.clone()],
- output: vec![txout.clone()],
+ inputs: vec![txin.clone()],
+ outputs: vec![txout.clone()],
};
// Test changing the transaction
let mut tx = tx_orig.clone();
- tx.inputs_mut()[0].previous_output.txid = Txid::from_byte_array([0xFF; 32]);
- tx.outputs_mut()[0].value = Amount::from_sat(987_654_321).unwrap();
- assert_eq!(tx.inputs()[0].previous_output.txid.to_byte_array(), [0xFF; 32]);
- assert_eq!(tx.outputs()[0].value.to_sat(), 987_654_321);
+ tx.inputs[0].previous_output.txid = Txid::from_byte_array([0xFF; 32]);
+ tx.outputs[0].value = Amount::from_sat(987_654_321).unwrap();
+ assert_eq!(tx.inputs[0].previous_output.txid.to_byte_array(), [0xFF; 32]);
+ assert_eq!(tx.outputs[0].value.to_sat(), 987_654_321);
// Test uses_segwit_serialization
assert!(!tx.uses_segwit_serialization());
- tx.input[0].witness.push(vec![0xAB, 0xCD, 0xEF]);
+ tx.inputs[0].witness.push(vec![0xAB, 0xCD, 0xEF]);
assert!(tx.uses_segwit_serialization());
// Test partial ord
Why this scored 20/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.