mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-11 01:26:10 +01:00
Merge #16525: Dump transaction version as an unsigned integer in RPC/TxToUniv
e80259f197
Additionally treat Tx.nVersion as unsigned in joinpsbts (Matt Corallo)970de70bdd
Dump transaction version as an unsigned integer in RPC/TxToUniv (Matt Corallo) Pull request description: Consensus-wise we already treat it as an unsigned integer (the only rules around it are in CSV/locktime handling), but changing the underlying data type means touching consensus code for a simple cleanup change, which isn't really worth it. See-also, https://github.com/rust-bitcoin/rust-bitcoin/pull/299 ACKs for top commit: sipa: ACKe80259f197
practicalswift: ACKe80259f197
ajtowns: ACKe80259f197
code review -- checked all other uses of tx.nVersion treat it as unsigned (except for policy.cpp:IsStandard anyway), so looks good. naumenkogs: ACKe80259f
Tree-SHA512: 6760a2c77e24e9e1f79a336ca925f9bbca3a827ce02003c71d7f214b82ed3dea13fa7d9f87df9b9445cd58dff8b44a15571d821c876f22f8e5a372a014c9976b
This commit is contained in:
commit
c57dc566b0
4 changed files with 18 additions and 6 deletions
9
doc/release-notes-16525.md
Normal file
9
doc/release-notes-16525.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
RPC changes
|
||||
-----------
|
||||
|
||||
Exposed transaction version numbers are now treated as unsigned 32-bit integers
|
||||
instead of signed 32-bit integers. This matches their treatment in consensus
|
||||
logic. Versions greater than 2 continue to be non-standard (matching previous
|
||||
behavior of smaller than 1 or greater than 2 being non-standard). Note that
|
||||
this includes the joinpsbt command, which combines partially-signed
|
||||
transactions by selecting the highest version number.
|
|
@ -179,7 +179,9 @@ void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry,
|
|||
{
|
||||
entry.pushKV("txid", tx.GetHash().GetHex());
|
||||
entry.pushKV("hash", tx.GetWitnessHash().GetHex());
|
||||
entry.pushKV("version", tx.nVersion);
|
||||
// Transaction version is actually unsigned in consensus checks, just signed in memory,
|
||||
// so cast to unsigned before giving it to the user.
|
||||
entry.pushKV("version", static_cast<int64_t>(static_cast<uint32_t>(tx.nVersion)));
|
||||
entry.pushKV("size", (int)::GetSerializeSize(tx, PROTOCOL_VERSION));
|
||||
entry.pushKV("vsize", (GetTransactionWeight(tx) + WITNESS_SCALE_FACTOR - 1) / WITNESS_SCALE_FACTOR);
|
||||
entry.pushKV("weight", GetTransactionWeight(tx));
|
||||
|
|
|
@ -1632,7 +1632,7 @@ UniValue joinpsbts(const JSONRPCRequest& request)
|
|||
throw JSONRPCError(RPC_INVALID_PARAMETER, "At least two PSBTs are required to join PSBTs.");
|
||||
}
|
||||
|
||||
int32_t best_version = 1;
|
||||
uint32_t best_version = 1;
|
||||
uint32_t best_locktime = 0xffffffff;
|
||||
for (unsigned int i = 0; i < txs.size(); ++i) {
|
||||
PartiallySignedTransaction psbtx;
|
||||
|
@ -1642,8 +1642,8 @@ UniValue joinpsbts(const JSONRPCRequest& request)
|
|||
}
|
||||
psbtxs.push_back(psbtx);
|
||||
// Choose the highest version number
|
||||
if (psbtx.tx->nVersion > best_version) {
|
||||
best_version = psbtx.tx->nVersion;
|
||||
if (static_cast<uint32_t>(psbtx.tx->nVersion) > best_version) {
|
||||
best_version = static_cast<uint32_t>(psbtx.tx->nVersion);
|
||||
}
|
||||
// Choose the lowest lock time
|
||||
if (psbtx.tx->nLockTime < best_locktime) {
|
||||
|
@ -1654,7 +1654,7 @@ UniValue joinpsbts(const JSONRPCRequest& request)
|
|||
// Create a blank psbt where everything will be added
|
||||
PartiallySignedTransaction merged_psbt;
|
||||
merged_psbt.tx = CMutableTransaction();
|
||||
merged_psbt.tx->nVersion = best_version;
|
||||
merged_psbt.tx->nVersion = static_cast<int32_t>(best_version);
|
||||
merged_psbt.tx->nLockTime = best_locktime;
|
||||
|
||||
// Merge
|
||||
|
|
|
@ -424,11 +424,12 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
####################################
|
||||
|
||||
# Test the minimum transaction version number that fits in a signed 32-bit integer.
|
||||
# As transaction version is unsigned, this should convert to its unsigned equivalent.
|
||||
tx = CTransaction()
|
||||
tx.nVersion = -0x80000000
|
||||
rawtx = ToHex(tx)
|
||||
decrawtx = self.nodes[0].decoderawtransaction(rawtx)
|
||||
assert_equal(decrawtx['version'], -0x80000000)
|
||||
assert_equal(decrawtx['version'], 0x80000000)
|
||||
|
||||
# Test the maximum transaction version number that fits in a signed 32-bit integer.
|
||||
tx = CTransaction()
|
||||
|
|
Loading…
Add table
Reference in a new issue