Skip to content

Commit

Permalink
Merge pull request Blockstream#75 from mempool/junderw/fix-vout-u32
Browse files Browse the repository at this point in the history
Fix: Output index should be u32 to prevent clobbering when over 65536 outputs.
  • Loading branch information
wiz authored Sep 4, 2024
2 parents 961a255 + 5b2075b commit 583d9e9
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 43 deletions.
22 changes: 11 additions & 11 deletions src/elements/asset.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,9 @@ pub struct IssuedAsset {
#[derive(Serialize, Deserialize, Debug)]
pub struct AssetRow {
pub issuance_txid: FullHash,
pub issuance_vin: u16,
pub issuance_vin: u32,
pub prev_txid: FullHash,
pub prev_vout: u16,
pub prev_vout: u32,
pub issuance: Bytes, // bincode does not like dealing with AssetIssuance, deserialization fails with "invalid type: sequence, expected a struct"
pub reissuance_token: FullHash,
}
Expand Down Expand Up @@ -105,7 +105,7 @@ impl IssuedAsset {
},
issuance_prevout: OutPoint {
txid: deserialize(&asset.prev_txid).unwrap(),
vout: asset.prev_vout as u32,
vout: asset.prev_vout,
},
contract_hash,
reissuance_token,
Expand Down Expand Up @@ -155,7 +155,7 @@ impl LiquidAsset {
#[cfg_attr(test, derive(PartialEq, Eq))]
pub struct IssuingInfo {
pub txid: FullHash,
pub vin: u16,
pub vin: u32,
pub is_reissuance: bool,
// None for blinded issuances
pub issued_amount: Option<u64>,
Expand All @@ -166,7 +166,7 @@ pub struct IssuingInfo {
#[cfg_attr(test, derive(PartialEq, Eq))]
pub struct BurningInfo {
pub txid: FullHash,
pub vout: u16,
pub vout: u32,
pub value: u64,
}

Expand Down Expand Up @@ -247,7 +247,7 @@ fn index_tx_assets(
pegout.asset.explicit().unwrap(),
TxHistoryInfo::Pegout(PegoutInfo {
txid,
vout: txo_index as u16,
vout: txo_index as u32,
value: pegout.value,
}),
));
Expand All @@ -258,7 +258,7 @@ fn index_tx_assets(
asset_id,
TxHistoryInfo::Burning(BurningInfo {
txid,
vout: txo_index as u16,
vout: txo_index as u32,
value,
}),
));
Expand All @@ -273,7 +273,7 @@ fn index_tx_assets(
pegin.asset.explicit().unwrap(),
TxHistoryInfo::Pegin(PeginInfo {
txid,
vin: txi_index as u16,
vin: txi_index as u32,
value: pegin.value,
}),
));
Expand All @@ -298,7 +298,7 @@ fn index_tx_assets(
asset_id,
TxHistoryInfo::Issuing(IssuingInfo {
txid,
vin: txi_index as u16,
vin: txi_index as u32,
is_reissuance,
issued_amount,
token_amount,
Expand All @@ -315,9 +315,9 @@ fn index_tx_assets(
asset_id,
AssetRow {
issuance_txid: txid,
issuance_vin: txi_index as u16,
issuance_vin: txi_index as u32,
prev_txid: full_hash(&txi.previous_output.txid[..]),
prev_vout: txi.previous_output.vout as u16,
prev_vout: txi.previous_output.vout,
issuance: serialize(&txi.asset_issuance),
reissuance_token: full_hash(&reissuance_token.into_inner()[..]),
},
Expand Down
4 changes: 2 additions & 2 deletions src/elements/peg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ impl PegoutValue {
#[cfg_attr(test, derive(PartialEq, Eq))]
pub struct PeginInfo {
pub txid: FullHash,
pub vin: u16,
pub vin: u32,
pub value: u64,
}

Expand All @@ -70,6 +70,6 @@ pub struct PeginInfo {
#[cfg_attr(test, derive(PartialEq, Eq))]
pub struct PegoutInfo {
pub txid: FullHash,
pub vout: u16,
pub vout: u32,
pub value: u64,
}
8 changes: 4 additions & 4 deletions src/new_index/mempool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ impl Mempool {

Some(Utxo {
txid: deserialize(&info.txid).expect("invalid txid"),
vout: info.vout as u32,
vout: info.vout,
value: info.value,
confirmed: None,

Expand Down Expand Up @@ -495,9 +495,9 @@ impl Mempool {
compute_script_hash(&prevout.script_pubkey),
TxHistoryInfo::Spending(SpendingInfo {
txid: txid_bytes,
vin: input_index as u16,
vin: input_index,
prev_txid: full_hash(&txi.previous_output.txid[..]),
prev_vout: txi.previous_output.vout as u16,
prev_vout: txi.previous_output.vout,
value: prevout.value,
}),
)
Expand All @@ -516,7 +516,7 @@ impl Mempool {
compute_script_hash(&txo.script_pubkey),
TxHistoryInfo::Funding(FundingInfo {
txid: txid_bytes,
vout: index as u16,
vout: index as u32,
value: txo.value,
}),
)
Expand Down
50 changes: 25 additions & 25 deletions src/new_index/schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1046,7 +1046,7 @@ impl ChainQuery {
let txid: Txid = deserialize(&edge.key.spending_txid).unwrap();
self.tx_confirming_block(&txid).map(|b| SpendingInput {
txid,
vin: edge.key.spending_vin as u32,
vin: edge.key.spending_vin,
confirmed: Some(b),
})
})
Expand Down Expand Up @@ -1295,7 +1295,7 @@ fn index_transaction(
tx_position,
TxHistoryInfo::Funding(FundingInfo {
txid,
vout: txo_index as u16,
vout: txo_index as u32,
value: txo.value,
}),
);
Expand All @@ -1322,19 +1322,19 @@ fn index_transaction(
tx_position,
TxHistoryInfo::Spending(SpendingInfo {
txid,
vin: txi_index as u16,
vin: txi_index as u32,
prev_txid: full_hash(&txi.previous_output.txid[..]),
prev_vout: txi.previous_output.vout as u16,
prev_vout: txi.previous_output.vout,
value: prev_txo.value,
}),
);
rows.push(history.into_row());

let edge = TxEdgeRow::new(
full_hash(&txi.previous_output.txid[..]),
txi.previous_output.vout as u16,
txi.previous_output.vout,
txid,
txi_index as u16,
txi_index as u32,
);
rows.push(edge.into_row());
}
Expand Down Expand Up @@ -1455,7 +1455,7 @@ impl TxConfRow {
struct TxOutKey {
code: u8,
txid: FullHash,
vout: u16,
vout: u32,
}

struct TxOutRow {
Expand All @@ -1469,7 +1469,7 @@ impl TxOutRow {
key: TxOutKey {
code: b'O',
txid: *txid,
vout: vout as u16,
vout: vout as u32,
},
value: serialize(txout),
}
Expand All @@ -1478,7 +1478,7 @@ impl TxOutRow {
bincode_util::serialize_little(&TxOutKey {
code: b'O',
txid: full_hash(&outpoint.txid[..]),
vout: outpoint.vout as u16,
vout: outpoint.vout,
})
.unwrap()
}
Expand Down Expand Up @@ -1569,17 +1569,17 @@ impl BlockRow {
#[cfg_attr(test, derive(PartialEq, Eq))]
pub struct FundingInfo {
pub txid: FullHash,
pub vout: u16,
pub vout: u32,
pub value: Value,
}

#[derive(Serialize, Deserialize, Debug)]
#[cfg_attr(test, derive(PartialEq, Eq))]
pub struct SpendingInfo {
pub txid: FullHash, // spending transaction
pub vin: u16,
pub vin: u32,
pub prev_txid: FullHash, // funding transaction
pub prev_vout: u16,
pub prev_vout: u32,
pub value: Value,
}

Expand Down Expand Up @@ -1689,11 +1689,11 @@ impl TxHistoryInfo {
match self {
TxHistoryInfo::Funding(ref info) => OutPoint {
txid: deserialize(&info.txid).unwrap(),
vout: info.vout as u32,
vout: info.vout,
},
TxHistoryInfo::Spending(ref info) => OutPoint {
txid: deserialize(&info.prev_txid).unwrap(),
vout: info.prev_vout as u32,
vout: info.prev_vout,
},
#[cfg(feature = "liquid")]
TxHistoryInfo::Issuing(_)
Expand All @@ -1717,9 +1717,9 @@ pub struct TxHistorySummary {
struct TxEdgeKey {
code: u8,
funding_txid: FullHash,
funding_vout: u16,
funding_vout: u32,
spending_txid: FullHash,
spending_vin: u16,
spending_vin: u32,
}

struct TxEdgeRow {
Expand All @@ -1729,9 +1729,9 @@ struct TxEdgeRow {
impl TxEdgeRow {
fn new(
funding_txid: FullHash,
funding_vout: u16,
funding_vout: u32,
spending_txid: FullHash,
spending_vin: u16,
spending_vin: u32,
) -> Self {
let key = TxEdgeKey {
code: b'S',
Expand All @@ -1745,7 +1745,7 @@ impl TxEdgeRow {

fn filter(outpoint: &OutPoint) -> Bytes {
// TODO build key without using bincode? [ b"S", &outpoint.txid[..], outpoint.vout?? ].concat()
bincode_util::serialize_little(&(b'S', full_hash(&outpoint.txid[..]), outpoint.vout as u16))
bincode_util::serialize_little(&(b'S', full_hash(&outpoint.txid[..]), outpoint.vout))
.unwrap()
}

Expand Down Expand Up @@ -1884,7 +1884,7 @@ mod tests {
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
// vout
0, 3,
0, 0, 0, 3,
// Value variant (Explicit)
0, 0, 0, 0, 0, 0, 0, 2,
// number of tuple elements
Expand All @@ -1901,7 +1901,7 @@ mod tests {
0, 0, 0, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
0, 3,
0, 0, 0, 3,
// Value variant (Null)
0, 0, 0, 0, 0, 0, 0, 1,
// number of tuple elements
Expand All @@ -1916,10 +1916,10 @@ mod tests {
0, 0, 0, 0,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
0, 12,
0, 0, 0, 12,
98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102,
98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102,
0, 9,
0, 0, 0, 9,
0, 0, 0, 0, 0, 0, 0, 2,
1,
14, 0, 0, 0, 0, 0, 0, 0,
Expand All @@ -1933,10 +1933,10 @@ mod tests {
0, 0, 0, 0,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
0, 12,
0, 0, 0, 12,
98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102,
98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102,
0, 9,
0, 0, 0, 9,
0, 0, 0, 0, 0, 0, 0, 1,
0,
],
Expand Down
2 changes: 1 addition & 1 deletion src/util/transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ impl From<Option<BlockId>> for TransactionStatus {
#[derive(Serialize, Deserialize)]
pub struct TxInput {
pub txid: Txid,
pub vin: u16,
pub vin: u32,
}

pub fn is_coinbase(txin: &TxIn) -> bool {
Expand Down

0 comments on commit 583d9e9

Please sign in to comment.