From 12e4bd4cb1b39aa3a6eb19dcaabbbc41d49d96c2 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Wed, 14 Oct 2026 15:32:00 +0000 Subject: [PATCH 1/2] fix(dash): keep the stored serde index of every transaction payload variant #1156 added the ProDisTx, ProUpShareTx and ProUpSharedRegTx payloads to `TransactionPayload` before `ClassicalWithNonStandardVersionTypeBytesPayloadType` and `RawPayloadType`. `serde` and `bincode` encode an enum variant by its index, so those two moved from 9 and 10 to 12 and 13. Hosts persist transactions in those encodings: Dash Platform's wallet store keeps key-wallet `TransactionRecord`s with `bincode::serde`, and one stored row with either payload fails the whole wallet load. The three new variants now come after `RawPayloadType`, so every variant that existed before #1156 is stored under its old index again. The enum doc says new variants go at the end. Consensus encoding and txids don't change; only the variant order (and so the derived `Ord`) does. Tests: - every variant's index under `bincode::serde` and `bincode`, pinned by an exhaustive match, so a new variant has to be given its index; - 23 transactions encoded before #1156 at 90359ed5, covering all 11 payload variants that existed then, decode to what their consensus bytes hold and re-encode to the same bytes under both encodings. Co-authored-by: Claude Opus 5.5 --- .../transaction/special_transaction/mod.rs | 17 +- dash/tests/data/persisted_transactions.txt | 31 ++++ dash/tests/persisted_transactions.rs | 167 ++++++++++++++++++ 3 files changed, 209 insertions(+), 6 deletions(-) create mode 100644 dash/tests/data/persisted_transactions.txt create mode 100644 dash/tests/persisted_transactions.rs diff --git a/dash/src/blockdata/transaction/special_transaction/mod.rs b/dash/src/blockdata/transaction/special_transaction/mod.rs index 47b29d5ff..e785d3cdf 100644 --- a/dash/src/blockdata/transaction/special_transaction/mod.rs +++ b/dash/src/blockdata/transaction/special_transaction/mod.rs @@ -74,6 +74,11 @@ pub const MAX_PAYLOAD_ECDSA_SIGNATURE_SIZE: usize = 75; /// An enum wrapper around various special transaction payloads. /// Special transactions are defined in DIP 2. +/// +/// Add a new variant at the end, never between existing ones. `serde` and `bincode` encode a +/// variant by its index, hosts persist transactions in those encodings (Dash Platform's wallet +/// store does), and a variant inserted earlier shifts the index of every one after it, so what +/// was stored with them no longer decodes. The derived `Ord` follows the same order. #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)] #[cfg_attr(feature = "bincode", derive(Encode, Decode))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] @@ -96,12 +101,6 @@ pub enum TransactionPayload { AssetLockPayloadType(AssetLockPayload), /// A wrapper for an Asset Unlock payload AssetUnlockPayloadType(AssetUnlockPayload), - /// A wrapper for a Masternode Dissolve payload - ProviderDissolvePayloadType(ProviderDissolvePayload), - /// A wrapper for a Masternode Update Share payload - ProviderUpdateSharePayloadType(ProviderUpdateSharePayload), - /// A wrapper for a Masternode Update Shared Registrar payload - ProviderUpdateSharedRegistrarPayloadType(ProviderUpdateSharedRegistrarPayload), /// A pseudo-payload that carries the raw `nTxType` u16 read from a pre-DIP-0002 /// transaction (`version == 0`). Older transactions on the chain were free to put /// arbitrary bytes in the type slot; we keep the original value here so that @@ -113,6 +112,12 @@ pub enum TransactionPayload { /// like a newer version. Keeping the bytes lets the block decode, and the transaction /// re-encode to the same bytes and txid. [`Self::get_type`] still reports a known type. RawPayloadType(u16, Vec), + /// A wrapper for a Masternode Dissolve payload + ProviderDissolvePayloadType(ProviderDissolvePayload), + /// A wrapper for a Masternode Update Share payload + ProviderUpdateSharePayloadType(ProviderUpdateSharePayload), + /// A wrapper for a Masternode Update Shared Registrar payload + ProviderUpdateSharedRegistrarPayloadType(ProviderUpdateSharedRegistrarPayload), } impl Encodable for TransactionPayload { diff --git a/dash/tests/data/persisted_transactions.txt b/dash/tests/data/persisted_transactions.txt new file mode 100644 index 000000000..a4fcdced5 --- /dev/null +++ b/dash/tests/data/persisted_transactions.txt @@ -0,0 +1,31 @@ +# Transactions as hosts stored them before rust-dashcore#1156, one per `TransactionPayload` +# variant that existed then. Generated at 90359ed5 (rust-dashcore dev right before #1156) +# with bincode 2's standard configuration, the encoding Dash Platform's wallet store uses. +# Most transactions come from Dash Platform's wallet-storage fixture (rows written at +# 40268cc0 and 6c5775cf), the quorum commitment from a Core v24 devnet block, the rest are +# built for the file. +# +# Columns: name, payload variant, consensus hex, `bincode::serde` hex, `bincode` hex. +asset_lock AssetLockPayloadType 03000800014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1010000006a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530ffffffff028801030000000000026a00288d9500000000001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac0000000024010188010300000000001976a914aa85a9fb4f84bc63046a574ac4f2ce3361f0db0d88ac 030001204d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff0002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac01070101fc880103001976a914aa85a9fb4f84bc63046a574ac4f2ce3361f0db0d88ac 0300014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff00000002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac01070101fc880103001976a914aa85a9fb4f84bc63046a574ac4f2ce3361f0db0d88ac +asset_unlock_v1 AssetUnlockPayloadType 03000900000100e1f505000000001976a914131313131313131313131313131313131313131388ac000000009101650000000000000070110100f40100001414141414141414141414141414141414141414141414141414141414141414151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 03000001fc00e1f5051976a914131313131313131313131313131313131313131388ac01080165fc70110100fbf40120141414141414141414141414141414141414141414141414141414141414141460151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 03000001fc00e1f5051976a914131313131313131313131313131313131313131388ac01080165fc70110100fbf4011414141414141414141414141414141414141414141414141414141414141414151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +asset_unlock_v2 AssetUnlockPayloadType 03000900000100e1f505000000001976a914131313131313131313131313131313131313131388ac000000009102650000000000000070110100f40100001414141414141414141414141414141414141414141414141414141414141414151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 03000001fc00e1f5051976a914131313131313131313131313131313131313131388ac01080265fc70110100fbf40120141414141414141414141414141414141414141414141414141414141414141460151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 03000001fc00e1f5051976a914131313131313131313131313131313131313131388ac01080265fc70110100fbf4011414141414141414141414141414141414141414141414141414141414141414151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +block_QuorumCommitmentPayloadType QuorumCommitmentPayloadType 03000600000000000000fda3010100983a0000030002f5ec6011210fb9ecc2fa58d73bed67414792c10ddf793f45c1901e72f1db7465fd90010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd900100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 03000000010501fb983a030220f5ec6011210fb9ecc2fa58d73bed67414792c10ddf793f45c1901e72f1db746500fb900100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb900100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000603030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030302000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 03000000010501fb983a0302f5ec6011210fb9ecc2fa58d73bed67414792c10ddf793f45c1901e72f1db746500fb900100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb9001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +cbtx_v1 CoinbasePayloadType 03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff025151ffffffff01404b4c0000000000197676767676767676767676767676767676767676767676767600000000260100e80300000101010101010101010101010101010101010101010101010101010101010101 030001200000000000000000000000000000000000000000000000000000000000000000fcffffffff025151fcffffffff0001fc404b4c001976767676767676767676767676767676767676767676767676010401fbe803200101010101010101010101010101010101010101010101010101010101010101200000000000000000000000000000000000000000000000000000000000000000000000 0300010000000000000000000000000000000000000000000000000000000000000000fcffffffff025151fcffffffff00000001fc404b4c001976767676767676767676767676767676767676767676767676010401fbe80301010101010101010101010101010101010101010101010101010101010101010000000000000000000000000000000000000000000000000000000000000000000000 +cbtx_v2 CoinbasePayloadType 03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff025151ffffffff01404b4c0000000000197676767676767676767676767676767676767676767676767600000000460200e803000001010101010101010101010101010101010101010101010101010101010101010202020202020202020202020202020202020202020202020202020202020202 030001200000000000000000000000000000000000000000000000000000000000000000fcffffffff025151fcffffffff0001fc404b4c001976767676767676767676767676767676767676767676767676010402fbe803200101010101010101010101010101010101010101010101010101010101010101200202020202020202020202020202020202020202020202020202020202020202000000 0300010000000000000000000000000000000000000000000000000000000000000000fcffffffff025151fcffffffff00000001fc404b4c001976767676767676767676767676767676767676767676767676010402fbe80301010101010101010101010101010101010101010101010101010101010101010202020202020202020202020202020202020202020202020202020202020202000000 +cbtx_v3 CoinbasePayloadType 03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff025151ffffffff01404b4c0000000000197676767676767676767676767676767676767676767676767600000000b10300e803000001010101010101010101010101010101010101010101010101010101010101010202020202020202020202020202020202020202020202020202020202020202fd84030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303031027000000000000 030001200000000000000000000000000000000000000000000000000000000000000000fcffffffff025151fcffffffff0001fc404b4c001976767676767676767676767676767676767676767676767676010403fbe80320010101010101010101010101010101010101010101010101010101010101010120020202020202020202020202020202020202020202020202020202020202020201fb8403016003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030301fb1027 0300010000000000000000000000000000000000000000000000000000000000000000fcffffffff025151fcffffffff00000001fc404b4c001976767676767676767676767676767676767676767676767676010403fbe8030101010101010101010101010101010101010101010101010101010101010101020202020202020202020202020202020202020202020202020202020202020201fb84030103030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030301fb1027 +cbtx_v4 CoinbasePayloadType 03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff016affffffff036de1f505000000001976a91456208a8adff9433262bffee3c4894d2a160c21bd88ac209db40600000000016a26072d0b000000001976a91456208a8adff9433262bffee3c4894d2a160c21bd88ac00000000cf04002a3b0000db318d0bad75d80a6e14088f71657af817056edee711360d25c729905f33ed502692b21d078be4bc3103156612ba6bdcf387efdd6320a50a97985f5cdce4ead8008df9d40906f1c7c36c545b06daec45a84ffd43b5caf4045c9c9a39a146a7771de6cbdd11f5d16b22e9e358f5c483e35b12a5f3cab190026c5445dec34e632c36a0ba36a1f87bb411d7d292c5fd55cd36128877c707747286e40abec1aee7e4812eb72a56c40700000000000000000000000000000000000000000000000000000000000000000000 030001200000000000000000000000000000000000000000000000000000000000000000fcffffffff016afcffffffff0003fc6de1f5051976a91456208a8adff9433262bffee3c4894d2a160c21bd88acfc209db406016afc26072d0b1976a91456208a8adff9433262bffee3c4894d2a160c21bd88ac010404fb2a3b20db318d0bad75d80a6e14088f71657af817056edee711360d25c729905f33ed50202692b21d078be4bc3103156612ba6bdcf387efdd6320a50a97985f5cdce4ead8010001608df9d40906f1c7c36c545b06daec45a84ffd43b5caf4045c9c9a39a146a7771de6cbdd11f5d16b22e9e358f5c483e35b12a5f3cab190026c5445dec34e632c36a0ba36a1f87bb411d7d292c5fd55cd36128877c707747286e40abec1aee7e48101fd2eb72a56c407000001200000000000000000000000000000000000000000000000000000000000000000 0300010000000000000000000000000000000000000000000000000000000000000000fcffffffff016afcffffffff00000003fc6de1f5051976a91456208a8adff9433262bffee3c4894d2a160c21bd88acfc209db406016afc26072d0b1976a91456208a8adff9433262bffee3c4894d2a160c21bd88ac010404fb2a3bdb318d0bad75d80a6e14088f71657af817056edee711360d25c729905f33ed502692b21d078be4bc3103156612ba6bdcf387efdd6320a50a97985f5cdce4ead80100018df9d40906f1c7c36c545b06daec45a84ffd43b5caf4045c9c9a39a146a7771de6cbdd11f5d16b22e9e358f5c483e35b12a5f3cab190026c5445dec34e632c36a0ba36a1f87bb411d7d292c5fd55cd36128877c707747286e40abec1aee7e48101fd2eb72a56c4070000010000000000000000000000000000000000000000000000000000000000000000 +classical_type_bytes_42 ClassicalWithNonStandardVersionTypeBytesPayloadType 00002a000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000 0000012000000000000000000000000000000000000000000000000000000000000000000000fcffffffff0001fd00f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac01092a 00000100000000000000000000000000000000000000000000000000000000000000000000fcffffffff00000001fd00f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac01092a +mnhf_signal_v1 MnhfSignalPayloadType 03000700011111111111111111111111111111111111111111111111111111111111111111010000000151feffffff01905f0100000000001976a914121212121212121212121212121212121212121288ac0000000082010a3131313131313131313131313131313131313131313131313131313131313131323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232 030001201111111111111111111111111111111111111111111111111111111111111111010151fcfeffffff0001fc905f01001976a914121212121212121212121212121212121212121288ac0106010a20313131313131313131313131313131313131313131313131313131313131313160323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232 0300011111111111111111111111111111111111111111111111111111111111111111010151fcfeffffff00000001fc905f01001976a914121212121212121212121212121212121212121288ac0106010a3131313131313131313131313131313131313131313131313131313131313131323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232 +pro_reg_tx_v1 ProviderRegistrationPayloadType 0300010001ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58010000006b483045022100fe8fec0b3880bcac29614348887769b0b589908e3f5ec55a6cf478a6652e736502202f30430806a6690524e4dd599ba498e5ff100dea6a872ebb89c2fd651caa71ed012103d85b25d6886f0b3b8ce1eef63b720b518fad0b8e103eba4e85b6980bfdda2dfdffffffff018e37807e090000001976a9144ee1d4e5d61ac40a13b357ac6e368997079678c888ac00000000fd1201010000000000ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab580000000000000000000000000000ffff010205064e1f3dd03f9ec192b5f275a433bfc90f468ee1a3eb4c157b10706659e25eb362b5d902d809f9160b1688e201ee6e94b40f9b5062d7074683ef05a2d5efb7793c47059c878dfad38a30fafe61575db40f05ab0a08d55119b0aad300001976a9144fbc8fb6e11e253d77e5a9c987418e89cf4a63d288ac3477990b757387cb0406168c2720acf55f83603736a314a37d01b135b873a27b411fb37e49c1ff2b8057713939a5513e6e711a71cff2e517e6224df724ed750aef1b7f9ad9ec612b4a7250232e1e400da718a9501e1d9a5565526e4b1ff68c028763 03000120ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58016b483045022100fe8fec0b3880bcac29614348887769b0b589908e3f5ec55a6cf478a6652e736502202f30430806a6690524e4dd599ba498e5ff100dea6a872ebb89c2fd651caa71ed012103d85b25d6886f0b3b8ce1eef63b720b518fad0b8e103eba4e85b6980bfdda2dfdfcffffffff0001fd8e37807e090000001976a9144ee1d4e5d61ac40a13b357ac6e368997079678c888ac010001000020ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58000001020506fb1f4e143dd03f9ec192b5f275a433bfc90f468ee1a3eb4c6031353762313037303636353965323565623336326235643930326438303966393136306231363838653230316565366539346234306639623530363264373037343638336566303561326435656662373739336334373035396338373864666114d38a30fafe61575db40f05ab0a08d55119b0aad3001976a9144fbc8fb6e11e253d77e5a9c987418e89cf4a63d288ac203477990b757387cb0406168c2720acf55f83603736a314a37d01b135b873a27b411fb37e49c1ff2b8057713939a5513e6e711a71cff2e517e6224df724ed750aef1b7f9ad9ec612b4a7250232e1e400da718a9501e1d9a5565526e4b1ff68c028763000000 030001ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58016b483045022100fe8fec0b3880bcac29614348887769b0b589908e3f5ec55a6cf478a6652e736502202f30430806a6690524e4dd599ba498e5ff100dea6a872ebb89c2fd651caa71ed012103d85b25d6886f0b3b8ce1eef63b720b518fad0b8e103eba4e85b6980bfdda2dfdfcffffffff00000001fd8e37807e090000001976a9144ee1d4e5d61ac40a13b357ac6e368997079678c888ac0100010000ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58000001020506fb1f4e3dd03f9ec192b5f275a433bfc90f468ee1a3eb4c157b10706659e25eb362b5d902d809f9160b1688e201ee6e94b40f9b5062d7074683ef05a2d5efb7793c47059c878dfad38a30fafe61575db40f05ab0a08d55119b0aad3001976a9144fbc8fb6e11e253d77e5a9c987418e89cf4a63d288ac3477990b757387cb0406168c2720acf55f83603736a314a37d01b135b873a27b411fb37e49c1ff2b8057713939a5513e6e711a71cff2e517e6224df724ed750aef1b7f9ad9ec612b4a7250232e1e400da718a9501e1d9a5565526e4b1ff68c028763000000 +pro_reg_tx_v1_no_address ProviderRegistrationPayloadType 0300010001ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58010000006b483045022100fe8fec0b3880bcac29614348887769b0b589908e3f5ec55a6cf478a6652e736502202f30430806a6690524e4dd599ba498e5ff100dea6a872ebb89c2fd651caa71ed012103d85b25d6886f0b3b8ce1eef63b720b518fad0b8e103eba4e85b6980bfdda2dfdffffffff018e37807e090000001976a9144ee1d4e5d61ac40a13b357ac6e368997079678c888ac00000000fd1201010000000000ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58000000000000000000000000000000000000000000003dd03f9ec192b5f275a433bfc90f468ee1a3eb4c157b10706659e25eb362b5d902d809f9160b1688e201ee6e94b40f9b5062d7074683ef05a2d5efb7793c47059c878dfad38a30fafe61575db40f05ab0a08d55119b0aad300001976a9144fbc8fb6e11e253d77e5a9c987418e89cf4a63d288ac3477990b757387cb0406168c2720acf55f83603736a314a37d01b135b873a27b411fb37e49c1ff2b8057713939a5513e6e711a71cff2e517e6224df724ed750aef1b7f9ad9ec612b4a7250232e1e400da718a9501e1d9a5565526e4b1ff68c028763 03000120ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58016b483045022100fe8fec0b3880bcac29614348887769b0b589908e3f5ec55a6cf478a6652e736502202f30430806a6690524e4dd599ba498e5ff100dea6a872ebb89c2fd651caa71ed012103d85b25d6886f0b3b8ce1eef63b720b518fad0b8e103eba4e85b6980bfdda2dfdfcffffffff0001fd8e37807e090000001976a9144ee1d4e5d61ac40a13b357ac6e368997079678c888ac010001000020ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab5800010000000000000000000000000000000000143dd03f9ec192b5f275a433bfc90f468ee1a3eb4c6031353762313037303636353965323565623336326235643930326438303966393136306231363838653230316565366539346234306639623530363264373037343638336566303561326435656662373739336334373035396338373864666114d38a30fafe61575db40f05ab0a08d55119b0aad3001976a9144fbc8fb6e11e253d77e5a9c987418e89cf4a63d288ac203477990b757387cb0406168c2720acf55f83603736a314a37d01b135b873a27b411fb37e49c1ff2b8057713939a5513e6e711a71cff2e517e6224df724ed750aef1b7f9ad9ec612b4a7250232e1e400da718a9501e1d9a5565526e4b1ff68c028763000000 030001ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58016b483045022100fe8fec0b3880bcac29614348887769b0b589908e3f5ec55a6cf478a6652e736502202f30430806a6690524e4dd599ba498e5ff100dea6a872ebb89c2fd651caa71ed012103d85b25d6886f0b3b8ce1eef63b720b518fad0b8e103eba4e85b6980bfdda2dfdfcffffffff00000001fd8e37807e090000001976a9144ee1d4e5d61ac40a13b357ac6e368997079678c888ac0100010000ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58000100000000000000000000000000000000003dd03f9ec192b5f275a433bfc90f468ee1a3eb4c157b10706659e25eb362b5d902d809f9160b1688e201ee6e94b40f9b5062d7074683ef05a2d5efb7793c47059c878dfad38a30fafe61575db40f05ab0a08d55119b0aad3001976a9144fbc8fb6e11e253d77e5a9c987418e89cf4a63d288ac3477990b757387cb0406168c2720acf55f83603736a314a37d01b135b873a27b411fb37e49c1ff2b8057713939a5513e6e711a71cff2e517e6224df724ed750aef1b7f9ad9ec612b4a7250232e1e400da718a9501e1d9a5565526e4b1ff68c028763000000 +pro_reg_tx_v2_evo_ipv6 ProviderRegistrationPayloadType 03000100014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1010000006a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530ffffffff028801030000000000026a00288d9500000000001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac00000000fd2a0102000100000004040404040404040404040404040404040404040404040404040404040404040100000020010db80000000000000000000000074e1f0505050505050505050505050505050505050505060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606070707070707070707070707070707070707070700001976a914080808080808080808080808080808080808080888ac09090909090909090909090909090909090909090909090909090909090909090b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b2068bb01410a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a 030001204d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff0002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac0100020100200404040404040404040404040404040404040404040404040404040404040404010120010db8000000000000000000000007fb1f4e14050505050505050505050505050505050505050560303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036140707070707070707070707070707070707070707001976a914080808080808080808080808080808080808080888ac200909090909090909090909090909090909090909090909090909090909090909410a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a01140b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b01fb206801fbbb01 0300014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff00000002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac01000201000404040404040404040404040404040404040404040404040404040404040404010120010db8000000000000000000000007fb1f4e05050505050505050505050505050505050505050606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060707070707070707070707070707070707070707001976a914080808080808080808080808080808080808080888ac0909090909090909090909090909090909090909090909090909090909090909410a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a010b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b01fb206801fbbb01 +pro_reg_tx_v3 ProviderRegistrationPayloadType 0300010001c2075d0bbe8678dea77af146f4c4fdd1ac6bec70333ffef3e7dc940e484c8120010000006a473044022065a0067b55484e06109b4282a8bb14a3392ed76ed0a1195a91a3e3b531098c7f022002aafa428439c858e721664c6b4a71aae2f5bc4ad77bdfc1651a9e8e35428c40012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffeffffff0200e87648170000001976a9140b80dfe15263ad7abd2421b82a1291e07d30571c88ac7e654870740000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac00000000ed03000000000000000000000000000000000000000000000000000000000000000000000000000000000001000c707b9fc7af33ddf9a9cf50ff45fc587f590f5693bec56a034e3bdb3ce1e978d5487d03129c507bd15e73fcb7dac95c7333a68f561450702cd1aac511e40275a501ea07d5b43701d895d09a68803bd67d9c23ab94d4428d0000021976a91494a6df7e4fc8f474b28c634c748d5ddf88b7ee3788ac70171976a91417340a777ca7c690d65d19d2f7aca4b1a0387fa388aca00f000000000000000000000000008576d28cdc5f9022cd2988a05001e5ed2c318854bb3c9d19ce3dcb38ad3ce52e00 03000120c2075d0bbe8678dea77af146f4c4fdd1ac6bec70333ffef3e7dc940e484c8120016a473044022065a0067b55484e06109b4282a8bb14a3392ed76ed0a1195a91a3e3b531098c7f022002aafa428439c858e721664c6b4a71aae2f5bc4ad77bdfc1651a9e8e35428c40012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffcfeffffff0002fd00e87648170000001976a9140b80dfe15263ad7abd2421b82a1291e07d30571c88acfd7e654870740000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac0100030000200000000000000000000000000000000000000000000000000000000000000000000100140c707b9fc7af33ddf9a9cf50ff45fc587f590f566039336265633536613033346533626462336365316539373864353438376430333132396335303762643135653733666362376461633935633733333361363866353631343530373032636431616163353131653430323735613530316561303714d5b43701d895d09a68803bd67d9c23ab94d4428d0000208576d28cdc5f9022cd2988a05001e5ed2c318854bb3c9d19ce3dcb38ad3ce52e0000000001021976a91494a6df7e4fc8f474b28c634c748d5ddf88b7ee3788acfb70171976a91417340a777ca7c690d65d19d2f7aca4b1a0387fa388acfba00f0100000000 030001c2075d0bbe8678dea77af146f4c4fdd1ac6bec70333ffef3e7dc940e484c8120016a473044022065a0067b55484e06109b4282a8bb14a3392ed76ed0a1195a91a3e3b531098c7f022002aafa428439c858e721664c6b4a71aae2f5bc4ad77bdfc1651a9e8e35428c40012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffcfeffffff00000002fd00e87648170000001976a9140b80dfe15263ad7abd2421b82a1291e07d30571c88acfd7e654870740000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac010003000000000000000000000000000000000000000000000000000000000000000000000001000c707b9fc7af33ddf9a9cf50ff45fc587f590f5693bec56a034e3bdb3ce1e978d5487d03129c507bd15e73fcb7dac95c7333a68f561450702cd1aac511e40275a501ea07d5b43701d895d09a68803bd67d9c23ab94d4428d00008576d28cdc5f9022cd2988a05001e5ed2c318854bb3c9d19ce3dcb38ad3ce52e0000000001021976a91494a6df7e4fc8f474b28c634c748d5ddf88b7ee3788acfb70171976a91417340a777ca7c690d65d19d2f7aca4b1a0387fa388acfba00f0100000000 +pro_up_reg_tx_v1 ProviderUpdateRegistrarPayloadType 0300030001c7de76dac8dd96f9b49b12a06fe39c8caf0cad12d23ad6026094d9b11b2b260d000000006b483045022100b31895e8cea95a965c82d842eadd6eef3c7b29e677c62a5c8e2b5dce05b4ddfc02206c7b5a9ea8b71983c3b21f4ff75ac1aa44090d28af8b2d9b93e794e6eb5835e20121032ea8be689184f329dce575776bc956cd52230f4c04755d5753d9491ea5bf8f2affffffff01c94670d0060000001976a914345f07bc7ebaf9f82f273be249b6066d2d5c236688ac00000000e4010049aa692330179f95c1342715102e37777df91cc0f3a4ae7e8f9e214ee97dbb3d0000139b654f0b1c031e1cf2b934c2d895178875cfe7c6a4f6758f02bc66eea7fc292d0040701acbe31f5e14a911cb061a2f6cc4a7bb877a80c11ae06b988d98305773f93b981976a91456bcf3cac49235537d6ce0fb3214d8850a6db77788ac2d7f857a2f15eb9340a0cfbce3ff8cf09b40e582d05b1f98c7468caa0f942bcf411ff69c9cb072660cc10048332c14c08621e7461f1f4f54b448baedc0e3434d9a7c3a1780885aaef4dd44c597b49b97595e02ad54728f572967d3ce0c2c0ceac174 03000120c7de76dac8dd96f9b49b12a06fe39c8caf0cad12d23ad6026094d9b11b2b260d006b483045022100b31895e8cea95a965c82d842eadd6eef3c7b29e677c62a5c8e2b5dce05b4ddfc02206c7b5a9ea8b71983c3b21f4ff75ac1aa44090d28af8b2d9b93e794e6eb5835e20121032ea8be689184f329dce575776bc956cd52230f4c04755d5753d9491ea5bf8f2afcffffffff0001fdc94670d0060000001976a914345f07bc7ebaf9f82f273be249b6066d2d5c236688ac0102012049aa692330179f95c1342715102e37777df91cc0f3a4ae7e8f9e214ee97dbb3d0060313339623635346630623163303331653163663262393334633264383935313738383735636665376336613466363735386630326263363665656137666332393264303034303730316163626533316635653134613931316362303631613266146cc4a7bb877a80c11ae06b988d98305773f93b981976a91456bcf3cac49235537d6ce0fb3214d8850a6db77788ac202d7f857a2f15eb9340a0cfbce3ff8cf09b40e582d05b1f98c7468caa0f942bcf411ff69c9cb072660cc10048332c14c08621e7461f1f4f54b448baedc0e3434d9a7c3a1780885aaef4dd44c597b49b97595e02ad54728f572967d3ce0c2c0ceac174 030001c7de76dac8dd96f9b49b12a06fe39c8caf0cad12d23ad6026094d9b11b2b260d006b483045022100b31895e8cea95a965c82d842eadd6eef3c7b29e677c62a5c8e2b5dce05b4ddfc02206c7b5a9ea8b71983c3b21f4ff75ac1aa44090d28af8b2d9b93e794e6eb5835e20121032ea8be689184f329dce575776bc956cd52230f4c04755d5753d9491ea5bf8f2afcffffffff00000001fdc94670d0060000001976a914345f07bc7ebaf9f82f273be249b6066d2d5c236688ac01020149aa692330179f95c1342715102e37777df91cc0f3a4ae7e8f9e214ee97dbb3d00139b654f0b1c031e1cf2b934c2d895178875cfe7c6a4f6758f02bc66eea7fc292d0040701acbe31f5e14a911cb061a2f6cc4a7bb877a80c11ae06b988d98305773f93b981976a91456bcf3cac49235537d6ce0fb3214d8850a6db77788ac2d7f857a2f15eb9340a0cfbce3ff8cf09b40e582d05b1f98c7468caa0f942bcf411ff69c9cb072660cc10048332c14c08621e7461f1f4f54b448baedc0e3434d9a7c3a1780885aaef4dd44c597b49b97595e02ad54728f572967d3ce0c2c0ceac174 +pro_up_reg_tx_v2 ProviderUpdateRegistrarPayloadType 03000300014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1010000006a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530ffffffff028801030000000000026a00288d9500000000001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac00000000e402001010101010101010101010101010101010101010101010101010101010101010000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112121212121212121212121212121212121212121976a914131313131313131313131313131313131313131388ac1414141414141414141414141414141414141414141414141414141414141414411515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 030001204d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff0002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac01020220101010101010101010101010101010101010101010101010101010101010101000603131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131311412121212121212121212121212121212121212121976a914131313131313131313131313131313131313131388ac201414141414141414141414141414141414141414141414141414141414141414411515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 0300014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff00000002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac01020210101010101010101010101010101010101010101010101010101010101010100011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112121212121212121212121212121212121212121976a914131313131313131313131313131313131313131388ac1414141414141414141414141414141414141414141414141414141414141414411515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +pro_up_reg_tx_v3 ProviderUpdateRegistrarPayloadType 0300030001ac515e0ff3128c046dc2b4a5414e91dbfee96643f9e3cab86918f36e77d9587c000000006a47304402202e23fe274788884c91a48592dbe2cfec421286c1c56a0a4f83b27e731b40bdd5022040b0818dae31cd8213d530c31768bf4fdd9e84a3d7f95ac77214c79ec1e35cf7012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffeffffff017678d1275d0000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac00000000e70300c2075d0bbe8678dea77af146f4c4fdd1ac6bec70333ffef3e7dc940e484c81200000806b8889b4ed6ccecefe7861fc3d69b7598f6ab9621fe2568403f94a1c5df398891433cdf301c67fda82f80bfe7f321465e088b8b1360c62946afcbea403cf927d5bfe23011976a9144a83c35e84c83510f20989dee7845ff133c567af88ac1027415720a36cce2d68158913b3523ff1167e016cfd049560109894dd9d844fa99c411f5e48101069586123670bd805a9f7b28ed3ebbf18292d18c3f5bfc819bb76ab8a76b5730eab51427a15742ef809693c8e0dbe27737a17f000823859ce58c30f03 03000120ac515e0ff3128c046dc2b4a5414e91dbfee96643f9e3cab86918f36e77d9587c006a47304402202e23fe274788884c91a48592dbe2cfec421286c1c56a0a4f83b27e731b40bdd5022040b0818dae31cd8213d530c31768bf4fdd9e84a3d7f95ac77214c79ec1e35cf7012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffcfeffffff0001fd7678d1275d0000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac01020320c2075d0bbe8678dea77af146f4c4fdd1ac6bec70333ffef3e7dc940e484c812000603830366238383839623465643663636563656665373836316663336436396237353938663661623936323166653235363834303366393461316335646633393838393134333363646633303163363766646138326638306266653766333231341465e088b8b1360c62946afcbea403cf927d5bfe230020415720a36cce2d68158913b3523ff1167e016cfd049560109894dd9d844fa99c411f5e48101069586123670bd805a9f7b28ed3ebbf18292d18c3f5bfc819bb76ab8a76b5730eab51427a15742ef809693c8e0dbe27737a17f000823859ce58c30f0301011976a9144a83c35e84c83510f20989dee7845ff133c567af88acfb1027 030001ac515e0ff3128c046dc2b4a5414e91dbfee96643f9e3cab86918f36e77d9587c006a47304402202e23fe274788884c91a48592dbe2cfec421286c1c56a0a4f83b27e731b40bdd5022040b0818dae31cd8213d530c31768bf4fdd9e84a3d7f95ac77214c79ec1e35cf7012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffcfeffffff00000001fd7678d1275d0000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac010203c2075d0bbe8678dea77af146f4c4fdd1ac6bec70333ffef3e7dc940e484c812000806b8889b4ed6ccecefe7861fc3d69b7598f6ab9621fe2568403f94a1c5df398891433cdf301c67fda82f80bfe7f321465e088b8b1360c62946afcbea403cf927d5bfe2300415720a36cce2d68158913b3523ff1167e016cfd049560109894dd9d844fa99c411f5e48101069586123670bd805a9f7b28ed3ebbf18292d18c3f5bfc819bb76ab8a76b5730eab51427a15742ef809693c8e0dbe27737a17f000823859ce58c30f0301011976a9144a83c35e84c83510f20989dee7845ff133c567af88acfb1027 +pro_up_rev_tx_v1 ProviderUpdateRevocationPayloadType 03000400011111111111111111111111111111111111111111111111111111111111111111010000000151feffffff01905f0100000000001976a914121212121212121212121212121212121212121288ac00000000a40100212121212121212121212121212121212121212121212121212121212121212101002222222222222222222222222222222222222222222222222222222222222222232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323 030001201111111111111111111111111111111111111111111111111111111111111111010151fcfeffffff0001fc905f01001976a914121212121212121212121212121212121212121288ac0103012021212121212121212121212121212121212121212121212121212121212121210120222222222222222222222222222222222222222222222222222222222222222260232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323 0300011111111111111111111111111111111111111111111111111111111111111111010151fcfeffffff00000001fc905f01001976a914121212121212121212121212121212121212121288ac0103012121212121212121212121212121212121212121212121212121212121212121012222222222222222222222222222222222222222222222222222222222222222232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323 +pro_up_serv_tx_v1_ipv4_compatible ProviderUpdateServicePayloadType 03000200018f3fe6683e36326669b6e34876fb2a2264e8327e822f6fec304b66f47d61b3e1010000006b48304502210082af6727408f0f2ec16c7da1c42ccf0a026abea6a3a422776272b03c8f4e262a022033b406e556f6de980b2d728e6812b3ae18ee1c863ae573ece1cbdf777ca3e56101210351036c1192eaf763cd8345b44137482ad24b12003f23e9022ce46752edf47e6effffffff0180220e43000000001976a914123cbc06289e768ca7d743c8174b1e6eeb610f1488ac00000000b501003a72099db84b1c1158568eec863bea1b64f90eccee3304209cebe1df5e7539fd000000000000000000000000010203044e1f00e6725f799ea20480f06fb105ebe27e7c4845ab84155e4c2adf2d6e5b73a998b1174f9621bbeda5009c5a6487bdf75edcf602b67fe0da15c275cc91777cb25f5fd4bb94e84fd42cb2bb547c83792e57c80d196acd47020e4054895a0640b7861b3729c41dd681d4996090d5750f65c4b649a5cd5b2bdf55c880459821e53d91c9 030001208f3fe6683e36326669b6e34876fb2a2264e8327e822f6fec304b66f47d61b3e1016b48304502210082af6727408f0f2ec16c7da1c42ccf0a026abea6a3a422776272b03c8f4e262a022033b406e556f6de980b2d728e6812b3ae18ee1c863ae573ece1cbdf777ca3e56101210351036c1192eaf763cd8345b44137482ad24b12003f23e9022ce46752edf47e6efcffffffff0001fc80220e431976a914123cbc06289e768ca7d743c8174b1e6eeb610f1488ac01010100203a72099db84b1c1158568eec863bea1b64f90eccee3304209cebe1df5e7539fdfe00000000000000000000000001020304fb1f4e0020e6725f799ea20480f06fb105ebe27e7c4845ab84155e4c2adf2d6e5b73a998b100000060174f9621bbeda5009c5a6487bdf75edcf602b67fe0da15c275cc91777cb25f5fd4bb94e84fd42cb2bb547c83792e57c80d196acd47020e4054895a0640b7861b3729c41dd681d4996090d5750f65c4b649a5cd5b2bdf55c880459821e53d91c9 0300018f3fe6683e36326669b6e34876fb2a2264e8327e822f6fec304b66f47d61b3e1016b48304502210082af6727408f0f2ec16c7da1c42ccf0a026abea6a3a422776272b03c8f4e262a022033b406e556f6de980b2d728e6812b3ae18ee1c863ae573ece1cbdf777ca3e56101210351036c1192eaf763cd8345b44137482ad24b12003f23e9022ce46752edf47e6efcffffffff00000001fc80220e431976a914123cbc06289e768ca7d743c8174b1e6eeb610f1488ac010101003a72099db84b1c1158568eec863bea1b64f90eccee3304209cebe1df5e7539fdfe00000000000000000000000001020304fb1f4e00e6725f799ea20480f06fb105ebe27e7c4845ab84155e4c2adf2d6e5b73a998b1000000174f9621bbeda5009c5a6487bdf75edcf602b67fe0da15c275cc91777cb25f5fd4bb94e84fd42cb2bb547c83792e57c80d196acd47020e4054895a0640b7861b3729c41dd681d4996090d5750f65c4b649a5cd5b2bdf55c880459821e53d91c9 +pro_up_serv_tx_v1_ipv4_mapped ProviderUpdateServicePayloadType 03000200018f3fe6683e36326669b6e34876fb2a2264e8327e822f6fec304b66f47d61b3e1010000006b48304502210082af6727408f0f2ec16c7da1c42ccf0a026abea6a3a422776272b03c8f4e262a022033b406e556f6de980b2d728e6812b3ae18ee1c863ae573ece1cbdf777ca3e56101210351036c1192eaf763cd8345b44137482ad24b12003f23e9022ce46752edf47e6effffffff0180220e43000000001976a914123cbc06289e768ca7d743c8174b1e6eeb610f1488ac00000000b501003a72099db84b1c1158568eec863bea1b64f90eccee3304209cebe1df5e7539fd00000000000000000000ffff342440944e1f00e6725f799ea20480f06fb105ebe27e7c4845ab84155e4c2adf2d6e5b73a998b1174f9621bbeda5009c5a6487bdf75edcf602b67fe0da15c275cc91777cb25f5fd4bb94e84fd42cb2bb547c83792e57c80d196acd47020e4054895a0640b7861b3729c41dd681d4996090d5750f65c4b649a5cd5b2bdf55c880459821e53d91c9 030001208f3fe6683e36326669b6e34876fb2a2264e8327e822f6fec304b66f47d61b3e1016b48304502210082af6727408f0f2ec16c7da1c42ccf0a026abea6a3a422776272b03c8f4e262a022033b406e556f6de980b2d728e6812b3ae18ee1c863ae573ece1cbdf777ca3e56101210351036c1192eaf763cd8345b44137482ad24b12003f23e9022ce46752edf47e6efcffffffff0001fc80220e431976a914123cbc06289e768ca7d743c8174b1e6eeb610f1488ac01010100203a72099db84b1c1158568eec863bea1b64f90eccee3304209cebe1df5e7539fdfe00000000000000000000ffff34244094fb1f4e0020e6725f799ea20480f06fb105ebe27e7c4845ab84155e4c2adf2d6e5b73a998b100000060174f9621bbeda5009c5a6487bdf75edcf602b67fe0da15c275cc91777cb25f5fd4bb94e84fd42cb2bb547c83792e57c80d196acd47020e4054895a0640b7861b3729c41dd681d4996090d5750f65c4b649a5cd5b2bdf55c880459821e53d91c9 0300018f3fe6683e36326669b6e34876fb2a2264e8327e822f6fec304b66f47d61b3e1016b48304502210082af6727408f0f2ec16c7da1c42ccf0a026abea6a3a422776272b03c8f4e262a022033b406e556f6de980b2d728e6812b3ae18ee1c863ae573ece1cbdf777ca3e56101210351036c1192eaf763cd8345b44137482ad24b12003f23e9022ce46752edf47e6efcffffffff00000001fc80220e431976a914123cbc06289e768ca7d743c8174b1e6eeb610f1488ac010101003a72099db84b1c1158568eec863bea1b64f90eccee3304209cebe1df5e7539fdfe00000000000000000000ffff34244094fb1f4e00e6725f799ea20480f06fb105ebe27e7c4845ab84155e4c2adf2d6e5b73a998b1000000174f9621bbeda5009c5a6487bdf75edcf602b67fe0da15c275cc91777cb25f5fd4bb94e84fd42cb2bb547c83792e57c80d196acd47020e4054895a0640b7861b3729c41dd681d4996090d5750f65c4b649a5cd5b2bdf55c880459821e53d91c9 +pro_up_serv_tx_v2_evo_ipv6 ProviderUpdateServicePayloadType 03000200014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1010000006a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530ffffffff028801030000000000026a00288d9500000000001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac00000000cf020001000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c20010db80000000000000000000000074e1f000d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e2068bb010f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 030001204d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff0002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac0101020101200c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0cfe20010db8000000000000000000000007fb1f4e00200d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d01140e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e01fb206801fbbb01600f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 0300014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff00000002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac01010201010c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0cfe20010db8000000000000000000000007fb1f4e000d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d010e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e01fb206801fbbb010f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +pro_up_serv_tx_v3_evo ProviderUpdateServicePayloadType 03000200016f49fb4225cd6323393872217d56302994a30fc8872e2070e347265c399dff1b010000006a47304402207bbed2c28fe9710187db1da4ab50a3c380108996b6cbcd972407ea8e36ad0da202200ffb02cc90a027e35a452cf8ed1edf33d567aaf2797150a797124e83871bad08012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffeffffff01277ad1275d0000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac00000000dc0300010022a1b2590651ff843222d7564397d0e7af94e94c35b94621822c268fcdebcba90103000101010444437aed4e21010101010444437aed6820020101010444437aed05a300e4b92ed4f5d34d4eb060b39c385ad1cf0ab338eb26619187e762c5e0c7c1080415d36e5fdf5b02343adb01a134f2aa78513658f9a751dcd16e848065f3b548fd24268a7f330346049b39e3e75bf75c0a77584fd2c02832000f39c15f38e43444ca05e898077bfad4bc0f91cb9158f10066ae056971a8011d05e9152f1017a305e8dfd7a3b292de2eb5230c434c59e622f3c0652f 030001206f49fb4225cd6323393872217d56302994a30fc8872e2070e347265c399dff1b016a47304402207bbed2c28fe9710187db1da4ab50a3c380108996b6cbcd972407ea8e36ad0da202200ffb02cc90a027e35a452cf8ed1edf33d567aaf2797150a797124e83871bad08012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffcfeffffff0001fd277ad1275d0000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac01010301012022a1b2590651ff843222d7564397d0e7af94e94c35b94621822c268fcdebcba90103000100000444437aedfb214e010100000444437aedfb2068020100000444437aedfba3050020e4b92ed4f5d34d4eb060b39c385ad1cf0ab338eb26619187e762c5e0c7c108040114f958365178aaf234a101db3a34025bdf5f6ed315000060a751dcd16e848065f3b548fd24268a7f330346049b39e3e75bf75c0a77584fd2c02832000f39c15f38e43444ca05e898077bfad4bc0f91cb9158f10066ae056971a8011d05e9152f1017a305e8dfd7a3b292de2eb5230c434c59e622f3c0652f 0300016f49fb4225cd6323393872217d56302994a30fc8872e2070e347265c399dff1b016a47304402207bbed2c28fe9710187db1da4ab50a3c380108996b6cbcd972407ea8e36ad0da202200ffb02cc90a027e35a452cf8ed1edf33d567aaf2797150a797124e83871bad08012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffcfeffffff00000001fd277ad1275d0000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac010103010122a1b2590651ff843222d7564397d0e7af94e94c35b94621822c268fcdebcba90103000100000444437aedfb214e010100000444437aedfb2068020100000444437aedfba30500e4b92ed4f5d34d4eb060b39c385ad1cf0ab338eb26619187e762c5e0c7c1080401f958365178aaf234a101db3a34025bdf5f6ed3150000a751dcd16e848065f3b548fd24268a7f330346049b39e3e75bf75c0a77584fd2c02832000f39c15f38e43444ca05e898077bfad4bc0f91cb9158f10066ae056971a8011d05e9152f1017a305e8dfd7a3b292de2eb5230c434c59e622f3c0652f +unknown_type_10 RawPayloadType 03000a00014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1010000006a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530ffffffff028801030000000000026a00288d9500000000001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac0000000024010188010300000000001976a914aa85a9fb4f84bc63046a574ac4f2ce3361f0db0d88ac 030001204d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff0002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac010a0a24010188010300000000001976a914aa85a9fb4f84bc63046a574ac4f2ce3361f0db0d88ac 0300014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff00000002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac010a0a24010188010300000000001976a914aa85a9fb4f84bc63046a574ac4f2ce3361f0db0d88ac diff --git a/dash/tests/persisted_transactions.rs b/dash/tests/persisted_transactions.rs new file mode 100644 index 000000000..5a8c9edf5 --- /dev/null +++ b/dash/tests/persisted_transactions.rs @@ -0,0 +1,167 @@ +//! Hosts persist `Transaction` with `bincode::serde` and `bincode` (Dash Platform's wallet store +//! does), and both encode `TransactionPayload` by the index of its variant. A variant inserted +//! before an existing one shifts that variant's index, and everything stored with it stops +//! decoding. +//! +//! `data/persisted_transactions.txt` holds transactions encoded before rust-dashcore#1156, one or +//! more per payload variant that existed then. They must keep decoding to the transaction their +//! consensus bytes hold, and re-encode to the same bytes. +#![cfg(all(feature = "serde", feature = "bincode"))] + +use dashcore::blockdata::transaction::special_transaction::TransactionPayload; +use dashcore::blockdata::transaction::special_transaction::provider_dissolve::ProviderDissolvePayload; +use dashcore::blockdata::transaction::special_transaction::provider_registration::CompactSignature; +use dashcore::blockdata::transaction::special_transaction::provider_update_share::ProviderUpdateSharePayload; +use dashcore::blockdata::transaction::special_transaction::provider_update_shared_registrar::ProviderUpdateSharedRegistrarPayload; +use dashcore::bls_sig_utils::BLSPublicKey; +use dashcore::consensus::deserialize; +use dashcore::hash_types::InputsHash; +use dashcore::hashes::Hash; +use dashcore::{PubkeyHash, ScriptBuf, Transaction, Txid}; + +const CONFIG: bincode::config::Configuration = bincode::config::standard(); + +const ROWS: &str = include_str!("data/persisted_transactions.txt"); + +struct Row { + name: &'static str, + variant: &'static str, + consensus: Vec, + serde: Vec, + bincode: Vec, +} + +fn rows() -> Vec { + ROWS.lines() + .filter(|line| !line.starts_with('#')) + .map(|line| { + let columns: Vec<&str> = line.split(' ').collect(); + let [name, variant, consensus, serde, bincode] = columns[..] else { + panic!("five columns: {line}"); + }; + let hex = |s: &str| hex_conservative::decode_to_vec(s).expect("hex"); + Row { + name, + variant, + consensus: hex(consensus), + serde: hex(serde), + bincode: hex(bincode), + } + }) + .collect() +} + +/// The variant index each payload is stored under. New variants go at the end; an existing +/// index never changes. +fn stored_index(payload: &TransactionPayload) -> u8 { + match payload { + TransactionPayload::ProviderRegistrationPayloadType(_) => 0, + TransactionPayload::ProviderUpdateServicePayloadType(_) => 1, + TransactionPayload::ProviderUpdateRegistrarPayloadType(_) => 2, + TransactionPayload::ProviderUpdateRevocationPayloadType(_) => 3, + TransactionPayload::CoinbasePayloadType(_) => 4, + TransactionPayload::QuorumCommitmentPayloadType(_) => 5, + TransactionPayload::MnhfSignalPayloadType(_) => 6, + TransactionPayload::AssetLockPayloadType(_) => 7, + TransactionPayload::AssetUnlockPayloadType(_) => 8, + TransactionPayload::ClassicalWithNonStandardVersionTypeBytesPayloadType(_) => 9, + TransactionPayload::RawPayloadType(..) => 10, + TransactionPayload::ProviderDissolvePayloadType(_) => 11, + TransactionPayload::ProviderUpdateSharePayloadType(_) => 12, + TransactionPayload::ProviderUpdateSharedRegistrarPayloadType(_) => 13, + } +} + +fn variant_name(payload: &TransactionPayload) -> String { + let debug = format!("{payload:?}"); + debug.split('(').next().expect("a variant name").to_string() +} + +/// One payload of every variant: the stored ones, then those added by rust-dashcore#1156. +fn one_payload_per_variant() -> Vec { + let mut payloads: Vec = Vec::new(); + for row in rows() { + let tx: Transaction = deserialize(&row.consensus).expect("consensus bytes"); + let payload = tx.special_transaction_payload.expect("a payload"); + if !payloads.iter().any(|p| stored_index(p) == stored_index(&payload)) { + payloads.push(payload); + } + } + let signatures = vec![CompactSignature::from([1; 65])]; + payloads.push(TransactionPayload::ProviderDissolvePayloadType(ProviderDissolvePayload { + version: 1, + pro_tx_hash: Txid::all_zeros(), + actor_index: 0, + signatures: signatures.clone(), + })); + payloads.push(TransactionPayload::ProviderUpdateSharePayloadType(ProviderUpdateSharePayload { + version: 1, + pro_tx_hash: Txid::all_zeros(), + share_index: 0, + script_reward: ScriptBuf::new(), + inputs_hash: InputsHash::all_zeros(), + payload_sig: vec![1; 65], + })); + payloads.push(TransactionPayload::ProviderUpdateSharedRegistrarPayloadType( + ProviderUpdateSharedRegistrarPayload { + version: 1, + pro_tx_hash: Txid::all_zeros(), + operator_public_key: BLSPublicKey::from([1; 48]), + voting_key_hash: PubkeyHash::all_zeros(), + inputs_hash: InputsHash::all_zeros(), + signatures, + }, + )); + payloads +} + +#[test] +fn should_encode_every_payload_variant_under_its_stored_index() { + let payloads = one_payload_per_variant(); + let mut indexes: Vec = payloads.iter().map(stored_index).collect(); + indexes.sort_unstable(); + assert_eq!(indexes, (0..=13).collect::>(), "one payload per variant"); + + for payload in &payloads { + let name = variant_name(payload); + // bincode's standard configuration writes a variant index below 251 as one byte. + let serde = bincode::serde::encode_to_vec(payload, CONFIG).expect("serde encoding"); + assert_eq!(serde[0], stored_index(payload), "{name} under bincode::serde"); + let native = bincode::encode_to_vec(payload, CONFIG).expect("bincode encoding"); + assert_eq!(native[0], stored_index(payload), "{name} under bincode"); + } +} + +#[test] +fn should_decode_and_re_encode_transactions_stored_before_new_payload_types_unchanged() { + let rows = rows(); + assert!(!rows.is_empty()); + for row in rows { + let name = row.name; + let expected: Transaction = deserialize(&row.consensus).expect("consensus bytes"); + let payload = expected.special_transaction_payload.as_ref().expect("a payload"); + assert_eq!(variant_name(payload), row.variant, "{name}"); + + let (from_serde, read): (Transaction, usize) = + bincode::serde::decode_from_slice(&row.serde, CONFIG) + .unwrap_or_else(|e| panic!("{name}: bincode::serde: {e}")); + assert_eq!(read, row.serde.len(), "{name}: bincode::serde reads every byte"); + assert_eq!(from_serde, expected, "{name}: bincode::serde"); + assert_eq!( + bincode::serde::encode_to_vec(&from_serde, CONFIG).unwrap(), + row.serde, + "{name}: bincode::serde re-encodes differently" + ); + + let (from_bincode, read): (Transaction, usize) = + bincode::decode_from_slice(&row.bincode, CONFIG) + .unwrap_or_else(|e| panic!("{name}: bincode: {e}")); + assert_eq!(read, row.bincode.len(), "{name}: bincode reads every byte"); + assert_eq!(from_bincode, expected, "{name}: bincode"); + assert_eq!( + bincode::encode_to_vec(&from_bincode, CONFIG).unwrap(), + row.bincode, + "{name}: bincode re-encodes differently" + ); + } +} From 59d9e5d732b98dbc87d347b04dca05d524f1ee05 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Thu, 15 Oct 2026 07:46:42 +0000 Subject: [PATCH 2/2] test(dash): drop the persisted transactions fixture test Keep the PR to the variant reorder and its doc note. Co-Authored-By: Claude Opus 5.5 --- dash/tests/data/persisted_transactions.txt | 31 ---- dash/tests/persisted_transactions.rs | 167 --------------------- 2 files changed, 198 deletions(-) delete mode 100644 dash/tests/data/persisted_transactions.txt delete mode 100644 dash/tests/persisted_transactions.rs diff --git a/dash/tests/data/persisted_transactions.txt b/dash/tests/data/persisted_transactions.txt deleted file mode 100644 index a4fcdced5..000000000 --- a/dash/tests/data/persisted_transactions.txt +++ /dev/null @@ -1,31 +0,0 @@ -# Transactions as hosts stored them before rust-dashcore#1156, one per `TransactionPayload` -# variant that existed then. Generated at 90359ed5 (rust-dashcore dev right before #1156) -# with bincode 2's standard configuration, the encoding Dash Platform's wallet store uses. -# Most transactions come from Dash Platform's wallet-storage fixture (rows written at -# 40268cc0 and 6c5775cf), the quorum commitment from a Core v24 devnet block, the rest are -# built for the file. -# -# Columns: name, payload variant, consensus hex, `bincode::serde` hex, `bincode` hex. -asset_lock AssetLockPayloadType 03000800014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1010000006a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530ffffffff028801030000000000026a00288d9500000000001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac0000000024010188010300000000001976a914aa85a9fb4f84bc63046a574ac4f2ce3361f0db0d88ac 030001204d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff0002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac01070101fc880103001976a914aa85a9fb4f84bc63046a574ac4f2ce3361f0db0d88ac 0300014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff00000002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac01070101fc880103001976a914aa85a9fb4f84bc63046a574ac4f2ce3361f0db0d88ac -asset_unlock_v1 AssetUnlockPayloadType 03000900000100e1f505000000001976a914131313131313131313131313131313131313131388ac000000009101650000000000000070110100f40100001414141414141414141414141414141414141414141414141414141414141414151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 03000001fc00e1f5051976a914131313131313131313131313131313131313131388ac01080165fc70110100fbf40120141414141414141414141414141414141414141414141414141414141414141460151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 03000001fc00e1f5051976a914131313131313131313131313131313131313131388ac01080165fc70110100fbf4011414141414141414141414141414141414141414141414141414141414141414151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 -asset_unlock_v2 AssetUnlockPayloadType 03000900000100e1f505000000001976a914131313131313131313131313131313131313131388ac000000009102650000000000000070110100f40100001414141414141414141414141414141414141414141414141414141414141414151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 03000001fc00e1f5051976a914131313131313131313131313131313131313131388ac01080265fc70110100fbf40120141414141414141414141414141414141414141414141414141414141414141460151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 03000001fc00e1f5051976a914131313131313131313131313131313131313131388ac01080265fc70110100fbf4011414141414141414141414141414141414141414141414141414141414141414151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 -block_QuorumCommitmentPayloadType QuorumCommitmentPayloadType 03000600000000000000fda3010100983a0000030002f5ec6011210fb9ecc2fa58d73bed67414792c10ddf793f45c1901e72f1db7465fd90010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd900100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 03000000010501fb983a030220f5ec6011210fb9ecc2fa58d73bed67414792c10ddf793f45c1901e72f1db746500fb900100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb900100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000603030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030302000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 03000000010501fb983a0302f5ec6011210fb9ecc2fa58d73bed67414792c10ddf793f45c1901e72f1db746500fb900100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb9001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -cbtx_v1 CoinbasePayloadType 03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff025151ffffffff01404b4c0000000000197676767676767676767676767676767676767676767676767600000000260100e80300000101010101010101010101010101010101010101010101010101010101010101 030001200000000000000000000000000000000000000000000000000000000000000000fcffffffff025151fcffffffff0001fc404b4c001976767676767676767676767676767676767676767676767676010401fbe803200101010101010101010101010101010101010101010101010101010101010101200000000000000000000000000000000000000000000000000000000000000000000000 0300010000000000000000000000000000000000000000000000000000000000000000fcffffffff025151fcffffffff00000001fc404b4c001976767676767676767676767676767676767676767676767676010401fbe80301010101010101010101010101010101010101010101010101010101010101010000000000000000000000000000000000000000000000000000000000000000000000 -cbtx_v2 CoinbasePayloadType 03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff025151ffffffff01404b4c0000000000197676767676767676767676767676767676767676767676767600000000460200e803000001010101010101010101010101010101010101010101010101010101010101010202020202020202020202020202020202020202020202020202020202020202 030001200000000000000000000000000000000000000000000000000000000000000000fcffffffff025151fcffffffff0001fc404b4c001976767676767676767676767676767676767676767676767676010402fbe803200101010101010101010101010101010101010101010101010101010101010101200202020202020202020202020202020202020202020202020202020202020202000000 0300010000000000000000000000000000000000000000000000000000000000000000fcffffffff025151fcffffffff00000001fc404b4c001976767676767676767676767676767676767676767676767676010402fbe80301010101010101010101010101010101010101010101010101010101010101010202020202020202020202020202020202020202020202020202020202020202000000 -cbtx_v3 CoinbasePayloadType 03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff025151ffffffff01404b4c0000000000197676767676767676767676767676767676767676767676767600000000b10300e803000001010101010101010101010101010101010101010101010101010101010101010202020202020202020202020202020202020202020202020202020202020202fd84030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303031027000000000000 030001200000000000000000000000000000000000000000000000000000000000000000fcffffffff025151fcffffffff0001fc404b4c001976767676767676767676767676767676767676767676767676010403fbe80320010101010101010101010101010101010101010101010101010101010101010120020202020202020202020202020202020202020202020202020202020202020201fb8403016003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030301fb1027 0300010000000000000000000000000000000000000000000000000000000000000000fcffffffff025151fcffffffff00000001fc404b4c001976767676767676767676767676767676767676767676767676010403fbe8030101010101010101010101010101010101010101010101010101010101010101020202020202020202020202020202020202020202020202020202020202020201fb84030103030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030301fb1027 -cbtx_v4 CoinbasePayloadType 03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff016affffffff036de1f505000000001976a91456208a8adff9433262bffee3c4894d2a160c21bd88ac209db40600000000016a26072d0b000000001976a91456208a8adff9433262bffee3c4894d2a160c21bd88ac00000000cf04002a3b0000db318d0bad75d80a6e14088f71657af817056edee711360d25c729905f33ed502692b21d078be4bc3103156612ba6bdcf387efdd6320a50a97985f5cdce4ead8008df9d40906f1c7c36c545b06daec45a84ffd43b5caf4045c9c9a39a146a7771de6cbdd11f5d16b22e9e358f5c483e35b12a5f3cab190026c5445dec34e632c36a0ba36a1f87bb411d7d292c5fd55cd36128877c707747286e40abec1aee7e4812eb72a56c40700000000000000000000000000000000000000000000000000000000000000000000 030001200000000000000000000000000000000000000000000000000000000000000000fcffffffff016afcffffffff0003fc6de1f5051976a91456208a8adff9433262bffee3c4894d2a160c21bd88acfc209db406016afc26072d0b1976a91456208a8adff9433262bffee3c4894d2a160c21bd88ac010404fb2a3b20db318d0bad75d80a6e14088f71657af817056edee711360d25c729905f33ed50202692b21d078be4bc3103156612ba6bdcf387efdd6320a50a97985f5cdce4ead8010001608df9d40906f1c7c36c545b06daec45a84ffd43b5caf4045c9c9a39a146a7771de6cbdd11f5d16b22e9e358f5c483e35b12a5f3cab190026c5445dec34e632c36a0ba36a1f87bb411d7d292c5fd55cd36128877c707747286e40abec1aee7e48101fd2eb72a56c407000001200000000000000000000000000000000000000000000000000000000000000000 0300010000000000000000000000000000000000000000000000000000000000000000fcffffffff016afcffffffff00000003fc6de1f5051976a91456208a8adff9433262bffee3c4894d2a160c21bd88acfc209db406016afc26072d0b1976a91456208a8adff9433262bffee3c4894d2a160c21bd88ac010404fb2a3bdb318d0bad75d80a6e14088f71657af817056edee711360d25c729905f33ed502692b21d078be4bc3103156612ba6bdcf387efdd6320a50a97985f5cdce4ead80100018df9d40906f1c7c36c545b06daec45a84ffd43b5caf4045c9c9a39a146a7771de6cbdd11f5d16b22e9e358f5c483e35b12a5f3cab190026c5445dec34e632c36a0ba36a1f87bb411d7d292c5fd55cd36128877c707747286e40abec1aee7e48101fd2eb72a56c4070000010000000000000000000000000000000000000000000000000000000000000000 -classical_type_bytes_42 ClassicalWithNonStandardVersionTypeBytesPayloadType 00002a000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000 0000012000000000000000000000000000000000000000000000000000000000000000000000fcffffffff0001fd00f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac01092a 00000100000000000000000000000000000000000000000000000000000000000000000000fcffffffff00000001fd00f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac01092a -mnhf_signal_v1 MnhfSignalPayloadType 03000700011111111111111111111111111111111111111111111111111111111111111111010000000151feffffff01905f0100000000001976a914121212121212121212121212121212121212121288ac0000000082010a3131313131313131313131313131313131313131313131313131313131313131323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232 030001201111111111111111111111111111111111111111111111111111111111111111010151fcfeffffff0001fc905f01001976a914121212121212121212121212121212121212121288ac0106010a20313131313131313131313131313131313131313131313131313131313131313160323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232 0300011111111111111111111111111111111111111111111111111111111111111111010151fcfeffffff00000001fc905f01001976a914121212121212121212121212121212121212121288ac0106010a3131313131313131313131313131313131313131313131313131313131313131323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232 -pro_reg_tx_v1 ProviderRegistrationPayloadType 0300010001ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58010000006b483045022100fe8fec0b3880bcac29614348887769b0b589908e3f5ec55a6cf478a6652e736502202f30430806a6690524e4dd599ba498e5ff100dea6a872ebb89c2fd651caa71ed012103d85b25d6886f0b3b8ce1eef63b720b518fad0b8e103eba4e85b6980bfdda2dfdffffffff018e37807e090000001976a9144ee1d4e5d61ac40a13b357ac6e368997079678c888ac00000000fd1201010000000000ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab580000000000000000000000000000ffff010205064e1f3dd03f9ec192b5f275a433bfc90f468ee1a3eb4c157b10706659e25eb362b5d902d809f9160b1688e201ee6e94b40f9b5062d7074683ef05a2d5efb7793c47059c878dfad38a30fafe61575db40f05ab0a08d55119b0aad300001976a9144fbc8fb6e11e253d77e5a9c987418e89cf4a63d288ac3477990b757387cb0406168c2720acf55f83603736a314a37d01b135b873a27b411fb37e49c1ff2b8057713939a5513e6e711a71cff2e517e6224df724ed750aef1b7f9ad9ec612b4a7250232e1e400da718a9501e1d9a5565526e4b1ff68c028763 03000120ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58016b483045022100fe8fec0b3880bcac29614348887769b0b589908e3f5ec55a6cf478a6652e736502202f30430806a6690524e4dd599ba498e5ff100dea6a872ebb89c2fd651caa71ed012103d85b25d6886f0b3b8ce1eef63b720b518fad0b8e103eba4e85b6980bfdda2dfdfcffffffff0001fd8e37807e090000001976a9144ee1d4e5d61ac40a13b357ac6e368997079678c888ac010001000020ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58000001020506fb1f4e143dd03f9ec192b5f275a433bfc90f468ee1a3eb4c6031353762313037303636353965323565623336326235643930326438303966393136306231363838653230316565366539346234306639623530363264373037343638336566303561326435656662373739336334373035396338373864666114d38a30fafe61575db40f05ab0a08d55119b0aad3001976a9144fbc8fb6e11e253d77e5a9c987418e89cf4a63d288ac203477990b757387cb0406168c2720acf55f83603736a314a37d01b135b873a27b411fb37e49c1ff2b8057713939a5513e6e711a71cff2e517e6224df724ed750aef1b7f9ad9ec612b4a7250232e1e400da718a9501e1d9a5565526e4b1ff68c028763000000 030001ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58016b483045022100fe8fec0b3880bcac29614348887769b0b589908e3f5ec55a6cf478a6652e736502202f30430806a6690524e4dd599ba498e5ff100dea6a872ebb89c2fd651caa71ed012103d85b25d6886f0b3b8ce1eef63b720b518fad0b8e103eba4e85b6980bfdda2dfdfcffffffff00000001fd8e37807e090000001976a9144ee1d4e5d61ac40a13b357ac6e368997079678c888ac0100010000ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58000001020506fb1f4e3dd03f9ec192b5f275a433bfc90f468ee1a3eb4c157b10706659e25eb362b5d902d809f9160b1688e201ee6e94b40f9b5062d7074683ef05a2d5efb7793c47059c878dfad38a30fafe61575db40f05ab0a08d55119b0aad3001976a9144fbc8fb6e11e253d77e5a9c987418e89cf4a63d288ac3477990b757387cb0406168c2720acf55f83603736a314a37d01b135b873a27b411fb37e49c1ff2b8057713939a5513e6e711a71cff2e517e6224df724ed750aef1b7f9ad9ec612b4a7250232e1e400da718a9501e1d9a5565526e4b1ff68c028763000000 -pro_reg_tx_v1_no_address ProviderRegistrationPayloadType 0300010001ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58010000006b483045022100fe8fec0b3880bcac29614348887769b0b589908e3f5ec55a6cf478a6652e736502202f30430806a6690524e4dd599ba498e5ff100dea6a872ebb89c2fd651caa71ed012103d85b25d6886f0b3b8ce1eef63b720b518fad0b8e103eba4e85b6980bfdda2dfdffffffff018e37807e090000001976a9144ee1d4e5d61ac40a13b357ac6e368997079678c888ac00000000fd1201010000000000ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58000000000000000000000000000000000000000000003dd03f9ec192b5f275a433bfc90f468ee1a3eb4c157b10706659e25eb362b5d902d809f9160b1688e201ee6e94b40f9b5062d7074683ef05a2d5efb7793c47059c878dfad38a30fafe61575db40f05ab0a08d55119b0aad300001976a9144fbc8fb6e11e253d77e5a9c987418e89cf4a63d288ac3477990b757387cb0406168c2720acf55f83603736a314a37d01b135b873a27b411fb37e49c1ff2b8057713939a5513e6e711a71cff2e517e6224df724ed750aef1b7f9ad9ec612b4a7250232e1e400da718a9501e1d9a5565526e4b1ff68c028763 03000120ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58016b483045022100fe8fec0b3880bcac29614348887769b0b589908e3f5ec55a6cf478a6652e736502202f30430806a6690524e4dd599ba498e5ff100dea6a872ebb89c2fd651caa71ed012103d85b25d6886f0b3b8ce1eef63b720b518fad0b8e103eba4e85b6980bfdda2dfdfcffffffff0001fd8e37807e090000001976a9144ee1d4e5d61ac40a13b357ac6e368997079678c888ac010001000020ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab5800010000000000000000000000000000000000143dd03f9ec192b5f275a433bfc90f468ee1a3eb4c6031353762313037303636353965323565623336326235643930326438303966393136306231363838653230316565366539346234306639623530363264373037343638336566303561326435656662373739336334373035396338373864666114d38a30fafe61575db40f05ab0a08d55119b0aad3001976a9144fbc8fb6e11e253d77e5a9c987418e89cf4a63d288ac203477990b757387cb0406168c2720acf55f83603736a314a37d01b135b873a27b411fb37e49c1ff2b8057713939a5513e6e711a71cff2e517e6224df724ed750aef1b7f9ad9ec612b4a7250232e1e400da718a9501e1d9a5565526e4b1ff68c028763000000 030001ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58016b483045022100fe8fec0b3880bcac29614348887769b0b589908e3f5ec55a6cf478a6652e736502202f30430806a6690524e4dd599ba498e5ff100dea6a872ebb89c2fd651caa71ed012103d85b25d6886f0b3b8ce1eef63b720b518fad0b8e103eba4e85b6980bfdda2dfdfcffffffff00000001fd8e37807e090000001976a9144ee1d4e5d61ac40a13b357ac6e368997079678c888ac0100010000ca9a43051750da7c5f858008f2ff7732d15691e48eb7f845c791e5dca78bab58000100000000000000000000000000000000003dd03f9ec192b5f275a433bfc90f468ee1a3eb4c157b10706659e25eb362b5d902d809f9160b1688e201ee6e94b40f9b5062d7074683ef05a2d5efb7793c47059c878dfad38a30fafe61575db40f05ab0a08d55119b0aad3001976a9144fbc8fb6e11e253d77e5a9c987418e89cf4a63d288ac3477990b757387cb0406168c2720acf55f83603736a314a37d01b135b873a27b411fb37e49c1ff2b8057713939a5513e6e711a71cff2e517e6224df724ed750aef1b7f9ad9ec612b4a7250232e1e400da718a9501e1d9a5565526e4b1ff68c028763000000 -pro_reg_tx_v2_evo_ipv6 ProviderRegistrationPayloadType 03000100014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1010000006a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530ffffffff028801030000000000026a00288d9500000000001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac00000000fd2a0102000100000004040404040404040404040404040404040404040404040404040404040404040100000020010db80000000000000000000000074e1f0505050505050505050505050505050505050505060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606070707070707070707070707070707070707070700001976a914080808080808080808080808080808080808080888ac09090909090909090909090909090909090909090909090909090909090909090b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b2068bb01410a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a 030001204d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff0002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac0100020100200404040404040404040404040404040404040404040404040404040404040404010120010db8000000000000000000000007fb1f4e14050505050505050505050505050505050505050560303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036303630363036140707070707070707070707070707070707070707001976a914080808080808080808080808080808080808080888ac200909090909090909090909090909090909090909090909090909090909090909410a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a01140b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b01fb206801fbbb01 0300014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff00000002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac01000201000404040404040404040404040404040404040404040404040404040404040404010120010db8000000000000000000000007fb1f4e05050505050505050505050505050505050505050606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060707070707070707070707070707070707070707001976a914080808080808080808080808080808080808080888ac0909090909090909090909090909090909090909090909090909090909090909410a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a010b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b01fb206801fbbb01 -pro_reg_tx_v3 ProviderRegistrationPayloadType 0300010001c2075d0bbe8678dea77af146f4c4fdd1ac6bec70333ffef3e7dc940e484c8120010000006a473044022065a0067b55484e06109b4282a8bb14a3392ed76ed0a1195a91a3e3b531098c7f022002aafa428439c858e721664c6b4a71aae2f5bc4ad77bdfc1651a9e8e35428c40012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffeffffff0200e87648170000001976a9140b80dfe15263ad7abd2421b82a1291e07d30571c88ac7e654870740000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac00000000ed03000000000000000000000000000000000000000000000000000000000000000000000000000000000001000c707b9fc7af33ddf9a9cf50ff45fc587f590f5693bec56a034e3bdb3ce1e978d5487d03129c507bd15e73fcb7dac95c7333a68f561450702cd1aac511e40275a501ea07d5b43701d895d09a68803bd67d9c23ab94d4428d0000021976a91494a6df7e4fc8f474b28c634c748d5ddf88b7ee3788ac70171976a91417340a777ca7c690d65d19d2f7aca4b1a0387fa388aca00f000000000000000000000000008576d28cdc5f9022cd2988a05001e5ed2c318854bb3c9d19ce3dcb38ad3ce52e00 03000120c2075d0bbe8678dea77af146f4c4fdd1ac6bec70333ffef3e7dc940e484c8120016a473044022065a0067b55484e06109b4282a8bb14a3392ed76ed0a1195a91a3e3b531098c7f022002aafa428439c858e721664c6b4a71aae2f5bc4ad77bdfc1651a9e8e35428c40012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffcfeffffff0002fd00e87648170000001976a9140b80dfe15263ad7abd2421b82a1291e07d30571c88acfd7e654870740000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac0100030000200000000000000000000000000000000000000000000000000000000000000000000100140c707b9fc7af33ddf9a9cf50ff45fc587f590f566039336265633536613033346533626462336365316539373864353438376430333132396335303762643135653733666362376461633935633733333361363866353631343530373032636431616163353131653430323735613530316561303714d5b43701d895d09a68803bd67d9c23ab94d4428d0000208576d28cdc5f9022cd2988a05001e5ed2c318854bb3c9d19ce3dcb38ad3ce52e0000000001021976a91494a6df7e4fc8f474b28c634c748d5ddf88b7ee3788acfb70171976a91417340a777ca7c690d65d19d2f7aca4b1a0387fa388acfba00f0100000000 030001c2075d0bbe8678dea77af146f4c4fdd1ac6bec70333ffef3e7dc940e484c8120016a473044022065a0067b55484e06109b4282a8bb14a3392ed76ed0a1195a91a3e3b531098c7f022002aafa428439c858e721664c6b4a71aae2f5bc4ad77bdfc1651a9e8e35428c40012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffcfeffffff00000002fd00e87648170000001976a9140b80dfe15263ad7abd2421b82a1291e07d30571c88acfd7e654870740000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac010003000000000000000000000000000000000000000000000000000000000000000000000001000c707b9fc7af33ddf9a9cf50ff45fc587f590f5693bec56a034e3bdb3ce1e978d5487d03129c507bd15e73fcb7dac95c7333a68f561450702cd1aac511e40275a501ea07d5b43701d895d09a68803bd67d9c23ab94d4428d00008576d28cdc5f9022cd2988a05001e5ed2c318854bb3c9d19ce3dcb38ad3ce52e0000000001021976a91494a6df7e4fc8f474b28c634c748d5ddf88b7ee3788acfb70171976a91417340a777ca7c690d65d19d2f7aca4b1a0387fa388acfba00f0100000000 -pro_up_reg_tx_v1 ProviderUpdateRegistrarPayloadType 0300030001c7de76dac8dd96f9b49b12a06fe39c8caf0cad12d23ad6026094d9b11b2b260d000000006b483045022100b31895e8cea95a965c82d842eadd6eef3c7b29e677c62a5c8e2b5dce05b4ddfc02206c7b5a9ea8b71983c3b21f4ff75ac1aa44090d28af8b2d9b93e794e6eb5835e20121032ea8be689184f329dce575776bc956cd52230f4c04755d5753d9491ea5bf8f2affffffff01c94670d0060000001976a914345f07bc7ebaf9f82f273be249b6066d2d5c236688ac00000000e4010049aa692330179f95c1342715102e37777df91cc0f3a4ae7e8f9e214ee97dbb3d0000139b654f0b1c031e1cf2b934c2d895178875cfe7c6a4f6758f02bc66eea7fc292d0040701acbe31f5e14a911cb061a2f6cc4a7bb877a80c11ae06b988d98305773f93b981976a91456bcf3cac49235537d6ce0fb3214d8850a6db77788ac2d7f857a2f15eb9340a0cfbce3ff8cf09b40e582d05b1f98c7468caa0f942bcf411ff69c9cb072660cc10048332c14c08621e7461f1f4f54b448baedc0e3434d9a7c3a1780885aaef4dd44c597b49b97595e02ad54728f572967d3ce0c2c0ceac174 03000120c7de76dac8dd96f9b49b12a06fe39c8caf0cad12d23ad6026094d9b11b2b260d006b483045022100b31895e8cea95a965c82d842eadd6eef3c7b29e677c62a5c8e2b5dce05b4ddfc02206c7b5a9ea8b71983c3b21f4ff75ac1aa44090d28af8b2d9b93e794e6eb5835e20121032ea8be689184f329dce575776bc956cd52230f4c04755d5753d9491ea5bf8f2afcffffffff0001fdc94670d0060000001976a914345f07bc7ebaf9f82f273be249b6066d2d5c236688ac0102012049aa692330179f95c1342715102e37777df91cc0f3a4ae7e8f9e214ee97dbb3d0060313339623635346630623163303331653163663262393334633264383935313738383735636665376336613466363735386630326263363665656137666332393264303034303730316163626533316635653134613931316362303631613266146cc4a7bb877a80c11ae06b988d98305773f93b981976a91456bcf3cac49235537d6ce0fb3214d8850a6db77788ac202d7f857a2f15eb9340a0cfbce3ff8cf09b40e582d05b1f98c7468caa0f942bcf411ff69c9cb072660cc10048332c14c08621e7461f1f4f54b448baedc0e3434d9a7c3a1780885aaef4dd44c597b49b97595e02ad54728f572967d3ce0c2c0ceac174 030001c7de76dac8dd96f9b49b12a06fe39c8caf0cad12d23ad6026094d9b11b2b260d006b483045022100b31895e8cea95a965c82d842eadd6eef3c7b29e677c62a5c8e2b5dce05b4ddfc02206c7b5a9ea8b71983c3b21f4ff75ac1aa44090d28af8b2d9b93e794e6eb5835e20121032ea8be689184f329dce575776bc956cd52230f4c04755d5753d9491ea5bf8f2afcffffffff00000001fdc94670d0060000001976a914345f07bc7ebaf9f82f273be249b6066d2d5c236688ac01020149aa692330179f95c1342715102e37777df91cc0f3a4ae7e8f9e214ee97dbb3d00139b654f0b1c031e1cf2b934c2d895178875cfe7c6a4f6758f02bc66eea7fc292d0040701acbe31f5e14a911cb061a2f6cc4a7bb877a80c11ae06b988d98305773f93b981976a91456bcf3cac49235537d6ce0fb3214d8850a6db77788ac2d7f857a2f15eb9340a0cfbce3ff8cf09b40e582d05b1f98c7468caa0f942bcf411ff69c9cb072660cc10048332c14c08621e7461f1f4f54b448baedc0e3434d9a7c3a1780885aaef4dd44c597b49b97595e02ad54728f572967d3ce0c2c0ceac174 -pro_up_reg_tx_v2 ProviderUpdateRegistrarPayloadType 03000300014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1010000006a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530ffffffff028801030000000000026a00288d9500000000001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac00000000e402001010101010101010101010101010101010101010101010101010101010101010000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112121212121212121212121212121212121212121976a914131313131313131313131313131313131313131388ac1414141414141414141414141414141414141414141414141414141414141414411515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 030001204d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff0002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac01020220101010101010101010101010101010101010101010101010101010101010101000603131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131311412121212121212121212121212121212121212121976a914131313131313131313131313131313131313131388ac201414141414141414141414141414141414141414141414141414141414141414411515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 0300014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff00000002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac01020210101010101010101010101010101010101010101010101010101010101010100011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112121212121212121212121212121212121212121976a914131313131313131313131313131313131313131388ac1414141414141414141414141414141414141414141414141414141414141414411515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 -pro_up_reg_tx_v3 ProviderUpdateRegistrarPayloadType 0300030001ac515e0ff3128c046dc2b4a5414e91dbfee96643f9e3cab86918f36e77d9587c000000006a47304402202e23fe274788884c91a48592dbe2cfec421286c1c56a0a4f83b27e731b40bdd5022040b0818dae31cd8213d530c31768bf4fdd9e84a3d7f95ac77214c79ec1e35cf7012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffeffffff017678d1275d0000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac00000000e70300c2075d0bbe8678dea77af146f4c4fdd1ac6bec70333ffef3e7dc940e484c81200000806b8889b4ed6ccecefe7861fc3d69b7598f6ab9621fe2568403f94a1c5df398891433cdf301c67fda82f80bfe7f321465e088b8b1360c62946afcbea403cf927d5bfe23011976a9144a83c35e84c83510f20989dee7845ff133c567af88ac1027415720a36cce2d68158913b3523ff1167e016cfd049560109894dd9d844fa99c411f5e48101069586123670bd805a9f7b28ed3ebbf18292d18c3f5bfc819bb76ab8a76b5730eab51427a15742ef809693c8e0dbe27737a17f000823859ce58c30f03 03000120ac515e0ff3128c046dc2b4a5414e91dbfee96643f9e3cab86918f36e77d9587c006a47304402202e23fe274788884c91a48592dbe2cfec421286c1c56a0a4f83b27e731b40bdd5022040b0818dae31cd8213d530c31768bf4fdd9e84a3d7f95ac77214c79ec1e35cf7012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffcfeffffff0001fd7678d1275d0000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac01020320c2075d0bbe8678dea77af146f4c4fdd1ac6bec70333ffef3e7dc940e484c812000603830366238383839623465643663636563656665373836316663336436396237353938663661623936323166653235363834303366393461316335646633393838393134333363646633303163363766646138326638306266653766333231341465e088b8b1360c62946afcbea403cf927d5bfe230020415720a36cce2d68158913b3523ff1167e016cfd049560109894dd9d844fa99c411f5e48101069586123670bd805a9f7b28ed3ebbf18292d18c3f5bfc819bb76ab8a76b5730eab51427a15742ef809693c8e0dbe27737a17f000823859ce58c30f0301011976a9144a83c35e84c83510f20989dee7845ff133c567af88acfb1027 030001ac515e0ff3128c046dc2b4a5414e91dbfee96643f9e3cab86918f36e77d9587c006a47304402202e23fe274788884c91a48592dbe2cfec421286c1c56a0a4f83b27e731b40bdd5022040b0818dae31cd8213d530c31768bf4fdd9e84a3d7f95ac77214c79ec1e35cf7012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffcfeffffff00000001fd7678d1275d0000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac010203c2075d0bbe8678dea77af146f4c4fdd1ac6bec70333ffef3e7dc940e484c812000806b8889b4ed6ccecefe7861fc3d69b7598f6ab9621fe2568403f94a1c5df398891433cdf301c67fda82f80bfe7f321465e088b8b1360c62946afcbea403cf927d5bfe2300415720a36cce2d68158913b3523ff1167e016cfd049560109894dd9d844fa99c411f5e48101069586123670bd805a9f7b28ed3ebbf18292d18c3f5bfc819bb76ab8a76b5730eab51427a15742ef809693c8e0dbe27737a17f000823859ce58c30f0301011976a9144a83c35e84c83510f20989dee7845ff133c567af88acfb1027 -pro_up_rev_tx_v1 ProviderUpdateRevocationPayloadType 03000400011111111111111111111111111111111111111111111111111111111111111111010000000151feffffff01905f0100000000001976a914121212121212121212121212121212121212121288ac00000000a40100212121212121212121212121212121212121212121212121212121212121212101002222222222222222222222222222222222222222222222222222222222222222232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323 030001201111111111111111111111111111111111111111111111111111111111111111010151fcfeffffff0001fc905f01001976a914121212121212121212121212121212121212121288ac0103012021212121212121212121212121212121212121212121212121212121212121210120222222222222222222222222222222222222222222222222222222222222222260232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323 0300011111111111111111111111111111111111111111111111111111111111111111010151fcfeffffff00000001fc905f01001976a914121212121212121212121212121212121212121288ac0103012121212121212121212121212121212121212121212121212121212121212121012222222222222222222222222222222222222222222222222222222222222222232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323 -pro_up_serv_tx_v1_ipv4_compatible ProviderUpdateServicePayloadType 03000200018f3fe6683e36326669b6e34876fb2a2264e8327e822f6fec304b66f47d61b3e1010000006b48304502210082af6727408f0f2ec16c7da1c42ccf0a026abea6a3a422776272b03c8f4e262a022033b406e556f6de980b2d728e6812b3ae18ee1c863ae573ece1cbdf777ca3e56101210351036c1192eaf763cd8345b44137482ad24b12003f23e9022ce46752edf47e6effffffff0180220e43000000001976a914123cbc06289e768ca7d743c8174b1e6eeb610f1488ac00000000b501003a72099db84b1c1158568eec863bea1b64f90eccee3304209cebe1df5e7539fd000000000000000000000000010203044e1f00e6725f799ea20480f06fb105ebe27e7c4845ab84155e4c2adf2d6e5b73a998b1174f9621bbeda5009c5a6487bdf75edcf602b67fe0da15c275cc91777cb25f5fd4bb94e84fd42cb2bb547c83792e57c80d196acd47020e4054895a0640b7861b3729c41dd681d4996090d5750f65c4b649a5cd5b2bdf55c880459821e53d91c9 030001208f3fe6683e36326669b6e34876fb2a2264e8327e822f6fec304b66f47d61b3e1016b48304502210082af6727408f0f2ec16c7da1c42ccf0a026abea6a3a422776272b03c8f4e262a022033b406e556f6de980b2d728e6812b3ae18ee1c863ae573ece1cbdf777ca3e56101210351036c1192eaf763cd8345b44137482ad24b12003f23e9022ce46752edf47e6efcffffffff0001fc80220e431976a914123cbc06289e768ca7d743c8174b1e6eeb610f1488ac01010100203a72099db84b1c1158568eec863bea1b64f90eccee3304209cebe1df5e7539fdfe00000000000000000000000001020304fb1f4e0020e6725f799ea20480f06fb105ebe27e7c4845ab84155e4c2adf2d6e5b73a998b100000060174f9621bbeda5009c5a6487bdf75edcf602b67fe0da15c275cc91777cb25f5fd4bb94e84fd42cb2bb547c83792e57c80d196acd47020e4054895a0640b7861b3729c41dd681d4996090d5750f65c4b649a5cd5b2bdf55c880459821e53d91c9 0300018f3fe6683e36326669b6e34876fb2a2264e8327e822f6fec304b66f47d61b3e1016b48304502210082af6727408f0f2ec16c7da1c42ccf0a026abea6a3a422776272b03c8f4e262a022033b406e556f6de980b2d728e6812b3ae18ee1c863ae573ece1cbdf777ca3e56101210351036c1192eaf763cd8345b44137482ad24b12003f23e9022ce46752edf47e6efcffffffff00000001fc80220e431976a914123cbc06289e768ca7d743c8174b1e6eeb610f1488ac010101003a72099db84b1c1158568eec863bea1b64f90eccee3304209cebe1df5e7539fdfe00000000000000000000000001020304fb1f4e00e6725f799ea20480f06fb105ebe27e7c4845ab84155e4c2adf2d6e5b73a998b1000000174f9621bbeda5009c5a6487bdf75edcf602b67fe0da15c275cc91777cb25f5fd4bb94e84fd42cb2bb547c83792e57c80d196acd47020e4054895a0640b7861b3729c41dd681d4996090d5750f65c4b649a5cd5b2bdf55c880459821e53d91c9 -pro_up_serv_tx_v1_ipv4_mapped ProviderUpdateServicePayloadType 03000200018f3fe6683e36326669b6e34876fb2a2264e8327e822f6fec304b66f47d61b3e1010000006b48304502210082af6727408f0f2ec16c7da1c42ccf0a026abea6a3a422776272b03c8f4e262a022033b406e556f6de980b2d728e6812b3ae18ee1c863ae573ece1cbdf777ca3e56101210351036c1192eaf763cd8345b44137482ad24b12003f23e9022ce46752edf47e6effffffff0180220e43000000001976a914123cbc06289e768ca7d743c8174b1e6eeb610f1488ac00000000b501003a72099db84b1c1158568eec863bea1b64f90eccee3304209cebe1df5e7539fd00000000000000000000ffff342440944e1f00e6725f799ea20480f06fb105ebe27e7c4845ab84155e4c2adf2d6e5b73a998b1174f9621bbeda5009c5a6487bdf75edcf602b67fe0da15c275cc91777cb25f5fd4bb94e84fd42cb2bb547c83792e57c80d196acd47020e4054895a0640b7861b3729c41dd681d4996090d5750f65c4b649a5cd5b2bdf55c880459821e53d91c9 030001208f3fe6683e36326669b6e34876fb2a2264e8327e822f6fec304b66f47d61b3e1016b48304502210082af6727408f0f2ec16c7da1c42ccf0a026abea6a3a422776272b03c8f4e262a022033b406e556f6de980b2d728e6812b3ae18ee1c863ae573ece1cbdf777ca3e56101210351036c1192eaf763cd8345b44137482ad24b12003f23e9022ce46752edf47e6efcffffffff0001fc80220e431976a914123cbc06289e768ca7d743c8174b1e6eeb610f1488ac01010100203a72099db84b1c1158568eec863bea1b64f90eccee3304209cebe1df5e7539fdfe00000000000000000000ffff34244094fb1f4e0020e6725f799ea20480f06fb105ebe27e7c4845ab84155e4c2adf2d6e5b73a998b100000060174f9621bbeda5009c5a6487bdf75edcf602b67fe0da15c275cc91777cb25f5fd4bb94e84fd42cb2bb547c83792e57c80d196acd47020e4054895a0640b7861b3729c41dd681d4996090d5750f65c4b649a5cd5b2bdf55c880459821e53d91c9 0300018f3fe6683e36326669b6e34876fb2a2264e8327e822f6fec304b66f47d61b3e1016b48304502210082af6727408f0f2ec16c7da1c42ccf0a026abea6a3a422776272b03c8f4e262a022033b406e556f6de980b2d728e6812b3ae18ee1c863ae573ece1cbdf777ca3e56101210351036c1192eaf763cd8345b44137482ad24b12003f23e9022ce46752edf47e6efcffffffff00000001fc80220e431976a914123cbc06289e768ca7d743c8174b1e6eeb610f1488ac010101003a72099db84b1c1158568eec863bea1b64f90eccee3304209cebe1df5e7539fdfe00000000000000000000ffff34244094fb1f4e00e6725f799ea20480f06fb105ebe27e7c4845ab84155e4c2adf2d6e5b73a998b1000000174f9621bbeda5009c5a6487bdf75edcf602b67fe0da15c275cc91777cb25f5fd4bb94e84fd42cb2bb547c83792e57c80d196acd47020e4054895a0640b7861b3729c41dd681d4996090d5750f65c4b649a5cd5b2bdf55c880459821e53d91c9 -pro_up_serv_tx_v2_evo_ipv6 ProviderUpdateServicePayloadType 03000200014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1010000006a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530ffffffff028801030000000000026a00288d9500000000001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac00000000cf020001000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c20010db80000000000000000000000074e1f000d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e2068bb010f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 030001204d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff0002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac0101020101200c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0cfe20010db8000000000000000000000007fb1f4e00200d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d01140e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e01fb206801fbbb01600f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 0300014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff00000002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac01010201010c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0cfe20010db8000000000000000000000007fb1f4e000d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d010e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e01fb206801fbbb010f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -pro_up_serv_tx_v3_evo ProviderUpdateServicePayloadType 03000200016f49fb4225cd6323393872217d56302994a30fc8872e2070e347265c399dff1b010000006a47304402207bbed2c28fe9710187db1da4ab50a3c380108996b6cbcd972407ea8e36ad0da202200ffb02cc90a027e35a452cf8ed1edf33d567aaf2797150a797124e83871bad08012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffeffffff01277ad1275d0000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac00000000dc0300010022a1b2590651ff843222d7564397d0e7af94e94c35b94621822c268fcdebcba90103000101010444437aed4e21010101010444437aed6820020101010444437aed05a300e4b92ed4f5d34d4eb060b39c385ad1cf0ab338eb26619187e762c5e0c7c1080415d36e5fdf5b02343adb01a134f2aa78513658f9a751dcd16e848065f3b548fd24268a7f330346049b39e3e75bf75c0a77584fd2c02832000f39c15f38e43444ca05e898077bfad4bc0f91cb9158f10066ae056971a8011d05e9152f1017a305e8dfd7a3b292de2eb5230c434c59e622f3c0652f 030001206f49fb4225cd6323393872217d56302994a30fc8872e2070e347265c399dff1b016a47304402207bbed2c28fe9710187db1da4ab50a3c380108996b6cbcd972407ea8e36ad0da202200ffb02cc90a027e35a452cf8ed1edf33d567aaf2797150a797124e83871bad08012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffcfeffffff0001fd277ad1275d0000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac01010301012022a1b2590651ff843222d7564397d0e7af94e94c35b94621822c268fcdebcba90103000100000444437aedfb214e010100000444437aedfb2068020100000444437aedfba3050020e4b92ed4f5d34d4eb060b39c385ad1cf0ab338eb26619187e762c5e0c7c108040114f958365178aaf234a101db3a34025bdf5f6ed315000060a751dcd16e848065f3b548fd24268a7f330346049b39e3e75bf75c0a77584fd2c02832000f39c15f38e43444ca05e898077bfad4bc0f91cb9158f10066ae056971a8011d05e9152f1017a305e8dfd7a3b292de2eb5230c434c59e622f3c0652f 0300016f49fb4225cd6323393872217d56302994a30fc8872e2070e347265c399dff1b016a47304402207bbed2c28fe9710187db1da4ab50a3c380108996b6cbcd972407ea8e36ad0da202200ffb02cc90a027e35a452cf8ed1edf33d567aaf2797150a797124e83871bad08012102c861a156ca6c6abecdeea95eab3ec7c93c6a37d63a5a6f62368ac94a424af15ffcfeffffff00000001fd277ad1275d0000001976a914c39aa109a7f20cefa69079374c7324e01998a12488ac010103010122a1b2590651ff843222d7564397d0e7af94e94c35b94621822c268fcdebcba90103000100000444437aedfb214e010100000444437aedfb2068020100000444437aedfba30500e4b92ed4f5d34d4eb060b39c385ad1cf0ab338eb26619187e762c5e0c7c1080401f958365178aaf234a101db3a34025bdf5f6ed3150000a751dcd16e848065f3b548fd24268a7f330346049b39e3e75bf75c0a77584fd2c02832000f39c15f38e43444ca05e898077bfad4bc0f91cb9158f10066ae056971a8011d05e9152f1017a305e8dfd7a3b292de2eb5230c434c59e622f3c0652f -unknown_type_10 RawPayloadType 03000a00014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1010000006a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530ffffffff028801030000000000026a00288d9500000000001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac0000000024010188010300000000001976a914aa85a9fb4f84bc63046a574ac4f2ce3361f0db0d88ac 030001204d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff0002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac010a0a24010188010300000000001976a914aa85a9fb4f84bc63046a574ac4f2ce3361f0db0d88ac 0300014d6d36c50d484aa79f7db080f971c3f6845407f652c7d5865756017fa06969c1016a47304402200136894a2ebb4967cf2766c10e238d69c53c24bf330758e4432eb4753def03de02202a2afb05475a064a419a6cc1c582e3504fcb36c2e22b610b5d320f7656573f7f0121028fdb0a3f730bb20f477536d98ca830efa56412dd05992c801219ba0ff35ad530fcffffffff00000002fc88010300026a00fc288d95001976a9148d40dfe30494080a1c1187c74066956043ff13fb88ac010a0a24010188010300000000001976a914aa85a9fb4f84bc63046a574ac4f2ce3361f0db0d88ac diff --git a/dash/tests/persisted_transactions.rs b/dash/tests/persisted_transactions.rs deleted file mode 100644 index 5a8c9edf5..000000000 --- a/dash/tests/persisted_transactions.rs +++ /dev/null @@ -1,167 +0,0 @@ -//! Hosts persist `Transaction` with `bincode::serde` and `bincode` (Dash Platform's wallet store -//! does), and both encode `TransactionPayload` by the index of its variant. A variant inserted -//! before an existing one shifts that variant's index, and everything stored with it stops -//! decoding. -//! -//! `data/persisted_transactions.txt` holds transactions encoded before rust-dashcore#1156, one or -//! more per payload variant that existed then. They must keep decoding to the transaction their -//! consensus bytes hold, and re-encode to the same bytes. -#![cfg(all(feature = "serde", feature = "bincode"))] - -use dashcore::blockdata::transaction::special_transaction::TransactionPayload; -use dashcore::blockdata::transaction::special_transaction::provider_dissolve::ProviderDissolvePayload; -use dashcore::blockdata::transaction::special_transaction::provider_registration::CompactSignature; -use dashcore::blockdata::transaction::special_transaction::provider_update_share::ProviderUpdateSharePayload; -use dashcore::blockdata::transaction::special_transaction::provider_update_shared_registrar::ProviderUpdateSharedRegistrarPayload; -use dashcore::bls_sig_utils::BLSPublicKey; -use dashcore::consensus::deserialize; -use dashcore::hash_types::InputsHash; -use dashcore::hashes::Hash; -use dashcore::{PubkeyHash, ScriptBuf, Transaction, Txid}; - -const CONFIG: bincode::config::Configuration = bincode::config::standard(); - -const ROWS: &str = include_str!("data/persisted_transactions.txt"); - -struct Row { - name: &'static str, - variant: &'static str, - consensus: Vec, - serde: Vec, - bincode: Vec, -} - -fn rows() -> Vec { - ROWS.lines() - .filter(|line| !line.starts_with('#')) - .map(|line| { - let columns: Vec<&str> = line.split(' ').collect(); - let [name, variant, consensus, serde, bincode] = columns[..] else { - panic!("five columns: {line}"); - }; - let hex = |s: &str| hex_conservative::decode_to_vec(s).expect("hex"); - Row { - name, - variant, - consensus: hex(consensus), - serde: hex(serde), - bincode: hex(bincode), - } - }) - .collect() -} - -/// The variant index each payload is stored under. New variants go at the end; an existing -/// index never changes. -fn stored_index(payload: &TransactionPayload) -> u8 { - match payload { - TransactionPayload::ProviderRegistrationPayloadType(_) => 0, - TransactionPayload::ProviderUpdateServicePayloadType(_) => 1, - TransactionPayload::ProviderUpdateRegistrarPayloadType(_) => 2, - TransactionPayload::ProviderUpdateRevocationPayloadType(_) => 3, - TransactionPayload::CoinbasePayloadType(_) => 4, - TransactionPayload::QuorumCommitmentPayloadType(_) => 5, - TransactionPayload::MnhfSignalPayloadType(_) => 6, - TransactionPayload::AssetLockPayloadType(_) => 7, - TransactionPayload::AssetUnlockPayloadType(_) => 8, - TransactionPayload::ClassicalWithNonStandardVersionTypeBytesPayloadType(_) => 9, - TransactionPayload::RawPayloadType(..) => 10, - TransactionPayload::ProviderDissolvePayloadType(_) => 11, - TransactionPayload::ProviderUpdateSharePayloadType(_) => 12, - TransactionPayload::ProviderUpdateSharedRegistrarPayloadType(_) => 13, - } -} - -fn variant_name(payload: &TransactionPayload) -> String { - let debug = format!("{payload:?}"); - debug.split('(').next().expect("a variant name").to_string() -} - -/// One payload of every variant: the stored ones, then those added by rust-dashcore#1156. -fn one_payload_per_variant() -> Vec { - let mut payloads: Vec = Vec::new(); - for row in rows() { - let tx: Transaction = deserialize(&row.consensus).expect("consensus bytes"); - let payload = tx.special_transaction_payload.expect("a payload"); - if !payloads.iter().any(|p| stored_index(p) == stored_index(&payload)) { - payloads.push(payload); - } - } - let signatures = vec![CompactSignature::from([1; 65])]; - payloads.push(TransactionPayload::ProviderDissolvePayloadType(ProviderDissolvePayload { - version: 1, - pro_tx_hash: Txid::all_zeros(), - actor_index: 0, - signatures: signatures.clone(), - })); - payloads.push(TransactionPayload::ProviderUpdateSharePayloadType(ProviderUpdateSharePayload { - version: 1, - pro_tx_hash: Txid::all_zeros(), - share_index: 0, - script_reward: ScriptBuf::new(), - inputs_hash: InputsHash::all_zeros(), - payload_sig: vec![1; 65], - })); - payloads.push(TransactionPayload::ProviderUpdateSharedRegistrarPayloadType( - ProviderUpdateSharedRegistrarPayload { - version: 1, - pro_tx_hash: Txid::all_zeros(), - operator_public_key: BLSPublicKey::from([1; 48]), - voting_key_hash: PubkeyHash::all_zeros(), - inputs_hash: InputsHash::all_zeros(), - signatures, - }, - )); - payloads -} - -#[test] -fn should_encode_every_payload_variant_under_its_stored_index() { - let payloads = one_payload_per_variant(); - let mut indexes: Vec = payloads.iter().map(stored_index).collect(); - indexes.sort_unstable(); - assert_eq!(indexes, (0..=13).collect::>(), "one payload per variant"); - - for payload in &payloads { - let name = variant_name(payload); - // bincode's standard configuration writes a variant index below 251 as one byte. - let serde = bincode::serde::encode_to_vec(payload, CONFIG).expect("serde encoding"); - assert_eq!(serde[0], stored_index(payload), "{name} under bincode::serde"); - let native = bincode::encode_to_vec(payload, CONFIG).expect("bincode encoding"); - assert_eq!(native[0], stored_index(payload), "{name} under bincode"); - } -} - -#[test] -fn should_decode_and_re_encode_transactions_stored_before_new_payload_types_unchanged() { - let rows = rows(); - assert!(!rows.is_empty()); - for row in rows { - let name = row.name; - let expected: Transaction = deserialize(&row.consensus).expect("consensus bytes"); - let payload = expected.special_transaction_payload.as_ref().expect("a payload"); - assert_eq!(variant_name(payload), row.variant, "{name}"); - - let (from_serde, read): (Transaction, usize) = - bincode::serde::decode_from_slice(&row.serde, CONFIG) - .unwrap_or_else(|e| panic!("{name}: bincode::serde: {e}")); - assert_eq!(read, row.serde.len(), "{name}: bincode::serde reads every byte"); - assert_eq!(from_serde, expected, "{name}: bincode::serde"); - assert_eq!( - bincode::serde::encode_to_vec(&from_serde, CONFIG).unwrap(), - row.serde, - "{name}: bincode::serde re-encodes differently" - ); - - let (from_bincode, read): (Transaction, usize) = - bincode::decode_from_slice(&row.bincode, CONFIG) - .unwrap_or_else(|e| panic!("{name}: bincode: {e}")); - assert_eq!(read, row.bincode.len(), "{name}: bincode reads every byte"); - assert_eq!(from_bincode, expected, "{name}: bincode"); - assert_eq!( - bincode::encode_to_vec(&from_bincode, CONFIG).unwrap(), - row.bincode, - "{name}: bincode re-encodes differently" - ); - } -}