diff options
author | Matt Corallo <git@bluematt.me> | 2019-08-01 17:54:48 -0400 |
---|---|---|
committer | Matt Corallo <git@bluematt.me> | 2019-08-02 15:37:13 -0400 |
commit | 970de70bdd3542e75b73c79b06f143168c361494 (patch) | |
tree | 727c0319bc969dea20689051dcb7999b3fb1c0b0 | |
parent | e653eeff7651d823407e2e31a89176cc0b240c62 (diff) |
Dump transaction version as an unsigned integer in RPC/TxToUniv
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
-rw-r--r-- | doc/release-notes-16525.md | 7 | ||||
-rw-r--r-- | src/core_write.cpp | 4 | ||||
-rwxr-xr-x | test/functional/rpc_rawtransaction.py | 3 |
3 files changed, 12 insertions, 2 deletions
diff --git a/doc/release-notes-16525.md b/doc/release-notes-16525.md new file mode 100644 index 0000000000..f042c875f8 --- /dev/null +++ b/doc/release-notes-16525.md @@ -0,0 +1,7 @@ +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). diff --git a/src/core_write.cpp b/src/core_write.cpp index 4d64446d7b..c7049eb16c 100644 --- a/src/core_write.cpp +++ b/src/core_write.cpp @@ -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)); diff --git a/test/functional/rpc_rawtransaction.py b/test/functional/rpc_rawtransaction.py index 4338675270..c2b80bc3dd 100755 --- a/test/functional/rpc_rawtransaction.py +++ b/test/functional/rpc_rawtransaction.py @@ -417,11 +417,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() |