V13.0 special txs (#90)

* Content - Add section for Special txs

* Content - Add necessary cross-refs

* Content - DIP3 - Add ProRegTx details

Description and example hexdump added

* Content - Minor DIP 2-5 formatting

* Content - formatting fix

* Content - DIP3 - Update ProRegTx Op Key info

Uses BLS public key instead of ECDSA pubkeyhash

* Content - DIP3 - Add ProUpServTx details

* Content - DIP3 - Update ProRegTx

Hexdump for both new collateral and reference to existing on

* Content - DIP3 - Update ProUpServTx

Add note about missing payloadSigSize
Hexdump corrections

* Content - DIP3 - Update ProUpServTx

Minor formatting updates

* Content - DIP3 - Add ProUpRevTx details

* Content - DIP4 - Add CbTx details

* Content - Update raw tx per DIP2

Split version into version and type
Add extra_payload fields

* Content - DIP3 - Add ProUpRegTx details
This commit is contained in:
thephez 2018-10-30 14:20:29 -04:00
parent 1c5293bb91
commit b68663de1e

View file

@ -7,6 +7,8 @@ http://opensource.org/licenses/MIT.
## Transactions ## Transactions
{% include helpers/subhead-links.md %} {% include helpers/subhead-links.md %}
<!-- __ -->
The following subsections briefly document core transaction details. The following subsections briefly document core transaction details.
#### OpCodes #### OpCodes
@ -222,12 +224,15 @@ A raw transaction has the following top-level format:
| Bytes | Name | Data Type | Description | Bytes | Name | Data Type | Description
|----------|--------------|---------------------|------------- |----------|--------------|---------------------|-------------
| 4 | version | uint32_t | Transaction version number; currently version 2. Programs creating transactions using newer consensus rules may use higher version numbers. | 2 | version | uint16_t | Transaction version number; currently version 3. Programs creating transactions using newer consensus rules may use higher version numbers.
| 2 | type | uint16_t | Transaction type number; 0 for classical transactions; Non-zero for DIP2 special transactions.
| *Varies* | tx_in count | compactSize uint | Number of inputs in this transaction. | *Varies* | tx_in count | compactSize uint | Number of inputs in this transaction.
| *Varies* | tx_in | txIn | Transaction inputs. See description of txIn below. | *Varies* | tx_in | txIn | Transaction inputs. See description of txIn below.
| *Varies* | tx_out count | compactSize uint | Number of outputs in this transaction. | *Varies* | tx_out count | compactSize uint | Number of outputs in this transaction.
| *Varies* | tx_out | txOut | Transaction outputs. See description of txOut below. | *Varies* | tx_out | txOut | Transaction outputs. See description of txOut below.
| 4 | lock_time | uint32_t | A time (Unix epoch time) or block number. See the [locktime parsing rules][]. | 4 | lock_time | uint32_t | A time (Unix epoch time) or block number. See the [locktime parsing rules][].
| *Varies* | extra_payload size | compactSize uint | *Added by DIP2*<br><br>Variable number of bytes of extra payload for DIP2-based special transactions
| *Varies* | extra_payload | blob | *Added by DIP2*<br><br>Special transaction payload.
A transaction may have multiple inputs and outputs, so the txIn and A transaction may have multiple inputs and outputs, so the txIn and
txOut structures may recur within a transaction. CompactSize unsigned txOut structures may recur within a transaction. CompactSize unsigned
@ -398,6 +403,515 @@ have multiple outputs depending on the number of proposals being funded.
{% endautocrossref %} {% endautocrossref %}
### Special Transactions
{% include helpers/subhead-links.md %}
{% autocrossref %}
The Special Transaction framework established by DIP2 enabled the implementation
of new on-chain features and consensus mechanisms. These transactions provide the
flexibility to expand beyond the financial uses of classical transactions. DIP2
transactions modified classical transactions by:
1. Splitting the 32 bit `version` field into two 16 bit fields (`version` and `type`)
2. Adding support for a generic extra payload following the `lock_time` field
Classical (financial) transactions have a `type` of 0 while special transactions
have a `type` defined in the DIP describing them. A list of current special
transaction types is maintained in the [DIP repository](https://github.com/dashpay/dips/blob/master/dip-0002-special-transactions.md).
{% endautocrossref %}
#### ProRegTx
{% include helpers/subhead-links.md %}
{% autocrossref %}
*Added in protocol version 70211 of Dash Core as described by DIP3*
The Masternode Registration (ProRegTx) special transaction is used to join the
masternode list by proving ownership of the 1000 DASH necessary to create a
masternode.
A ProRegTx is created and sent using the `protx` RPC. The ProRegTx must either
include an output with 1000 DASH (`protx register`) or refer to an existing
unspent output holding 1000 DASH (`protx fund_register`). If the 1000 DASH is an
output of the ProRegTx, the collateralOutpoint hash field should be null.
The special transaction type is 1 and the extra payload consists of the following
data:
| Bytes | Name | Data type | Description |
| ---------- | ----------- | -------- | -------- |
| 2 | version | uint_16 | Provider transaction version number. Currently set to 1.
| 2 | type | uint_16 | Masternode type. Default set to 0.
| 2 | mode | uint_16 | Masternode mode. Default set to 0.
| 36 | collateralOutpoint | COutpoint | The collateral outpoint.<br>**Note:** The hash will be null if the collateral is part of this transaction, otherwise it will reference an existing collateral.
| 16 | ipAddress | byte[] | IPv6 address in network byte order. Only IPv4 mapped addresses are allowed (to be extended in the future)
| 2 | port | uint_16 | Port (network byte order)
| 20 | KeyIdOwner | CKeyID | The public key hash used for owner related signing (ProTx updates, governance voting)
| 48 | PubKeyOperator | CBLSPublicKey | The BLS public key used for operational related signing (network messages, ProTx updates)
| 20 | KeyIdVoting | CKeyID | The public key hash used for voting.
| 2 | operatorReward | uint_16 | A value from 0 to 10000.
| 1-9 | scriptPayoutSize | compactSize uint | Size of the Payee Script.
| Variable | scriptPayout | Script | Payee script (p2pkh/p2sh)
| 32 | inputsHash | uint256 | Hash of all the outpoints of the transaction inputs
| 1-9 | payloadSigSize |compactSize uint | Size of the Signature
| Variable | payloadSig | vector | Signature of the hash of the ProTx fields. Signed with the key corresponding to the collateral outpoint in case the collateral is not part of the ProRegTx itself, empty otherwise.
The following annotated hexdump shows a ProRegTx transaction referencing an
existing collateral. (Parts of the classical transaction section have been omitted.)
{% highlight text %}
0300 ....................................... Version (3)
0100 ....................................... Type (1 - ProRegTx)
[...] ...................................... Transaction inputs omitted
[...] ...................................... Transaction outputs omitted
00000000 ................................... locktime: 0 (a block height)
fd1201 ..................................... Extra payload size (274)
ProRegTx Payload
| 0100 ..................................... Version (1)
| 0000 ..................................... Type (0)
| 0000 ..................................... Mode (0)
|
| 4859747b0eb19bb2dae5a12ef7b6a69b
| 03712bfeded1174de0b6ab1334ab2e8b ......... Outpoint TXID
| 01000000 ................................. Outpoint index number: 1
|
| 00000000000000000000ffffc0000233 ......... IP Address: ::ffff:192.0.2.51
| 270f ..................................... Port: 9999
|
|
| 1636e84d02310b0b458f3eb51d8ea8b2e684b7ce . Owner pubkey hash (ECDSA)
| 88d719278eef605d9c19037366910b59bc28d437
| de4a8db4d76fda6d6985dbdf10404fb9bb5cd0e8
| c22f4a914a6c5566 ......................... Operator public key (BLS)
| 1636e84d02310b0b458f3eb51d8ea8b2e684b7ce . Voting pubkey hash (ECDSA)
|
| f401 ..................................... Operator reward (500 -> 5%)
|
| Payout script
| 19 ....................................... Bytes in pubkey script: 25
| | 76 ..................................... OP_DUP
| | a9 ..................................... OP_HASH160
| | 14 ..................................... Push 20 bytes as data
| | | fc136008111fcc7a05be6cec66f97568
| | | 727a9e51 ............................. PubKey hash
| | 88 ..................................... OP_EQUALVERIFY
| | ac ..................................... OP_CHECKSIG
|
| 0fcfb7d939078ba6a6b81ecf1dc2e05d
| e2776f49f7b503ac254798be6a672699 ......... Inputs hash
|
| Payload signature
| 41 ....................................... Signature Size (65)
| 200476f193b465764093014ba44bd4ff
| de2b3fc92794c4acda9cad6305ca172e
| 9e3d6b1cd6e30f86678dae8e6595e53d
| 2b30bc32141b6c0151eb58479121b3e6a4 ....... Signature
{% endhighlight %}
The following annotated hexdump shows a ProRegTx transaction creating a new
collateral.
**Note the presence of the output, a null Outpoint TXID and the
absence of a signature (since it isn't referring to an existing collateral).**
(Parts of the classical transaction section have been omitted.)
{% highlight text %}
0300 ....................................... Version (3)
0100 ....................................... Type (1 - ProRegTx)
[...] ...................................... Transaction inputs omitted
02 ......................................... Number of outputs
| [...] .................................... 1 output omitted
|
| Masternode collateral output
| | 00e8764817000000 ....................... Duffs (1000 DASH)
| | 1976a9149e648c7e4b61482aa3
| | 9bd10e0bf0b5268768005f88ac ............. Script
00000000 ................................... locktime: 0 (a block height)
d1 ......................................... Extra payload size (209)
ProRegTx Payload
| 0100 ..................................... Version (1)
| 0000 ..................................... Type (0)
| 0000 ..................................... Mode (0)
|
| 00000000000000000000000000000000
| 00000000000000000000000000000000 ......... Outpoint TXID
| 01000000 ................................. Outpoint index number: 1
|
| 00000000000000000000ffffc0000233 ......... IP Address: ::ffff:192.0.2.51
| 270f ..................................... Port: 9999
|
| 757a2171bbf92517e358249f20c37a8ad2d7a5bc . Owner pubkey hash (ECDSA)
| 0e02146e9c34cfbcb3f3037574a1abb35525e2ca
| 0c3c6901dbf82ac591e30218d1711223b7ca956e
| df39f3d984d06d51 ......................... Operator public key (BLS)
| 757a2171bbf92517e358249f20c37a8ad2d7a5bc . Voting pubkey hash (ECDSA)
|
| f401 ..................................... Operator reward (500 -> 5%)
|
| Payout script
| 19 ....................................... Bytes in pubkey script: 25
| | 76 ..................................... OP_DUP
| | a9 ..................................... OP_HASH160
| | 14 ..................................... Push 20 bytes as data
| | | 9e648c7e4b61482aa39bd10e0bf0b526
| | | 8768005f ............................. PubKey hash
| | 88 ..................................... OP_EQUALVERIFY
| | ac ..................................... OP_CHECKSIG
|
| 57b115d681b9aff82824ff7e22af99d4
| ac4b39ad7be7cb70b662e9011827d589 ......... Inputs hash
|
| Payload signature
| 00 ....................................... Signature Size (0)
| .......................................... Signature (Empty)
{% endhighlight %}
{% endautocrossref %}
#### ProUpServTx
{% include helpers/subhead-links.md %}
{% autocrossref %}
*Added in protocol version 70211 of Dash Core as described by DIP3*
The Masternode Provider Update Service (ProUpServTx) special transaction is used
to update the IP Address and port of a masternode. If a non-zero operatorReward
was set in the initial ProRegTx, the operator may also set the scriptOperatorPayout
field in the ProUpServTx.
A ProUpServTx is only valid for masternodes in the registered masternodes subset.
When processed, it updates the metadata of the masternode entry and revives the
masternode if it was previously marked as PoSe-banned.
A ProUpServTx is created and sent using the `protx update_service` RPC.
The special transaction type used for ProUpServTx Transactions is 2 and the extra
payload consists of the following data:
| Bytes | Name | Data type | Description |
| ---------- | ----------- | -------- | -------- |
| 2 | version | uint_16 | ProUpServTx version number. Currently set to 1.
| 32 | proTXHash | uint256 | The hash of the initial ProRegTx
| 16 | ipAddress | byte[] | IPv6 address in network byte order. Only IPv4 mapped addresses are allowed (to be extended in the future)
| 2 | port | uint_16 | Port (network byte order)
| 1-9 | scriptOperator<br>PayoutSize | compactSize uint | Size of the Operator Payee Script.
| Variable | scriptOperator<br>Payout | Script | Operator Payee script (p2pkh/p2sh)
| 32 | inputsHash | uint256 | Hash of all the outpoints of the transaction inputs
| 1-9 | payloadSigSize |compactSize uint | Size of the Signature<br>**Note:** not present in BLS implementation
| 96 | payloadSig | vector | BLS Signature of the hash of the ProUpServTx fields. Signed by the Operator.
The following annotated hexdump shows a ProUpServTx transaction. (Parts of the
classical transaction section have been omitted.)
{% highlight text %}
0300 ....................................... Version (3)
0200 ....................................... Type (2 - ProUpServTx)
[...] ...................................... Transaction inputs omitted
[...] ...................................... Transaction outputs omitted
00000000 ................................... locktime: 0 (a block height)
b5 ......................................... Extra payload size (181)
ProUpServTx Payload
| 0100 ..................................... Version (1)
|
| db60b8cecae691a3d078a2341d460b06
| b2914f6b092f1906b5c815589399b0ff ......... ProRegTx Hash
|
| 00000000000000000000ffffc0000233 ......... IP Address: ::ffff:192.0.2.51
| 270f ..................................... Port: 9999
|
| 00 ....................................... Operator payout script size (0)
| .......................................... Operator payout script (Empty)
|
| a9569d037b0eacc8bca05c5829c95283
| 4ac27d1c7e7df610500b7ba70fd46507 ......... Inputs hash
|
| Payload signature (BLS)
| 0267702ef85d186ef7fa32dc40c65f2f
| eca0a7465715eb7c30f81beb69e35ee4
| 1f6ff7f292b82a9caebb5aa961b0f915
| 02501becf629e93c0a01c76162d56a6c
| 65a9675c3ca9d5297f053e68f91393dd
| 789beed8ef7e8839695a334c2e1bd37c ......... BLS Signature (96 bytes)
{% endhighlight %}
{% endautocrossref %}
#### ProUpRegTx
{% include helpers/subhead-links.md %}
{% autocrossref %}
*Added in protocol version 70211 of Dash Core as described by DIP3*
The Masternode Provider Update Registrar (ProUpRegTx) special transaction is used
by a masternode owner to update masternode metadata (e.g. operator/voting key
details or the payout script).
A ProUpRegTx is created and sent using the `protx update_registrar` RPC.
The special transaction type is 3 and the extra payload consists of the following
data:
| Bytes | Name | Data type | Description |
| ---------- | ----------- | -------- | -------- |
| 2 | version | uint_16 | Provider update registrar transaction version number. Currently set to 1.
| 32 | proTXHash | uint256 | The hash of the initial ProRegTx
| 2 | mode | uint_16 | Masternode mode. Default set to 0.
| 48 | PubKeyOperator | CBLSPublicKey | The BLS public key used for operational related signing (network messages, ProTx updates)
| 20 | KeyIdVoting | CKeyID | The public key hash used for voting.
| 1-9 | scriptPayoutSize | compactSize uint | Size of the Payee Script.
| Variable | scriptPayout | Script | Payee script (p2pkh/p2sh)
| 32 | inputsHash | uint256 | Hash of all the outpoints of the transaction inputs
| 1-9 | payloadSigSize |compactSize uint | Size of the Signature
| Variable | payloadSig | vector | Signature of the hash of the ProTx fields. Signed with the key corresponding to the collateral outpoint in case the collateral is not part of the ProRegTx itself, empty otherwise.
The following annotated hexdump shows a ProUpRegTx transaction referencing an
existing collateral. (Parts of the classical transaction section have been omitted.)
<!--devnet-dashdocs getrawtransaction 702390ef06b10c174841ad7b863df23c166c27815e3be2438e2fee6f87882b91 true-->
{% highlight text %}
0300 ....................................... Version (3)
0300 ....................................... Type (3 - ProUpRegTx)
[...] ...................................... Transaction inputs omitted
[...] ...................................... Transaction outputs omitted
00000000 ................................... locktime: 0 (a block height)
e4 ......................................... Extra payload size (228)
ProRegTx Payload
| 0100 ..................................... Version (1)
|
| ddaf13bf1b02de39711de911e646c63e
| f089b6cee786a1b776086ae130331bba ......... ProRegTx Hash
|
| 0000 ..................................... Mode (0)
|
| 0e02146e9c34cfbcb3f3037574a1abb35525e2ca
| 0c3c6901dbf82ac591e30218d1711223b7ca956e
| df39f3d984d06d51 ......................... Operator public key (BLS)
| 757a2171bbf92517e358249f20c37a8ad2d7a5bc . Voting pubkey hash (ECDSA)
|
| Payout script
| 19 ....................................... Bytes in pubkey script: 25
| | 76 ..................................... OP_DUP
| | a9 ..................................... OP_HASH160
| | 14 ..................................... Push 20 bytes as data
| | | 9e648c7e4b61482aa39bd10e0bf0b526
| | | 8768005f ............................. PubKey hash
| | 88 ..................................... OP_EQUALVERIFY
| | ac ..................................... OP_CHECKSIG
|
| 50b50b24193b2b16f0383125c1f4426e
| 883d256eeadee96d500f8c08b0e0f9e4 ......... Inputs hash
|
| Payload signature
| 41 ....................................... Signature Size (65)
| 1ffa8a27ae0301e414176d4c876cff2e
| 20b810683a68ab7dcea95de1f8f36441
| 4c56368f189a3ef7a59b83bd77f22431
| a73d347841a58768b94c771819dc2bbce3 ....... Signature
{% endhighlight %}
{% endautocrossref %}
#### ProUpRevTx
{% include helpers/subhead-links.md %}
{% autocrossref %}
*Added in protocol version 70211 of Dash Core as described by DIP3*
The Masternode Operator Revocation (ProUpRevTx) special transaction allows an
operator to revoke their key in case of compromise or if they wish to terminate
service. If a masternode's operator key is revoked, the masternode becomes
ineligible for payment until the owner provides a new operator key (via a ProUpRegTx).
A ProUpRevTx is created and sent using the `protx revoke` RPC.
The special transaction type used for ProUpServTx Transactions is 4 and the extra
payload consists of the following data:
| Bytes | Name | Data type | Description |
| ---------- | ----------- | -------- | -------- |
| 2 | version | uint_16 | ProUpRevTx version number. Currently set to 1.
| 32 | proTXHash | uint256 | The hash of the initial ProRegTx
| 2 | reason | uint_16 | The reason for revoking the key.<br>`0` - Not specified<br>`1` - Termination of Service<br>`2` - Compromised Key<br>`3` - Change of key
| 32 | inputsHash | uint256 | Hash of all the outpoints of the transaction inputs
| 1-9 | payloadSigSize |compactSize uint | Size of the Signature<br>**Note:** not present in BLS implementation
| 96 | payloadSig | vector | BLS Signature of the hash of the ProUpServTx fields. Signed by the Operator.
The following annotated hexdump shows a ProUpRevTx transaction. (Parts of the
classical transaction section have been omitted.)
{% highlight text %}
0300 ....................................... Version (3)
0400 ....................................... Type (4 - ProUpRevTx)
[...] ...................................... Transaction inputs omitted
[...] ...................................... Transaction outputs omitted
00000000 ................................... locktime: 0 (a block height)
a4 ......................................... Extra payload size (164)
ProUpRevTx Payload
| 0100 ..................................... Version (1)
|
| ddaf13bf1b02de39711de911e646c63e
| f089b6cee786a1b776086ae130331bba ......... ProRegTx Hash
|
| 0000 ..................................... Reason: 0 (Not specified)
|
| cb0dfe113c87f8e9cde2c5d18aae12fc
| 8d0617c42c34ca5c2f2f6ab4b1dae164 ......... Inputs hash
|
| Payload signature (BLS)
| 0adaef4bf1a904308f1b0efbdfaffc93
| 864f9e047fd83415c831589180303711
| 0f0d8adb312ab43ddd7f8086042d3f5b
| 09029a6a16c341c9d2a62789b495fef4
| e068da711dac28106ff354db7249ae88
| 05877d82ff7d1af00ae2d303dea5eb3b ......... BLS Signature (96 bytes)
{% endhighlight %}
{% endautocrossref %}
#### CbTx
{% include helpers/subhead-links.md %}
{% autocrossref %}
*Added in protocol version 70211 of Dash Core as described by DIP4*
The Coinbase (CbTx) special transaction adds information to the blocks coinbase
transaction that enables verification of the deterministic masternode list without
the full chain (e.g. from SPV clients). This allows light-clients to properly
verify InstantSend transactions and support additional deterministic masternode
list functionality in the future.
The special transaction type used for CbTx Transactions is 5 and the extra
payload consists of the following data:
| Bytes | Name | Data type | Description |
| ---------- | ----------- | -------- | -------- |
| 2 | version | uint_16 | CbTx version number. Currently set to 1.
| 4 | height | uint32_t | Height of the block
| 32 | merkleRootMNList | uint256 | Merkle root of the masternode list
The following annotated hexdump shows a CbTx transaction.
<!--devnet-DRA getrawtransaction 072b8eb47a87799a1242a8bd959a9c5eab93a346700d2f674420cfea70b2ed1c true-->
An itemized coinbase transaction:
{% highlight text %}
0300 ....................................... Version (3)
0500 ....................................... Type (5 - Coinbase)
01 ......................................... Number of inputs
| 00000000000000000000000000000000
| 00000000000000000000000000000000 ......... Previous outpoint TXID
| ffffffff ................................. Previous outpoint index
|
| 05 ....................................... Bytes in coinbase: 5
| |
| | 02 ..................................... Bytes in height
| | | 0608 ................................. Height: 2054
| |
| | 0101 ................................... Arbitrary data
| ffffffff ................................. Sequence
02 ......................................... Output count
| Transaction Output 1
| | 00902f5009000000 ....................... Duffs (400 DASH)
| | 2102c633b7022b4dab169c8a8459d83b7e0
| | 6e0f8da0f89bf7e788ec98c8038107989ac .... Script
|
| Transaction Output 2
| | 00e40b5402000000 ....................... Duffs (100 DASH)
| | 1976a914ebafa153cffbb5b37c30fb93
| | 886f2fe0f1d549ed88ac ................... P2PKH script
00000000 ................................... Locktime
26 ......................................... Extra payload size (38)
Coinbase Transaction Payload
| 0100 ..................................... Version (1)
|
| 06080000 ................................. Block height: 2054
|
| 69010fa8b729b53c78a1e209946c82e2
| 3159439022ea4055aa60d4393fffba46 ......... MN List merkle root
{% endhighlight %}
{% endautocrossref %}
#### Quorum Commitment
{% include helpers/subhead-links.md %}
{% autocrossref %}
Quorum Commitment
{% endautocrossref %}
#### SubTxRegister
{% include helpers/subhead-links.md %}
{% autocrossref %}
Register Blockchain User
{% endautocrossref %}
#### SubTxTopup
{% include helpers/subhead-links.md %}
{% autocrossref %}
Topup Blockchain User Credit
{% endautocrossref %}
#### SubTxResetKey
{% include helpers/subhead-links.md %}
{% autocrossref %}
Change Blockchain User Public Key
{% endautocrossref %}
#### SubTxCloseAccount
{% include helpers/subhead-links.md %}
{% autocrossref %}
Close Blockchain User Account
{% endautocrossref %}
### CompactSize Unsigned Integers ### CompactSize Unsigned Integers
{% include helpers/subhead-links.md %} {% include helpers/subhead-links.md %}