Skip to content

Commit 583d9e9

Browse files
authored
Merge pull request Blockstream#75 from mempool/junderw/fix-vout-u32
Fix: Output index should be u32 to prevent clobbering when over 65536 outputs.
2 parents 961a255 + 5b2075b commit 583d9e9

File tree

5 files changed

+43
-43
lines changed

5 files changed

+43
-43
lines changed

src/elements/asset.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ pub struct IssuedAsset {
7171
#[derive(Serialize, Deserialize, Debug)]
7272
pub struct AssetRow {
7373
pub issuance_txid: FullHash,
74-
pub issuance_vin: u16,
74+
pub issuance_vin: u32,
7575
pub prev_txid: FullHash,
76-
pub prev_vout: u16,
76+
pub prev_vout: u32,
7777
pub issuance: Bytes, // bincode does not like dealing with AssetIssuance, deserialization fails with "invalid type: sequence, expected a struct"
7878
pub reissuance_token: FullHash,
7979
}
@@ -105,7 +105,7 @@ impl IssuedAsset {
105105
},
106106
issuance_prevout: OutPoint {
107107
txid: deserialize(&asset.prev_txid).unwrap(),
108-
vout: asset.prev_vout as u32,
108+
vout: asset.prev_vout,
109109
},
110110
contract_hash,
111111
reissuance_token,
@@ -155,7 +155,7 @@ impl LiquidAsset {
155155
#[cfg_attr(test, derive(PartialEq, Eq))]
156156
pub struct IssuingInfo {
157157
pub txid: FullHash,
158-
pub vin: u16,
158+
pub vin: u32,
159159
pub is_reissuance: bool,
160160
// None for blinded issuances
161161
pub issued_amount: Option<u64>,
@@ -166,7 +166,7 @@ pub struct IssuingInfo {
166166
#[cfg_attr(test, derive(PartialEq, Eq))]
167167
pub struct BurningInfo {
168168
pub txid: FullHash,
169-
pub vout: u16,
169+
pub vout: u32,
170170
pub value: u64,
171171
}
172172

@@ -247,7 +247,7 @@ fn index_tx_assets(
247247
pegout.asset.explicit().unwrap(),
248248
TxHistoryInfo::Pegout(PegoutInfo {
249249
txid,
250-
vout: txo_index as u16,
250+
vout: txo_index as u32,
251251
value: pegout.value,
252252
}),
253253
));
@@ -258,7 +258,7 @@ fn index_tx_assets(
258258
asset_id,
259259
TxHistoryInfo::Burning(BurningInfo {
260260
txid,
261-
vout: txo_index as u16,
261+
vout: txo_index as u32,
262262
value,
263263
}),
264264
));
@@ -273,7 +273,7 @@ fn index_tx_assets(
273273
pegin.asset.explicit().unwrap(),
274274
TxHistoryInfo::Pegin(PeginInfo {
275275
txid,
276-
vin: txi_index as u16,
276+
vin: txi_index as u32,
277277
value: pegin.value,
278278
}),
279279
));
@@ -298,7 +298,7 @@ fn index_tx_assets(
298298
asset_id,
299299
TxHistoryInfo::Issuing(IssuingInfo {
300300
txid,
301-
vin: txi_index as u16,
301+
vin: txi_index as u32,
302302
is_reissuance,
303303
issued_amount,
304304
token_amount,
@@ -315,9 +315,9 @@ fn index_tx_assets(
315315
asset_id,
316316
AssetRow {
317317
issuance_txid: txid,
318-
issuance_vin: txi_index as u16,
318+
issuance_vin: txi_index as u32,
319319
prev_txid: full_hash(&txi.previous_output.txid[..]),
320-
prev_vout: txi.previous_output.vout as u16,
320+
prev_vout: txi.previous_output.vout,
321321
issuance: serialize(&txi.asset_issuance),
322322
reissuance_token: full_hash(&reissuance_token.into_inner()[..]),
323323
},

src/elements/peg.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ impl PegoutValue {
6161
#[cfg_attr(test, derive(PartialEq, Eq))]
6262
pub struct PeginInfo {
6363
pub txid: FullHash,
64-
pub vin: u16,
64+
pub vin: u32,
6565
pub value: u64,
6666
}
6767

@@ -70,6 +70,6 @@ pub struct PeginInfo {
7070
#[cfg_attr(test, derive(PartialEq, Eq))]
7171
pub struct PegoutInfo {
7272
pub txid: FullHash,
73-
pub vout: u16,
73+
pub vout: u32,
7474
pub value: u64,
7575
}

src/new_index/mempool.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ impl Mempool {
210210

211211
Some(Utxo {
212212
txid: deserialize(&info.txid).expect("invalid txid"),
213-
vout: info.vout as u32,
213+
vout: info.vout,
214214
value: info.value,
215215
confirmed: None,
216216

@@ -495,9 +495,9 @@ impl Mempool {
495495
compute_script_hash(&prevout.script_pubkey),
496496
TxHistoryInfo::Spending(SpendingInfo {
497497
txid: txid_bytes,
498-
vin: input_index as u16,
498+
vin: input_index,
499499
prev_txid: full_hash(&txi.previous_output.txid[..]),
500-
prev_vout: txi.previous_output.vout as u16,
500+
prev_vout: txi.previous_output.vout,
501501
value: prevout.value,
502502
}),
503503
)
@@ -516,7 +516,7 @@ impl Mempool {
516516
compute_script_hash(&txo.script_pubkey),
517517
TxHistoryInfo::Funding(FundingInfo {
518518
txid: txid_bytes,
519-
vout: index as u16,
519+
vout: index as u32,
520520
value: txo.value,
521521
}),
522522
)

src/new_index/schema.rs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,7 +1046,7 @@ impl ChainQuery {
10461046
let txid: Txid = deserialize(&edge.key.spending_txid).unwrap();
10471047
self.tx_confirming_block(&txid).map(|b| SpendingInput {
10481048
txid,
1049-
vin: edge.key.spending_vin as u32,
1049+
vin: edge.key.spending_vin,
10501050
confirmed: Some(b),
10511051
})
10521052
})
@@ -1295,7 +1295,7 @@ fn index_transaction(
12951295
tx_position,
12961296
TxHistoryInfo::Funding(FundingInfo {
12971297
txid,
1298-
vout: txo_index as u16,
1298+
vout: txo_index as u32,
12991299
value: txo.value,
13001300
}),
13011301
);
@@ -1322,19 +1322,19 @@ fn index_transaction(
13221322
tx_position,
13231323
TxHistoryInfo::Spending(SpendingInfo {
13241324
txid,
1325-
vin: txi_index as u16,
1325+
vin: txi_index as u32,
13261326
prev_txid: full_hash(&txi.previous_output.txid[..]),
1327-
prev_vout: txi.previous_output.vout as u16,
1327+
prev_vout: txi.previous_output.vout,
13281328
value: prev_txo.value,
13291329
}),
13301330
);
13311331
rows.push(history.into_row());
13321332

13331333
let edge = TxEdgeRow::new(
13341334
full_hash(&txi.previous_output.txid[..]),
1335-
txi.previous_output.vout as u16,
1335+
txi.previous_output.vout,
13361336
txid,
1337-
txi_index as u16,
1337+
txi_index as u32,
13381338
);
13391339
rows.push(edge.into_row());
13401340
}
@@ -1455,7 +1455,7 @@ impl TxConfRow {
14551455
struct TxOutKey {
14561456
code: u8,
14571457
txid: FullHash,
1458-
vout: u16,
1458+
vout: u32,
14591459
}
14601460

14611461
struct TxOutRow {
@@ -1469,7 +1469,7 @@ impl TxOutRow {
14691469
key: TxOutKey {
14701470
code: b'O',
14711471
txid: *txid,
1472-
vout: vout as u16,
1472+
vout: vout as u32,
14731473
},
14741474
value: serialize(txout),
14751475
}
@@ -1478,7 +1478,7 @@ impl TxOutRow {
14781478
bincode_util::serialize_little(&TxOutKey {
14791479
code: b'O',
14801480
txid: full_hash(&outpoint.txid[..]),
1481-
vout: outpoint.vout as u16,
1481+
vout: outpoint.vout,
14821482
})
14831483
.unwrap()
14841484
}
@@ -1569,17 +1569,17 @@ impl BlockRow {
15691569
#[cfg_attr(test, derive(PartialEq, Eq))]
15701570
pub struct FundingInfo {
15711571
pub txid: FullHash,
1572-
pub vout: u16,
1572+
pub vout: u32,
15731573
pub value: Value,
15741574
}
15751575

15761576
#[derive(Serialize, Deserialize, Debug)]
15771577
#[cfg_attr(test, derive(PartialEq, Eq))]
15781578
pub struct SpendingInfo {
15791579
pub txid: FullHash, // spending transaction
1580-
pub vin: u16,
1580+
pub vin: u32,
15811581
pub prev_txid: FullHash, // funding transaction
1582-
pub prev_vout: u16,
1582+
pub prev_vout: u32,
15831583
pub value: Value,
15841584
}
15851585

@@ -1689,11 +1689,11 @@ impl TxHistoryInfo {
16891689
match self {
16901690
TxHistoryInfo::Funding(ref info) => OutPoint {
16911691
txid: deserialize(&info.txid).unwrap(),
1692-
vout: info.vout as u32,
1692+
vout: info.vout,
16931693
},
16941694
TxHistoryInfo::Spending(ref info) => OutPoint {
16951695
txid: deserialize(&info.prev_txid).unwrap(),
1696-
vout: info.prev_vout as u32,
1696+
vout: info.prev_vout,
16971697
},
16981698
#[cfg(feature = "liquid")]
16991699
TxHistoryInfo::Issuing(_)
@@ -1717,9 +1717,9 @@ pub struct TxHistorySummary {
17171717
struct TxEdgeKey {
17181718
code: u8,
17191719
funding_txid: FullHash,
1720-
funding_vout: u16,
1720+
funding_vout: u32,
17211721
spending_txid: FullHash,
1722-
spending_vin: u16,
1722+
spending_vin: u32,
17231723
}
17241724

17251725
struct TxEdgeRow {
@@ -1729,9 +1729,9 @@ struct TxEdgeRow {
17291729
impl TxEdgeRow {
17301730
fn new(
17311731
funding_txid: FullHash,
1732-
funding_vout: u16,
1732+
funding_vout: u32,
17331733
spending_txid: FullHash,
1734-
spending_vin: u16,
1734+
spending_vin: u32,
17351735
) -> Self {
17361736
let key = TxEdgeKey {
17371737
code: b'S',
@@ -1745,7 +1745,7 @@ impl TxEdgeRow {
17451745

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

@@ -1884,7 +1884,7 @@ mod tests {
18841884
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
18851885
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
18861886
// vout
1887-
0, 3,
1887+
0, 0, 0, 3,
18881888
// Value variant (Explicit)
18891889
0, 0, 0, 0, 0, 0, 0, 2,
18901890
// number of tuple elements
@@ -1901,7 +1901,7 @@ mod tests {
19011901
0, 0, 0, 1,
19021902
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
19031903
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1904-
0, 3,
1904+
0, 0, 0, 3,
19051905
// Value variant (Null)
19061906
0, 0, 0, 0, 0, 0, 0, 1,
19071907
// number of tuple elements
@@ -1916,10 +1916,10 @@ mod tests {
19161916
0, 0, 0, 0,
19171917
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
19181918
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
1919-
0, 12,
1919+
0, 0, 0, 12,
19201920
98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102,
19211921
98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102,
1922-
0, 9,
1922+
0, 0, 0, 9,
19231923
0, 0, 0, 0, 0, 0, 0, 2,
19241924
1,
19251925
14, 0, 0, 0, 0, 0, 0, 0,
@@ -1933,10 +1933,10 @@ mod tests {
19331933
0, 0, 0, 0,
19341934
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
19351935
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
1936-
0, 12,
1936+
0, 0, 0, 12,
19371937
98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102,
19381938
98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102, 98, 101, 101, 102,
1939-
0, 9,
1939+
0, 0, 0, 9,
19401940
0, 0, 0, 0, 0, 0, 0, 1,
19411941
0,
19421942
],

src/util/transaction.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ impl From<Option<BlockId>> for TransactionStatus {
4848
#[derive(Serialize, Deserialize)]
4949
pub struct TxInput {
5050
pub txid: Txid,
51-
pub vin: u16,
51+
pub vin: u32,
5252
}
5353

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

0 commit comments

Comments
 (0)