From a64e7200b751c7df3e587d18751d99553a421ab8 Mon Sep 17 00:00:00 2001 From: AndrewStone Date: Fri, 5 Mar 2021 19:50:20 +0000 Subject: [PATCH 01/31] wiki commit From 982bc604129bb46abbe60fa44f75c63dba7e7d34 Mon Sep 17 00:00:00 2001 From: Anonymous Contributor <80100588+A60AB5450353F40E@users.noreply.github.com> Date: Sun, 7 Mar 2021 12:48:34 +0100 Subject: [PATCH 02/31] Add a note to clarify limitations of arithmetic opcodes Copied from: https://gitlab.com/bitcoin-cash-node/bitcoin-cash-node/-/blob/master/src/script/script.h#L213 --- protocol/blockchain/script.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/protocol/blockchain/script.md b/protocol/blockchain/script.md index d0b386f..70e152a 100644 --- a/protocol/blockchain/script.md +++ b/protocol/blockchain/script.md @@ -125,6 +125,8 @@ Op codes marked with **(do not use)** are disallowed and will make a transaction ### Arithmetic +Numeric opcodes (OP_1ADD, etc) are restricted to operating on 4-byte integers. The semantics are subtle, though: operands must be in the range [-2^31 +1...2^31 -1], but results may overflow (and are valid as long as they are not used in a subsequent numeric operation). + |Word |Value |Hex |Input |Output | Description | |---------------------|-------|----|--------------|-----------------|------------------------------------------------------| |OP_1ADD | 139 |0x8b|in |out | 1 is added to the input. | From dbbf3b6cc520695e6156a8f270a947a542669d16 Mon Sep 17 00:00:00 2001 From: Paul Chandler Date: Mon, 15 Mar 2021 22:36:16 -0400 Subject: [PATCH 03/31] Updated pre-BCH protocol version infomration. Added pre-BCH release info and updated change summary info where known. --- history/protocol-version.md | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/history/protocol-version.md b/history/protocol-version.md index f7dd7af..6ab8f73 100644 --- a/history/protocol-version.md +++ b/history/protocol-version.md @@ -1,10 +1,16 @@ # Network Protocol Version History - -| Version Number | Proposed In | Summary | -|--|--|--| -| 106 | ??? | Added the following fields to the `version` message: `address-from`, `nonce`, `user-agent`, `current block height` | -| 209 | ??? | `address` message may accept a list of network addresses. | -|31 402| ??? | Time field added to `address` messages. | -| | [BIP-0014](/history/bips) | Network Version decoupled from Block Version. User-agent replaced sub-version number. | -| 60 000 | [BIP-0031](/history/bips) | Added pong. | -| 70 001 | [BIP-0037](/history/bips) | Added `relay` flag to the `version` message.| \ No newline at end of file +| Version Number | Proposed In | Released | Summary | +|--|--|---| +|||Aug 2017| Bitcoin Cash hard fork.| +|70 015|[BIP-0152](/history/bips)|Jun 2017
Bitcoin Core 0.14.2|Modified banning behaviour for invalid compact blocks.| +|70 012| [BIP-0130](/history/bips)|Nov 2016
Bitcoin Core 0.12.0| Added `sendheaders` message.| +| 70 001 | [BIP-0037](/history/bips) | Feb 2013
Bitcoin Core 0.8.0 | Added `relay` flag to the `version` message.
Added `msg_filtered_block` inventory type to `getdata` message.
Added `filterload`, `filteradd`, `filterclear` and `merkleblock` messages.
Added `notfound` message (released but not in BIP).| +| 60 002 | [BIP-0035](/history/bips) | Sep 2012
Bitcoin Core 0.7.0| Added `mempool` message. Extended `getdata` message to allow download of memory pool transactions.| +| 60 001 | [BIP-0031](/history/bips) | May 2012
Bitcoin Core 0.6.1 |Added pong message. Added nonce field to `ping` message. | +| 60 000 | [BIP-0014](/history/bips) | Mar 2012
Bitcoin Core 0.6.0 |Network Version decoupled from Block Version. User-agent replaced sub-version number. | +|||Sep 2011|BIP process implemented| +|31800 | |Dec 2010
Bitcoin Core 0.3.15| Added `getheaders` message and `headers` message.| +|31 402| | Oct 2010
Bitcoin Core 0.3.15| Time field added to `address` messages. | +| 311 ||Aug 2010
Bitcoin Core 0.3.11| Added `alert` message.| +| 209 | |May 2010
Bitcoin Core 0.2.9 | `address` message may accept a list of network addresses. Added checksum field to message headers.| +| 106 | | Oct 2009
Bitcoin Core 0.1.6 | Added the following fields to the `version` message: `address-from`, `nonce`, `user-agent`, `current block height`. | \ No newline at end of file From 426d01af782441e1f9f2de707a02a092315e9193 Mon Sep 17 00:00:00 2001 From: Paul Chandler Date: Mon, 15 Mar 2021 22:45:10 -0400 Subject: [PATCH 04/31] Added protocol version 70 002. Added details of protocol version 70 002. --- history/protocol-version.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/history/protocol-version.md b/history/protocol-version.md index 6ab8f73..15e5d27 100644 --- a/history/protocol-version.md +++ b/history/protocol-version.md @@ -4,12 +4,13 @@ |||Aug 2017| Bitcoin Cash hard fork.| |70 015|[BIP-0152](/history/bips)|Jun 2017
Bitcoin Core 0.14.2|Modified banning behaviour for invalid compact blocks.| |70 012| [BIP-0130](/history/bips)|Nov 2016
Bitcoin Core 0.12.0| Added `sendheaders` message.| + |70 002|[BIP-0061](/history/bips)|Mar 2014
Bitcoin Core 0.9.0| Added `reject` message.
Send multiple `inv` messages in response to a `mempool` message if required (released but not in BIP).| | 70 001 | [BIP-0037](/history/bips) | Feb 2013
Bitcoin Core 0.8.0 | Added `relay` flag to the `version` message.
Added `msg_filtered_block` inventory type to `getdata` message.
Added `filterload`, `filteradd`, `filterclear` and `merkleblock` messages.
Added `notfound` message (released but not in BIP).| | 60 002 | [BIP-0035](/history/bips) | Sep 2012
Bitcoin Core 0.7.0| Added `mempool` message. Extended `getdata` message to allow download of memory pool transactions.| | 60 001 | [BIP-0031](/history/bips) | May 2012
Bitcoin Core 0.6.1 |Added pong message. Added nonce field to `ping` message. | | 60 000 | [BIP-0014](/history/bips) | Mar 2012
Bitcoin Core 0.6.0 |Network Version decoupled from Block Version. User-agent replaced sub-version number. | |||Sep 2011|BIP process implemented| -|31800 | |Dec 2010
Bitcoin Core 0.3.15| Added `getheaders` message and `headers` message.| +|31 800 | |Dec 2010
Bitcoin Core 0.3.15| Added `getheaders` message and `headers` message.| |31 402| | Oct 2010
Bitcoin Core 0.3.15| Time field added to `address` messages. | | 311 ||Aug 2010
Bitcoin Core 0.3.11| Added `alert` message.| | 209 | |May 2010
Bitcoin Core 0.2.9 | `address` message may accept a list of network addresses. Added checksum field to message headers.| From 84f77aeef1b3770174922eb0a581d90c6a3cfdfc Mon Sep 17 00:00:00 2001 From: Paul Chandler Date: Mon, 15 Mar 2021 23:14:54 -0400 Subject: [PATCH 05/31] Added transaction version history link. Added transaction version history link. --- protocol/blockchain/transaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocol/blockchain/transaction.md b/protocol/blockchain/transaction.md index e00944f..c085c95 100644 --- a/protocol/blockchain/transaction.md +++ b/protocol/blockchain/transaction.md @@ -13,7 +13,7 @@ Verification of a transaction ensures that: | Field | Length | Format | Description | |--|--|--|--| -| version | 4 bytes | unsigned integer[(LE)](/protocol/misc/endian/little) | The version of the transaction format. Currently `0x02000000`. | +| version | 4 bytes | unsigned integer[(LE)](/protocol/misc/endian/little) | The version of the transaction format. Currently `0x02000000`.
For more details refer to the [transaction version history](/history/transaction-version). | | input count | variable | [variable length integer](/protocol/formats/variable-length-integer) | The number of inputs in the transaction. | | transaction inputs | variable | `input_count` [transaction inputs](#transaction-input) | Each of the transaction's inputs serialized in order. | | output count | variable | [variable length integer](/protocol/formats/variable-length-integer) | The number of output in the transaction. | From b0aba5dcef1eb1b9df8721a09db79f7cb440a751 Mon Sep 17 00:00:00 2001 From: Paul Chandler Date: Tue, 16 Mar 2021 01:06:34 -0400 Subject: [PATCH 06/31] Added block version history page. Added block version history page. --- history/block-version.md | 7 +++++++ protocol/blockchain/block/block-header.md | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 history/block-version.md diff --git a/history/block-version.md b/history/block-version.md new file mode 100644 index 0000000..7252bfd --- /dev/null +++ b/history/block-version.md @@ -0,0 +1,7 @@ +| Version Number | Proposed In | Released | Summary | +|--|--|---| +|||Aug 2017| Bitcoin Cash hard fork.| +|4|[BIP-0065](/history/bips)| Nov 2015
Bitcoin Core 0.11.2| Added support for `OP_CHECKLOCKTIMEVERIFY` opcode.| +|3|[BIP-0066](/history/bips)|Jul 2015
Bitcoin Core 0.10.0| Added enforcement of DER encoding of all ECDSA signatures in new blocks.| +|2|[BIP-0034](/history/bips)|Sep 2012
Bitcoin Core 0.7.0| Added the block height within the block coinbase.| +|1||Jan 2009|The format used in the genesis block.| \ No newline at end of file diff --git a/protocol/blockchain/block/block-header.md b/protocol/blockchain/block/block-header.md index 3094095..5b93ab7 100644 --- a/protocol/blockchain/block/block-header.md +++ b/protocol/blockchain/block/block-header.md @@ -16,7 +16,7 @@ Since validation of all the transactions in the block can be expensive, the abil | Field | Length | Format | Description | |--|--|--|--| -| version | 4 bytes | unsigned integer[(LE)](/protocol/misc/endian/little) | The block format version. | +| version | 4 bytes | unsigned integer[(LE)](/protocol/misc/endian/little) | The block format version. Currently 0x04000000.
For more details refer to the [block version history](/history/block-version). | | previous block hash | 32 bytes | [block hash](/protocol/blockchain/hash)[(LE)](/protocol/misc/endian/little) | The hash of the block immediately preceding this block in the blockchain. | | merkle root | 32 bytes | [merkle root](/protocol/blockchain/merkle-tree)[(LE)](/protocol/misc/endian/little) | The merkle tree root of the transactions in the block. | | timestamp | 4 bytes | unix timestamp[(LE)](/protocol/misc/endian/little) | The epoch timestamp of the block in seconds. | From c87549cb96fa7064859ea27428851c15435efa10 Mon Sep 17 00:00:00 2001 From: Paul Chandler Date: Tue, 16 Mar 2021 01:22:30 -0400 Subject: [PATCH 07/31] Added transaction version history page. Added transaction version history page. --- history/transaction-version.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 history/transaction-version.md diff --git a/history/transaction-version.md b/history/transaction-version.md new file mode 100644 index 0000000..44ca84e --- /dev/null +++ b/history/transaction-version.md @@ -0,0 +1,6 @@ +# Transaction Version History +| Version Number | Proposed In | Released | Summary | +|--|--|---| +|||Aug 2017| Bitcoin Cash hard fork.| +|2|[BIP-0068](/history/bips)|May 2016
Bitcoin Core 0.12.1|Added relative lock-time (RLT) consensus-enforced semantics of the transaction input sequence number field.| +|1|||As used in the genesis block.| \ No newline at end of file From 20447464d9d20698704e9d1f4960e6a3905c3731 Mon Sep 17 00:00:00 2001 From: Paul Chandler Date: Tue, 16 Mar 2021 01:23:27 -0400 Subject: [PATCH 08/31] Added page title. Added page title. --- history/block-version.md | 1 + 1 file changed, 1 insertion(+) diff --git a/history/block-version.md b/history/block-version.md index 7252bfd..6daeb34 100644 --- a/history/block-version.md +++ b/history/block-version.md @@ -1,3 +1,4 @@ +# Block Version History | Version Number | Proposed In | Released | Summary | |--|--|---| |||Aug 2017| Bitcoin Cash hard fork.| From 41a44500a0a3d6a32e6c56ce60b7b3658162718d Mon Sep 17 00:00:00 2001 From: Paul Chandler Date: Mon, 22 Mar 2021 08:28:57 -0400 Subject: [PATCH 09/31] Added inventory item count constraint. Added the 50,000 inventory item per INV message constraint. --- protocol/network/messages/inv.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocol/network/messages/inv.md b/protocol/network/messages/inv.md index e229b10..e4c808e 100644 --- a/protocol/network/messages/inv.md +++ b/protocol/network/messages/inv.md @@ -16,7 +16,7 @@ If a bloom filter has been sent to this node via [filterload](/protocol/network/ | Field | Length | Format | Description | |--|--|--|--| | inventory count | variable | [variable length integer](/protocol/formats/variable-length-integer) | The number of inventory items in this message. | -| inventory items | `inventory_count` * 36 bytes | `inventory_count` [inventory items](#inventory-item-format) | The set of inventory items being transmitted. | +| inventory items | `inventory_count` * 36 bytes | `inventory_count` [inventory items](#inventory-item-format) | The set of inventory items being transmitted. Up to 50,000 inventory items can be sent in a single inventory message.| NOTE: Since a block header is a relatively small data structure, and block propagation speed is an important network metric, a peer may send [headers](/protocol/network/messages/headers) messages in place of inventory messages when a block arrives. This behavior can be requested using the [sendheaders](/protocol/network/messages/sendheaders) message. From 08013f335d23f6ea2aa68fdc25e220ab7190f0ca Mon Sep 17 00:00:00 2001 From: Andrew Groot Date: Mon, 22 Mar 2021 15:44:50 -0400 Subject: [PATCH 10/31] Added stratum protocol. --- home.md | 2 +- mining/stratum-protocol.md | 191 ++++++++++++++++++++++ protocol/blockchain/block/block-header.md | 2 +- 3 files changed, 193 insertions(+), 2 deletions(-) create mode 100644 mining/stratum-protocol.md diff --git a/home.md b/home.md index a42aeef..679f482 100644 --- a/home.md +++ b/home.md @@ -22,7 +22,7 @@ [Block-Level Validation Rules](/protocol/blockchain/transaction-validation/block-level-validation-rules) — [Network-Level Validation Rules](/protocol/blockchain/transaction-validation/network-level-validation-rules) ### Proof of Work (PoW) -[Proof of Work](/protocol/blockchain/proof-of-work) — [Difficulty Adjustment Algorithm](/protocol/blockchain/proof-of-work/difficulty-adjustment-algorithm) — [Mining](/protocol/blockchain/proof-of-work/mining) — Stratum Protocol — Mining Pools +[Proof of Work](/protocol/blockchain/proof-of-work) — [Difficulty Adjustment Algorithm](/protocol/blockchain/proof-of-work/difficulty-adjustment-algorithm) — [Mining](/protocol/blockchain/proof-of-work/mining) — [Stratum Protocol](/mining/stratum-protocol) — Mining Pools ### Addresses Pay To Public Key (P2PK) — Pay To Public Key Hash (P2PKH) — Pay To Script Hash (P2SH) — [Base58Check encoding (legacy)](/protocol/blockchain/encoding/base58check) — [Cashaddr Encoding](/protocol/blockchain/encoding/cashaddr) diff --git a/mining/stratum-protocol.md b/mining/stratum-protocol.md new file mode 100644 index 0000000..585eba7 --- /dev/null +++ b/mining/stratum-protocol.md @@ -0,0 +1,191 @@ +# Stratum Protocol + +The stratum protocol is used by [ASIC](https://en.wikipedia.org/wiki/Application-specific_integrated_circuit) miners, devices created specifically for performing Bitcoin [mining](/protocol/blockchain/proof-of-work/mining). + +Miners use this protocol to reach out to one or more servers (e.g. a mining pool) in order to obtain a template for a new [block](/protocol/blockchain/block). +The template has gaps where random data can be added until the the miner successfully creates a candidate block that meets the specified difficulty requirements. + +## Message Format + +Stratum uses the [JSON-RPC 2.0](https://en.wikipedia.org/wiki/JSON-RPC) message format. +That is, [JSON](https://en.wikipedia.org/wiki/JSON)-encoded messages, separated by newline (line feed) characters. +There are two high-level message formats: requests and responses. + +### Requests + +Requests all contain the following fields: + +| Field | Format | Description | +|--|--|--| +| id | number or string | A message ID that must be unique per request that expects a response. For requests not expecting a response (called notifications), this is null. | +| method | string | Indicates the type of request the message represents. | +| params | array | Additional data which varies based on the request method. | + +### Responses + +Responses all contain the following fields: + +| Field | Format | Description | +|--|--|--| +| id | number or string | The ID of the request that this message is a response to. | +| result | any | Data being returned in response to the request. Must be present, but may be a string, number, array, object, or null. | +| error | [error array](#error-array-format) | Indicates that the request could not be fulfilled and provides information about what went wrong. | + +#### Error Array Format + +The error array is a JSON array containing the following elements: + +| Field | Format | Description | +|--|--|--| +| error code | number | An error code indicating the type of error. | +| message | string | A description of the error. | +| data | object | Additional data associated with the error (nullable). | + +*Example error:* {"result":null,"id":2,"error":[24,"Unauthorized worker",null]} + +Beyond those specified by JSON-RPC, the following error codes are used: + +| Code | Description | +|--|--| +| 20 | Other/Unknown | +| 21 | Job not found (=stale) | +| 22 | Duplicate share | +| 23 | Low difficulty share | +| 24 | Unauthorized worker | +| 25 | Not subscribed | + +## Client Methods + +### mining.subscribe + +Upon connecting to a server, clients are expected to send a subscribe request, described as follows. + +| Field | Format | Description | +|--|--|--| +| method | string | "mining.subscribe" | +| params\[0\] | string | User agent and version, separated by a forward slash (e.g. "Node/1.0.0"). | +| params\[1\] | string | Suggested extra nonce value (optional). | + +*Example request:* {"id": 1, "method": "mining.subscribe", "params": ["Node/1.0.0"]} + +In response, the server will send the following data in its result object, which is a JSON array: + +| Field | Format | Description | +|--|--|--| +| subscriptions | array | An array containing sub-array that described intended subscriptions. The first value in sub-arrays is the subscription type (e.g. "mining.set_difficulty"), the second is a subscription ID. | +| extra nonce 1 | string | The selected extra nonce 1 value. | +| extra nonce 2 byte count | number | The size, in bytes, that the extra nonce 2 should be. | + +*Example response:* {"result":[[["mining.set_difficulty","731ec5e0649606ff"],["mining.notify","731ec5e0649606ff"]],"e9695791",4],"id":1,"error":null} + +### mining.authorize + +In order to authenticate itself, the client send an authorize message: + +| Field | Format | Description | +|--|--|--| +| method | string | "mining.authorize" | +| params\[0\] | string | The client's user name. | +| params\[1\] | string | The client's password (if required by the server). | + +*Example request:* {"id": 1, "method": "mining.authorize", "params": ["username", "p4ssw0rd"]} + +Response format: + +| Field | Format | Description | +|--|--|--| +| result | boolean | The value true if the client has been authorized; false otherwise. | + +*Example response:* {"id": 2, "result": true, "error": null} + +### mining.submit + +Once the client has completed a job (received via [mining.notify](#miningnotify) following an accepted [mining.authorize](#miningauthorize)), it returns its result using a submit message. +This message is also used to submit shares to a mining pool. +The format is as follows: + +| Field | Format | Description | +|--|--|--| +| method | string | "mining.submit" | +| params\[0\] | string | The client's user name. | +| params\[1\] | string | The job ID for the work being submitted. | +| params\[2\] | string | The hex-encoded value of extra nonce 2. | +| params\[3\] | string | The hex-encoded time value use in the block header. | +| params\[4\] | string | The hex-encoded nonce value to use in the block header. | + +*Example request:* {"id": 1, "method": "mining.submit", "params": ["username", "4f", "fe36a31b", "504e86ed", "e9695791"]} + +Response format: + +| Field | Format | Description | +|--|--|--| +| result | boolean | The value true if the submission has been accepted; false if it was rejected. | + +*Example response:* {"id": 2, "result": true, "error": null} + +## Server Methods + +### mining.notify + +Once a client successfully connects using the [mining.subscribe](#miningsubscribe) and [mining.authorize](#miningauthorize) messages, the server may send a job to the client, informing it of everything it needs to know in order to mine a new block. +The notify message is a notification (does not expect a response) and has the following format: + +| Field | Format | Description | +|--|--|--| +| method | string | "mining.notify" | +| params\[0\] | string | The job ID for the job being sent in this message. | +| params\[1\] | string | The hex-encoded previous block hash. | +| params\[2\] | string | The hex-encoded prefix of the coinbase transaction (to precede extra nonce 2). | +| params\[3\] | string | The hex-encoded suffix of the coinbase transaction (to follow extra nonce 2). | +| params\[4\] | array | A JSON array containing the hex-encoded hashes needed to compute the [merkle root](/protocol/blockchain/block/merkle-tree). See [Merkle Tree Hash Array](#merkle-tree-hash-array). | +| params\[5\] | string | The hex-encoded block version. | +| params\[6\] | string | The hex-encoded network difficulty required for the block. | +| params\[7\] | string | The hex-encoded current time for the block. | +| params\[8\] | boolean | Indicates whether the client should forget any prior jobs. If true, the server will reject any submissions for prior jobs and the miner should forget any prior job IDs so that they can be reused by the server. | + +*Example request:* {"id": null, "method": "mining.notify", "params": ["bf", "4d16b6f85af6e2198f44ae2a6de67f78487ae5611b77c6c0440b921e00000000", +"01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff20020862062f503253482f04b8864e5008", +"072f736c7573682f000000000100f2052a010000001976a914d23fcdf86f7e756a64a7a9688ef9903327048ed988ac00000000", [], +"00000002", "1c2ac4af", "504e86b9", false]} + +#### Merkle Tree Hash Array + +The array of merkle tree hashes in the [mining.notify](#miningnotify) request, denote (in order) the hashes that should be iteratively composed with the coinbase transaction has to ultimately generate the merkle root. +In the simplest case, where the block will only contain the coinbase transaction, the array is empty and the coinbase transaction hash becomes the merkle root. +When there are more transactions, however, the merkle tree hash array contains the leaf nodes of the partial merkle tree, as shown below. + +```mermaid +graph TD + +root[Merkle Root] --- 0[Hash0] +root[Merkle Root] --- 1[Hash1] +0 --- 00[Hash00] +0 --- 01[Hash01] +00 --- 000[Hash000] +00 --- 001[Hash001] +000 --- coinbase[Coinbase] + +style root stroke-width: 3px, stroke-dasharray: 5 +style 0 stroke-width: 3px, stroke-dasharray: 5 +style 00 stroke-width: 3px, stroke-dasharray: 5 +style 000 stroke-width: 3px, stroke-dasharray: 5 +style 1 stroke-width: 3px, stroke-bold: 5 +style 01 stroke-width: 3px, stroke-bold: 5 +style 001 stroke-width: 3px, stroke-bold: 5 +``` + +In the example above, dashed lines indicate hashes that must be computed, while bold lines indicate hashes are are included in the merkle tree hash array, which in this case would be: ["Hash000", "Hash00", "Hash0"]. +So after the coinbase transaction is created, it is hashed into `Hash000`. +Then `Hash000` and `Hash001` are hashed together to create `Hash00`, and so on until the Merkle Root is computed. + +## mining.set_difficulty + +When reporting shares to the server, clients are expected to default to a [difficulty](/protocol/blockchain/proof-of-work#difficulty) of 1 (a [target](/protocol/blockchain/proof-of-work#target) of: `0x00000000ffff0000000000000000000000000000000000000000000000000000`). +At any point, however, the server can change that threshold by sending a `set_difficulty` message: + +| Field | Format | Description | +|--|--|--| +| method | string | "mining.set_difficulty" | +| params\[0\] | number | The new difficulty threshold for share reporting. Shares are reported using the [mining.submit](#miningsubmit) message. | + +*Example request:* { "id": null, "method": "mining.set_difficulty", "params": [2]} \ No newline at end of file diff --git a/protocol/blockchain/block/block-header.md b/protocol/blockchain/block/block-header.md index 5b93ab7..0adfdeb 100644 --- a/protocol/blockchain/block/block-header.md +++ b/protocol/blockchain/block/block-header.md @@ -18,7 +18,7 @@ Since validation of all the transactions in the block can be expensive, the abil |--|--|--|--| | version | 4 bytes | unsigned integer[(LE)](/protocol/misc/endian/little) | The block format version. Currently 0x04000000.
For more details refer to the [block version history](/history/block-version). | | previous block hash | 32 bytes | [block hash](/protocol/blockchain/hash)[(LE)](/protocol/misc/endian/little) | The hash of the block immediately preceding this block in the blockchain. | -| merkle root | 32 bytes | [merkle root](/protocol/blockchain/merkle-tree)[(LE)](/protocol/misc/endian/little) | The merkle tree root of the transactions in the block. | +| merkle root | 32 bytes | [merkle root](/protocol/blockchain/block/merkle-tree)[(LE)](/protocol/misc/endian/little) | The merkle tree root of the transactions in the block. | | timestamp | 4 bytes | unix timestamp[(LE)](/protocol/misc/endian/little) | The epoch timestamp of the block in seconds. | | target | 4 bytes | [compressed target](#compressed-target-format)[(LE)](/protocol/misc/endian/little) | The target that the block hash must be below to be valid. This value is determined by the timestamps of previously mined blocks. See [Target](/protocol/blockchain/proof-of-work#target) for more information. | | nonce | 4 bytes | bytes[(LE)](/protocol/misc/endian/little) | A random value that is repeatedly changes during block mining in order to achieve the block hash requirements. | From 2393c5c15c35e9d0ddbd153fe646a0b702ba8c8b Mon Sep 17 00:00:00 2001 From: Andrew Groot Date: Tue, 23 Mar 2021 11:03:21 -0400 Subject: [PATCH 11/31] Started page for mining pools. --- home.md | 2 +- mining/mining-pools.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 mining/mining-pools.md diff --git a/home.md b/home.md index 679f482..3c88bfc 100644 --- a/home.md +++ b/home.md @@ -22,7 +22,7 @@ [Block-Level Validation Rules](/protocol/blockchain/transaction-validation/block-level-validation-rules) — [Network-Level Validation Rules](/protocol/blockchain/transaction-validation/network-level-validation-rules) ### Proof of Work (PoW) -[Proof of Work](/protocol/blockchain/proof-of-work) — [Difficulty Adjustment Algorithm](/protocol/blockchain/proof-of-work/difficulty-adjustment-algorithm) — [Mining](/protocol/blockchain/proof-of-work/mining) — [Stratum Protocol](/mining/stratum-protocol) — Mining Pools +[Proof of Work](/protocol/blockchain/proof-of-work) — [Difficulty Adjustment Algorithm](/protocol/blockchain/proof-of-work/difficulty-adjustment-algorithm) — [Mining](/protocol/blockchain/proof-of-work/mining) — [Stratum Protocol](/mining/stratum-protocol) — [Mining Pools](/mining/mining-pools) ### Addresses Pay To Public Key (P2PK) — Pay To Public Key Hash (P2PKH) — Pay To Script Hash (P2SH) — [Base58Check encoding (legacy)](/protocol/blockchain/encoding/base58check) — [Cashaddr Encoding](/protocol/blockchain/encoding/cashaddr) diff --git a/mining/mining-pools.md b/mining/mining-pools.md new file mode 100644 index 0000000..825798c --- /dev/null +++ b/mining/mining-pools.md @@ -0,0 +1,4 @@ +# Mining Pools + +Mining pools coordinate the efforts of a (typically large) group of miners. +When a block is mined, the [block reward](/protocol/blockchain/block#coinbase-transaction) is distributed amongst the contributing members of the pool. \ No newline at end of file From ba6d40d3934b9ea82245446ffd5797dff6b5f52a Mon Sep 17 00:00:00 2001 From: Andrew Groot Date: Tue, 23 Mar 2021 11:07:19 -0400 Subject: [PATCH 12/31] Add missing cases for transaction preimage hashes. --- protocol/blockchain/transaction/transaction-signing.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/protocol/blockchain/transaction/transaction-signing.md b/protocol/blockchain/transaction/transaction-signing.md index 481269d..a9fc8e5 100644 --- a/protocol/blockchain/transaction/transaction-signing.md +++ b/protocol/blockchain/transaction/transaction-signing.md @@ -59,8 +59,8 @@ In Bitcoin Cash, transaction signatures use the transaction digest algorithm des | Field | Length | Format | Description | |--|--|--|--| | transaction version | 4 bytes | unsigned integer[(LE)](/protocol/misc/endian/little) | The value of transaction's version field. | -| previous outputs hash | 32 bytes | hash[(BE)](/protocol/misc/endian/big) | A double SHA-256 hash of the set of previous outputs spent by the inputs of the transaction. See [Previous Outputs](#previous-outputs-hash) for the hash preimage format.

If hash type is "ANYONE CAN PAY" then this is all `0x00` bytes. | -| sequence numbers hash | 32 bytes | hash[(BE)](/protocol/misc/endian/big) | A double SHA-256 hash of the set of sequence numbers of the inputs of the transaction. See [Sequence Numbers](#sequence-numbers-hash) for the hash preimage format.

If hash type is "ANYONE CAN PAY" then this is all `0x00` bytes. | +| previous outputs hash | 32 bytes | hash[(BE)](/protocol/misc/endian/big) | A double SHA-256 hash of the set of previous outputs spent by the inputs of the transaction. See [Previous Outputs](#previous-outputs-hash) for the hash preimage format.

If hash type is "ANYONECANPAY" then this is all `0x00` bytes. | +| sequence numbers hash | 32 bytes | hash[(BE)](/protocol/misc/endian/big) | A double SHA-256 hash of the set of sequence numbers of the inputs of the transaction. See [Sequence Numbers](#sequence-numbers-hash) for the hash preimage format.

If hash type is "ANYONECANPAY", "SINGLE", or "NONE" then this is all `0x00` bytes. | | previous output hash | 32 bytes | hash[(LE)](/protocol/misc/endian/little) | The transaction ID of the previous output being spent. | | previous output index | 4 bytes | unsigned integer[(LE)](/protocol/misc/endian/little) | The index of the output to be spent. | | modified locking script length | variable | [variable length integer](/protocol/format/variable-length-integer) | The number of bytes for `modified_locking_script`. | From 14c13064eff14a79f627caec08c3abd01714fc1b Mon Sep 17 00:00:00 2001 From: Anonymous Contributor <80100588+A60AB5450353F40E@users.noreply.github.com> Date: Wed, 24 Mar 2021 10:49:12 +0100 Subject: [PATCH 13/31] Disambiguation: rename variable length integer to **compact** variable length integer See issue [#32](https://github.com/BitcoinUnlimited/BitcoinCashSpecification/issues/32) Quoting @joshmg: "I think we're inclined to take your most recent suggestion and rename what the specification calls "variable length integer" to "compact variable length integer". It's similar enough to the C++ -ism such that anyone with that context will understand the intended parallel, while also avoiding the name collision of BCHN/Core's internal VarInt." --- protocol/formats/variable-length-integer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocol/formats/variable-length-integer.md b/protocol/formats/variable-length-integer.md index 1ab8b19..1754758 100644 --- a/protocol/formats/variable-length-integer.md +++ b/protocol/formats/variable-length-integer.md @@ -1,4 +1,4 @@ -# Variable Length Integer +# Compact Variable Length Integer A variable-width data format for unsigned integers allowing a more compact representation for smaller values. From 328ffed8a818a6a858d62c1f225eda91a4d63fff Mon Sep 17 00:00:00 2001 From: Josh Green Date: Tue, 30 Mar 2021 12:48:27 -0400 Subject: [PATCH 14/31] DSProof Specific Clarification Improved the verbiage and reduced ambiguities, particularly endianness, within the Double Spend Proof specification. --- .../transaction/transaction-signing.md | 17 +- protocol/forks/replay-protected-sighash.md | 12 +- protocol/network/messages/dsproof-beta.md | 148 +++++++++--------- protocol/network/messages/inv.md | 14 +- 4 files changed, 101 insertions(+), 90 deletions(-) diff --git a/protocol/blockchain/transaction/transaction-signing.md b/protocol/blockchain/transaction/transaction-signing.md index 481269d..9ac9113 100644 --- a/protocol/blockchain/transaction/transaction-signing.md +++ b/protocol/blockchain/transaction/transaction-signing.md @@ -52,10 +52,25 @@ Combining these, there are 6 valid signature hash types in Bitcoin Cash. Only t ## Bitcoin Cash Signatures -In Bitcoin Cash, transaction signatures use the transaction digest algorithm described in [BIP143](https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki), in order to minimize redundant data hashing in verification and to cover the input value by the signature. +In Bitcoin Cash, transaction signatures use the transaction digest algorithm described in a modification of [BIP143](/protocol/forks/replay-protected-sighash), in order to minimize redundant data hashing in verification and to cover the input value by the signature. ### Preimage Format +At a high level, the preimage format for a signature within a single input is a serialization of the following transaction components, **many of which are hashed, modified, or substituted** depending on the context: + +1. Transaction version +2. Previous transaction outputs identifiers +3. Transaction input sequence numbers +4. The identifier of the output being spent +5. The locking script of the output being spent +6. The value of the output being spent +7. The sequence number of the transaction input +8. The created transaction outputs +9. Transaction locktime +10. The signature hash type + +The following table specifies, in detail, the preimage format for a signature within a single input: + | Field | Length | Format | Description | |--|--|--|--| | transaction version | 4 bytes | unsigned integer[(LE)](/protocol/misc/endian/little) | The value of transaction's version field. | diff --git a/protocol/forks/replay-protected-sighash.md b/protocol/forks/replay-protected-sighash.md index 3898668..959e7a8 100644 --- a/protocol/forks/replay-protected-sighash.md +++ b/protocol/forks/replay-protected-sighash.md @@ -12,7 +12,7 @@ This document describes proposed requirements and design for a reusable signing mechanism ensuring replay protection in the event of a chain split. It provides a way for users to create transactions which are invalid on forks lacking support for the mechanism and a fork-specific ID. -The proposed digest algorithm is adapted from BIP143[1][1] as it minimizes redundant data hashing in verification, covers the input value by the signature and is already implemented in a wide variety of applications[2][2]. +The proposed digest algorithm is adapted from BIP143[1][1] as it minimizes redundant data hashing in verification, covers the input value by the signature and is already implemented in a wide variety of applications[2][2]. The proposed digest algorithm is used when the `SIGHASH_FORKID` bit is set in the signature's sighash type. The verification of signatures which do not set this bit is not affected. @@ -53,7 +53,7 @@ The proposed digest algorithm computes the double SHA256 of the serialization of 9. nLocktime of the transaction (4-byte little endian) 10. sighash type of the signature (4-byte little endian) -Items 1, 4, 7 and 9 have the same meaning as in the original algorithm[3][3]. +Items 1, 4, 7 and 9 have the same meaning as in the original algorithm[3][3]. #### hashPrevouts @@ -93,7 +93,7 @@ The 8-byte value of the amount of Bitcoin this input contains. Notes: -1. In the original algorithm[3][OP_CHECKSIG], a `uint256` of `0x0000......0001` is committed if the input index for a `SINGLE` signature is greater than or equal to the number of outputs. +1. In the original algorithm[3][3], a `uint256` of `0x0000......0001` is committed if the input index for a `SINGLE` signature is greater than or equal to the number of outputs. In this BIP a `0x0000......0000` is committed, without changing the semantics. #### sighash type @@ -205,16 +205,20 @@ Gating code: ## Note -In the UAHF, a `fork id` of 0 is used (see [4][4] REQ-6-2 NOTE 4), i.e. +In the UAHF, a `fork id` of 0 is used (see UAHF[4][4] REQ-6-2 NOTE 4), i.e. the GetForkID() function returns zero. In that case the code can be simplified to omit the function. ## References [1]: https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki +\[1]: https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki [2]: https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki#Motivation +\[2]: https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki#Motivation [3]: https://en.bitcoin.it/wiki/OP_CHECKSIG +\[3]: https://en.bitcoin.it/wiki/OP_CHECKSIG [4]: https://github.com/bitcoincashorg/bitcoincash.org/blob/master/spec/uahf-technical-spec.md +\[4]: https://github.com/bitcoincashorg/bitcoincash.org/blob/master/spec/uahf-technical-spec.md diff --git a/protocol/network/messages/dsproof-beta.md b/protocol/network/messages/dsproof-beta.md index 4d922d9..4352a3e 100644 --- a/protocol/network/messages/dsproof-beta.md +++ b/protocol/network/messages/dsproof-beta.md @@ -1,103 +1,100 @@ # Announcement: Double Spend Proof ("dsproof-beta") -This message is meant to inform participants of attempts of double -spending an unconfirmed transaction by providing cryptographic provable -evidence that one UTXO entry was spent twice by the owner(s) of the funds. +This message is meant to inform participants of attempts of double spending an unconfirmed transaction by providing cryptographic provable evidence that one UTXO entry was spent twice by the owner(s) of the funds. ## Summary -A double spend attack can be used, for instance, to redirect payments meant for a specific -merchant to a different target and thus defraud the merchant we want to pay to. The basic -concept of a double spend is that (at least) one unspent output is spent -twice in different transactions which forces miners to pick one of them to mine. +A double spend attack can be used, for instance, to redirect payments meant for a specific merchant to a different target and thus defraud the merchant we want to pay to. +The basic concept of a double spend is that (at least) one unspent output is spent twice in different transactions which forces miners to pick one of them to mine. -At its most basic we can detect this by finding two signed inputs both -spending the same output. In the case of pay-to-public-key-hash (P2PKH) -this means two signatures signing the same public key. +At its most basic we can detect this by finding two signed inputs both spending the same output. +In the case of pay-to-public-key-hash (P2PKH) this means two signatures signing the same public key. -Cryptographic signatures in Bitcoin Cash follow the 'fork-id' algorithm described -[here](/protocol/forks/replay-protected-sighash), -which explains a change made to the Satoshi designed algorithm, a change after which the containing transaction itself is not signed, but a unique hash of that -transaction is being signed. This gives us the opportunity to send only -the intermediate hashes instead of the whole transaction while allowing -receivers to still validate both signatures of the same public -key. And therefore prove that a double spend has taken place. +Cryptographic signatures in Bitcoin Cash follow the "fork-id" algorithm described [here](/protocol/forks/replay-protected-sighash). +Since a hash of the transaction is signed, the protocol sends only the intermediate components used to build the preimage for the hash, while still allowing receivers to validate both signatures of the same public key, and therefore proving that a double spend has taken place. ## Network specification A node that finds itself in possession of a correct double-spend-proof -shall notify its peers using the INV message, using a 'type' field with -number **0x94a0**. This will be changed to another number as this spec -is finalized. +shall notify its peers using the [inventory](/protocol/network/messages/inv) message, using a "type" field with the value **`0x94A0`**. +This inventory type value will be changed to another number once double-spend proofs move out of beta and is finalized. -The hash-ID for the double-spend-proof is a double sha256 over the entire -serialized content of the proof, as defined next. +The hash-ID for the double-spend-proof is a double sha256 over the entire serialized content of the proof, as defined next. -In response to an INV any peer can issue a `getdata` message which will -cause a reply with the following message. The name of the message (until -this spec is finalized) is **`dsproof-beta`**. +In response to an inventory message, any peer can issue a [getdata](/protocol/network/messages/getdata) message which will cause a reply with the following message. +This type of message is **`dsproof-beta`** but will be changed to another identifier once double-spend proofs move out of beta and is finalized. - -| Field Size | Description | Data Type | Comments | +| Field | Length | Format | Description | | -----------|:-----------:| ----------:|---------:| -| 32 | TxInPrevHash | sha256 | The txid being spent | -| 4 | TxInPrevIndex | int | The output being spent | -| | FirstSpender | spender | the first sorted spender | -| | DoubleSpender | spender | the second spender | +| previous [transaction output](/protocol/blockchain/transaction#transaction-output)'s transaction hash | 32 | sha256[(LE)](/protocol/misc/endian/little) | The **transaction hash** of the output being spent | +| previous [transaction output](/protocol/blockchain/transaction#transaction-output)'s index | 4 | unsigned integer[(LE)](/protocol/misc/endian/little) | The **index** of the transaction output being spent | +| first spender | variable | spender[(BE)](/protocol/misc/endian/big) | The preimage data structure needed to validate a transaction's signature. | +| second spender | variable | spender[(BE)](/protocol/misc/endian/big) | The preimage data structure needed to validate a transaction's signature. | -A double-spend-proof essentially describes two inputs, both spending the -same output. As such the prev-hash and prev-index point to the output and -the spenders each describe inputs. +A double-spend-proof describes two inputs, both spending the same output. +As such the previous transaction output's hash and previous transaction output's index point to the output and the spenders each describe inputs. -The details required to validate one input are provided in the spender field; +### Spender Format -| Field Size | Description | Data Type | Comments | +The `spender` format is as follows. +Each field in the (below) table's `description` column loosely corresponds to the name of the preimage component used when generating transaction signatures per the [transaction signing algorithm](/protocol/blockchain/transaction/transaction-signing). + +| Field | Length | Format | [Signature Preimage](/protocol/blockchain/transaction/transaction-signing#preimage-format) Component | Description | | -----------|:-----------:| ----------:|---------:| -| 4 | tx-version | unsigned int | Copy of the transactions version field | -| 4 | sequence | unsigned int | Copy of the sequence field of the input | -| 4 | locktime | unsigned int | Copy of the transactions locktime field | -| 32 | hash-prevoutputs | sha256 | Transaction hash of prevoutputs | -| 32 | hash-sequence | sha256 | Transaction hash of sequences | -| 32 | hash-outputs | sha256 | Transaction hash of outputs | -| 1-9 | list-size | var-int | Number of items in the push-data list | -| | push-data | byte-array | Raw byte-array of a push-data. For instance a signature | +| tx version | 4 | unsigned integer [(LE)](/protocol/misc/endian/little) | #1 | Copy of the transactions version field | +| sequence | 4 | unsigned integer [(LE)](/protocol/misc/endian/little) | #7 | Copy of the sequence field of the input | +| locktime | 4 | unsigned integer [(LE)](/protocol/misc/endian/little) | #9 | Copy of the transactions locktime field | +| hash prevoutputs | 32 | sha256 [(BE)](/protocol/misc/endian/big) | #2 | Transaction hash of prevoutputs | +| hash sequence | 32 | sha256 [(BE)](/protocol/misc/endian/big) | #3 | Transaction hash of sequences | +| hash outputs | 32 | sha256 [(BE)](/protocol/misc/endian/big) | #8 | Transaction hash of outputs | +| push-data count | variable | [variable length integer](/protocol/formats/variable-length-integer) | | Number of push-data objects within in the push-data list | +| push-data | variable | bytes [(BE)](/protocol/misc/endian/big) | #10 | List of push-data objects | + +### Push Data Format + +The `push data` format is as follows. +Each item is a value pushed by the [unlocking script](/protocol/blockchain/transaction/unlocking-script). + +| Field | Length | Format | Description | +| -----------|:-----------:| ----------:|---------:| +| byte count | variable | [variable length integer](/protocol/formats/variable-length-integer) | The number of bytes in this push-data object | +| bytes | variable | bytes [(BE)](/protocol/misc/endian/big) | The resulting bytes pushed by an [unlocking script](/protocol/blockchain/transaction/unlocking-script)'s push [operation](/protocol/blockchain/script#operation-codes-opcodes) (ex. signature data). | ## Validation -It is required that nodes validate the proof before using it or forward it to other -nodes. Please check against the matching transaction in your mempool for -addresses so you can limit sending the proof only to interested nodes that -have registered a bloom filter. +It is required that nodes validate the proof before using it or forwarding it to other +nodes. +Double spend proofs only apply to transactions within the [memory pool](/protocol/blockchain/memory-pool). +Validated double spend proofs should be advertised (via [inventory message](/protocol/network/messages/inv)) to all connected peers. +If a peer has a bloom filter set, nodes should only relay double spend proofs that the [bloom filter](/protocol/spv/bloom-filter). Validation includes a short list of requirements; -1. The DSP message is well-formed and contains all fields. It is allowed (by - nature of Bitcoin Cash) for some hashes to be all-zeros. -2. The two spenders are different, specifically the signature (push data) - has to be different. -3. The first & double spenders are sorted with two hashes as keys. - Compare on the hash-outputs, and if those are equal, then compare on - hash-prevoutputs. - The sorting order is in numerically ascending order of the hash, - interpreted as 256-bit little endian integers. -4. The double spent output is still available in the UTXO database, - implying no spending transaction has been mined. +1. The message is well-formed and contains all fields. +It is allowed for some hashes to be all-zeros. +2. The two `spenders` must be are different. +3. The first & double `spender`s are sorted via the following algorithm: + + 3a. sort via the `hash-outputs` field of the `spender`. + + 3b. if `hash-outputs` are equal, then compare on `hash-prevoutputs`. + + The sorting order is in numerically ascending order of the hash, interpreted as 256-bit [little endian](/protocol/misc/endian/little) integers. + +4. The double spent output is still available in the UTXO database, implying no spending transaction has been mined. + 5. No other valid proof is known. -Further validation can be done by essentially validating the signature that -was copied from the inputs of both transactions against the output a node -should have in either its memory pool or its UTXO database. +Further validation can be done by validating the signature that +was copied from the inputs of both transactions against the (soon to be spent) previous transaction output. -To validate a spender of the proof, a node requires to have; +To validate a spender of the proof, a node is required to have; * The output being spent (mempool or UTXO) * One of the transactions trying to spend the output. * The double-spend-proof. -As the forkid -[specification](/protocol/forks/replay-protected-sighash) -details, the digest algorithm hashes 10 items in order to receive a sha256 -hash, which is then signed. +As the forkid [specification](/protocol/blockchain/transaction/transaction-signing#preimage-format) details, the digest algorithm hashes 10 items in order to receive a sha256 hash, which is then signed. These 10 items are; @@ -112,22 +109,17 @@ These 10 items are; 9. nLocktime of the transaction (4-byte little endian) 10. sighash type of the signature (4-byte little endian) -In the double spend message we include items: 1, 2, 3, 4, 7, 8, 9 and 10. +The double spend message includes items: 1, 2, 3, 4, 7, 8, 9 and 10. -From the output we are trying to spend you can further obtain items: 5 & 6 +Items 5 & 6 can be obtained from the output being spent. -The full transaction also spending the same output which you found in your -mempool, can be used to get the public key which you can use to validate -that the signature is actually correct. +The transaction that first spent the output within the node's [memory pool](/protocol/blockchain/memory-pool), can be used to get the public key required to validate that the signature within the `push-data` field of the double spend proof is correct. When all rules are followed, the proof is valid. ## Limitation and risks -Not all types and all combinations of transactions are supported. Wallets -and point-of-sale applications are suggested to give a rating of how secure -an unconfirmed transaction is based on various factors. +Not all types and all combinations of transactions are supported. +Wallets and point-of-sale applications are suggested to give a rating of how secure an unconfirmed transaction is based on various factors. -Transactions that spend all, confirmed, P2PKH outputs with all inputs -signed SIGHASH\_ALL without ANYONECANPAY, are double-spend-proof's -"protected transactions". +Transactions that spend all, confirmed, P2PKH outputs with all inputs signed `SIGHASH_ALL` without `ANYONECANPAY`, are double-spend-proof's "protected transactions". diff --git a/protocol/network/messages/inv.md b/protocol/network/messages/inv.md index e229b10..1b556cc 100644 --- a/protocol/network/messages/inv.md +++ b/protocol/network/messages/inv.md @@ -32,12 +32,12 @@ The type of the object that is available. | Type | Value| |------|------| -| 1 | Transaction | -| 2 | Block | -| 3 | Filtered Block (partial block with merkle proof) -| 4 | Compact block -| 5 | Xthin block (Bitcoin Unlimited) -| 6 | Graphene Block (Bitcoin Unlimited) -| 0x94a0 | [DSProof](/protocol/network/messages/dsproof-beta) | +| 0x0001 | Transaction | +| 0x0002 | Block | +| 0x0003 | Filtered Block (partial block with merkle proof) +| 0x0004 | Compact block +| 0x0005 | Xthin block (Bitcoin Unlimited) +| 0x0006 | Graphene Block (Bitcoin Unlimited) +| 0x94A0 | [Double Spend Proof](/protocol/network/messages/dsproof-beta) | Implementations: [C++](https://github.com/BitcoinUnlimited/BitcoinUnlimited/blob/eb264e627e231f7219e60eef41b4e37cc52d6d9d/src/protocol.h#L477) From 8e6f78b55994b0c214f08780a5b756975fbceb0b Mon Sep 17 00:00:00 2001 From: TomZ Date: Sat, 3 Apr 2021 10:57:25 +0200 Subject: [PATCH 15/31] Quoted segments don't belong in
 tags

In order to allow the specification to be read on a mobile phone
it helps to use the standard quoting standard (staring with '>')
for those paragraphs as that means they can still change their
content-width and a reader doesn't end up with a paragraph wider
than screen.
---
 .../network-level-validation-rules.md         | 46 +++++++++----------
 1 file changed, 22 insertions(+), 24 deletions(-)

diff --git a/protocol/blockchain/transaction-validation/network-level-validation-rules.md b/protocol/blockchain/transaction-validation/network-level-validation-rules.md
index c7990f1..123b09d 100644
--- a/protocol/blockchain/transaction-validation/network-level-validation-rules.md
+++ b/protocol/blockchain/transaction-validation/network-level-validation-rules.md
@@ -28,15 +28,13 @@ For this reason, among others, it is always wise to send transactions to multipl
 
 The transaction input scriptSig limit must be less or equal to 1650 bytes to be considered standard. The rationale for the number `1650` byte limit was described in the code base as:
 
-```
-Biggest 'standard' txin is a 15-of-15 P2SH multisig with compressed  
-keys. (remember the 520 byte limit on redeemScript size) That works
-out to a (15*(33+1))+3=513 byte redeemScript, 513+1+15*(73+1)+3=1627
-bytes of scriptSig, which we round off to 1650 bytes for some minor
-future-proofing. That's also enough to spend a 20-of-20              
-CHECKMULTISIG scriptPubKey, though such a scriptPubKey is not        
-considered standard)
-```
+> Biggest 'standard' txin is a 15-of-15 P2SH multisig with compressed
+> keys. (remember the 520 byte limit on redeemScript size) That works
+> out to a (15\*(33+1))+3=513 byte redeemScript, 513+1+15\*(73+1)+3=1627
+> bytes of scriptSig, which we round off to 1650 bytes for some minor
+> future-proofing. That's also enough to spend a 20-of-20
+> CHECKMULTISIG scriptPubKey, though such a scriptPubKey is not
+> considered standard)
 
 ### Data Output Size Limit
 
@@ -59,25 +57,25 @@ The exception to this is provably unspendable outputs (e.g. data outputs), which
 
 bchd provides the following comment regarding its dust calculation:
 
-    The output is considered dust if the cost to the network to spend the
-    coins is more than 1/3 of the minimum free transaction relay fee.
-    minFreeTxRelayFee is in Satoshi/KB, so multiply by 1000 to
-    convert to bytes.
-    
-    Using the typical values for a pay-to-pubkey-hash transaction from
-    the breakdown above and the default minimum free transaction relay
-    fee of 1000, this equates to values less than 546 satoshi being
-    considered dust.
+>  The output is considered dust if the cost to the network to spend the
+>  coins is more than 1/3 of the minimum free transaction relay fee.
+>  minFreeTxRelayFee is in Satoshi/KB, so multiply by 1000 to
+>  convert to bytes.
+>
+>  Using the typical values for a pay-to-pubkey-hash transaction from
+>  the breakdown above and the default minimum free transaction relay
+>  fee of 1000, this equates to values less than 546 satoshi being
+>  considered dust.
 
 #### Bitcoin Cash Node
 
 Bitcoin ABC provides the following description of its dust threshold calculation:
 
-    "Dust" is defined in terms of dustRelayFee, which has units
-    satoshis-per-kilobyte. If you'd pay more than 1/3 in fees to spend
-    something, then we consider it dust.  A typical spendable txout is 34
-    bytes big, and will need a CTxIn of at least 148 bytes to spend: so dust
-    is a spendable txout less than 546*dustRelayFee/1000 (in satoshis).
+>  "Dust" is defined in terms of dustRelayFee, which has units
+>  satoshis-per-kilobyte. If you'd pay more than 1/3 in fees to spend
+>  something, then we consider it dust.  A typical spendable txout is 34
+>  bytes big, and will need a CTxIn of at least 148 bytes to spend: so dust
+>  is a spendable txout less than 546\*dustRelayFee/1000 (in satoshis).
 
 #### Bitcoin Unlimited
 
@@ -92,4 +90,4 @@ Bitcoin Verde performs a similar calculation to Bitcoin ABC but with two differe
 
 This is accompanied by the comment:
 
-> For the common default _satoshisPerByteFee (1), the dust threshold is 546 satoshis.
+> For the common default \_satoshisPerByteFee (1), the dust threshold is 546 satoshis.

From 5b0473288072ba223a1723ba48f9f4ec2fcf536e Mon Sep 17 00:00:00 2001
From: Andrew Groot 
Date: Mon, 3 May 2021 10:55:04 -0400
Subject: [PATCH 16/31] Bitcoin-Verde-specific dsproof-beta behaviour.

Also, various grammatical fixes and clarifications.
---
 protocol/network/messages/dsproof-beta.md | 54 +++++++++++++++++------
 1 file changed, 40 insertions(+), 14 deletions(-)

diff --git a/protocol/network/messages/dsproof-beta.md b/protocol/network/messages/dsproof-beta.md
index 4352a3e..61b1191 100644
--- a/protocol/network/messages/dsproof-beta.md
+++ b/protocol/network/messages/dsproof-beta.md
@@ -4,11 +4,11 @@ This message is meant to inform participants of attempts of double spending an u
 
 ## Summary
 
-A double spend attack can be used, for instance, to redirect payments meant for a specific merchant to a different target and thus defraud the merchant we want to pay to.
+A double spend attack can be used, for instance, to redirect payments sent to a specific merchant to a different target and thus defraud the merchant.
 The basic concept of a double spend is that (at least) one unspent output is spent twice in different transactions which forces miners to pick one of them to mine.
 
-At its most basic we can detect this by finding two signed inputs both spending the same output.
-In the case of pay-to-public-key-hash (P2PKH) this means two signatures signing the same public key.
+At its most basic level, this can be detected by finding two signed inputs both spending the same output.
+In the case of pay-to-public-key-hash (P2PKH) this means two signatures from the same public key.
 
 Cryptographic signatures in Bitcoin Cash follow the "fork-id" algorithm described [here](/protocol/forks/replay-protected-sighash).
 Since a hash of the transaction is signed, the protocol sends only the intermediate components used to build the preimage for the hash, while still allowing receivers to validate both signatures of the same public key, and therefore proving that a double spend has taken place.
@@ -41,14 +41,14 @@ Each field in the (below) table's `description` column loosely corresponds to th
 
 | Field | Length | Format | [Signature Preimage](/protocol/blockchain/transaction/transaction-signing#preimage-format) Component | Description |
 | -----------|:-----------:| ----------:|---------:|
-| tx version | 4 | unsigned integer [(LE)](/protocol/misc/endian/little) | #1 | Copy of the transactions version field |
-| sequence | 4 | unsigned integer [(LE)](/protocol/misc/endian/little) | #7 | Copy of the sequence field of the input |
-| locktime | 4 | unsigned integer [(LE)](/protocol/misc/endian/little) | #9 | Copy of the transactions locktime field |
-| hash prevoutputs | 32 | sha256 [(BE)](/protocol/misc/endian/big) | #2 | Transaction hash of prevoutputs |
-| hash sequence | 32 | sha256 [(BE)](/protocol/misc/endian/big) | #3 | Transaction hash of sequences |
-| hash outputs | 32 | sha256 [(BE)](/protocol/misc/endian/big) | #8 | Transaction hash of outputs |
+| tx version | 4 | unsigned integer[(LE)](/protocol/misc/endian/little) | #1 | Copy of the transactions version field |
+| sequence | 4 | unsigned integer[(LE)](/protocol/misc/endian/little) | #7 | Copy of the sequence field of the input |
+| locktime | 4 | unsigned integer[(LE)](/protocol/misc/endian/little) | #9 | Copy of the transactions locktime field |
+| hash prevoutputs | 32 | sha256 | #2 | Transaction hash of prevoutputs |
+| hash sequence | 32 | sha256 | #3 | Transaction hash of sequences |
+| hash outputs | 32 | sha256 | #8 | Transaction hash of outputs |
 | push-data count | variable | [variable length integer](/protocol/formats/variable-length-integer) | | Number of push-data objects within in the push-data list |
-| push-data | variable | bytes [(BE)](/protocol/misc/endian/big) | #10 | List of push-data objects |
+| push-data | variable | bytes | #10 | List of push-data objects |
 
 ### Push Data Format
 
@@ -62,8 +62,7 @@ Each item is a value pushed by the [unlocking script](/protocol/blockchain/trans
 
 ## Validation
 
-It is required that nodes validate the proof before using it or forwarding it to other
-nodes.
+It is required that nodes validate the proof before using it or forwarding it to other nodes.
 Double spend proofs only apply to transactions within the [memory pool](/protocol/blockchain/memory-pool).
 Validated double spend proofs should be advertised (via [inventory message](/protocol/network/messages/inv)) to all connected peers.
 If a peer has a bloom filter set, nodes should only relay double spend proofs that the [bloom filter](/protocol/spv/bloom-filter).
@@ -72,7 +71,7 @@ Validation includes a short list of requirements;
 
 1. The message is well-formed and contains all fields.
 It is allowed for some hashes to be all-zeros.
-2. The two `spenders` must be are different.
+2. The two `spenders` must be different.
 3. The first & double `spender`s are sorted via the following algorithm:
 
   3a. sort via the `hash-outputs` field of the `spender`.
@@ -83,7 +82,9 @@ It is allowed for some hashes to be all-zeros.
 
 4. The double spent output is still available in the UTXO database, implying no spending transaction has been mined.
 
-5. No other valid proof is known.
+5. The push data elements of the two signers are different.
+
+6. No other valid proof is known.
 
 Further validation can be done by validating the signature that
 was copied from the inputs of both transactions against the (soon to be spent) previous transaction output.
@@ -123,3 +124,28 @@ Not all types and all combinations of transactions are supported.
 Wallets and point-of-sale applications are suggested to give a rating of how secure an unconfirmed transaction is based on various factors.
 
 Transactions that spend all, confirmed, P2PKH outputs with all inputs signed `SIGHASH_ALL` without `ANYONECANPAY`, are double-spend-proof's "protected transactions".
+
+## Node-Specific Behavior
+
+### Bitcoin Verde
+
+Bitcoin Verde supports an extended form of the `dsproof-beta` message.
+For P2PKH outputs, the format is as described above for compatibility with other nodes.
+For all other script types, the following changes are made to the existing data:
+
+1. `hash prevoutputs` is always the non-zero version of hash (e.g. for `SIGHASH_ALL`, **not** `ANYONECANPAY` hash types).
+2. `hash sequence` is always the non-zero version of the hash (e.g. for `SIGHASH_ALL`, **not** `ANYONECANPAY` hash types).
+3. `hash outputs` is always all zero (0x00) bytes.
+4. `push data` is defined to be the values push by every (push) operation in the unlocking scripts, except for P2SH, where the last value (the redeem script) is left off.
+
+The following extra data is also appended after the second spender:
+
+| Field | Length | Format | Description |
+| -----------|:-----------:| ----------|---------|
+| hash type count | 1 byte | [variable length integer](/protocol/formats/variable-length-integer) | The number of hashes to follow (always 2 with current signature rules). |
+| hash type indicator 0 | 1 byte | byte | The hash type of the following hash (always 0x01 for `SIGHASH_ALL`). |
+| hash outputs 0 | 32 bytes | sha256 | The hash outputs, as used in the signature preimage for a `SIGHASH_ALL` signature. |
+| hash type indicator 1 | 1 byte | byte | The hash type of the following hash (always 0x03 for `SIGHASH_SINGLE`). |
+| hash outputs 1 | 32 bytes | sha256 | The hash outputs, as used in the signature preimage for a `SIGHASH_SINGLE` signature. |
+
+This format corresponds with Bitcoin Verde's proposal for an alternate double spend proof message that supports all script types.

From 055129d12cf873be73291c3890a7bd514b3b1c70 Mon Sep 17 00:00:00 2001
From: Andrew Groot 
Date: Mon, 3 May 2021 11:58:00 -0400
Subject: [PATCH 17/31] Fee filter fixes.

Per https://github.com/BitcoinUnlimited/BitcoinCashSpecification/issues/35.
---
 protocol/network/messages/feefilter.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/protocol/network/messages/feefilter.md b/protocol/network/messages/feefilter.md
index e3ba1df..41fd3fa 100644
--- a/protocol/network/messages/feefilter.md
+++ b/protocol/network/messages/feefilter.md
@@ -1,6 +1,6 @@
-# Request: Filter Fee (“filterfee”)
+# Request: Fee Filter (“feefilter”)
 
-Requests that the recipient withhold transactions that provide less than the given threshold of fees, in satoshis per byte.
+Requests that the recipient withhold transactions that provide less than the given threshold of fees, in satoshis per kilobyte (1000 bytes).
 
 The recipient node may, but is not required to, begin to perform this filtering and send only transactions that have fees at or above this threshold to the sender.
 
@@ -8,4 +8,4 @@ The recipient node may, but is not required to, begin to perform this filtering
 
 | Field | Length | Format | Description |
 |--|--|--|--|
-|  minimum fee per byte  | 8 bytes | unsigned 64 bit integer[(LE)](/protocol/misc/endian/little) | The minimum number of satoshis per byte in fees desired by the sender.
+|  minimum fee per byte  | 8 bytes | unsigned integer[(LE)](/protocol/misc/endian/little) | The minimum number of satoshis, per 1000 bytes, desired by the sender in fees. |

From 1f182159062995e70afbffa587c255673c6e6ba4 Mon Sep 17 00:00:00 2001
From: Andrew Groot 
Date: Mon, 3 May 2021 12:00:23 -0400
Subject: [PATCH 18/31] Fixed block message timestamp length.

Per https://github.com/BitcoinUnlimited/BitcoinCashSpecification/issues/35.
---
 protocol/network/messages/block.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/protocol/network/messages/block.md b/protocol/network/messages/block.md
index 5e751ee..54de389 100644
--- a/protocol/network/messages/block.md
+++ b/protocol/network/messages/block.md
@@ -9,7 +9,7 @@ Provides the contents of a block.
 | version number | 4 bytes | signed integer | The block format version number. |
 | previous block hash | 32 bytes | bytes | The hash of the block preceding this one in the blockchain. |
 | merkle root | 32 bytes | bytes | The root hash of the merkle tree comprised of the block's transactions. |
-| timestamp | 8 bytes | unix timestamp[(LE)](/protocol/misc/endian/little) | The time the block was generated. |
+| timestamp | 4 bytes | unix timestamp[(LE)](/protocol/misc/endian/little) | The time the block was generated. |
 | hash target | 4 bytes | [compressed target](/protocol/blockchain/block/block-header#compressed-target-format) | The target that the hash of this block is expected to satisfy.  See [Target](/protocol/blockchain/proof-of-work#target). |
 | nonce | 4 bytes | bytes | Nonce used to update the block hash during mining.  See [Proof of Work](/protocol/blockchain/proof-of-work). |
 | transaction count | variable | [variable length integer](/protocol/formats/variable-length-integer) | The number of transactions in the block (and therefore following in this message). |

From 12192eedc42e01d99f2409ed0b0f0523d2923c7f Mon Sep 17 00:00:00 2001
From: Andrew Groot 
Date: Mon, 3 May 2021 14:27:46 -0400
Subject: [PATCH 19/31] Added BIP-133 to reference for feefilter.

---
 home.md                                |  2 +-
 protocol/forks/bip-0133.md             | 52 ++++++++++++++++++++++++++
 protocol/network/messages/feefilter.md |  2 +
 3 files changed, 55 insertions(+), 1 deletion(-)
 create mode 100644 protocol/forks/bip-0133.md

diff --git a/home.md b/home.md
index 3c88bfc..707323a 100644
--- a/home.md
+++ b/home.md
@@ -31,7 +31,7 @@ Pay To Public Key (P2PK) — Pay To Public Key Hash (P2PKH) — Pay To Script Ha
 Secp256k1 — Public Key — Private Key — ECDSA Signatures — Schnorr Signatures — [Multisignature (M-of-N multisig)](/protocol/blockchain/cryptography/multisignature)
 
 ### Network upgrades
-[Bip-16](/protocol/forks/bip-0016) — [Bip-34](/protocol/forks/bip-0034) — [Bip-37](/protocol/forks/bip-0037) — [Bip-65](/protocol/forks/bip-0065) — [Bip-66](/protocol/forks/bip-0066) — [Bip-68](/protocol/forks/bip-0068) — [Bip-112](/protocol/forks/bip-0112) — [Bip-113](/protocol/forks/bip-0113) — [Bip-157](/protocol/forks/bip-0157) — [Bip-158](/protocol/forks/bip-0158) — [Bip-159](/protocol/forks/bip-0159) — [BCH-UAHF (BUIP-55)](/protocol/forks/bch-uahf) — [HF-20171113](/protocol/forks/hf-20171113) — [HF-20180515](/protocol/forks/hf-20180515) — [HF-20181115](/protocol/forks/hf-20181115) — [HF-20190515](/protocol/forks/hf-20190515) — [HF-20191115](/protocol/forks/hf-20191115)
+[Bip-16](/protocol/forks/bip-0016) — [Bip-34](/protocol/forks/bip-0034) — [Bip-37](/protocol/forks/bip-0037) — [Bip-65](/protocol/forks/bip-0065) — [Bip-66](/protocol/forks/bip-0066) — [Bip-68](/protocol/forks/bip-0068) — [Bip-112](/protocol/forks/bip-0112) — [Bip-113](/protocol/forks/bip-0113) — [Bip-133](/protocol/forks/bip-0133) — [Bip-157](/protocol/forks/bip-0157) — [Bip-158](/protocol/forks/bip-0158) — [Bip-159](/protocol/forks/bip-0159) — [BCH-UAHF (BUIP-55)](/protocol/forks/bch-uahf) — [HF-20171113](/protocol/forks/hf-20171113) — [HF-20180515](/protocol/forks/hf-20180515) — [HF-20181115](/protocol/forks/hf-20181115) — [HF-20190515](/protocol/forks/hf-20190515) — [HF-20191115](/protocol/forks/hf-20191115)
 
 ### Network protocol
 
diff --git a/protocol/forks/bip-0133.md b/protocol/forks/bip-0133.md
new file mode 100644
index 0000000..19eca91
--- /dev/null
+++ b/protocol/forks/bip-0133.md
@@ -0,0 +1,52 @@
+# BIP-0133
+
+    BIP: 133
+    Layer: Peer Services
+    Title: feefilter message
+    Author: Alex Morcos 
+    Comments-Summary: No comments yet.
+    Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0133
+    Status: Draft
+    Type: Standards Track
+    Created: 2016-02-13
+    License: PD
+
+# Abstract
+
+Add a new message, "feefilter", which serves to instruct peers not to send "inv"'s to the node for transactions with fees below the specified fee rate.
+
+## Motivation
+
+The concept of a limited mempool was introduced in Bitcoin Core 0.12 to provide protection against attacks or spam transactions of low fees that are not being mined. A reject filter was also introduced to help prevent repeated requests for the same transaction that might have been recently rejected for insufficient fee. These methods help keep resource utilization on a node from getting out of control.
+
+However, there are limitations to the effectiveness of these approaches.  The reject filter is reset after every block which means transactions that are inv'ed over a longer time period will be rerequested and there is no method to prevent requesting the transaction the first time.  Furthermore, inv data is sent at least once either to or from each peer for every transaction accepted to the mempool and there is no mechanism by which to know that an inv sent to a given peer would not result in a getdata request because it represents a transaction with too little fee.
+
+After receiving a feefilter message, a node can know before sending an inv that a given transaction's fee rate is below the minimum currently required by a given peer, and therefore the node can skip relaying an inv for that transaction to that peer.
+
+## Specification
+
+- The feefilter message is defined as a message containing an int64_t where pchCommand == "feefilter"
+- Upon receipt of a "feefilter" message, the node will be permitted, but not required, to filter transaction invs for transactions that fall below the feerate provided in the feefilter message interpreted as satoshis per kilobyte.
+- The fee filter is additive with a bloom filter for transactions so if an SPV client were to load a bloom filter and send a feefilter message, transactions would only be relayed if they passed both filters.
+- Inv's generated from a mempool message are also subject to a fee filter if it exists.
+- Feature discovery is enabled by checking protocol version >= 70013
+
+## Considerations
+The propagation efficiency of transactions across the network should not be adversely affected by this change. In general, transactions which are not accepted to a node's mempool are not relayed by this node and the functionality implemented with this message is meant only to filter those transactions. There could be a small number of edge cases where a node's mempool min fee is actually less than the filter value a peer is aware of and transactions with fee rates between these values will now be newly inhibited.
+
+Feefilter messages are not sent to whitelisted peers if the "-whitelistforcerelay" option is set. In that case, transactions are intended to be relayed even if they are not accepted to the mempool.
+
+There are privacy concerns with deanonymizing a node by the fact that it is broadcasting identifying information about its mempool min fee. To help ameliorate this concern, the implementation quantizes the filter value broadcast with a small amount of randomness, in addition, the messages are broadcast to different peers at individually randomly distributed times.
+
+If a node is using prioritisetransaction to accept transactions whose actual fee rates might fall below the node's mempool min fee, it may want to consider disabling the fee filter to make sure it is exposed to all possible txid's.
+
+## Backward compatibility
+
+Older clients remain fully compatible and interoperable after this change. Also, clients implementing this BIP can choose to not send any feefilter messages.
+
+## Implementation
+
+https://github.com/bitcoin/bitcoin/pull/7542
+
+## Copyright
+This document is placed in the public domain.
\ No newline at end of file
diff --git a/protocol/network/messages/feefilter.md b/protocol/network/messages/feefilter.md
index 41fd3fa..172a853 100644
--- a/protocol/network/messages/feefilter.md
+++ b/protocol/network/messages/feefilter.md
@@ -4,6 +4,8 @@ Requests that the recipient withhold transactions that provide less than the giv
 
 The recipient node may, but is not required to, begin to perform this filtering and send only transactions that have fees at or above this threshold to the sender.
 
+Defined in [BIP-133](/protocol/forks/bip-0133).
+
 ## Message Format
 
 | Field | Length | Format | Description |

From 9331a727c425f37112d210fff07cce182c99d07a Mon Sep 17 00:00:00 2001
From: Andrew Groot 
Date: Mon, 3 May 2021 15:42:20 -0400
Subject: [PATCH 20/31] Added note about alternate names for
 variable-length-integer.

---
 protocol/formats/variable-length-integer.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/protocol/formats/variable-length-integer.md b/protocol/formats/variable-length-integer.md
index 1754758..2064f4b 100644
--- a/protocol/formats/variable-length-integer.md
+++ b/protocol/formats/variable-length-integer.md
@@ -1,6 +1,6 @@
 # Compact Variable Length Integer
 
-A variable-width data format for unsigned integers allowing a more compact representation for smaller values.
+A variable-width data format for unsigned integers allowing a more compact representation for smaller values.  This is sometimes referred to as "compact size" or "var int".
 
 ## Format
 

From 0657e6e637886a0021c2af4a240adfd33fc167a7 Mon Sep 17 00:00:00 2001
From: Andrew Groot 
Date: Mon, 3 May 2021 16:53:48 -0400
Subject: [PATCH 21/31] Additional details about mining pools.

---
 mining/mining-pools.md | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/mining/mining-pools.md b/mining/mining-pools.md
index 825798c..c5355ad 100644
--- a/mining/mining-pools.md
+++ b/mining/mining-pools.md
@@ -1,4 +1,10 @@
 # Mining Pools
 
 Mining pools coordinate the efforts of a (typically large) group of miners.
-When a block is mined, the [block reward](/protocol/blockchain/block#coinbase-transaction) is distributed amongst the contributing members of the pool.  
\ No newline at end of file
+When a block is mined, the [block reward](/protocol/blockchain/block#coinbase-transaction) is distributed amongst the contributing members of the pool.
+This cooperation converts the discrete nature of block rewards into a continuous income for miners, allowing for all members to receive rewards whenever anyone in the pool successfully mines a new block.
+
+Miners generally connect to pools using the [Stratum protocol](/mining/stratum-protocol).
+While mining, miners submit shares in addition to valid blocks, allowing the pool to statistically verify that the miner is actively performing work toward the provided jobs.
+This mechanism also allows pools to distribute the block reward proportionally, based on the amount of work performed by each miner.
+The amount and timing of reward distribution varies by pool.
\ No newline at end of file

From e710951b7c8cd1718c7a3a869cf40d2bffdcf446 Mon Sep 17 00:00:00 2001
From: Andrew Groot 
Date: Thu, 6 May 2021 12:32:59 -0400
Subject: [PATCH 22/31] Public/private keys and ECDSA/Schnorr signatures.

---
 home.md                                       |   2 +-
 protocol/blockchain/cryptography/keys.md      |  73 ++++++
 .../blockchain/cryptography/signatures.md     |  36 +++
 protocol/forks/2019-05-15-schnorr.md          |  20 +-
 protocol/forks/schnorr/README                 |   4 +
 protocol/forks/schnorr/bip-schnorr-archive.md | 223 ++++++++++++++++++
 .../forks/schnorr/bip-schnorr/reference.py    | 136 +++++++++++
 .../schnorr/bip-schnorr/speedup-batch.png     | Bin 0 -> 11914 bytes
 .../schnorr/bip-schnorr/test-vectors.csv      |  17 ++
 9 files changed, 500 insertions(+), 11 deletions(-)
 create mode 100644 protocol/blockchain/cryptography/keys.md
 create mode 100644 protocol/blockchain/cryptography/signatures.md
 create mode 100644 protocol/forks/schnorr/README
 create mode 100644 protocol/forks/schnorr/bip-schnorr-archive.md
 create mode 100644 protocol/forks/schnorr/bip-schnorr/reference.py
 create mode 100644 protocol/forks/schnorr/bip-schnorr/speedup-batch.png
 create mode 100644 protocol/forks/schnorr/bip-schnorr/test-vectors.csv

diff --git a/home.md b/home.md
index 707323a..1d191ca 100644
--- a/home.md
+++ b/home.md
@@ -28,7 +28,7 @@
 Pay To Public Key (P2PK) — Pay To Public Key Hash (P2PKH) — Pay To Script Hash (P2SH) — [Base58Check encoding (legacy)](/protocol/blockchain/encoding/base58check) — [Cashaddr Encoding](/protocol/blockchain/encoding/cashaddr)
 
 ### Cryptography
-Secp256k1 — Public Key — Private Key — ECDSA Signatures — Schnorr Signatures — [Multisignature (M-of-N multisig)](/protocol/blockchain/cryptography/multisignature)
+[Bitcoin Keys (Public/Private)](/protocol/blockchain/cryptography/keys) — [Signatures (ECDSA/Schnorr)](/protocol/blockchain/cryptography/signatures) — [Multisignature (M-of-N multisig)](/protocol/blockchain/cryptography/multisignature)
 
 ### Network upgrades
 [Bip-16](/protocol/forks/bip-0016) — [Bip-34](/protocol/forks/bip-0034) — [Bip-37](/protocol/forks/bip-0037) — [Bip-65](/protocol/forks/bip-0065) — [Bip-66](/protocol/forks/bip-0066) — [Bip-68](/protocol/forks/bip-0068) — [Bip-112](/protocol/forks/bip-0112) — [Bip-113](/protocol/forks/bip-0113) — [Bip-133](/protocol/forks/bip-0133) — [Bip-157](/protocol/forks/bip-0157) — [Bip-158](/protocol/forks/bip-0158) — [Bip-159](/protocol/forks/bip-0159) — [BCH-UAHF (BUIP-55)](/protocol/forks/bch-uahf) — [HF-20171113](/protocol/forks/hf-20171113) — [HF-20180515](/protocol/forks/hf-20180515) — [HF-20181115](/protocol/forks/hf-20181115) — [HF-20190515](/protocol/forks/hf-20190515) — [HF-20191115](/protocol/forks/hf-20191115)
diff --git a/protocol/blockchain/cryptography/keys.md b/protocol/blockchain/cryptography/keys.md
new file mode 100644
index 0000000..cccf60f
--- /dev/null
+++ b/protocol/blockchain/cryptography/keys.md
@@ -0,0 +1,73 @@
+# Bitcoin Keys
+
+Bitcoin Cash transactions are secured through the use of key-pairs generated by all senders and receivers.
+The key-pair is comprised of a **private key**, which is generated randomly and stored securely on a user's device, and a **public key**, which is calculated from the private key but can be sent to others without revealing the private key.
+The private key can be used to generate [signatures](/protocol/blockchain/cryptography/signatures), which can then be verified using the public key.
+
+## Private Key Generation
+
+Bitcoin Cash uses [elliptic-curve cryptography (ECC)](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography); in particular, the secp256k1 curve with 32-byte (256-bit) private keys.
+
+From [SEC 2, ver. 2.0](https://www.secg.org/sec2-v2.pdf), the curve parameters are as follows:
+
+> The elliptic curve domain parameters over Fp associated with a Koblitz curve secp256k1 are
+> specified by the sextuple `T = (p, a, b, G, n, h)` where the finite field `Fp` is defined by:
+> 
+> p = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F
+>  = 2256 − 232 − 29 − 28 − 27 − 26 − 24 − 1
+> 
+> The curve E: `y2 = x3 + ax + b` over `Fp` is defined by:
+> 
+> a = 00000000 00000000 00000000 00000000 00000000 00000000 00000000
+> 00000000
+> 
+> b = 00000000 00000000 00000000 00000000 00000000 00000000 00000000
+> 00000007
+> 
+> The base point G in compressed form is:
+> 
+> G = 02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798
+> 
+> and in uncompressed form is:
+> 
+> G = 04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9
+> 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448
+> A6855419 9C47D08F FB10D4B8
+> 
+> Finally the order n of G and the cofactor are:
+> 
+> n = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
+> 
+> h = 01
+
+Private keys are then 256-bit values and can be chosen at [random](https://en.wikipedia.org/wiki/Cryptographically-secure_pseudorandom_number_generator) from the set `[1, n-1]`.
+
+It is important that private keys are stored securely and never revealed to untrusted third-parties.
+Anyone with access to a given private key would be able to control any funds secured with that key.
+
+## Public Key Generation
+
+Public keys are created by performing [scalar multiplication of the generator](https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication), G, with the private key.
+
+This means that public keys are a point on the elliptic curve, represented as two 256-bit coordinates, `(x, y)`.
+This means that a full public key is 512-bits (64 bytes) in length.
+However, since elliptic curves are symmetrical across the x-axis, there are always two y-values that correspond to a given x-value, which can be calculated using the curve function, E.
+These are also necessarily negations of each other mod p (i.e. y1 = p - y2).
+As a result, public keys are often **compressed** into 33 bytes, 32 bytes for the x-value and an additional bit (generally expanded to a full byte) indicating which y-value should be used.
+
+When included in [scripts](/protocol/blockchain/script), public keys follow one of two formats:
+
+### Uncompressed Public Key Format
+
+| Field | Length | Format | Description |
+|--|--|--|--|
+| magic number | 1 byte | byte | Always `0x04`, indicating that this is an uncompressed public key. |
+| x-value | 32 bytes | bytes | The zero-padded x-value of the public key. |
+| y-value | 32 bytes | bytes | The zero-padded y-value of the public key. |
+
+### Compressed Public Key Format
+
+| Field | Length | Format | Description |
+|--|--|--|--|
+| magic number | 1 byte | byte | `0x02` if the (discarded) y-value was even, `0x03` if it was odd.  This bytes indicates both that this is a compressed public key and which y-value should be used.

NOTE: this works because the y-values are negations of each other (mod p), so it is always that case that one is even and the other odd. | +| x-value | 32 bytes | bytes | The zero-padded x-value of the public key. | diff --git a/protocol/blockchain/cryptography/signatures.md b/protocol/blockchain/cryptography/signatures.md new file mode 100644 index 0000000..29ef71e --- /dev/null +++ b/protocol/blockchain/cryptography/signatures.md @@ -0,0 +1,36 @@ +# Signatures + +Bitcoin transaction generally require at least one signature in order to be valid. +Signatures prove that the intended recipient(s) of the funds being spent were involved in the creation of the transaction. +Each signature is generated using a [private key](/protocol/blockchain/cryptography/keys) and indicates that the owner of that private key approves of certain data in the transaction. +This page describes how these signature are generated, given data to be signed and a private key. +For details on what data is signed when signing a transaction and how the signature is formatted, see [Transaction Signing](/protocol/blockchain/transaction/transaction-signing). + +Bitcoin Cash permits two algorithms for transaction signatures: [ECDSA](#ecdsa-signatures) and [Schnorr](#schnorr-signatures). + +## ECDSA Signatures + +ECDSA, as defined in [RFC 6979](https://tools.ietf.org/html/rfc6979), can be thought of as taking three input parameters: the private key, the message to be signed, and a random value, **k**, taken from the [same domain as a private key](/protocol/blockchain/cryptography/keys#private-key-generation), `[1, n-1]`. + +Generally with ECDSA, the message used is a hash of the data that is intended to be signed. +In the case of Bitcoin Cash, this is the hash of the transaction [preimage](/protocol/blockchain/transaction/transaction-signing#preimage-format) for the context in which the signature will be provided (i.e. for a given position in a script). +It is also common, and recommended, to use a **deterministic k** value (defined in [RFC 6979, section 3](https://tools.ietf.org/html/rfc6979#section-3)), which is dependent on the private key and the message being signed. +Using a deterministic k value guarantees that a different k will never be used to sign an identical message, a mistake which would reveal the user's private key. +However, since it is impossible to know the method used to generate k without the user's private key, it is impossible to enforce the use of this method. + +The output of ECDSA is two values, **r** and **s** which can be used with the public key and message to verify the authenticity of the signature. +However, there are technically two valid s value that are possible, which are additive inverses (i.e. `s1 + s2 (mod p) = 0 (mod p)`). +By convention, and since [HF-20171113](/protocol/forks/hf-20171113), the lower s value must be used (this is known as the "LOW_S" rule). + +## Schnorr Signatures + +Schnorr signatures have been accepted in Bitcoin Cash since [HF-20190515](/protocol/forks/hf-20190515). +Details on the implementation of Schnorr used in Bitcoin Cash can be found [here](/protocol/forks/2019-05-15-schnorr). +Of particular importance are the following points: + +- Pre-existing Public and Private Keys are valid for generating Schnorr signatures. +- Following activation of Schnorr signatures, all 64-byte signatures passed to OP_CHECKDATASIG/VERIFY and all 65-byte signatures passed to OP_CHECKSIG/VERIFY are interpretted as Schnorr signatures. + 65-byte signatures passed to OP_CHECKMULTISIG/VERIFY will trigger script failure. +- Bitcoin Cash uses the (r, s) variant of Schnorr, instead of the (e, s) variant, with an altered approach from that originally proposed by Pieter Wuille. +- Both random and deterministic k values are considered secure, though care must be taken with deterministic k values to avoid conflicts with deterministic ECDSA k values. + diff --git a/protocol/forks/2019-05-15-schnorr.md b/protocol/forks/2019-05-15-schnorr.md index 05f2bbd..ef28a4a 100644 --- a/protocol/forks/2019-05-15-schnorr.md +++ b/protocol/forks/2019-05-15-schnorr.md @@ -1,12 +1,12 @@ # 2019-MAY-15 Schnorr Signature specification - layout: specification - title: 2019-MAY-15 Schnorr Signature specification - date: 2019-02-15 - category: spec - activation: 1557921600 - version: 0.5 - author: Mark B. Lundeberg + layout: specification + title: 2019-MAY-15 Schnorr Signature specification + date: 2019-02-15 + category: spec + activation: 1557921600 + version: 0.5 + author: Mark B. Lundeberg # Summary @@ -36,7 +36,7 @@ The other two ECDSA opcodes, `OP_CHECKMULTISIG` and `OP_CHECKMULTISIGVERIFY`, wi # Motivation -(for more detail, see Motivation and Applications sections of [Pieter Wuille's Schnorr specification](https://github.com/sipa/bips/blob/bip-schnorr/bip-schnorr.mediawiki)) +(for more detail, see Motivation and Applications sections of [Pieter Wuille's Schnorr specification](/protocol/forks/schnorr/bip-schnorr-archive)) Schnorr signatures have some slightly improved properties over the ECDSA signatures currently used in bitcoin: @@ -79,7 +79,7 @@ The formerly supported ECDSA hybrid keys (see [X9.62 §4.3.6](citeseerx.ist.psu. ## Signature verification algorithm -We follow essentially what is an older variant of Pieter Wuille's [BIP-Schnorr](https://github.com/sipa/bips/blob/bip-schnorr/bip-schnorr.mediawiki). +We follow essentially what is an older variant of Pieter Wuille's [BIP-Schnorr](/protocol/forks/schnorr/bip-schnorr-archive). Notable design choices: * Operates on secp256k1 curve. @@ -245,7 +245,7 @@ Curiously, however, aggregate signatures cannot be "second-party" malleated; pro The Bitcoin ABC implementation involved a number of Diffs: https://reviews.bitcoinabc.org/T527 -Pieter Wuille's specification comes with a handy set of test vectors for checking cryptographic corner cases: https://github.com/sipa/bips/blob/bip-schnorr/bip-schnorr/test-vectors.csv +Pieter Wuille's specification comes with a handy set of test vectors for checking cryptographic corner cases: [test-vectors.csv](/protocol/forks/schnorr/bip-schnorr/test-vectors.csv) # Acknowledgements diff --git a/protocol/forks/schnorr/README b/protocol/forks/schnorr/README new file mode 100644 index 0000000..5efe453 --- /dev/null +++ b/protocol/forks/schnorr/README @@ -0,0 +1,4 @@ +Files adapted/copied from: + + https://github.com/sipa/bips/ + Commit b65cd694676096dd31ea790485a2019ca653b34f by Mark Lundeburg diff --git a/protocol/forks/schnorr/bip-schnorr-archive.md b/protocol/forks/schnorr/bip-schnorr-archive.md new file mode 100644 index 0000000..e3c6c2b --- /dev/null +++ b/protocol/forks/schnorr/bip-schnorr-archive.md @@ -0,0 +1,223 @@ +# BIP-Schnorr (Archive) + + BIP: ? + Title: Schnorr Signatures for secp256k1 + Author: Pieter Wuille + Status: Draft + Type: Informational + License: BSD-2-Clause + Post-History: 2018-07-06: https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2018-July/016203.html [bitcoin-dev] Schnorr signatures BIP + +## Introduction + +### Abstract + +This document proposes a standard for 64-byte Schnorr signatures over the elliptic curve `secp256k1`. + +### Copyright + +This document is licensed under the 2-clause BSD license. + +### Motivation + +Bitcoin has traditionally used +[ECDSA](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) signatures over the [secp256k1 curve](http://www.secg.org/sec2-v2.pdf) for authenticating +transactions. These are [standardized](http://www.secg.org/sec1-v2.pdf), but have a number of downsides +compared to [Schnorr signatures](https://en.wikipedia.org/wiki/Schnorr_signature) over the same curve: + +* **Security proof**: The security of Schnorr signatures is easily [provable](https://www.di.ens.fr/~pointche/Documents/Papers/2000_joc.pdf) in the random oracle model assuming the elliptic curve discrete logarithm problem (ECDLP) is hard. Such a proof does not exist for ECDSA. +* **Non-malleability**: ECDSA signatures are inherently malleable; a third party without access to the private key can alter an existing valid signature for a given public key and message into another signature that is valid for the same key and message. This issue is discussed in [BIP62](https://github.com/bitcoin/bips/blob/master/bip-0062.mediawiki) and [BIP66](https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki). On the other hand, Schnorr signatures are provably non-malleable[1](#footnotes). +* **Linearity**: Schnorr signatures have the remarkable property that multiple parties can collaborate to produce a signature that is valid for the sum of their public keys. This is the building block for various higher-level constructions that improve efficiency and privacy, such as multisignatures and others (see Applications below). + +For all these advantages, there are virtually no disadvantages, apart +from not being standardized. This document seeks to change that. As we +propose a new standard, a number of improvements not specific to Schnorr signatures can be +made: + +* **Signature encoding**: Instead of [DER](https://en.wikipedia.org/wiki/X.690#DER_encoding)-encoding for signatures (which are variable size, and up to 72 bytes), we can use a simple fixed 64-byte format. +* **Batch verification**: The specific formulation of ECDSA signatures that is standardized cannot be verified more efficiently in batch compared to individually, unless additional witness data is added. Changing the signature scheme offers an opportunity to avoid this. + +![Graph of batch signature verification speedup.](/protocol/forks/schnorr/bip-schnorr/speedup-batch.png) + +This graph shows the ratio between the time it takes to verify `n` signatures individually and to verify a batch of `n` signatures. This ratio goes up logarithmically with the number of signatures, or in other words: the total time to verify `n` signatures grows with `O(n / log n)`. + +By reusing the same curve as Bitcoin has used for ECDSA, private and public keys remain identical for Schnorr signatures, and we avoid introducing new assumptions about elliptic curve group security. + +## Description + +We first build up the algebraic formulation of the signature scheme by +going through the design choices. Afterwards, we specify the exact +encodings and operations. + +### Design + +**Schnorr signature variant** Elliptic Curve Schnorr signatures for message `m` and public key `P` generally involve a point `R`, integers `e` and `s` picked by the signer, and generator `G` which satisfy `e = H(R || m)` and `sG = R + eP`. Two formulations exist, depending on whether the signer reveals `e` or `R`: + +1. Signatures are `(e,s)` that satisfy `e = H(sG - eP || m)`. This avoids minor complexity introduced by the encoding of the point `R` in the signature (see paragraphs "Encoding the sign of R" and "Implicit Y coordinate" further below in this subsection). +2. Signatures are `(R,s)` that satisfy `sG = R + H(R || m)P`. This supports batch verification, as there are no elliptic curve operations inside the hashes. + +We choose the `R`-option to support batch verification. + +**Key prefixing** When using the verification rule above directly, it is possible for a third party to convert a signature `(R,s)` for key `P` into a signature `(R,s + aH(R || m))` for key `P + aG` and the same message, for any integer `a`. This is not a concern for Bitcoin currently, as all signature hashes indirectly commit to the public keys. However, this may change with proposals such as SIGHASH_NOINPUT ([BIP 118](https://github.com/bitcoin/bips/blob/master/bip-0118.mediawiki)), or when the signature scheme is used for other purposes—especially in combination with schemes like [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)'s unhardened derivation. To combat this, we choose `key prefixed`[2](#footnotes) Schnorr signatures; changing the equation to `sG = R + H(R || P || m)P`. + +**Encoding the sign of R** As we chose the `R`-option above, we're required to encode the point `R` into the signature. Several possibilities exist: + +1. Encoding the full X and Y coordinate of R, resulting in a 96-byte signature. +2. Encoding the full X coordinate, but only whether Y is even or odd (like compressed public keys). This would result in 65-byte signatures. +3. Encoding only the X coordinate, leaving us with 64-byte signature. + +Using the first option would be slightly more efficient for verification (around 5%), but we prioritize compactness, and therefore choose option 3. + +**Implicit Y coordinate** In order to support batch verification, the Y coordinate of `R` cannot be ambiguous (every valid X coordinate has two possible Y coordinates). We have a choice between several options for symmetry breaking: + +1. Implicitly choosing the Y coordinate that is in the lower half. +2. Implicitly choosing the Y coordinate that is even[3](#footnotes). +3. Implicitly choosing the Y coordinate that is a quadratic residue (has a square root modulo the field size)[4](#footnotes). + +The third option is slower at signing time but a bit faster to verify, as the quadratic residue of the Y coordinate can be computed directly for points represented in +[Jacobian coordinates](https://en.wikibooks.org/wiki/Cryptography/Prime_Curve/Jacobian_Coordinates) (a common optimization to avoid modular inverses +for elliptic curve operations). The two other options require a possibly +expensive conversion to affine coordinates first. This would even be the case if the sign or oddness were explicitly coded (option 2 in the previous design choice). We therefore choose option 3. + +**Final scheme** As a result, our final scheme ends up using signatures `(r,s)` where `r` is the X coordinate of a point `R` on the curve whose Y coordinate is a quadratic residue, and which satisfies `sG = R + H(r || P || m)P`. + +### Specification + +We first describe the verification algorithm, and then the signature algorithm. + +The following convention is used, with constants as defined for secp256k1: +* Lowercase variables represent integers or byte arrays. + * The constant `p` refers to the field size, `0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F`. + * The constant `n` refers to the curve order, `0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141`. +* Uppercase variables refer to points on the curve with equation `y2 = x3 + 7` over the integers modulo `p`. + * `infinite(P)` returns whether or not `P` is the point at infinity. + * `x(P)` and `y(P)` are integers in the range `0..p-1` and refer to the X and Y coordinates of a point `P` (assuming it is not infinity). + * The constant `G` refers to the generator, for which `x(G) = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798` and `y(G) = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8`. + * Addition of points refers to the usual [elliptic curve group operation](https://en.wikipedia.org/wiki/Elliptic_curve#The_group_law). + * [Multiplication of an integer and a point](https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication) refers to the repeated application of the group operation. +* Functions and operations: + * `||` refers to byte array concatenation. + * The function `x[i:j]`, where `x` is a byte array, returns a `(j - i)`-byte array with a copy of the `i`-th byte (inclusive) to the `j`-th byte (exclusive) of `x`. + * The function `bytes(x)`, where `x` is an integer, returns the 32-byte encoding of `x`, most significant byte first. + * The function `bytes(P)`, where `P` is a point, returns `bytes(0x02 + (y(P) & 1)) || bytes(x(P))`[5](#footnotes). + * The function `int(x)`, where `x` is a 32-byte array, returns the 256-bit unsigned integer whose most significant byte encoding is `x`. + * The function `lift_x(x)`, where `x` is an integer in range `0..p-1`, returns the point `P` for which `x(P) = x` and `y(P)` is a quadratic residue modulo `p`, or fails if no such point existsGiven an candidate X coordinate `x` in the range `0..p-1`, there exist either exactly two or exactly zero valid Y coordinates. If no valid Y coordinate exists, then `x` is not a valid X coordinate either, i.e., no point `P` exists for which `x(P) = x`. Given a candidate `x`, the valid Y coordinates are the square roots of `c = x3 + 7 mod p` and they can be computed as `y = ±c(p+1)/4 mod p` (see [Quadratic residue](https://en.wikipedia.org/wiki/Quadratic_residue#Prime_or_prime_power_modulus)) if they exist, which can be checked by squaring and comparing with `c`. Due to [Euler's criterion](https://en.wikipedia.org/wiki/Euler%27s_criterion) it then holds that `c(p-1)/2 = 1 mod p`. The same criterion applied to `y` results in `y(p-1)/2 mod p = ±c((p+1)/4)((p-1)/2) mod p = ±1 mod p`. Therefore `y = +c(p+1)/4 mod p` is a quadratic residue and `-y mod p` is not.. The function `lift_x(x)` is equivalent to the following pseudocode: + * Let `y = c(p+1)/4 mod p`. + * Fail if `c ≠ y2 mod p`. + * Return `(r, y)`. + * The function `point(x)`, where `x` is a 33-byte array, returns the point `P` for which `x(P) = int(x[1:33])` and `y(P) & 1 = int(x[0:1]) - 0x02)`, or fails if no such point exists. The function `point(x)` is equivalent to the following pseudocode: + * Fail if (`x[0:1] ≠ 0x02` and `x[0:1] ≠ 0x03`). + * Set flag `odd` if `x[0:1] = 0x03`. + * Let `(r, y) = lift_x(x)`; fail if `lift_x(x)` fails. + * If (flag `odd` is set and `y` is an even integer) or (flag `odd` is not set and `y` is an odd integer): + * Let `y = p - y`. + * Return `(r, y)`. + * The function `hash(x)`, where `x` is a byte array, returns the 32-byte SHA256 hash of `x`. + * The function `jacobi(x)`, where `x` is an integer, returns the [Jacobi symbol](https://en.wikipedia.org/wiki/Jacobi_symbol) of `x / p`. It is equal to `x(p-1)/2 mod p` ([Euler's criterion](https://en.wikipedia.org/wiki/Euler%27s_criterion))[6](#footnotes). + +#### Verification + +Input: +* The public key `pk`: a 33-byte array +* The message `m`: a 32-byte array +* A signature `sig`: a 64-byte array + +The signature is valid if and only if the algorithm below does not fail. +* Let `P = point(pk)`; fail if `point(pk)` fails. +* Let `r = int(sig[0:32])`; fail if `r ≥ p`. +* Let `s = int(sig[32:64])`; fail if `s ≥ n`. +* Let `e = int(hash(bytes(r) || bytes(P) || m)) mod n`. +* Let `R = sG - eP`. +* Fail if `infinite(R)`. +* Fail if `jacobi(y(R)) ≠ 1` or `x(R) ≠ r`. + +#### Batch Verification + +Input: +* The number `u` of signatures +* The public keys `pk1..u`: `u` 33-byte arrays +* The messages `m1..u`: `u` 32-byte arrays +* The signatures `sig1..u`: `u` 64-byte arrays + +All provided signatures are valid with overwhelming probability if and only if the algorithm below does not fail. +* Generate `u-1` random integers `a2...u` in the range `1...n-1`. They are generated deterministically using a [CSPRNG](https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator) seeded by a cryptographic hash of all inputs of the algorithm, i.e. `seed = seed_hash(pk1..pku || m1..mu || sig1..sigu )`. A safe choice is to instantiate `seed_hash` with SHA256 and use [ChaCha20](https://tools.ietf.org/html/rfc8439) with key `seed` as a CSPRNG to generate 256-bit integers, skipping integers not in the range `1...n-1`. +* For `i = 1 .. u`: +** Let `Pi = point(pki)`; fail if `point(pki)` fails. +** Let `r = int(sigi[0:32])`; fail if `r ≥ p`. +** Let `si = int(sigi[32:64])`; fail if `si ≥ n`. +** Let `ei = int(hash(bytes(r) || bytes(Pi) || mi)) mod n`. +** Let `Ri = lift_x(r)`; fail if `lift_x(r)` fails. +* Fail if `(s1 + a2s2 + ... + ausu)G ≠ R1 + a2R2 + ... + auRu + e1P1 + (a2e2)P2 + ... + (aueu)Pu`. + +#### Signing + +Input: +* The secret key `d`: an integer in the range `1..n-1`. +* The message `m`: a 32-byte array + +To sign `m` for public key `dG`: +* Let `k' = int(hash(bytes(d) || m)) mod n`Note that in general, taking the output of a hash function modulo the curve order will produce an unacceptably biased result. However, for the secp256k1 curve, the order is sufficiently close to `2256` that this bias is not observable (`1 - n / 2256` is around `1.27 * 2-128`).. +* Fail if `k' = 0`. +* Let `R = k'G`. +* Let `k = k' ` if `jacobi(y(R)) = 1`, otherwise let `k = n - k' `. +* Let `e = int(hash(bytes(x(R)) || bytes(dG) || m)) mod n`. +* The signature is `bytes(x(R)) || bytes((k + ed) mod n)`. + +**Above deterministic derivation of `R` is designed specifically for this signing algorithm and may not be secure when used in other signature schemes.** +For example, using the same derivation in the MuSig multi-signature scheme leaks the secret key (see the [MuSig paper](https://eprint.iacr.org/2018/068) for details). + +Note that this is not a `unique signature` scheme: while this algorithm will always produce the same signature for a given message and public key, `k` (and hence `R`) may be generated in other ways (such as by a CSPRNG) producing a different, but still valid, signature. + +### Optimizations + +Many techniques are known for optimizing elliptic curve implementations. Several of them apply here, but are out of scope for this document. Two are listed below however, as they are relevant to the design decisions: + +**Jacobi symbol** The function `jacobi(x)` is defined as above, but can be computed more efficiently using an [extended GCD algorithm](https://en.wikipedia.org/wiki/Jacobi_symbol#Calculating_the_Jacobi_symbol). + +**Jacobian coordinates** Elliptic Curve operations can be implemented more efficiently by using [Jacobian coordinates](https://en.wikibooks.org/wiki/Cryptography/Prime_Curve/Jacobian_Coordinates). Elliptic Curve operations implemented this way avoid many intermediate modular inverses (which are computationally expensive), and the scheme proposed in this document is in fact designed to not need any inversions at all for verification. When operating on a point `P` with Jacobian coordinates `(x,y,z)` which is not the point at infinity and for which `x(P)` is defined as `x / z2` and `y(P)` is defined as `y / z3`: +* `jacobi(y(P))` can be implemented as `jacobi(yz mod p)`. +* `x(P) ≠ r` can be implemented as `x ≠ z2r mod p`. + +## Applications + +There are several interesting applications beyond simple signatures. +While recent academic papers claim that they are also possible with ECDSA, consensus support for Schnorr signature verification would significantly simplify the constructions. + +### Multisignatures and Threshold Signatures + +By means of an interactive scheme such as [MuSig](https://eprint.iacr.org/2018/068), participants can produce a combined public key which they can jointly sign for. This allows n-of-n multisignatures which, from a verifier's perspective, are no different from ordinary signatures, giving improved privacy and efficiency versus `CHECKMULTISIG` or other means. + +Further, by combining Schnorr signatures with [Pedersen Secret Sharing](https://link.springer.com/content/pdf/10.1007/3-540-46766-1_9.pdf), it is possible to obtain [an interactive threshold signature scheme](http://cacr.uwaterloo.ca/techreports/2001/corr2001-13.ps) that ensures that signatures can only be produced by arbitrary but predetermined sets of signers. For example, k-of-n threshold signatures can be realized this way. Furthermore, it is possible to replace the combination of participant keys in this scheme with MuSig, though the security of that combination still needs analysis. + +### Adaptor Signatures + +[Adaptor signatures](https://download.wpsoftware.net/bitcoin/wizardry/mw-slides/2018-05-18-l2/slides.pdf) can be produced by a signer by offsetting his public nonce with a known point `T = tG`, but not offsetting his secret nonce. +A correct signature (or partial signature, as individual signers' contributions to a multisignature are called) on the same message with same nonce will then be equal to the adaptor signature offset by `t`, meaning that learning `t` is equivalent to learning a correct signature. +This can be used to enable atomic swaps or even [general payment channels](https://eprint.iacr.org/2018/472) in which the atomicity of disjoint transactions is ensured using the signatures themselves, rather than Bitcoin script support. The resulting transactions will appear to verifiers to be no different from ordinary single-signer transactions, except perhaps for the inclusion of locktime refund logic. + +Adaptor signatures, beyond the efficiency and privacy benefits of encoding script semantics into constant-sized signatures, have additional benefits over traditional hash-based payment channels. Specifically, the secret values `t` may be reblinded between hops, allowing long chains of transactions to be made atomic while even the participants cannot identify which transactions are part of the chain. Also, because the secret values are chosen at signing time, rather than key generation time, existing outputs may be repurposed for different applications without recourse to the blockchain, even multiple times. + +### Blind Signatures + +Schnorr signatures admit a very [simple **blind signature** construction](https://www.math.uni-frankfurt.de/~dmst/research/papers/schnorr.blind_sigs_attack.2001.pdf) which is a signature that a signer produces at the behest of another party without learning what he has signed. +These can for example be used in [Partially Blind Atomic Swaps](https://github.com/jonasnick/scriptless-scripts/blob/blind-swaps/md/partially-blind-swap.md), a construction to enable transferring of coins, mediated by an untrusted escrow agent, without connecting the transactors in the public blockchain transaction graph. + +While the traditional Schnorr blind signatures are vulnerable to [Wagner's attack](https://www.iacr.org/archive/crypto2002/24420288/24420288.pdf), there are [a number of mitigations](https://www.math.uni-frankfurt.de/~dmst/teaching/SS2012/Vorlesung/EBS5.pdf) which allow them to be usable in practice without any known attacks. Nevertheless, more analysis is required to be confident about the security of the blind signature scheme. + +## Test Vectors and Reference Code + +For development and testing purposes, we provide a [collection of test vectors in CSV format](/protocol/forks/schnorr/bip-schnorr/test-vectors.csv) and a naive but highly inefficient and non-constant time [pure Python 3.7 reference implementation of the signing and verification algorithm](/protocol/forks/schnorr/bip-schnorr/reference.py). +The reference implementation is for demonstration purposes only and not to be used in production environments. + +## Footnotes + +1. More precisely they are ***strongly** unforgeable under chosen message attacks* (SUF-CMA), which informally means that without knowledge of the secret key but given a valid signature of a message, it is not possible to come up with a second valid signature for the same message. A security proof in the random oracle model can be found for example in [a paper by Kiltz, Masny and Pan](https://eprint.iacr.org/2016/191), which essentially restates [the original security proof of Schnorr signatures by Pointcheval and Stern](https://www.di.ens.fr/~pointche/Documents/Papers/2000_joc.pdf) more explicitly. These proofs are for the Schnorr signature variant using `(e,s)` instead of `(R,s)` (see Design above). Since we use a unique encoding of `R`, there is an efficiently computable bijection that maps `(R, s)` to `(e, s)`, which allows to convert a successful SUF-CMA attacker for the `(e, s)` variant to a successful SUF-CMA attacker for the `(r, s)` variant (and vice-versa). Furthermore, the aforementioned proofs consider a variant of Schnorr signatures without key prefixing (see Design above), but it can be verified that the proofs are also correct for the variant with key prefixing. As a result, the aforementioned security proofs apply to the variant of Schnorr signatures proposed in this document. +2. A limitation of committing to the public key (rather than to a short hash of it, or not at all) is that it removes the ability for public key recovery or verifying signatures against a short public key hash. These constructions are generally incompatible with batch verification. +3. Since `p` is odd, negation modulo `p` will map even numbers to odd numbers and the other way around. This means that for a valid X coordinate, one of the corresponding Y coordinates will be even, and the other will be odd. +4. A product of two numbers is a quadratic residue when either both or none of the factors are quadratic residues. As `-1` is not a quadratic residue, and the two Y coordinates corresponding to a given X coordinate are each other's negation, this means exactly one of the two must be a quadratic residue. +5. This matches the `compressed` encoding for elliptic curve points used in Bitcoin already, following section 2.3.3 of the [SEC 1](http://www.secg.org/sec1-v2.pdf) standard. +6. For points `P` on the secp256k1 curve it holds that `jacobi(y(P)) ≠ 0`. + +## Acknowledgements + +This document is the result of many discussions around Schnorr based signatures over the years, and had input from Johnson Lau, Greg Maxwell, Jonas Nick, Andrew Poelstra, Tim Ruffing, Rusty Russell, and Anthony Towns. diff --git a/protocol/forks/schnorr/bip-schnorr/reference.py b/protocol/forks/schnorr/bip-schnorr/reference.py new file mode 100644 index 0000000..48a36a6 --- /dev/null +++ b/protocol/forks/schnorr/bip-schnorr/reference.py @@ -0,0 +1,136 @@ +import hashlib +import binascii + +p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F +n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 +G = (0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8) + +def point_add(P1, P2): + if (P1 is None): + return P2 + if (P2 is None): + return P1 + if (P1[0] == P2[0] and P1[1] != P2[1]): + return None + if (P1 == P2): + lam = (3 * P1[0] * P1[0] * pow(2 * P1[1], p - 2, p)) % p + else: + lam = ((P2[1] - P1[1]) * pow(P2[0] - P1[0], p - 2, p)) % p + x3 = (lam * lam - P1[0] - P2[0]) % p + return (x3, (lam * (P1[0] - x3) - P1[1]) % p) + +def point_mul(P, n): + R = None + for i in range(256): + if ((n >> i) & 1): + R = point_add(R, P) + P = point_add(P, P) + return R + +def bytes_from_int(x): + return x.to_bytes(32, byteorder="big") + +def bytes_from_point(P): + return (b'\x03' if P[1] & 1 else b'\x02') + bytes_from_int(P[0]) + +def point_from_bytes(b): + if b[0] in [b'\x02', b'\x03']: + odd = b[0] - 0x02 + else: + return None + x = int_from_bytes(b[1:33]) + y_sq = (pow(x, 3, p) + 7) % p + y0 = pow(y_sq, (p + 1) // 4, p) + if pow(y0, 2, p) != y_sq: + return None + y = p - y0 if y0 & 1 != odd else y0 + return [x, y] + +def int_from_bytes(b): + return int.from_bytes(b, byteorder="big") + +def hash_sha256(b): + return hashlib.sha256(b).digest() + +def jacobi(x): + return pow(x, (p - 1) // 2, p) + +def schnorr_sign(msg, seckey): + if len(msg) != 32: + raise ValueError('The message must be a 32-byte array.') + if not (1 <= seckey <= n - 1): + raise ValueError('The secret key must be an integer in the range 1..n-1.') + k0 = int_from_bytes(hash_sha256(bytes_from_int(seckey) + msg)) % n + if k0 == 0: + raise RuntimeError('Failure. This happens only with negligible probability.') + R = point_mul(G, k0) + k = n - k0 if (jacobi(R[1]) != 1) else k0 + e = int_from_bytes(hash_sha256(bytes_from_int(R[0]) + bytes_from_point(point_mul(G, seckey)) + msg)) % n + return bytes_from_int(R[0]) + bytes_from_int((k + e * seckey) % n) + +def schnorr_verify(msg, pubkey, sig): + if len(msg) != 32: + raise ValueError('The message must be a 32-byte array.') + if len(pubkey) != 33: + raise ValueError('The public key must be a 33-byte array.') + if len(sig) != 64: + raise ValueError('The signature must be a 64-byte array.') + P = point_from_bytes(pubkey) + if (P is None): + return False + r = int_from_bytes(sig[0:32]) + s = int_from_bytes(sig[32:64]) + if (r >= p or s >= n): + return False + e = int_from_bytes(hash_sha256(sig[0:32] + bytes_from_point(P) + msg)) % n + R = point_add(point_mul(G, s), point_mul(P, n - e)) + if R is None or jacobi(R[1]) != 1 or R[0] != r: + return False + return True + +# +# The following code is only used to verify the test vectors. +# +import csv + +def test_vectors(): + all_passed = True + with open('test-vectors.csv', newline='') as csvfile: + reader = csv.reader(csvfile) + reader.__next__() + for row in reader: + (index, seckey, pubkey, msg, sig, result, comment) = row + pubkey = bytes.fromhex(pubkey) + msg = bytes.fromhex(msg) + sig = bytes.fromhex(sig) + result = result == 'TRUE' + print('\nTest vector #%-3i: ' % int(index)) + if seckey != '': + seckey = int(seckey, 16) + sig_actual = schnorr_sign(msg, seckey) + if sig == sig_actual: + print(' * Passed signing test.') + else: + print(' * Failed signing test.') + print(' Excepted signature:', sig.hex()) + print(' Actual signature:', sig_actual.hex()) + all_passed = False + result_actual = schnorr_verify(msg, pubkey, sig) + if result == result_actual: + print(' * Passed verification test.') + else: + print(' * Failed verification test.') + print(' Excepted verification result:', result) + print(' Actual verification result:', result_actual) + if comment: + print(' Comment:', comment) + all_passed = False + print() + if all_passed: + print('All test vectors passed.') + else: + print('Some test vectors failed.') + return all_passed + +if __name__ == '__main__': + test_vectors() diff --git a/protocol/forks/schnorr/bip-schnorr/speedup-batch.png b/protocol/forks/schnorr/bip-schnorr/speedup-batch.png new file mode 100644 index 0000000000000000000000000000000000000000..fe672d4ade832463c152b8666c8d94a8a0559f4f GIT binary patch literal 11914 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 Date: Mon, 10 May 2021 16:50:01 -0400 Subject: [PATCH 23/31] Some clarifications on transaction validation rules. --- protocol/blockchain/script.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/protocol/blockchain/script.md b/protocol/blockchain/script.md index 84cf8d2..6a72caf 100644 --- a/protocol/blockchain/script.md +++ b/protocol/blockchain/script.md @@ -41,11 +41,14 @@ In general, though, this combined unlocking/locking script is then executed and Additionally, in order for the combined script to be valid, the following must be true: - **Non-Empty Scripts** - both the locking and unlocking scripts must be non-empty. - - **Max Script Length** - the locking and unlocking script must each be less than the max script length of 10,000 bytes (for a combined script maximum of 20,000 bytes). + - **Max Script Length** - the locking and unlocking script, when executed, must each be less than the max script length of 10,000 bytes (for a combined script maximum of 20,000 bytes). - **Contained Control Flow** - an IF/ELSE block cannot start in the unlocking script and end in the locking script, the script must be in the top-level scope when the locking script execution begins. - **Permitted Operations Only** - the locking script must not include operations that are disallowed and must not execute operations that are disabled.. - **Push Only** - the unlocking script must contain only push operations (i.e. those with op codes 0x60 or less). Added in [HF-20181115](/protocol/forks/hf-20181115). +NOTE: violations of the above rules does not necessarily make a transaction invalid. +For example, a locking script may be longer than 10,000 bytes, but it would be unspendable, since the max script length is only checked when the scripts are combined before execution. + ## Operation codes (opcodes) The table below lists the currently allocated op codes. Op codes marked with **(ignored)** are permitted but will do nothing when executed. From 48e2e5d5dbc769605d342cb62a62b4fe3c9bcc4d Mon Sep 17 00:00:00 2001 From: Andrew Groot Date: Mon, 10 May 2021 17:28:31 -0400 Subject: [PATCH 24/31] Details about how div/mod operations work. --- protocol/blockchain/script.md | 4 ++-- protocol/blockchain/script/integer-division.md | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 protocol/blockchain/script/integer-division.md diff --git a/protocol/blockchain/script.md b/protocol/blockchain/script.md index 6a72caf..7967da4 100644 --- a/protocol/blockchain/script.md +++ b/protocol/blockchain/script.md @@ -143,8 +143,8 @@ Numeric opcodes (OP_1ADD, etc) are restricted to operating on 4-byte integers. T |OP_ADD | 147 |0x93|a b |out | *a* is added to *b*. | |OP_SUB | 148 |0x94|a b |out | *b* is subtracted from *a*. | |OP_MUL | 149 |0x95|a b |out | *a* is multiplied by *b*. **DISABLED** | -|OP_DIV | 150 |0x96|a b |out | *a* is divided by *b*. | -|OP_MOD | 151 |0x97|a b |out | Returns the remainder after *a* is divided by *b*. | +|OP_DIV | 150 |0x96|a b |out | *a* is [divided](/protocol/blockchain/script/integer-division) by *b*. | +|OP_MOD | 151 |0x97|a b |out | Returns the remainder after *a* is [divided](/protocol/blockchain/script/integer-division) by *b*. | |OP_LSHIFT | 152 |0x98|a b |out | Shifts *a* left *b* bits, preserving sign. **DISABLED** | |OP_RSHIFT | 153 |0x99|a b |out | Shifts *a* right *b* bits, preserving sign. **DISABLED** | |OP_BOOLAND | 154 |0x9a|a b |true / false | If both *a* and *b* are not 0, the output is 1. Otherwise 0. | diff --git a/protocol/blockchain/script/integer-division.md b/protocol/blockchain/script/integer-division.md new file mode 100644 index 0000000..f1f808d --- /dev/null +++ b/protocol/blockchain/script/integer-division.md @@ -0,0 +1,18 @@ +# Script Integer Division + +The Bitcoin Script [OP_DIV](/protocol/blockchain/script#arithmetic) and [OP_MOD](/protocol/blockchain/script#arithmetic) operations are performed on script numbers, which are signed integers. +However, there are multiple valid approaches to signed integer division, particularly with respect to how negative values are handled, so this must be disambiguated. + +The above operations follow [C](https://en.wikipedia.org/wiki/C_(programming_language))-style integer division semantics. +For a given `numerator` and `denominator`, if `OP_DIV` returns `quotient` and `OP_MOD` returns `remainder`, the following relation be true: `numerator = quotient * denominator + remainder`. + +The following example may provide clarity: + + OP_DIV 5 2 -> 2 + OP_MOD 5 2 -> 1 + OP_DIV -5 2 -> -2 + OP_MOD -5 2 -> -1 + OP_DIV 5 -2 -> -2 + OP_MOD 5 -2 -> 1 + OP DIV -5 -2 -> 2 + OP_MOD -5 -2 -> -1 \ No newline at end of file From 77db8a8a5827a8b85b4c64a10bd53011d8fff8ee Mon Sep 17 00:00:00 2001 From: Andrew Groot Date: Mon, 10 May 2021 17:32:16 -0400 Subject: [PATCH 25/31] Minor updates to integer division page. Per: https://github.com/BitcoinUnlimited/BitcoinCashSpecification/issues/25 --- protocol/blockchain/script/integer-division.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/protocol/blockchain/script/integer-division.md b/protocol/blockchain/script/integer-division.md index f1f808d..8fb87e7 100644 --- a/protocol/blockchain/script/integer-division.md +++ b/protocol/blockchain/script/integer-division.md @@ -5,8 +5,9 @@ However, there are multiple valid approaches to signed integer division, particu The above operations follow [C](https://en.wikipedia.org/wiki/C_(programming_language))-style integer division semantics. For a given `numerator` and `denominator`, if `OP_DIV` returns `quotient` and `OP_MOD` returns `remainder`, the following relation be true: `numerator = quotient * denominator + remainder`. +This allows for both negative quotients and remainders. -The following example may provide clarity: +The following examples may provide clarity: OP_DIV 5 2 -> 2 OP_MOD 5 2 -> 1 @@ -15,4 +16,4 @@ The following example may provide clarity: OP_DIV 5 -2 -> -2 OP_MOD 5 -2 -> 1 OP DIV -5 -2 -> 2 - OP_MOD -5 -2 -> -1 \ No newline at end of file + OP_MOD -5 -2 -> -1 From 033cd42c59d93956e12ddedfd6fe2b1c06a3051c Mon Sep 17 00:00:00 2001 From: Andrew Groot Date: Wed, 12 May 2021 16:48:07 -0400 Subject: [PATCH 26/31] Addresses, and various multisig-related clarifications. --- home.md | 2 +- protocol/blockchain/addresses.md | 40 +++++++++++++++++++ .../blockchain/cryptography/multisignature.md | 10 +++-- .../blockchain/transaction/locking-script.md | 6 ++- 4 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 protocol/blockchain/addresses.md diff --git a/home.md b/home.md index 1d191ca..fe437b8 100644 --- a/home.md +++ b/home.md @@ -25,7 +25,7 @@ [Proof of Work](/protocol/blockchain/proof-of-work) — [Difficulty Adjustment Algorithm](/protocol/blockchain/proof-of-work/difficulty-adjustment-algorithm) — [Mining](/protocol/blockchain/proof-of-work/mining) — [Stratum Protocol](/mining/stratum-protocol) — [Mining Pools](/mining/mining-pools) ### Addresses -Pay To Public Key (P2PK) — Pay To Public Key Hash (P2PKH) — Pay To Script Hash (P2SH) — [Base58Check encoding (legacy)](/protocol/blockchain/encoding/base58check) — [Cashaddr Encoding](/protocol/blockchain/encoding/cashaddr) +[Address Types](/protocol/blockchain/addresses) — [Base58Check Encoding (legacy)](/protocol/blockchain/encoding/base58check) — [Cashaddr Encoding](/protocol/blockchain/encoding/cashaddr) ### Cryptography [Bitcoin Keys (Public/Private)](/protocol/blockchain/cryptography/keys) — [Signatures (ECDSA/Schnorr)](/protocol/blockchain/cryptography/signatures) — [Multisignature (M-of-N multisig)](/protocol/blockchain/cryptography/multisignature) diff --git a/protocol/blockchain/addresses.md b/protocol/blockchain/addresses.md new file mode 100644 index 0000000..0873c3c --- /dev/null +++ b/protocol/blockchain/addresses.md @@ -0,0 +1,40 @@ +# Address Types + +Addresses are commonly used identifiers that act as a shorthand for who can spend a given output. +Since Bitcoin Cash [transactions](/protocol/blockchain/transaction) do not inherently have a concept of accounts with balances, it is not always easy (or even possible) to determine which unspent outputs are spendable by a given person. +However, the [standard scripts](/protocol/blockchain/transaction/locking-script#standard-scripts) were designed to provide a straightforward structure that can be used to identify transactions that spendable in similar ways. +In most cases, the address contains all of the information necessary to create a transaction output that is spendable by the owner of the address. +Due to this and their compactness, addresses are the most common way to specify to others how ("where") they can receive funds. + +Raw addresses are rarely used outside of scripts, though, as they lack context and redundancy. +Instead, addresses are typically encoded using the [Base58Check](/protocol/blockchain/encoding/base58check) or [CashAddr](/protocol/blockchain/encoding/cashaddr) formats to ensure they are received and interpreted correctly. +These encodings include checksums as well as information about the type of address being encoded. +CashAddr was created after Base58Check (also referred to as legacy encoding) to avoid conflicts with pre-existing BTC address. + +## Pay to Public Key Hash (P2PKH) Addresses + +[P2PKH](/protocol/blockchain/transaction/locking-script#pay-to-public-key-hash-p2pkh) addresses encode the hash of the public key that is locking the output (i.e. `RIPEMD-160(SHA-256(publicKey))`). +Mainnet P2PKH addresses always start with `1` in Base58Check encoding and `q` in CashAddr encoding: + + Base58Check: 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa + CashAddr: bitcoincash:qp3wjpa3tjlj042z2wv7hahsldgwhwy0rq9sywjpyy + +## Pay to Script Hash (P2SH) Addresses + +[P2SH](/protocol/blockchain/transaction/locking-script#pay-to-script-hash-p2sh) addresses encode the redeem script hash (i.e. `RIPEMD-160(redeemScript)`). +Mainnet P2SH addresses always start with `3` in Base58Check encoding and `p` in CashAddr encoding. + + Base58Check: 3N5i3Vs9UMyjYbBCFNQqU3ybSuDepX7oT3 + CashAddr: bitcoincash:pr0662zpd7vr936d83f64u629v886aan7c77r3j5v5 + +## Multisig Addresses + +Multisig addresses are occasionally referenced despite there not being a specific process for creating them. +This is because the addresses being referred to are actually P2SH addresses for redeem scripts that perform [multisignature](/protocol/blockchain/cryptography/multisignature) validation. +As such, they look exactly like P2SH addresses and are indistinguishable from them until the script is known and inspected. +Moreover, outputs created using multsig addresses use the P2SH script format, not the [Multisig (P2MS)](/protocol/blockchain/transaction/locking-script#multisig-p2ms) script format. + +Alternatively, with the advent of [Schnorr signatures](/protocol/blockchain/cryptography/signatures#schnorr-signatures) in BCH, it is also possible perform n-of-n multisignature locking and unlocking using [aggregated keys and signatures](/protocol/blockchain/cryptography/multisignature#private-multisignature). +Only a single signature is produces, regardless of the number of parties involved, reducing the cost of multisignature validation and minimizing transaction size. +This also means it could fit in a P2PKH (or P2PK) script, and therefore have a typical address of that type. +This technique is newer, however, and not as widely implemented as the P2SH method. \ No newline at end of file diff --git a/protocol/blockchain/cryptography/multisignature.md b/protocol/blockchain/cryptography/multisignature.md index 0533a9d..3d8f098 100644 --- a/protocol/blockchain/cryptography/multisignature.md +++ b/protocol/blockchain/cryptography/multisignature.md @@ -4,7 +4,7 @@ Multisignature (often called "multisig") refers to requiring multiple keys to sp Multisignature scripts set a condition where N public keys are recorded in the script and at least M of those must provide signatures to unlock the funds. This is also known as *M-of-N multisignature scheme*, where N is the total number of keys and M is the threshold of signatures required for validation. The signatures used can either be ECDSA signatures or Schnorr signatures. -## Public multisignature: OP_CHECKMULTISIG(VERIFY) +## Public Multisignature: OP_CHECKMULTISIG(VERIFY) Multisig schemes can be built with the opcodes `OP_CHECKMULTISIG` and `OP_CHECKMULTISIGVERIFY`, two opcodes of the Bitcoin Cash [scripting language](/protocol/blockchain/script). `OP_CHECKMULTISIGVERIFY` has the same implementation as `OP_CHECKMULTISIG`, except OP_VERIFY is executed afterward. @@ -78,7 +78,9 @@ If they want to use Schnorr, they have to sign the transaction with this algorit The value of the `dummy` element is 5, whose binary representation is `0b101`. This ensures that Alice's signature (`sigA`) is checked against her public key (`pubkeyA`), that Carol's signature (`sigC`) is not checked against Bob's public key (`pubkeyB`) but against her public key (`pubkeyC`). -## Private multisignature - -Multisig schemes can also be implemented in P2PKH outputs, using Schnorr agregation property. +## Private Multisignature +N-of-N multisig schemes can also be implemented in P2PKH outputs, using the Schnorr aggregation property. +By combining the public keys of the cooperating parties, a combined public key can be created and used in a locking script. +When spending the output, the parties can jointly create a signature that will validate as a normal Schnorr signature for the combined public key in the locking script. +For more details, see [MuSig](https://eprint.iacr.org/2018/068). diff --git a/protocol/blockchain/transaction/locking-script.md b/protocol/blockchain/transaction/locking-script.md index b6ab44f..28ac806 100644 --- a/protocol/blockchain/transaction/locking-script.md +++ b/protocol/blockchain/transaction/locking-script.md @@ -31,7 +31,7 @@ That is, if it ever becomes possible to create a signature using a public key (n ### Pay to Public Key Hash (P2PKH) -Pay to Public Key Hash is a widely used standard locking script format, that works similarly to P2PK but instead of pushing the public key, it pushes a hash of the public key, commonly referred to as an address. +Pay to Public Key Hash is a widely used standard locking script format, that works similarly to P2PK but instead of pushing the public key, it pushes a hash of the public key, commonly referred to as an [address](/protocol/blockchain/addresses). This heavily reduces the risks associated with a plain P2PK script as the hashing algorithms used provide a considerable barrier to determining the public key a priori. To spend an output locked with this type of script, the unlocking script is expected to push a signature and then the public key corresponding to the private key that created the signature. If that public key hashes to the expected address, and the signature is valid, the output is allowed to be spent. @@ -84,7 +84,7 @@ One drawback of this is that it is not possible to determine whether certain ins This makes retirement of opcodes impossible. However, it's also possible for people to create transactions and not commit them to the blockchain, so the viability of opcode retirement is questionable anyway. -### Multisig +### Multisig (P2MS) Multiple-signature, or multisig, scripts provide a mechanism to have multiple private keys coordinate with spending funds. For example, three people could share funds and require that for some transactions any one of them could spend it while, for others, two of them would need to agree, and for others still, all three people would need to agree to spend the funds. @@ -92,6 +92,8 @@ Each party's public key is included in the locking script along with the require An unlocking script is therefore expected to provide the required number of signatures which are then checked against the list of public keys. If a sufficient number of valid signatures are provided, the output is allowed to be spent. +These are also referred to as "bare multisig" scripts to disambiguate them from P2SH multisig scripts (see [Multisignature](/protocol/blockchain/cryptography/multisignature)). + | Operation | Description | |--|--| | [OP_X](/protocol/blockchain/script/op-codes/op-x) | Push the number of parties required to provide signatures. | From 9fffc5e973a8e6158ef6a33b11ca795afb1349bd Mon Sep 17 00:00:00 2001 From: Andrew Groot Date: Wed, 19 May 2021 11:57:38 -0400 Subject: [PATCH 27/31] Added missing hard forks and ASERT documentation. --- home.md | 13 +- .../difficulty-adjustment-algorithm.md | 81 +++- protocol/forks/2020-05-15-ifp.md | 44 ++ protocol/forks/2020-05-15-op_reversebytes.md | 161 +++++++ .../forks/2020-05-15-sigchecks-plotblocks.png | Bin 0 -> 38878 bytes .../forks/2020-05-15-sigchecks-plotinputs.png | Bin 0 -> 148576 bytes protocol/forks/2020-05-15-sigchecks.md | 167 +++++++ .../forks/2020-11-15-asert-test-vectors.zip | Bin 0 -> 156307 bytes protocol/forks/2020-11-15-asert.md | 428 ++++++++++++++++++ protocol/forks/bip-0009-states.png | Bin 0 -> 30632 bytes protocol/forks/bip-0009.md | 229 ++++++++++ ...05-multiple-op-returns-for-bitcoin-cash.md | 205 +++++++++ ...-05-unconfirmed-transaction-chain-limit.md | 141 ++++++ protocol/forks/hf-20200515.md | 72 +++ protocol/forks/hf-20201115.md | 67 +++ protocol/forks/hf-20210515.md | 22 + 16 files changed, 1613 insertions(+), 17 deletions(-) create mode 100644 protocol/forks/2020-05-15-ifp.md create mode 100644 protocol/forks/2020-05-15-op_reversebytes.md create mode 100644 protocol/forks/2020-05-15-sigchecks-plotblocks.png create mode 100644 protocol/forks/2020-05-15-sigchecks-plotinputs.png create mode 100644 protocol/forks/2020-05-15-sigchecks.md create mode 100644 protocol/forks/2020-11-15-asert-test-vectors.zip create mode 100644 protocol/forks/2020-11-15-asert.md create mode 100644 protocol/forks/bip-0009-states.png create mode 100644 protocol/forks/bip-0009.md create mode 100644 protocol/forks/chips/2021-05-multiple-op-returns-for-bitcoin-cash.md create mode 100644 protocol/forks/chips/2021-05-unconfirmed-transaction-chain-limit.md create mode 100644 protocol/forks/hf-20200515.md create mode 100644 protocol/forks/hf-20201115.md create mode 100644 protocol/forks/hf-20210515.md diff --git a/home.md b/home.md index fe437b8..7fa619d 100644 --- a/home.md +++ b/home.md @@ -31,7 +31,18 @@ [Bitcoin Keys (Public/Private)](/protocol/blockchain/cryptography/keys) — [Signatures (ECDSA/Schnorr)](/protocol/blockchain/cryptography/signatures) — [Multisignature (M-of-N multisig)](/protocol/blockchain/cryptography/multisignature) ### Network upgrades -[Bip-16](/protocol/forks/bip-0016) — [Bip-34](/protocol/forks/bip-0034) — [Bip-37](/protocol/forks/bip-0037) — [Bip-65](/protocol/forks/bip-0065) — [Bip-66](/protocol/forks/bip-0066) — [Bip-68](/protocol/forks/bip-0068) — [Bip-112](/protocol/forks/bip-0112) — [Bip-113](/protocol/forks/bip-0113) — [Bip-133](/protocol/forks/bip-0133) — [Bip-157](/protocol/forks/bip-0157) — [Bip-158](/protocol/forks/bip-0158) — [Bip-159](/protocol/forks/bip-0159) — [BCH-UAHF (BUIP-55)](/protocol/forks/bch-uahf) — [HF-20171113](/protocol/forks/hf-20171113) — [HF-20180515](/protocol/forks/hf-20180515) — [HF-20181115](/protocol/forks/hf-20181115) — [HF-20190515](/protocol/forks/hf-20190515) — [HF-20191115](/protocol/forks/hf-20191115) + +**Pre-BCH:** [Bip-9](/protocol/forks/bip-0009) — [Bip-16](/protocol/forks/bip-0016) — [Bip-34](/protocol/forks/bip-0034) — [Bip-37](/protocol/forks/bip-0037) — [Bip-65](/protocol/forks/bip-0065) — [Bip-66](/protocol/forks/bip-0066) — [Bip-68](/protocol/forks/bip-0068) — [Bip-112](/protocol/forks/bip-0112) — [Bip-113](/protocol/forks/bip-0113) — [Bip-133](/protocol/forks/bip-0133) — [Bip-157](/protocol/forks/bip-0157) — [Bip-158](/protocol/forks/bip-0158) — [Bip-159](/protocol/forks/bip-0159) + +**2017:** [BCH-UAHF (BUIP-55)](/protocol/forks/bch-uahf) — [HF-20171113](/protocol/forks/hf-20171113) + +**2018:** [HF-20180515](/protocol/forks/hf-20180515) — [HF-20181115](/protocol/forks/hf-20181115) + +**2019:** [HF-20190515](/protocol/forks/hf-20190515) — [HF-20191115](/protocol/forks/hf-20191115) + +**2020:** [HF-20200515](/protocol/forks/hf-20200515) — [HF-20201115](/protocol/forks/hf-20201115) + +**2021:** [HF-20210515](/protocol/forks/hf-20210515) ### Network protocol diff --git a/protocol/blockchain/proof-of-work/difficulty-adjustment-algorithm.md b/protocol/blockchain/proof-of-work/difficulty-adjustment-algorithm.md index b76ebc8..403146b 100644 --- a/protocol/blockchain/proof-of-work/difficulty-adjustment-algorithm.md +++ b/protocol/blockchain/proof-of-work/difficulty-adjustment-algorithm.md @@ -1,22 +1,83 @@ # Difficulty Adjustment Algorithm In order to correct for changes in the Bitcoin Cash network's total hashing power (i.e. as hardware improves or nodes are added to or removed from the network), the amount of work required to mine a block must change in tandem. -Bitcoin Cash solves this by adjusting the difficulty according to an algorithm that looks at recent block timestamps, infers the hashing power that led to those timestamps, and adjusts the difficulty for future blocks accordingly. +Bitcoin Cash solves this by adjusting the [target](/protocol/blockchain/proof-of-work#target) according to an algorithm that looks at recent block timestamps, infers the hashing power that led to those timestamps, and attempts to change the [difficulty](/protocol/blockchain/proof-of-work#difficulty) of mining future blocks accordingly. +The calculation used is referred to as the Difficulty Adjustment Algorithm, or DAA, and has changed a number of times. +In order to validate the blockchain, however, the difficulty must be verified using the DAA that was in use when that block was mined. +Consequently, the historical DAAs remain relevant to node implementation that wish to validate historical headers. -The current Bitcoin Cash difficulty adjustment algorithm attempts to ensure that the difficulty of new blocks is always closely tied to recent block difficulties. +The algorithms used, from newest to oldest, are: + + - [ASERT](#asert) + - [CW-144](#cw-144) + - [Emergency DAA](#emergency-daa) + - [Legacy DAA](#legacy-daa) + +## ASERT + +Absolutely Scheduled Exponentially Rising Targets (ASERT), more specifically [aserti3-2d](/protocol/forks/2020-11-15-asert), was implemented as a part of [HF-20201115](/protocol/forks/hf-20201115). +It uses an [exponential moving average](https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average) approach that should theoretically always target a correction toward a 10 minute average block time. +ASERT bases it's calculations on the following components: + + 1. The **fork block**: The first block mined with the ASERT DAA + 2. The **anchor block**: The parent of the fork block + 3. The current head block + +Though this is not used directly in practice, the exponential form of the calculation of the target for the next block is: + +``` +exponent = (time_delta - ideal_block_time * (height_delta + 1)) / halflife +next_target = anchor_target * 2**(exponent) +``` + +where: + +- `anchor_target` is the unsigned 256 bit integer equivalent of the `nBits` value in + the header of the anchor block. +- `time_delta` is the difference, in signed integer seconds, between the + timestamp in the header of the current block and the timestamp in the + parent of the anchor block. +- `ideal_block_time` is a constant: 600 seconds, the targeted + average time between blocks. +- `height_delta` is the difference in block height between the current + block and the anchor block. +- `halflife` is a constant parameter sometimes referred to as + 'tau', with a value of 172800 (seconds) on mainnet. +- `next_target` is the integer value of the target computed for the block + after the current block. + +In order to avoid subtle platform-dependent floating point issues, however, ASERT is instead calculated using fixed-point integer arithmetic with a cubic polynomial approximation of the exponential. +See [ASERT:target computeration](/protocol/forks/2020-11-15-asert#target-computation) for the Python reference implementation and additional details on where new implementations of the algorithm must be cautious to ensure full compatibility. + +## CW-144 + +CW-144 attempts to ensure that the difficulty of new blocks is always closely tied to the amount of work done on recent blocks. +The name referes to the fact that it evaluates the difference in [chainwork](/protocol/blockchain/proof-of-work#chainwork) (CW) across the most recent 144 blocks. Put into place as a part of [HF-20171113](/protocol/forks/hf-20171113), it performs the following calculation to determine the difficulty of a block, Bn+1, with block height `n+1`: - Select Bnew: The block with the median timestamp of the blocks Bn, Bn-1, and Bn-2 - Select Bold: The block with the median timestamp of the blocks Bn-144, Bn-145, and Bn-146. - Calculate `t`, the difference between the timestamps of Bnew and Bold. If this difference is less than `72 * 600`, use `72 * 600`, if it is above `288 * 600`, use `288 * 600`. - - Calculate `W`, the difference in [chainwork](/protocol/blockchain/proof-of-work#chainwork) between Bnew and Bold. + - Calculate `W`, the difference in chainwork between Bnew and Bold. - Calculate `PW`, the projected work for the next block, as `(W * 600) / t`. - Calculate `T`, the target difficulty, as (2256 - PW) / PW. In 256-bit two's-complement arithmetic, this is equivalent to `(-PW) / PW`. - If `T` is greater than the maximum target of `0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF`, use the maximum target. Otherwise, use `T`. In other words, for any given block the projected work is be equal to the difference in chainwork multiplied by an adjustment. The adjustment is 600 seconds (the goal timeframe for a block to be mined) divided by the difference in timestamps between the median block (by timestamp) of its prior three immediate ancestors and its 144th, 145th, and 146th ancestors (bounded by `72 * 600` and `288 * 600`). The projected work is then converted into the target by subtracting it from 2256 and then dividing the result by the projected work. Then minimum of that calculated value and the maximum target is then used as the target for that block. -## Legacy Difficulty Adjustment Algorithm +## Emergency DAA + +As a part of [BCH-UAHF](/protocol/forks/bch-uahf), due to the anticipated decrease in hashing power, the following adjustment to the legacy difficulty adjustment algorithm above was put into place: + +>In case the MTP of the tip of the chain is 12h or more after the MTP 6 block before the tip, the proof of work target is increased by a quarter, or 25%, which corresponds to a difficulty reduction of 20% . +> +> RATIONALE: The hashrate supporting the chain is dependent on market price and hard to predict. In order to make sure the chain remains viable no matter what difficulty needs to adjust down in case of abrupt hashrate drop. + +That is, if the block height is not divisible by 2016, the target may still be adjusted if the current MTP is more than 12 hours after the MTP from 6 blocks prior. In this case, the target is multiplied by 1.25. + +This algorithm was superseded by the current difficulty adjustment algorithm as a part of HF-20171113. + +## Legacy DAA Prior to [BCH-UAHF](/protocol/forks/bch-uahf), the original Bitcoin difficulty adjustment algorithm was used. To determine the difficulty of a block, Bn+1, with block height `n+1`: @@ -30,15 +91,3 @@ To determine the difficulty of a block, Bn+1, with block - If `T` is greater than the maximum target of `0x00000000FFFF0000000000000000000000000000000000000000000000000000`, use the maximum target instead. Otherwise, use `T`. This boils down to a possible change in difficulty every 2016 blocks, where the new target (for the next 2016 blocks) is calculated by dividing the time taken for the last 2015 blocks by the time expectation for 2016 blocks (bounded by 0.25 and 4) and multiplying that ratio by the existing target. - -## Emergency Difficulty Adjustment Algorithm - -As a part of BCH-UAHF, due to the anticipated decrease in hashing power, the following adjustment to the legacy difficulty adjustment algorithm above was put into place: - ->In case the MTP of the tip of the chain is 12h or more after the MTP 6 block before the tip, the proof of work target is increased by a quarter, or 25%, which corresponds to a difficulty reduction of 20% . -> -> RATIONALE: The hashrate supporting the chain is dependent on market price and hard to predict. In order to make sure the chain remains viable no matter what difficulty needs to adjust down in case of abrupt hashrate drop. - -That is, if the block height is not divisible by 2016, the target may still be adjusted if the current MTP is more than 12 hours after the MTP from 6 blocks prior. In this case, the target is multiplied by 1.25. - -This algorithm was superseded by the current difficulty adjustment algorithm as a part of HF-20171113. \ No newline at end of file diff --git a/protocol/forks/2020-05-15-ifp.md b/protocol/forks/2020-05-15-ifp.md new file mode 100644 index 0000000..e51d394 --- /dev/null +++ b/protocol/forks/2020-05-15-ifp.md @@ -0,0 +1,44 @@ +# 2020-05-15 IFP + + layout: specification + title: Infrastructure Funding Plan Specification + category: spec + date: 2020-04-10 + activation: 1589544000 + version: 0.1 + author: Antony Zegers + +## Infrastructure Funding Plan + +The purpose of the Infrastructure Funding Plan (IFP) is to provide funding to development projects working on common Bitcoin Cash infrastructure. If activated, it enforces that 5% of the block reward is spent to one of a set of specified addresses. + +## IFP Destination Addresses + +The IFP contains four destination addresses, each associated with a separate BIP 9 activation `bit` as follows: + +| Name | Destination Address | BIP 9 `bit` | +| ---------------------------- | ------------------------------------------ | ----------- | +| MinerFundDestination | pqv2r67sgz3qumufap3h2uuj0zfmnzuv8vqhqfgddk | 0 | +| MinerABCDestination | qzvz0es48sf8wrqy7kn5j5cugka95ztskcanc9laay | 1 | +| MinerBCHDDestination | qrhea03074073ff3zv9whh0nggxc7k03ssh8jv9mkx | 2 | +| MinerElectronCashDestination | pp8d685l8kecnmtyy52ndvq625arz2qwmu42qeeqek | 3 | + +## Activation + +Activation is triggered separately for each destination address via [BIP 9](https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki), with the following parameters: +* `activation threshold` is set to 1344 (which is ~66.6% of the 2016 block retarget periods) +* `starttime` is set to 1573819200 (Nov 15, 2019 12:00:00 UTC) +* `timeout` is set to 1589544000 (May 15, 2020 12:00:00 UTC ** note:** this is the same time as the May 15, 2020 upgrade activation) +* `bit` is set according to the table above. + +## Enforcement + +If activated, the IFP enforcement begins once the 15th May 2020 upgrade is activated. + +If one or more IFP destination addresses are activated, then the coinbase transaction in each block must contain an output sending 5% of the block reward to one of the activated addresses. + +## References + +[1] [BIP 9](https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki) + +[2] [Sample implementation](https://reviews.bitcoinabc.org/D5282) \ No newline at end of file diff --git a/protocol/forks/2020-05-15-op_reversebytes.md b/protocol/forks/2020-05-15-op_reversebytes.md new file mode 100644 index 0000000..e9e3399 --- /dev/null +++ b/protocol/forks/2020-05-15-op_reversebytes.md @@ -0,0 +1,161 @@ +# 2020-05-15 OP_REVERSEBYTES + + layout: specification + title: OP_REVERSEBYTES Specification + category: spec + date: 2019-05-29 + activation: 1589544000 + version: 0.2 + author: Tobias Ruck + +## OP_REVERSEBYTES + +OP_REVERSEBYTES reverses the bytes of the top stackitem. + +### Rationale + +Bitcoin's protocol almost exclusively uses little-endian encoding [[8]](#references), and Script provides various tools for using integers encoded in little endian, such as `OP_NUM2BIN` and `OP_BIN2NUM` [[11]](#references). Using covenants [[2]](#references), sophisticated smart contracts can be created, and Script already has a great arsenal of arithmetic operators (opcodes 139 to 165) to enforce e.g. how input and output amounts of transactions have to be related. + +However, many protocols do not use little endian encoding, and it is by no means clear that one is superior to the other. Both AMQP [[12]](#references) and Apache Thrift [[13]](#references), for instance, use big-endian encoding. The Simple Ledger Protocol (SLP) uses big-endian encoding as well [[1]](#references). Bitdb, when using the `hN` elements, returns stack items in a format that can be directly interpreted as base16 big-endian encoded numbers, and to use this feature, it has to be possible to encode values as big-endian. + +Further, now that oracles using OP_CHECKDATASIG are possible, likely used to retrieve numeric data, it would be unnecessarily limiting to assume all oracles will use little-endian encoding. + +Among the mentioned protocols, SLP tokens are likely the most important ones. Various new use cases combining the power of covenants and looping transactions [[5]](#references) emerge, among them: + +* Decentralized exchanges (such as SLP Agora or SLPDEX) [[3, 4, 6]](#references) +* Donation mintable tokens +* DAOs, which charge a fee for services and distribute revenue proportional to shares [[7]](#references) +* Native tokens (not yet possible) + +Note that values can be converted to big-endian encoding if the size of the encoding is both fixed and not too large. Currently, Script only supports 32-bit integers, and they can be encoded in big-endian using OP_SPLIT, OP_SWAP and OP_CAT: + +``` +// initial: // +// convert to little-endian +PUSH 4 // 4 +OP_NUM2BIN // + +// split into individual bytes +PUSH 1 // 1 +OP_SPLIT // +PUSH 1 // 1 +OP_SPLIT // +PUSH 1 // 1 +OP_SPLIT // + +// reverse individual bytes and concat +// results in 4-byte big endian +OP_SWAP // +OP_CAT // +OP_SWAP // +OP_CAT // +OP_SWAP // +OP_CAT // +``` + +However, if with OP_REVERSEBYTES, this becomes trivial: + +``` +// convert to bytes +PUSH 4 // 4 +OP_NUM2BIN // +OP_REVERSEBYTES // +``` + +That's 11 bytes (9 operations and 3 pushdata) saved. + +There are multiple reasons why the second version would be preferable: + +* Covenants and looping scripts usually take the script code of the preimage [[9]](#references) as input, which means every operation counts twice: Once for the stack item containing the script code, and once for the P2SH script stack item [[10]](#references). For a conversion to 8-byte big-endian, this would save 32 bytes per conversion, and if there's, say, three of those conversions in a script, it would already amount to 96 bytes - a non-trivial number of bytes for a transaction. +* The cognitive load of developing scripts using the larger snippet above is increased unnecessarily. Developing scripts, by hand or by using tools such as macros or Spedn, already puts a lot of cognitive load on developers, and errors can be devastating to the community. A prominent example of such a failure is the contentious hard-fork on the Ethereum blockchain that was caused by a bug in The DAO smart contract. +* The first version assumes that Script uses 32-bit numbers, however, once integers with larger width are implemented, the script gets linearly longer (4 bytes/byte) with each additional byte. For 256-bit numbers, it would require a whopping 124 bytes (93 operations and 31 pushdata) to convert to big-endian. As the opcode limit currently is 201, that wouldn't leave much room for other operations. In contrast, ` OP_NUM2BIN OP_REVERSEBYTES` always encodes integers as N-byte big-endian number, with a constant script size independent of N. + +Also, suppose an oracle returns an ordered list of 1-byte items (e.g. indices), however, if the script requires the bytes to be in the reversed order, then OP_REVERSEBYTES would allow to do this trivially. + +### A Note On Signs + +For unsigned integers, the behavior is always the expected one: the number will be encoded as unsigned big-endian integer. However, as integers in Script are encoded rather curiously, signed integers might result in unexpected behavior: + +`-1 4 OP_NUM2BIN OP_REVERSEBYTES -> {0x80, 0x00, 0x00, 0x01}` + +Here, the sign bit is the first bit of the resulting stackitem. Usually, negative numbers are encoded in two's complement, and the number should be `{0xff, 0xff, 0xff, 0xff}`. However, as long as developers are aware of this quite Script specific encoding, there's no issue at hand. + +## OP_REVERSEBYTES Specification + +This specification uses the same syntax for the stack/stackitems as [[11]](#references). + +### Semantics + +`a OP_REVERSEBYTES -> b`. + +OP_REVERSEBYTES fails immediately if the stack is empty. + +Otherwise, the top stack item is removed from the stack, and a byte-reversed version is pushed onto the stack. + +Examples: + +* `{} OP_REVERSEBYTES -> {}` +* `{0x01} OP_REVERSEBYTES -> {0x01}` +* `{0x01, 0x02, 0x03, 0x04} OP_REVERSEBYTES -> {0x04, 0x03, 0x02, 0x01}` + +### Opcode Number + +OP_REVERSEBYTES proposes to use the previously unused opcode with number 188 (0xbc in hex encoding), which comes after the most recently added opcode, `OP_CHECKDATASIGVERIFY`. + +### Name + +The naming of this opcode turned out to become a bit of a bikeshed. In a previous proposal, this opcode has been named `OP_REVERSE`. After that, it has been renamed to `OP_BSWAP`, as that is a more technically accurate term, which is commonly used for reversing the byteorder of integers [[14, 15]](#references). However, after some more consideration, it has been renamed to `OP_ENDIAN_REVERSE` following Boost‘s nomenclature [[16]](#references), then to `OP_REVERSEENDIAN` and finally to `OP_REVERSEBYTES`, which are both more consistent with Script‘s opcode naming system. However, as, “endian” is usually used for numbers which are a power of two—which isn‘t the case for this opcode—`OP_REVERSEBYTES` is the prefered choice here. + +`OP_REVERSEBYTES` is preferable to `OP_BSWAP` because `OP_BSWAP` is lexically very similar to the already existing `OP_SWAP` and would make Script harder to read. Also, while the technical term for the instruction is indeed `bswap`, it isn‘t well known for developers of higher level languages and could thus spark confusion that would be avoided by using the name `OP_REVERSEBYTES`, which is more self-descriptive. + +### Activation + +The opcode will be activated during the 15th May 2020 hardfork. + +### Unit Tests + +The following unit tests are used by the ABC implementation of the opcode as of Feb 17th 2020. +- ` OP_REVERSEBYTES` fails if 15th May 2020 protocol upgrade is not yet activated. +- `OP_REVERSEBYTES` fails if the stack is empty. +- `{} OP_REVERSEBYTES -> {}` +- `{99} OP_REVERSEBYTES -> {99}` +- `{0xde, 0xad} OP_REVERSEBYTES -> {0xad, 0xde}` +- `{0xde, 0xad, 0xa1} OP_REVERSEBYTES -> {0xa1, 0xad, 0xde}` +- `{0xde, 0xad, 0xbe, 0xef} OP_REVERSEBYTES -> {0xef, 0xbe, 0xad, 0xde}` +- `{0x12, 0x34, 0x56} OP_REVERSEBYTES -> {0x56, 0x34, 0x12}` +- for all n ∈ [0; 520]: `{i mod 256 | i < n} OP_REVERSEBYTES -> {(n - i - 1) mod 256 | i < n}` +- for all n ∈ [0; 520]: `{(if (i < (n + 1) / 2) then (i) else (n - i - 1)) % 256) | i < n} OP_DUP OP_REVERSEBYTES OP_EQUAL -> OP_TRUE` + +## References + +[1] SLP Token specification: https://github.com/simpleledger/slp-specifications/blob/master/slp-token-type-1.md + +[2] Spending constraints with OP_CHECKDATASIG: https://honest.cash/pein_sama/spending-constraints-with-op_checkdatasig-172 + +[3] SLP Agora: https://github.com/EyeOfPython/slpagora + +[4] Sample SLPDEX transaction: https://blockchair.com/bitcoin-cash/transaction/2e69f47a985673c5a645e20ad09025a0892321f096224679657f98e6152c845c + +[5] Let's play chess on the BCH Blockchain: https://tobiasruck.com/content/lets-play-chess-on-bch/ + +[6] SLPDEX (discontinued): slpdex.cash + +[7] DAO: https://en.wikipedia.org/wiki/Decentralized_autonomous_organization + +[8] Bitcoin protocol documentation, common structures: https://en.bitcoin.it/wiki/Protocol_documentation#Common_structures + +[9] BIP143: https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki + +[10] BIP16: https://github.com/bitcoin/bips/blob/master/bip-0016.mediawiki + +[11] May 2018, reenabled opcodes: https://github.com/EyeOfPython/bitcoincash.org/blob/master/spec/may-2018-reenabled-opcodes.md + +[12] AMQP specification, page 14: http://www.amqp.org/sites/amqp.org/files/amqp.pdf + +[13] Apache Thrift binary protocol: https://github.com/apache/thrift/blob/master/doc/specs/thrift-binary-protocol.md + +[14] https://docs.rs/bswap/1.0.0/bswap/ + +[15] https://www.npmjs.com/package/bswap + +[16] https://www.boost.org/doc/libs/1_63_0/libs/endian/doc/conversion.html#endian_reverse \ No newline at end of file diff --git a/protocol/forks/2020-05-15-sigchecks-plotblocks.png b/protocol/forks/2020-05-15-sigchecks-plotblocks.png new file mode 100644 index 0000000000000000000000000000000000000000..96aff1ccbf042db47f1f5f2daaeabed31180a17d GIT binary patch literal 38878 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
f%_F7Kx@J|n9L^GuB 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 HDWM4fXQ^_* literal 0 HcmV?d00001 diff --git a/protocol/forks/2020-05-15-sigchecks-plotinputs.png b/protocol/forks/2020-05-15-sigchecks-plotinputs.png new file mode 100644 index 0000000000000000000000000000000000000000..0417e1e00ab0013d12c1c2842e160695f4ce964c GIT binary patch literal 148576 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

X7vP?WR}LXvx{nfzxlkr z@}{!1$v+G0@}0L@IyW8PFFZ@5`j7R(&P~U63UAY%QLP>3!131c{=V8?$LUk1NXS2Y zD0L{$MGzGIYwWkjZH#Hm=1BEiyzJuH`)BPgH-q;S%`7nE+@Q@t>&L) z?yZ#dy(__M_|iY8Wt;Y=tDAU#t|)WbY|G-QoggV zZ`%XC#h;&@Jsj)CSWr;5B~IKd{r>7(96nf-9O83rN>zX3a=S<{*QukF zgOOp{Mf(-?iPexZvbvP!&(FJ;mF=-ycr@$yY~iRiWighC=}#FIw+QE6|95wP{r}tgtgYd3 zl}BMkn(F%f|8`BD9K1em@2&aPCBMJrKK|`9*J|r#{n@8__RAV3v9t&_`jfPx~Qn?<)#$giH*}3!Q+U@s>ii(N~3wK^lth}{tvs?O^85jS3+_Ps7v`#eN|I>H5a-#r~0&|<3 zY}DPDUYRHE2fj9}58l7+YuL8j#YejZ&8iQ9YNp-(o{fAl;DLwTVrTSTe4R4E!PC=B z+;W?r#-bA&OPvH=`xXk9Me_(aUHtJ>zy9Yb?e%A7nQCijyg1a#Eh#DK>FN1aeA)l& z`~O|Nb?euW)nfW_Ie*?t=kE~|5-R%n>FIL0$rLd zch`KdtN8H1Z~9tu37*Ht``>?26;|_kk@fZGs#UA@|9zV;8~^D_u>V`Z$GZeL6d7uS zW{K`n&Sfu}@N{Bq{kgF1Vw#|Z5PUKVE-v<5?|!3aXG!Oty>IPQS*<3__SO}+$_U&pzeI2ihC1pXcT+x~rG^BDma(010^?7h18 zYTn;-FW(lfk#SwG68q1G zwKsMz+j&gv{hF})^yXvoTcs*DFI>`cue!ghdm>BntJfzlPhJd%3u(?xu^gmoJ+H9p$*^up}_4AHyJAKM3KK;-+@gFzyip%yLIA1n<^JmsNvs-g!vP(fsWPolT zc+#HVkzeV&Q}^D^EmK0YqIQ3~7`a$aZ%euUr!)s==CAL3B_%z;yP;&gI5~TKOq7}? zP2RZ!wCv{86R`!`ZfH!7Zs^(<_?h1jJe@OvLA*=9X4)Ugq6w0j-!G>fJ-g|sb$IyX z+0sv+2-H?j4?M$bbkIVz^c!fW=s}0%&h z8p|yt9;3UrOD5&m@8kFM*9re$wW*Em)2BsWN?6WF%msDK*2GCmbR?u~PTxFRaew9H zMT>q!8O0r8+z<;Q4YoK6vM0PuYy~ei_)~5S+L6Y{-F3SAOxGFDz{xK4x37hL`nb?I zUBJNm)TtLwJf-aBI5`QhRZr7f$}26AyL(kvpZxQ4ko7kr*%D`R1EwTK6goi0D_G7v zeEg$-V)GdZVKcSuR^fNPUwN7FqoAwTb(cm~El*45#9E{ThW^dMJY4n@F>_!ttitUc4*^VvbjWRRf%e~Ol*cliO zo||aM2JJp@@pIrSTC`(b#fyszAMJZC9)IE1){bem(c32lbxJyYQ&GJL+Jb6yt0wpD zy$}8^NS`c|yc;z~9U!CE4&b|$n&&qg;CJ1kSoVNU~zwk%i?fJ`F zxhHCacAI|5xV2Y0+urEeBiB#gmOV>zn|(b?)9RO@=)*f~zVa&1%`$!|SZ;R|X4j01 zg{-<+_tEan-9_1se47^TS$IeNhWin79*zYogC%2CS#M38%DlNi(|KwO?<}Jb&l?H-&Z1jk?)zk5RH9NeLAZO8*jz0e)oZ(5!JAf& zi!NJ(*zSJvwDQz0E$y4V3hM3G*8E&oK79gjnSBE1&4lmF(~YAA5PEH zu68miyzcQc;Bw4m^$qajd*AE3 zpk+5F+n(fX&<1T_D|^*qwn7^`f^tBg*_q8Qr?x{T<#1Q9_M>-4IzNR$cECe6n=yGB zEY5xC-r5wlHp!fCZeLQeroo5Z_x8SZcLL3s-2U%zg3a10@wYtZ%>;M#EsoHj^jn#| zQW`uk)5hl8d|Z(~a2b34U8VB!Rcl>W^l0j;PVMUIn!sXg5%t5+bZSzP)l0A&K}&<+ zZd`N?n)IeDkaoNu^Ow!?L>upObD906cYb}>)KLi!_wn4geAlcycQn-5JvX#WZv=hvM_2ku!*a+K`CoGHx@A%h_id4FUnjfilW$hmiLkXaHiG6XF=_XQ znbi#4tHeqSt-pMCS=vpGV0W3!HbSX!|=WcL+l;771fPA zR3!i#l-Z;rs{ST!n#z-wyX<RXbbarDkZ)92@-FXAU0FAC z9)+8mi&WRfc1zqS{-EGH+bv1wK@uw)v#R>#PT^%)LZJ0EYMzHUeLH8>t8dAN88<`L z{CC<>-zN&pERLY9u`4pS++cftc5&=(0hQ`)xr|xd224v{^It<)qd+Y{dl@M?Bc7d9usZb`7Tb;Y_a!x zHpj-ZnQda&=_(n}I@2AhSx1%&&syzv$75rd`dNn(faosebylY?<1%#~Hbxb*4UB0=g=SolY<5a8}=<6LD|O zg+~c%S3~o)`20D4o?P1NeZrAVMO>x6=#%hiP@Sf!sTTk~Ed#Mt{?(28v(C%?0)2Wy zt&a2yM=f@av0P|6@zdj$FgMt|euF-Aufqh!zs6qwoMC2RgatSyc&{b}^|WwWN{HxZEuUaq2|9!-Wx$p(!EP2S%um>E_ZOTi|ZQYa|ymcT>_;?mJ z7J4D?b1&g*Q{pK3rjvVLZy#tGPwqlnpE(!AF5bM)nJY4P=0nKBkGy|hxi>d>%ljw8S$AT7z0!{61g+*NJCvNRz9lx} zTZz-`wlqH%NDV5!ZFwF)Xzy~6I%HMy=D46RH!ab-d%HhKT)yG4xBBwc)!=5<-v4$- zkA5_qwaaSu8Qxp>Idj)ql@&WhA5WE6-{Ksj#tvEgUa_z~;J=#gI=RUJ;d9I{N;#&%y;SXv>a;`1FZ@}^xANKa_)F8{l?=YIuw9y>xxw+>6t)G%u;V@#})|fnbA!x@GT< zOc4=xalN=A(8kx(QfuYPCvSay|LE+ve8(qx`=x7Zdv=#)mvqQWZwYGuvC%QR>FFu9 z-5g@zG+>~nXrB0Y=hqXCm)2PBR#UQGbbPt2ozG2bj6)Lo^o;_ z;m6N5@UU@lF7%zf6OQjZPdSB4%h_3@%z-Jh8b1wD zk~Z3Ic0=(=wRIUJL#9cvfEpuD6f(EP-I6L%Uh(_+94l8lyBU*`&aaIIZ&SlISwcHhayG<1fTSMP&wgi4Yn*oAyOjF=>fZY?f0xZxhwPraqM&tb%G8Ol zjj$#G@9#~Sckc2Gmc~PeG<16IuiIN4IjM{Hn}&DL#)I#Yr%&LmlePx;1rlzwfaZ^V zcbcj`5T5I}+-k+87rSkQzr2eD<#yzwFMj^GFw=MrueP!?)31w=#XEs&nc$VtmeMAA z){T%gt6?$v`|UvcqbKOK=gZtH%Zv`+ud9E2iikL5f9}pEm5BPrMc{4q(>5oDh6V;q zF!{20vG6<4+UPe|IKRK24qD0M1YXlKhc^kl0lY!=bnvwKJFD3&Jw%!l3O<)-Uo$KJ zb^BISQTg&UI!}&BJf3ppeF8=fD&)-GGW6tul(u2t)V8|A+zt6h9}*rUl-JN(it(?7hgpZVU}6*@`l zYN3}`mvFZ1a;v3g8?QYLS$;(=2i*N*kT#olUjnqN+GC1vrMgwDz6*3KKIg{m2Y-If zeC`L`itqHVEi~F&+RWoq%IQ8cjX?D`6^~Yn%-wKVIDTmuw7bQ7uYGTH>Dm*Hi@w<2 z`R;hRxlhQb(ukE!N$y+CPu1F=s<7?&ckX&cE?>OC!1LQX+5BwHqqB?4_AFmvl7H^z z$qh>@E?=KAr5ZY$dEnj@^C|s2vYj$2r*1CV{MrA^`;2C8u?u~&9qqQ(<(HaR|9Eyh z7L@c{>^5=UVeX~+F$;EBy!`qumN%lv@5ajp)#oj-yb(>MrTIs>z+sq>UlxC}_RF)t zCklaVZ9F<_^=ls;yt+E`s#eP3d57CGKc(DIsJ@aVWii1->YrO!z=yk1UxZ%W-7UYW zWzL4#3%yQo?v`J51Q za$Nc4-89}#XZ0-!9x_%7Q=KO{#U_Gt;DL1}*|UGMes$&xQrWMz|L@+!^>Ih1h=||W zd-~&)DawJt&UtxL=AM1}VAd=Roi`i3*?+#jyH=7X+%Mx}!j2-RY_`L-&^GdJp_#%v zK|8J$T$j1{?~JRv`{Vx2n@^s#X=;9hZUIK@=0ElH0S}v(&k|wvC0BMw+w=I%xo`@! z%I6w?^LuFbqAWG$$c{z3l%6Q)-n;Yn*?IGSe}1ptcRxFLy?Ocm%sG>^w4DulR<4De z$dL&?9He&E^^d730U=YSRF!XJJ8*~7Rg$4tT_l@92HJDmAaB*YuG}I2iGpQS?yIL; z?wtJbxtn({Xy>7eR!?Tm61&~(8dn5wLs(v>P$3&1 zDk^KQH}l?IyQ&0s^(}|h-aKgecF}JhwEJ_TQ&oNXl6(HHe3uqEUjA@>{hhgUTFewn zij=lW9o&!z+Az#zxIx`u!ZM$SH`qWUURyp~a{T@M-8Y-Y3(F3rZTIw;%{ANB-{Na00J?i!M z-rgsVKAm9u{?65ahl6X8=j4RuH=dq~@$r{3EaZ~>_*&b&7ni4RDUvuWs6Qr zuRf}40UdNn;NNHSITf^LdxDs<`TJLUUn~f8I(5op?Xf!w(%_PyZ}}3LHgFp!E9Xf? z$JVWjVy!Y>-<$i^=&6#H%;BYct|1m}-m*mj(8!hh!uMjW@rwz~EgT$|{v~bnT6|fF zD@;PwMyIEyX2n*~N&_|R?mKr^ZkzTvN>gvy42et~zJu4;TtzI~%s}%NTOIjekum4d zu16aMlP5N}bo4H*_xX0eE>nF`g6r+fU0kfSe@#EZP5?SrzShF}@|&ANFYZ=ua11Qz z+sO->pShv%8k$$l(r+)#ooG4ngrn9ROK0X9p7*i^xfi!8@TyIjYWwO#p|ZRmUpuH7 zo}#;8p0SPm3B>A2*wK zzr!SAVOa3*Qo9XT*qxyxElY#7XPbY%z58=ov)F3caI=h!w?3vdzk&H}+Nx!%5|6hj zvU^T|Ztba%`IK?NL_r|z&JIT|)-;ZrkYfm+avgV0F?G&xR6e(yH%g&G=GFq%rsKmB>A zlj=|2{5iq){QUDR<DS%GO zGP$lGtY%_5al3i!KA)DQb~6@1&hpZ2)h}{#)-;)7mcQ-woduD;mjBH%7QHFVYgRiY z_unkzJ1ioWI9`4r{H9sPV)?qhJ9l3`^Ho|j<uE+?Tg27V`}O}q5x=a$L;Rl|AMtO}cigm=EXyEL`=ZpZwV zoDI?+Cr{(OwGo!$O~T_EF>2p5Ng(3yU*}UyuWYSJl?WZ^^-s=Kn$#+s?6XcQD&2Q_b&5KkbiPO_n79& zj*jEz;XJeM?cNSu&LWZvTifzB2%7rBjyyk> zZ?T`z@g)1wcy#Ie!8FUV2*Q}P5H|J-WemN@M(WojE{bS?KnTHPV+)=V&^}W5d z*WW!?x0QZ#1+?Qa*YCyi?>G89&avgj!wiLO6aSI&G3nN}w;SEv+I!EfJ?CmvcI20 z`Ih>Ils7&F29T}4D}%pG-|vy~@c0>@uCAgR!M_VmY4}MV)m#iVz#_V&Eb^4mlLLyo z%P-Hd^!GY(=h}ErGv*ht{*`Lqk!RtPnXP;u= zP-K{tn0M$-cIx#B%=s-X7g{(|3~at71jb(6kbGF6&(^ZI4P5?s8bBK%Zd}Q^;K3`u zvL{a&H@sn)Huu0LVUTl71XvFKov^#X_@RZeUSAvU>lCl7v^Qt8Rl_fB>)XY^(7@p7 z;utca|L%^eseAUUSjgyU@a$bIsEHIK^?%i+mBAwN?;mh?fY(~|w}Ow^%A625&G7vZ zn{ePVl!Xq!cbpIUda2m;`2=S7u6d4otIO?Fw<;7KoVhz)U}7zJ zlizRCcQOsoo=PXr_Fc2Ct$)6y+dz8x0PG`-kz5)zKb>pFeRwYW1Po!utCP+;kVqP;>E9Co%?m>S=Rf*_c~74g@jC4 ztt~2|z~#sPX5$)tpyIDcjLppYpgZgXaPKYVEO?VZ^6 z2avTBQ-z~qm&L9KaPKWeck%sw_97Y>;M10Kh^8$sj1q%{Zpn) zsi>%sm}_8XC+F1B@6T{%segieZ(Os?jO00!PMvx4iSzZjwcMw%e<%Ws%zSI^Xz@z z=~cI+_Re$bUv|Pn<>0(l?#$zSFL}b3FTQa@eRh;wRe4}ZAG^AU>vPb$b=8L-N>z&$ zzkK}~sx|fBzkhe_-#$3l%+;E7pn);BKj-Eq*M$LpUWM;(5_lvm!m#;9Y322e(Z?q+ zM{kLeGU@P}_vW4D?cnX~ar`b}X08HACoP1nophx`Klarg{q)2x0~sTEk6WU59ri1 z)k>K}Evh9_0e)#aNt^4BZEBIEGu*p8!q}eTg8FTV$wVMgDcb`8Dp=dMoX7hXD(f`L_?%2eO~3Vw-d9kuhSIilK=C7UBIcP zk14@wtM1n3ejYbI9zm8_c5|z&^jp3yeSf<+mH*Ku&DYm1ZlC^~c^V7r#U-ATHXS?$ zJ{4rv`g?cXKBd*GZ<)B~=1tDr5Qe^}a3k?U@qb^1do3;c_U7hY``l}5BDq>0ZM`0s zUG1_q?D3R94n>A%LIt*xvKUx+B3NyPSFe&;X3+#-}k*6 zHt4-q7MGHG_2|)}5Uu6Dv#))7(8en*!gX~2zpwfnigvz?26Mmn@BP2vC1X*-(O+M; z~nI5I7CU)9t_i+{el`&J?6TcMLR$81@% z#P;TQ6`&-fqoq~#Zs+r!?6drmMk-obtClQrS$_Ft$*xJ0CY?BO;$Sno_EfJ{r;mR= zpBEPu-MaTfe*N#+K`Uc+m1wpI$gg0S;jww!&iDZPCkMK0t6wbcubMZ>h=a|%e!E(( zu+V0~!a~q7F$I-s>`70by7u-?lKS%Z_uW{l6HCgs!`Ca!&I7Gi;0p`?6yI)OX!w!c z{zqeB>_I=nIPDwTp0Nl%efo6o_j}dv_kNFab7N}}n7@)?hKCDew?DIRpWM=qk9}uN z>N?XIQ=4Wgv{?|myF6(2q)E!qV;OEp7*;4H6nQZ{EC!`P{j4%xpX-PM<#9&fX%xpe-qFxNXNe3CkPve^gZc zubsSX35(+k*$cbZE#+Hyv*}C8tGlzM3MR*16A_*0<(is0NovbM2T#wEM=b7pttUq} z+)7&PlgFs_%WdWzrYniBPARrr@bL6J`S5W2be%|}(pOhj1~1o(+@xY)uwls(miaOQ zP7G_@q3cS17r%oXP@!gPscHXm^ON%evvhYr_KHe*8Z2AX1nRI(xwT_`{PGhXeO2Y4 zWe>YELF5h)Y2_AcIRQLeuZ$${_N-}J5!Eu+_K{yVy}O}+Bih;ib|)yn+*yDEh}4ZvlyrmAb!V=?eS zU5(T4&7HjNE_fY87+;&PbV{Q} zdxbe=#6%yudGlwdyU&up+@Oni8GO%5uW&ft|M}AH;u~9|p=%`yGnzN8TU~wd;3grb#f)|z zJ36=2gG}dWIC*!*gSr#3FA5z?6xd+f$?mP*q_z2&Ymal4(jxG|JA#cW7C)S_1at4} zoy`|nv?%Ac{Oo(Xi*Ik84LY&p!kUML+0CE8i{4MVbNJVKA9wd*nXfJ2#Bk2IT=b_UHdE%~N%^l0J5 z-NpB|&bIS7mwVxeV^LnS(c0D3r>8w!W&~=~JzZn9S8J&OtK|);=Eh?^3oit0j*kck z2Ca)=5}By#o$)&C$N@Qf`&ri0RVvF4&9xR0Jm~sfuXEj9@EIo6GOJW_0{Wocjx~!w zXA(HJ%j9$^T0H=Dd<55v)< z^K!p_Bp+hke5SK^>BGaG>PPbzl~{FkCSFh~e{)y$`qpw)X>g|_pvX*P{jOcl-@jkr zBq1tlTJJ@V|o+JdDHqKb{(q~tZQJ(u@%-9vk-u5h_kG{{o|TR5kujSSN5f7~w;8mYW!q!$UN!FJ zOIFQV^^5(hd)p!bdH=(0p2c2Xao{s_u3S(!dr@2@AVMO3?{1`JB9k^d?z}SfOl!fv zKR>xzlU`g{_*Q;T-QQh7D^2uFKVI_Im;C?uX8QcS)!+5(G8I}FX86IjAHB6G>p9l9 zwZ`k!<|pUdt6Njp-#2ZE z`_d&B{{8KL+aa>`+KM3X9@>?1e4XGX$Nzut|4;FHI?uNHmc2#ktB}Q9Qs+hX*8Kc* zT7UnV5G`^2xE_9K4n>A#pU+;+Z^~m)WS0gX#xW@@`{C)=QLn1lza0BD;o9Vhicd8) zB?CiTv_z*)^D6#QWqb5^aF9^BaJJCgNv|q4EfraAWo>&is4IBxrS+gnd41hi?WIAL z&(6&J#=q~^tJPjhKYc!LpI@DFb5kl;>!Y>X?;U#1+akblS+XQ0Al6&9Xano>^TGS; z!hAhzE1!AC+{?7xp6^}h<>dw~4?W7*_2Sd)(=YAI{{C6n-hQQ3Vzu<0{qd8wAA4D0 zJ?)$Dyh}w+k)W{ua5H^=sMgf$>*MpQRrK}!7Y1ldJ=N3GvyI(e=f~g{)W5`rhJ(>(5&HH?>9jg;+ zUM4Ize?H|!uCDdH;E=BETi=+}Xx`Hc)hjK{Kh9^#{qXz#|9{ofIQV5O76fR-)qFhq z&Hwa?69F0`{`Fm#eq!Qm_p^^96T^a)77O>h z@_OcEk#vNk)#>B({ePCOT-n+2>GS8_;L*C+b|SkJ#;hIEIFX z{$AcIYaO;Qphv=xN#0(-iNOc7Uw#?)>k{a#!AU<#S(@ELqj8wKlHXL)Urr z(u2(}Rl;5;^eSA~lKJGl{?l3w?Zp=Y?(Ht~{PJ!Yx6paNjIa|n)(d4`dp)}@Aarq# zWpR%-@3ytJJBpv5`{tjKnOXVqsQ6T`r~m%`aFcZ6Xz=vunG+EZ+#qx05NN}26Gy&i zf$f9WSJn%zOqJjPpK+kf`AsLz=k_+wO7{#iOL;3%h*HgO@LVK5Um)E4L8-e`2EY{y$Ik>%Xp!cdP@Yr>1)gzVm!=;Y(V0 z_0j~zDKj+M&U3JZ*I!S|H4fU!;J852_{9T9m4ow2UuPWU>J*<0+9EUQ<*l7>?}8?i zL91XYi=BR6o9YanUQ$p>e>X3(FpITFfVH{N?#~1#=cAR|FRZ!n_4zgB(9=Jj2>*Je zedNGA+v<#SGLyc|(!9QIc|!KIf=_V7#bzP;r-+ic^@yGMf* zp6%To!FA*sr)$r|wZc{ou_xm>rg|;ybXpOj^)Zu0k!3;kCGX46=g;VuS(AQQ?bjP) z!}}M0ZzwM;>*h=9~5Tai;el2cw=|Bw*8tp z0bf9iW|FUnwoK^IFgF)B25mR@d071QxphkapMD*6%ve&I(>VmDlT4Bq}19}_FnAs+*;=v&>bEdBInrq z|NZS<FWAmm> zyDI&XlOL}LTr9$MR62i8W4|hgBE#K+=LhGmycj&OITh&)>dw#SAPbS54y6@>i&)#d zgNJ89Pg!}id*Rifk}s2GH`i8`N3ZU?TU8znU2L;LTl$EqvtrF!SvSR+uUEt4UpIla zbR0eEx-vv->ZzsP(;rRdbmDL@Ut_)foy$GWCkc{SU(3xh{sgW*TKW8Y|K9kR@Sc{l zKe8V4?c8~>ncbtwaOzahILW>*-=F;XdCoe@gHMJ1lTPcdNeczEbRNCkem^fK=SaJ7 zi$Fu(3*j5?i?1uNpZ4%mYjye~c?hyhSzx{8|3j0#TwzthL&upjFWsN~=a2hzzDFh= zbJ#jBXD^KmHxfCt@vXr*fnUFV^}X#We0fS3 z69fC4jhaIopUp-oi{s8Y-YW)-~aty_ha>bJ>`<3uU{R!^C~7{ zSLE8=KFgM<^o4mhvt2wn`OXaEC ze}4rA2^|7mUDP94@?n8a*|HTKPR?)d?%w?Nmg}3lH*YP7NHp5+cx9?bpv5!+uBHjo zr%#^-2Gggvzh+ZxVVH4ZVRk!Tnv4ry+Qmywe}7&4`FUH_|C@!IFTY!^`21aF^zVx| zBe%RZYdl)>iL>_WRGn{2HcmWr$Ybrc?DyxKuj_feKiA9~C9kP&*0D=SnZ;f3(2gBD z>i+(+{eGwTRGH29JH>y0eeLehg!N?>|U>n7t7w>t$ck;_ubvf&5oxZJ-xsd7=8^@RbEIi`1AYzf3sB& zg8gl;u8-e8RXhCMy}h^3pU;1KYU3mT)4}H41HTuHt z&za57+Rm)yU9@h^3Q#k!Pu99;-}9$WOaK4-+vmTd{(s$kyV{=fH+L4R+ig*3VJLah z{DJ?S{hodqpXn2NrE_<8PF)^$?C!yv|7<^;H8-g?dwWy)->v=wI^eUTJeN;Cdd|c= zxMGLubiSxNCqCWTI{WJG&pFM@+|TahU9?W;?wm8NALRf4Xm?upDxb?C%UOuRB}i8zbjfyZ`+i z?A@(Xb}V7RlN77MLv?$t|Htm`+-v>cEW_);qz#T&L|Zl}>+ku{6tt3ulk?@jO!q#S zKn)T7Js+6tb}6(l*f<8&UAnb7dt$TZoBRI8>9_u9t>gtS#+Jz}Kiny7QlgQ$)uYJ} zdf43Q)OsUhO|4UPdv}NI`X*OhzVb%G_l@2s*aE`^4ypfm$X~xAMC9c+GUsJc}-_xQr>c7clUnEiU| zH8nFYZTq&kX5H-^$gIV-;P?CL_kY>-&9C}9`1~Q+xfjm&|M{~dy?KQ;N20W}Sx$h4 zh_ZX%n}3cuHjOeQ|O)!*c>+%K?ZPi%F$X4zZW>hjK83GV7sR`4!br_kbNB6W6l z{=S=g->i+_AGa`I&(CMGrFz-srwBMP+yY&_b@kHf6APuG8<#K0-L{%gc;Njed87A_ z?&k)rd|~&l?ewe{88_GdoiW*2P_XP()ouUUoSRB}*X>gSH9P&*l!7@@ueh8%T#m7_=^ndzQ_`t} zzv97$l(3XKk^h24FS;fP1+6@h_um7$P`qQWGC%0>p4k0;DiVvqEy*b=i?cblMs;;< zn#^4C=9cQM-Q_lpfn9z#UUGH?l{j4yZMmS)a&19~mSW3~9(KOdr-HTpMdvy3&HV)0 zvvp~%b=j>s;3HV1O?y55an72(60{AO5xl0K-)_N$3-155+qcTILawAR+rD+mqqCOQ z_kIU1GJpQYB1iMy9N|({#hk|rt~zjhG~}0=c8_uIS2o+C7aq_(#NTcweR=yr|9nm7 zllccMRHx49P`R=C@|l?>4;uD-(=wla=y0T7jrz`edoMG3pX1yuwc*Je0odTkk`3Dm zoSv{exiE2>*sJUP=jLus->wUqKHhpo@y|C2o-YsE!8=93Lmf)%V^^)-e0gc}-R!oO zs_%Jip!1RHRtOb=0s&OhZJ4JkzWvCZK1V+P1(z>gSa{{~t#wM1VQFtCs&eX!^hX zn*@(Zo{X$**88{L_+Q0e4Qc&z`}588Et2Io9ya9fTX=J`r`mRto8G~yCaz&U*kM0E3w_LW7noF>rzx(wD&E2tgP15Z_c5};IifW zt9uX5Bs{q=FZFcBVK%ngvPC5xp0%8x@{>V_YIy4f2L(Ml!YO4nWlPk~H~mq6=kiL` zo8>=Sn*DrR`F7}vsz(<%1H;3vOkLBmA@}M*@F?U%g%$>Ziwl&S<+jZ1(ORodSZ4c?AFxGEPBqjbJwM2_D#1p{{F71)8piv`8iGQ zIor-xcVP>y&de1kRXqmXFxPMR=toD_F|H>LF6yAm2G1;8a?HKw{HimD0u?0vJw4wa zo*1IFt3JNW`Wooa+9hG$3$oMi?e5+IT50uenWUBCE3YNZ+Qo`CwZFc+yuAGVot@47 zhM+;83yZQ}R`1X+Qds0YeMNqJR$kiXue-N`&c*Iq?BD`9nJ1#W*)$Y#GS8;lhRu!O zBWzEWyydAbzi58y2q$v-(_X4M5IC{;eS{6KDusaFrmO7nzJ407|yF&XJpHCka zw7O0|wBoy7*o_$@zC@3k`dh)%yZnHOU7QU4ST9$QX z>I(L#XHGxST>(G2K6Tw8NaY$wvn}I0Tq)gcFcGx@ofH#`gJenG|P8@j`5oEa>|q?7qT)> z2zdESdAx7ymJ8S8FE8`m_Ui82#q4D-?!Mi?X>GBvcFScxcG=R@=4QQO#h4uh3n9}# zc9#@d7`~iXc_>)he{IPVmY(3C?fJ&C&X=3(9RJGf5s8j^Vy&vG$pbmmYwF{DoJ^`} zmyY#r%Ubicl4+r@boOpvv6~?`-c%;7^5wUEb;_(g?wM0WSlGA6^8bIdipQNebLI%U zG^n-uQ{&&_GhE02ZeIkxaIlBx*x`s(akFMje{rI8#nnp}78=c+G-;M0xP&@g@_o}L z4Wmn8Z@2!{(3EQ;gZwe-6ncwuuv(VhNXJgbIrc%|Fpbp8tZ@047@BMbmzwVRp4oV;yz z`?}aE+h$i@*Xug>F`;>d_RA|%|EvceidFUGTl4M9$;+%C^y$a@y}n*-C&lquLj|S6{cfqWAmv?ed^}(BScTVz z_r^VL*gAcROEddvu=V@>=FJO<*U!HHw&LZ2ue}!YV|TOmTC~UR2CraSv~I`x)z$z0 z8G+k#ixw@qcJ11_c^58SN~-DGaobdar~dct`*Y^Zsrz+#ewlL1{F+alAGhc4`RGUa9qqodUEkFF@%jm{W79s}J>0~^#Vx$Q z{Q1so^VPD?w`H4qf3Dc(ct!L+c*VFS_rsf;(?z+Ca_jF22oAn{wKyv)YhL}o%JlT- zSFVHzn(s|LEvBx%{Ca$S?a4{1v7Cu{dFu+fK7!AKxGrd7YP$F9wP-&-KRrFY%F0Ur zJ+BTlG9NRaV^{l2`2Dv--1-)lmVe)s@4x&KbRx6Qlh;?)AKr9GCcS?0wJCw)F13z^T*EqZ^h{(4?g@VUzCd5hkB%x_+y-S_&{ zy-le_VuxlLr)!CH@!P$4xcmRch$T!zo$%b0pDh=X&%0>dd2nN8XHyB&O5uk zmuA1;Xgb~H`aSSLT!GAfFU$y#ihDVda7rqy<_oLnigoXz>X^B3(AO7sh z^~uZCWB2R5p1Y@J=Ay-}@9r+Wy0!fB0`C>s@7?|^No`)Ct@rxXyVpT1#11W=Ul+A9ByMlj*5Aux_f~~246yn8h*|9Tqf7|MU_E{gO2i!JDE`dfuw=PXo9 z-%9=a0qGKzJZf1}zG-FWp+jf(m25Z;+SVNvTYdaqY!`TQH|Wl*725Y&0`8sm`||3l z_sS4C>#{Y!m&;n0`78|h^XIw!_PXxLYQ9B9MZccg|G!x_FFo98NA`8S$B$!q-{07n zd`$hv&!1auEpl!cJZ=t+jj1w9KF0G{xTvVeM{vKNr?+>r0MpIQ-(ST|pQ`6~dTvbE zt~Yykg&(Vq0^KcI^4qMO**dzU%<&P^aZONg?=1fDIJpOO)I*T}+Qu*CMurpp<_K&q z&%giX*H6#&+3&ZMPoKlP&2r)V`^nZymeQcU!rSk6i|_CAT3U2sg5q8K+z$^9amzubiLiYZr!?L?7VEw%h&(<^Z9(QzeV*oofd(Hbphfl zZs%P1u~;wQbiR3XbmjpDqlfa$Y%!WUjf~5dHD8%s=(XxKzfywzG`*!|_cxvTD!tx_ zi}&ctT8mVX+D?X?K^ht_?zF|-TnN`%*Ws*N%cQZ$Cquc z*sCdV^!@(-zxU7IQPKZg(rJznmyDSE48BPB}tfNmhJ3s z?~cxwt=^Wi(BFRQZ@+DjyA>WkgRU#xb;vhWZsNp=AOCzlFa4Zhs@K!?bzfI+zhC!z z{{KJEK@+i$mAP6U{d_*(fBUUcvf*Kc63S?+Na> zc=4jxoz#+hdn$LF)?ipNV{GXAIR!}f>r_v#963!Zwjdi{&Z z{vWO%n|C4L*8}EPkCM103qLQLF`X}ou~5gSzxCxtgS|N|7fy5vtEZix2ReK4cYi&o zW$@!TXhoxZ?U#!uC#xUL%(MG*;baOIH#g^N0j2{Y%?TfPK1_LiZ*7cc_VrKJd;ZM& z6S#1(%)&E#G7BV)pV+CYvQ7e>fO;wG>Av})p(THI*zPLJ{QAyz+p|e8?t&M+D!%GE zy{kw;am(B7cb|dUC+qio>Y6^{RbPc}l?rdqzi+nh2M)#;ZQMu2?ZWHzPRHKf)+?s_s3a%Rd}6o1`{A;A z`F_p!Qrz5&4U=UOyt=BP=cq=$`+f74*TjjSO%F-I=jz{sE7JF%iu8TU3hlVpufW&Q z+`e?xw8h0F_m;`y^?Gr8Zaiduv*=^^<>mhMkHU{t&)oOrk~i|1gInLFl?ga0R6m

#kZfPkZcWy!U^PT0} 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%0A6sYX72a#GT(7e*f|I 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

XyTgW#7)u=FeNSBxvR0W+5Su<;lNp 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 KT-G@yGywo8jj`?k literal 0 HcmV?d00001 diff --git a/protocol/forks/2020-05-15-sigchecks.md b/protocol/forks/2020-05-15-sigchecks.md new file mode 100644 index 0000000..0053d26 --- /dev/null +++ b/protocol/forks/2020-05-15-sigchecks.md @@ -0,0 +1,167 @@ +# 2020-05-15 SigChecks + + layout: specification + title: 2020-MAY-15 script SigChecks counting and limiting specification + date: 2020-03-05 + category: spec + activation: 1589544000 + version: 0.2 (DRAFT) + author: Mark B. Lundeberg + +# Summary + +Bitcoin Cash's SigOps counting and limiting system will be replaced with a new system, referred to as SigChecks. + +# Motivation + +Since early days, Bitcoin has had a SigOps counting rule for limiting the amount of CPU usage possible in a given transaction or block, based on the principle that signature verifications are by far the most CPU-intense operations. + +Although partly effective, there are well known issues with sigops, which mainly stem from the fact that SigOps are judged by parsing scripts, rather than executing them. +Bitcoin splits scripts into two transactions (the scriptPubKey of the transaction that creates a coin, and the scriptSig of the transaction that spends it), yet the actual CPU work of verifying a transaction solely happens in the spending transaction, and this leads to some paradoxical situations: a transaction/block that contains high sigops might involve very little CPU work, and conversely a transaction with low sigops may require very high CPU work. + +The essential idea of SigChecks is to perform counting solely in the spending transaction, and count actual executed signature check operations. + +# Specification + +## Counting rule + +The SigChecks count for a given script is discovered during execution of the script. + +- Executing OP_CHECKSIG / OP_CHECKSIGVERIFY / OP_CHECKDATASIG / OP_CHECKDATASIGVERIFY increments SigChecks by: + - +0, if signature is NULL. + - +1, if signature is non-NULL. +- Executing an M-of-N OP_CHECKMULTISIG / OP_CHECKMULTISIGVERIFY increments SigChecks by: + - +0, if all M signatures are NULL. + - +M, if at least one signature is non-NULL and the verification is in [New/Schnorr mode](/protocol/forks/2019-11-15-schnorrmultisig) (dummy element is non-NULL). + - +N, if at least one signature is non-NULL and the verification is in Old/ECDSA mode (dummy element is NULL). + +Here NULL means a script stack element that has length 0; passing NULL in place of an expected signature is the canonical way of cancelling the signature check, i.e., making the signature checking opcode fail / return false (and the only way permitted way to cause this result ever since NULLFAIL rule activated). + +## Per-block limitation (consensus rule) + +After activation, any block where the total number of SigChecks accumulated (during all script executions - scriptSig, scriptPubKey, and P2SH redeemScript - in all inputs excepting coinbase) violates the following limit based on the maximum block size shall be rejected: + + block_SigChecks <= max_Blocksize // 141 + +Here, max_Blocksize refers to the consensus limit that is enforced on the full serialized block size (including block header, transaction counter, and all serialized transaction). + +Currently, `max_BlockSize` = 32000000 so the maximum allowed `block_SigChecks` would be 226950 for all blocks. However, in future block size increases, it should be assumed that the SigChecks limit increases proportionally. + +## Per-transaction limits (consensus rule) + +After activation, any transaction where the total number of SigChecks accumulated (during all script executions - scriptSig, scriptPubKey, and P2SH redeemScript - in all inputs excepting coinbase) violates the following limit shall be rejected: + + transaction_SigChecks <= 3000 + +## Per-input limitation (standardness rule) + +For a given transaction input, the number of SigChecks accumulated during all script execution (scriptSig, scriptPubKey, and P2SH redeemScript) is to be limited according to the byte-length of the scriptSig, `len_scriptSig`: + + txin_SigChecks <= (len_scriptSig + 60) // 43, where // indicates floor division. + - or equivalently - + len_scriptSig >= 43 * txin_SigChecks - 60 + +Any transaction that contains an input violating this limit should be rejected from nodes' mempools and not relayed. However, blocks may contain inputs that violate this limit. + +This is only a non-consensus standardness (transaction relay) rule, meaning that transactions within blocks do not need to obey this rule. Nodes should only enforce this rule starting at the activation time, and if any transactions in mempool violate this rule at precisely the time of activation, they should be ejected. + +## Removal of SigOps + +After the activation, nodes shall disable the all consensus rules and all standardness rules relating to the old SigOps counting mechanism. There are four such rules: + +- The consensus limit of 20000 sigops per MB of block shall be disabled. +- The consensus limit of 20000 sigops per transaction shall be disabled. +- The standardness limit of 4000 sigops per transaction shall be disabled. +- The standardness limit of 15 sigops per P2SH input shall be disabled. + +## Notes + +- The question of whether all signatures are null is not precisely the inverse of whether the opcode returns true/false to stack: consider the case of 0-of-N OP_CHECKMULTISIG, which always returns true, yet also has "all null" signatures. Also, historically pre-NULLFAIL opcodes would return false for non-null invalid signatures, instead of failing. + +# Rationale and commentary on design decisions + +## Counting rule + +The proposed counting rule is easy to implement, but it's not the simplest / most obvious approach. There is one primary design feature we wanted to ensure: *The proposed counting rule means that the sigchecks count can be evaluated by executing a script with a 'dummy'/deferred signature verifier, i.e., without performing any CPU-intensive elliptic curve math.* + +We currently have the NULLFAIL rule, which means that signature check opcodes will either: +- fail with error, because the non-null signatures were not valid, or there was a mixture of null / non-null signatures, or because the checked public keys were incorrectly encoded, or some other reason. +- return true, if all signatures are non-null and valid, or, +- return false, if all signatures are null and there is at least 1 signature. + +Right now, nodes can optionally use this fact to defer public key and signature checks until after script execution, simply placing true/false on stack depending on whether the signatures are null or not, and continuing execution as if the checks were done. +Later, after the script has finished executing successfully, the deferred checks can be finally executed to determine whether the script should in fact be failed entirely. +This deferment allows some efficiency advantages (like allowing Schnorr batch validation, fast rejection of some invalid blocks/transactions, etc.). + +The simplest imaginable rule would be to only count signature check function calls that are actually done. +The main problem with this approach is that M-of-N ECDSA multisig verifications perform a variable number of signature checks, at least M but as many as N. +Some of these checks fail, some succeed. The count would then be only determinable by actually performing full signature checks. +With the deferment mentioned above, this would mean that any limits on sigchecks could not be accurately enforced before actually carrying out the signature checks. + +A secondary aspect of counting is that when all signatures are null, we assign a sigchecks count of 0. +This is a rare case since most scripts want only valid signatures anyway. +However, it does increase accuracy of the count, and it can be useful in smart contracting to use null signatures instead of booleans to control branching flows (booleans pushed from scriptSig can be malleated). +Since it is easy to implement the 0 sigchecks counting and it's more accurate that way, we decided to include this. + +## Why have limits? + +The SigOps and SigChecks limits exist solely to limit the impact of denial of service attacks. There are a variety of attacks that might occur, but these are the main ones: +- An attacking miner can craft valid/invalid blocks packed full with valid and CPU-intensive non-standard scripts that would require huge amounts of time (perhaps hours) to validate. +- Anyone may flood the mempool with valid but CPU-intensive transactions. Since these are valid, they will be propagated to all nodes 'for free' and load down the network. + +While these might sound bad, it's worth noting that the disruption would be temporary. +The mempool and block attack vectors are essentially decoupled since efficient nodes use transaction validity caching: if they have accepted a transaction already, they don't need to re-verify it when they see it mined in a block. +Also, CPU-intensive blocks do not cause any kind of "permanent damage" to new nodes coming online, since again efficient nodes typically provide for an 'assume-valid' setting that only requires fully verifying recent blocks. + +*Blocks*: +Slow blocks can be made without any setup, but the slowest possible block would require a many setup blocks to be mined beforehand that generate attack outputs. +These attack outputs would then all be spent in the attack block. +Since scripts are limited to 201 opcodes and inputs are at least 41 bytes, this could achieve about 5 signature checks for every byte in the spending block, or 160 million signature checks with today's maximum block size. +As a rough rule of thumb, each signature check takes 50 microseconds, so such a block would take a couple of CPU-hours to validate (though this is trivially parallelized). +The proposed limit of 141 bytes / sigcheck cuts the worst case down by a factor of 700. +The main motivation here isn't just to ensure nondisruption with current block sizes, but also to make sure future block size increases can be made with needing to worry so much about slow block attacks. + +*Mempool*: +As far as mempool attacks go, these currently are already greatly limited by standardness rules on mainnet that 1) whitelist only certain allowed output script templates and 2) limit P2SH to 15 sigops. +If either rule were simply removed, it would permit abusive scripts that perform a large number of verifications in a tight space. +Since we are planning to remove sigops, then something needs to go in place of that P2SH sigops rule. +Besides limiting the density of CPU usage, it also makes sense to limit signature checks density in transactions as a *support* for the block limit: we don't want that the mempool can be totally filled with high-sigchecks transactions that take ages to clear out (since each block can only consume so many of them). + +It's worth pointing out some of the indirect limits that are created as a result: +- As mentioned above it is impossible for the number of SigChecks in an input to exceed 201, which is the current limit on the 'opcode count' for a single script. + - However, a mainnet standard transaction cannot have a scriptSig longer than 1650 bytes, which means an input in a standard transaction won't be able to have more than 39 SigChecks. +- The per-input rule means that the overall density of SigChecks in a standard transaction cannot exceed 33.5 bytes / SigCheck. This occurs with many inputs having each two SigChecks in a scriptSig of length 26, i.e., an input of size 26+41 = 67 bytes. + - Due to additional script template standardness rules on mainnet, it is practically not possible to produce such a short scriptSig containing two sigchecks. So, practically one can only achieve 36.67 bytes/SigCheck (three SigChecks in a scriptSig of length 69), using 1-of-3 bare multisignatures or some P2SH tricks. +- Likewise standard transactions on mainnet are limited to 100000 bytes, so a standard transaction won't be able to have more than 3000 sigchecks. + +## Choice of numbers + +The numbers proposed for the per-input and per-block limits are based on an examination of current typical uses, and an examination of the historical blockchain. + +The per-input limit is designed to support the two most extreme standard use cases, which deserve continuing support and (though rare) are still used occasionally: + +* Spending a bare 1-of-3 multisignature in ECDSA mode will have 3 SigChecks in around 73 bytes. (Bare multisigs like 1-of-4 and beyond are nonstandard to fund.) +* Spending a P2SH 1-of-15 multisignature in ECDSA mode will have 15 SigChecks in around 589 bytes. + +The proposed per-input rule is a line interpolating between those two cases, with a spare allowance of 4 bytes for each (since ECDSA signatures are variable size, and very rarely are they shorter than this in normal usage). + +Typical use cases are much much lower density than these. P2PK and P2PKH have 1 SigCheck in ~70 bytes and ~105 bytes respectively, and most P2SH multisignatures are 2-of-3 spent with ECDSA which have 3 SigChecks in a ~250 byte scriptSig. I've plotted the common standard use cases below. As can be seen + +![Input sigchecks plotted for various standard scripts](/protocol/forks/2020-05-15-sigchecks-plotinputs.png) + +The block limit is based on an examination of normal usage patterns and observations on historical blocks. Historically, the bulk (75%) of blocks have had a density of between 150 and 250 bytes/SigCheck, and the average density of the whole chain is 176 bytes/SigCheck. Only 2% of blocks have been more dense than 141 bytes/SigCheck. This matches the fact that the vast majority of inputs/outputs are P2PKH, which on the whole (considering funding and spending) have a density of around 182 bytes/SigCheck. Rarely, one sees a block that is packed full of an unusually high fraction of P2SH 2-of-3 multisignature consolidations, which pushes down to the 100 bytes/SigCheck level. Blocks more dense than 98 bytes/SigCheck have been extremely rare, making up 0.01% of blocks. + +The exact number of 141 bytes/SigCheck comes from considering a fairly common use case, which is consolidating many P2PKH inputs. If done with Schnorr signatures then each input is 141 bytes and one SigCheck. + +The choice of 141 bytes/SigCheck for a block is ~4x times more aggressive than the ~36.67 bytes/SigCheck standardness rule. It's worth emphasizing however that this block limit is based on the maximum block size. Thus, it may happen that a normally mined block has an actual density of ~36.67 bytes/SigCheck, however, such a block could not be more than ~1/4th of the maximum block byte size. + +A histogram of historical block densities is plotted below: +![Block sigchecks density historically (up to mid-2019)](/protocol/forks/2020-05-15-sigchecks-plotblocks.png) + +# Implementation + +**Implementation information to be added - TBD** + +# Acknowledgements + +Thanks to Amaury Sechet, Josh Green, Tobias Ruck, Tyler Smith, Calin Culianu, and Andrew Stone for valuable feedback. \ No newline at end of file diff --git a/protocol/forks/2020-11-15-asert-test-vectors.zip b/protocol/forks/2020-11-15-asert-test-vectors.zip new file mode 100644 index 0000000000000000000000000000000000000000..bc5e96e707f916f7fe68ceed989046c2466b5413 GIT binary patch literal 156307 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 JV`5-n001K;ARzz% literal 0 HcmV?d00001 diff --git a/protocol/forks/2020-11-15-asert.md b/protocol/forks/2020-11-15-asert.md new file mode 100644 index 0000000..cb75c9e --- /dev/null +++ b/protocol/forks/2020-11-15-asert.md @@ -0,0 +1,428 @@ +# 2020-11-15 ASERT + + layout: specification + title: ASERT Difficulty Adjustment Algorithm (aserti3-2d) + date: 2020-08-17 + category: spec + activation: 1605441600 + version: 0.6.3 + author: freetrader, Jonathan Toomim, Calin Culianu, Mark Lundeberg, Tobias Ruck + +## Summary + +Activation of a new new difficulty adjustment algorithm 'aserti3-2d' +(or 'ASERT' for short) for the November 2020 Bitcoin Cash upgrade. Activation will be +based on MTP, with the last pre-fork block used as the anchor block. + +## Motivation + +- To eliminate periodic oscillations in difficulty and hashrate +- To reduce the difference in profitability between steady miners and + those who switch to mining other blockchains. +- To maintain average block intervals close to the 10 minute target. +- To bring the average transaction confirmation time close to target time. + +## Technical background + +The November 2017 Bitcoin Cash upgrade introduced a simple moving average as +difficulty adjustment algorithm. This change unfortunately introduced daily +periodic difficulty oscillations, which resulted in long confirmation times +followed by a burst of rapid blocks. This harms the user experience of Bitcoin +Cash, and punishes steady hashrate miners. + +Research into the family of difficulty algorithms based on an exponential +moving average (EMA) resulted in ASERT (Absolutely Scheduled Exponentially +Rising Targets) [[1]](#references), which has been developed by Mark Lundeberg in 2019 and +fully described by him in 2020. An equivalent formula was independently +discovered in 2018 by Jacob Eliosoff and in 2020 by Werner et. al [[6]](#references). + +ASERT does not have the same oscillations as the DAA introduced in the November +2017 upgrade and has a range of other attractive qualities such as robustness +against singularities [[15]](#references) without a need for additional rules, and absence of +accumulation of rounding/approximation errors. + +In extensive simulation against a range of other stable algorithms [[2]](#references), +an ASERT algorithm performed best across criteria that included: + +- Average block times closest to an ideal target time of 600 seconds. +- Average transaction confirmation times closest to the target time. +- Reducing the advantage of non-steady mining strategies, thereby maximizing + the relative profitability of steady mining. + +## Specification + +### Terms and conventions + +* Fork block: The first block mined according to the new consensus rules. +* Anchor block: The parent of the fork block. + + +### Requirements + +#### Target computation +The current block's target bits are calculated by the following algorithm. + +The aserti3-2d algorithm can be described by the following formula: + +``` +next_target = anchor_target * 2**((time_delta - ideal_block_time * (height_delta + 1)) / halflife) +``` + +where: + +- `anchor_target` is the unsigned 256 bit integer equivalent of the `nBits` value in + the header of the anchor block. +- `time_delta` is the difference, in signed integer seconds, between the + timestamp in the header of the current block and the timestamp in the + parent of the anchor block. +- `ideal_block_time` is a constant: 600 seconds, the targeted + average time between blocks. +- `height_delta` is the difference in block height between the current + block and the anchor block. +- `halflife` is a constant parameter sometimes referred to as + 'tau', with a value of 172800 (seconds) on mainnet. +- `next_target` is the integer value of the target computed for the block + after the current block. + +The algorithm below implements the above formula using fixed-point integer +arithmetic and a cubic polynomial approximation to the 2^x term. + +The 'target' values used as input and output are the compact representations +of actual 256-bit integer targets as specified for the 'nBits' field in the +block header. + + +Python-code, uses Python 3 syntax: + +```python +def next_target_aserti3_2d( + anchor_height: int, # height of the anchor block. + anchor_parent_time: int, # timestamp (nTime) of the parent of the anchor block. + anchor_bits: int, # 'nBits' value of the anchor block. + current_height: int, # height of the current block. + current_time: int, # timestamp of the current block. +) -> int: # 'target' nBits of the current block. + ideal_block_time = 600 # in seconds + halflife = 172_800 # 2 days (in seconds) + radix = 2**16 # 16 bits for decimal part of fixed-point integer arithmetic + max_bits = 0x1d00_ffff # maximum target in nBits representation + max_target = bits_to_target(max_bits) # maximum target as integer + + anchor_target = bits_to_target(anchor_bits) + time_delta = current_time - anchor_parent_time + height_delta = current_height - anchor_height # can be negative + # `//` is truncating division (int.__floordiv__) - see note 3 below + exponent = time_delta - ideal_block_time * (height_delta + 1) // halflife + + # Compute equivalent of `num_shifts = math.floor(exponent / 2**16)` + num_shifts = exponent >> 16 + + exponent = exponent - num_shifts * radix + factor = ((195_766_423_245_049 * exponent + + 971_821_376 * exponent**2 + + 5_127 * exponent**3 + + 2**47) >> 48) + radix + next_target = anchor_target * factor + + # Calculate `next_target = math.floor(next_target * 2**factor)` + if num_shifts < 0: + next_target >>= -num_shifts + else: + # Implementations should be careful of overflow here (see note 6 below). + next_target <<= num_shifts + + next_target >>= 16 + if next_target == 0: + return target_to_bits(1) # hardest valid target + + if next_target > max_target: + return max_bits # limit on easiest target + return target_to_bits(next_target) +``` + +Note 1: The reference implementations make use of signed integer arithmetic. + Alternative implementations may use strictly unsigned integer + arithmetic. + +Note 2: All implementations should strictly avoid use of floating point + arithmetic in the computation of the exponent. + +Note 3: In the calculation of the exponent, truncating integer division [[7, 10]](#references) + must be used, as indicated by the `//` division operator (`int.__floordiv__`). + +Note 5: The convenience functions `bits_to_target()` and `target_to_bits()` + are assumed to be available for conversion between compact 'nBits' + and unsigned 256-bit integer representations of targets. + Examples of such functions are available in the C++ and Python3 + reference implementations. + +Note 6: If a limited-width integer type is used for `current_target`, then the `<<` + operator may cause an overflow exception or silent discarding of + most-significant bits. + Implementations must detect and handle such cases to correctly emulate + the behaviour of an unlimited-width calculation. Note that if the result + at this point would exceed `radix * max_target` then `max_bits` may be returned + immediately. + +Note 7: The polynomial approximation that computes `factor` must be performed + with 64 bit unsigned integer arithmetic or better. It *will* + overflow a signed 64 bit integer. Since exponent is signed, it may be + necessary to cast it to unsigned 64 bit integer. In languages like + Java where long is always signed, an unsigned shift `>>> 48` must be + used to divide by 2^48. + + +#### Activation + +The ASERT algorithm will be activated according to the top-level upgrade spec [[3]](#references). + +#### Anchor block + +ASERT requires the choice of an anchor block to schedule future target +computations. + +The first block with an MTP that is greater/equal to the upgrade activation time +will be used as the anchor block for subsequent ASERT calculations. + +This corresponds to the last block mined under the pre-ASERT DAA rules. + +Note 1: The anchor block is the block whose height and target + (nBits) are used as the 'absolute' basis for ASERT's + scheduled target. The timestamp (nTime) of the anchor block's + *parent* is used. + +Note 2: The height, timestamp, and nBits of this block are not known ahead of + the upgrade. Implementations MUST dynamically determine it across the + upgrade. Once the network upgrade has been consolidated by + sufficient chain work or a checkpoint, implementations can simply + hard-code the known height, nBits and associated (parent) timestamp + this anchor block. Implementations MAY also hard-code other equivalent + representations, such as an nBits value and a time offset from the + genesis block. + + +#### REQ-ASERT-TESTNET-DIFF-RESET (testnet difficulty reset) + +On testnet, an additional rule will be included: Any block with a timestamp +that is more than 1200 seconds after its parent's timestamp must use an +nBits value of `max_bits` (`0x1d00ffff`). + + +## Rationale and commentary on requirements / design decisions + +1. Choice of anchor block determination + + Choosing an anchor block that is far enough in the past would result + in slightly simpler coding requirements but would create the possibility + of a significant difficulty adjustment at the upgrade. + + The last block mined according to the old DAA was chosen since this block is + the most proximal anchor and allows for the smoothest transition to the new + algorithm. + +2. Avoidance of floating point calculations + + Compliance with IEEE-754 floating point arithmetic is not generally + guaranteed by programming languages on which a new DAA needs to be + implemented. This could result in floating point calculations yielding + different results depending on compilers, interpreters or hardware. + + It is therefore highly advised to perform all calculations purely using + integers and highly specific operators to ensure identical difficulty + targets are enforced across all implementations. + +3. Choice of half-life + + A half-life of 2 days (`halflife = 2 * 24 * 3600`), equivalent to an e^x-based + time constant of `2 * 144 * ln(2)` or aserti3-415.5, was chosen because it reaches + near-optimal performance in simulations by balancing the need to buffer + against statistical noise and the need to respond rapidly to swings in price + or hashrate, while also being easy for humans to understand: For every 2 days + ahead of schedule a block's timestamp becomes, the difficulty doubles. + +4. Choice of approximation polynomial + + The DAA is part of a control system feedback loop that regulates hashrate, + and the exponential function and its integer approximation comprise its + transfer function. As such, standard guidelines for ensuring control system + stability apply. Control systems tend to be far more sensitive to + differential nonlinearity (DNL) than integral nonlinearity (INL) in their + transfer functions. Our requirements were to have a transfer function that + was (a) monotonic, (b) contained no abrupt changes, (c) had precision and + differential nonlinearity that was better than our multi-block statistical + noise floor, (d) was simple to implement, and (e) had integral nonlinearity + that was no worse than our single-block statistical noise floor. + + A simple, fast to compute cubic approximation of 2^x for 0 <= x < 1 was + found to satisfy all of these requirements. It maintains an absolute error + margin below 0.013% over this range [8]. In order to address the full + (-infinity, +infinity) domain of the exponential function, we found the + `2**(x + n) = 2**n * 2**x` identity to be of use. Our cubic approximation gives + the exactly correct values `f(0) == 1` and `f(1) == 2`, which allows us to + use this identity without concern for discontinuities at the edges of the + approximation's domain. + + First, there is the issue of DNL. Our goal was to ensure that our algorithm + added no more than 25% as much noise as is inherent in our dataset. Our + algorithm is effectively trying to estimate the characteristic hashrate over + the recent past, using a 2-day (~288-block) half-life. Our expected + exponential distribution of block intervals has a standard deviation (stddev) + of 600 seconds. Over a 2-day half-life, our noise floor in our estimated + hashrate should be about `sqrt(1 / 288) * 600` seconds, or 35.3 seconds. Our + chosen approximation method is able to achieve precision of 3 seconds in most + circumstances, limited in two places by 16-bit operations: + `172800 sec / 65536 = 2.6367 sec` + Our worst-case precision is 8 seconds, and is limited by the worst-case + 15-bit precision of the nBits value. This 8 second worst-case is not within + the scope of this work to address, as it would require a change to the block + header. Our worst-case step size is 0.00305%,[[11]](#references) due to the worst-case + 15-bit nBits mantissa issue. Outside the 15-bit nBits mantissa range, our + approximation has a worst-case precision of 0.0021%. Overall, we considered + this to be satisfactory DNL performance. + + Second, there is the issue of INL. Simulation testing showed that difficulty + and hashrate regulation performance was remarkably insensitive to + integral non-linearity. We found that even the use of `f(x) = 1 + x` as an + approximation of `2**x` in the `aserti1` algorithm was satisfactory when + coupled with the `2**(x + n) = 2^n * 2^x` identity, despite having 6% + worst-case INL.[[12, 13]](#references) An approximation with poor INL will still show good + hashrate regulation ability, but will have a different amount of drift for a + given change in hashrate depending on where in the \[0, 1) domain our exponent + (modulo 1) lies. With INL of +/- 1%, for any given difficulty (or target), a + block's timestamp might end up being 1% of 172800 seconds ahead of or behind + schedule. However, out of an abundance of caution, and because achieving + higher precision was easy, we chose to aim for INL that would be comparable + to or less than the typical drift that can be caused by one block. Out of + a 2-day half-life window, one block's variance comprises: + `600 / 172800 = 0.347%` + Our cubic approximation's INL performance is better than 0.013%,[[14]](#references) which + exceeds that requirement by a comfortable margin. + +5. Conversion of difficulty bits (nBits) to 256-bit target representations + + As there are few calculations in ASERT which involve 256-bit integers + and the algorithm is executed infrequently, it was considered unnecessary + to require more complex operations such as doing arithmetic directly on + the compact target representations (nBits) that are the inputs/output of + the difficulty algorithm. + + Furthermore, 256-bit (or even bignum) arithmetic is available in existing + implementation and used within the previous DAA. Performance impacts are + negligible. + +6. Choice of 16-bits of precision for fixed-point math + + The nBits format is comprised of 8 bits of base_256 exponent, followed by a + 24-bit mantissa. The mantissa must have a value of at least 0x008000, which + means that the worst-case scenario gives the mantissa only 15 bits of + precision. The choice of 16-bit precision in our fixed point math ensures + that overall precision is limited by this 15-bit nBits limit. + +7. Choice of name + + The specific algorithm name 'aserti3-2d' was chosen based on: + + - the 'i' refers to the integer-only arithmetic + - the '3' refers to the cubic approximation of the exponential + - the '2d' refers to the 2-day (172800 second) halflife + + +## Implementation advice + +Implementations must not make any rounding errors during their calculations. +Rounding must be done exactly as specified in the algorithm. In practice, +to guarantee that, you likely need to use integer arithmetic exclusively. + +Implementations which use signed integers and use bit-shifting must ensure +that the bit-shifting is arithmetic. + +Note 1: In C++ compilers, right shifting negative signed integers + is formally unspecified behavior until C++20 when it + will become standard [[5]](#references). In practice, C/C++ compilers + commonly implement arithmetic bit shifting for signed + numbers. Implementers are advised to verify good behavior + through compile-time assertions or unit tests. + + +## Reference implementations + +- C++ code for aserti3-2d (see pow.cpp): https://reviews.bitcoinabc.org/D7174 +- Python3 code (see contrib/testgen/validate_nbits_aserti3_2d.py): https://gitlab.com/bitcoin-cash-node/bitcoin-cash-node/-/merge_requests/692 +- Java code: https://github.com/pokkst/asert-java + + +## Test vectors + +Test vectors suitable for validating further implementations of the aserti3-2d +algorithm are available at: + + [Here](/protocol/forks/2020-11-15-asert-test-vectors.zip) + +alternatively at: + + https://gitlab.com/bitcoin-cash-node/bchn-sw/qa-assets/-/tree/master/test_vectors/aserti3-2d + +and alternatively at: + + https://download.bitcoincashnode.org/misc/data/asert/test_vectors + + +## Acknowledgements + +Thanks to Mark Lundeberg for granting permission to publish the ASERT paper [[1]](#references), +Jonathan Toomim for developing the initial Python and C++ implementations, +upgrading the simulation framework [[9]](#references) and evaluating the various difficulty +algorithms. + +Thanks to Jacob Eliosoff, Tom Harding and Scott Roberts for evaluation work +on the families of EMA and other algorithms considered as replacements for +the Bitcoin Cash DAA, and thanks to the following for review and their +valuable suggestions for improvement: + +- Andrea Suisani (sickpig) +- BigBlockIfTrue +- Fernando Pellicioni +- imaginary_username +- mtrycz +- Jochen Hoenicke +- John Nieri (emergent_reasons) +- Tom Zander + + +## References + +[1] "[Static difficulty adjustments, with absolutely scheduled exponentially rising targets (DA-ASERT) -- v2](http://toom.im/files/da-asert.pdf)", Mark B. Lundeberg, July 31, 2020 + +[2] "[BCH upgrade proposal: Use ASERT as the new DAA](https://read.cash/@jtoomim/bch-upgrade-proposal-use-asert-as-the-new-daa-1d875696)", Jonathan Toomim, 8 July 2020 + +[3] [Bitcoin Cash November 15, 2020 Upgrade Specification](2020-11-15-upgrade.md). + +[4] + +[5] + +[6] "[Unstable Throughput: When the Difficulty Algorithm Breaks](https://arxiv.org/pdf/2006.03044.pdf)", Sam M. Werner, Dragos I. Ilie, Iain Stewart, William J. Knottenbelt, June 2020 + +[7] "[Different kinds of integer division](https://harry.garrood.me/blog/integer-division)", Harry Garrood, blog, 2018 + +[8] [Error in a cubic approximation of 2^x for 0 <= x < 1](https://twitter.com/MarkLundeberg/status/1191831127306031104) + +[9] Jonathan Toomim adaptation of kyuupichan's difficulty algorithm simulator: + +[10] "[The Euclidean definition of the functions div and mod](dl.acm.org/doi/10.1145/128861.128862)", Raymond T. Boute, 1992, ACM Transactions on Programming Languages and Systems (TOPLAS). 14. 127-144. 10.1145/128861.128862 + +[11] + +[12] [f(x) = (1 + x)/2^x for 0 + +[14] + +[15] + + +## License + +This specification is dual-licensed under the Creative Commons CC0 1.0 Universal and +GNU All-Permissive licenses. \ No newline at end of file diff --git a/protocol/forks/bip-0009-states.png b/protocol/forks/bip-0009-states.png new file mode 100644 index 0000000000000000000000000000000000000000..09312a1c0381845d10afe2ffbbec912ee1b1b1e0 GIT binary patch literal 30632 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 V8piEj#eBIiT4PV+ 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 Hr-UW|v!; + Peter Todd + Greg Maxwell + Rusty Russell + Comments-Summary: No comments yet. + Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0009 + Status: Final + Type: Informational + Created: 2015-10-04 + License: PD + +## Abstract + +This document specifies a proposed change to the semantics of the 'version' field in Bitcoin blocks, allowing multiple backward-compatible changes (further called "soft forks") to be deployed in parallel. It relies on interpreting the version field as a bit vector, where each bit can be used to track an independent change. These are tallied each retarget period. Once the consensus change succeeds or times out, there is a "fallow" pause after which the bit can be reused for later changes. + +## Motivation + +[BIP 34](/protocol/forks/bip-0034) introduced a mechanism for doing soft-forking changes without a predefined flag timestamp (or flag block height), instead relying on measuring miner support indicated by a higher version number in block headers. As it relies on comparing version numbers as integers however, it only supports one single change being rolled out at once, requiring coordination between proposals, and does not allow for permanent rejection: as long as one soft fork is not fully rolled out, no future one can be scheduled. + +In addition, BIP 34 made the integer comparison (nVersion >= 2) a consensus rule after its 95% threshold was reached, removing 231+2 values from the set of valid version numbers (all negative numbers, as nVersion is interpreted as a signed integer, as well as 0 and 1). This indicates another downside this approach: every upgrade permanently restricts the set of allowed nVersion field values. This approach was later reused in [BIP 66](/protocol/forks/bip-0066) and [BIP 65](/protocol/forks/bip-0065), which further removed nVersions 2 and 3 as valid options. As will be shown further, this is unnecessary. + +## Specification + +Each soft fork deployment is specified by the following per-chain parameters (further elaborated below): + +1. The **name** specifies a very brief description of the soft fork, reasonable for use as an identifier. For deployments described in a single BIP, it is recommended to use the name "bipN" where N is the appropriate BIP number. +2. The **bit** determines which bit in the nVersion field of the block is to be used to signal the soft fork lock-in and activation. It is chosen from the set {0,1,2,...,28}. +3. The **starttime** specifies a minimum median time past of a block at which the bit gains its meaning. +4. The **timeout** specifies a time at which the deployment is considered failed. If the median time past of a block >= timeout and the soft fork has not yet locked in (including this block's bit state), the deployment is considered failed on all descendants of the block. + +### Selection guidelines + +The following guidelines are suggested for selecting these parameters for a soft fork: + +1. **name** should be selected such that no two softforks, concurrent or otherwise, ever use the same name. +2. **bit** should be selected such that no two concurrent softforks use the same bit. +3. **starttime** should be set to some date in the future, approximately one month after a software release date including the soft fork. This allows for some release delays, while preventing triggers as a result of parties running pre-release software. +4. **timeout** should be 1 year (31536000 seconds) after starttime. + +A later deployment using the same bit is possible as long as the starttime is after the previous one's +timeout or activation, but it is discouraged until necessary, and even then recommended to have a pause in between to detect buggy software. + +### States + +With each block and soft fork, we associate a deployment state. The possible states are: + +1. **DEFINED** is the first state that each soft fork starts out as. The genesis block is by definition in this state for each deployment. +2. **STARTED** for blocks past the starttime. +3. **LOCKED_IN** for one retarget period after the first retarget period with STARTED blocks of which at least threshold have the associated bit set in nVersion. +4. **ACTIVE** for all blocks after the LOCKED_IN retarget period. +5. **FAILED** for one retarget period past the timeout time, if LOCKED_IN was not reached. + +### Bit flags + +The nVersion block header field is to be interpreted as a 32-bit little-endian integer (as present), and bits are selected within this integer as values (1 << N) where N is the bit number. + +Blocks in the STARTED state get an nVersion whose bit position bit is set to 1. The top 3 bits of such blocks must be +001, so the range of actually possible nVersion values is [0x20000000...0x3FFFFFFF], inclusive. + +Due to the constraints set by BIP 34, BIP 66 and BIP 65, we only have 0x7FFFFFFB possible nVersion values available. +This restricts us to at most 30 independent deployments. By restricting the top 3 bits to 001 we get 29 out of those +for the purposes of this proposal, and support two future upgrades for different mechanisms (top bits 010 and 011). +When a block nVersion does not have top bits 001, it is treated as if all +bits are 0 for the purposes of deployments. + +Miners should continue setting the bit in LOCKED_IN phase so uptake is visible, though this has no effect on +consensus rules. + +### New consensus rules + +The new consensus rules for each soft fork are enforced for each block that has ACTIVE state. + +### State transitions + +![State transition diagram](/protocol/forks/bip-0009-states.png) + +The genesis block has state DEFINED for each deployment, by definition. + + State GetStateForBlock(block) { + if (block.height == 0) { + return DEFINED; + } + +All blocks within a retarget period have the same state. This means that if +floor(block1.height / 2016) = floor(block2.height / 2016), they are guaranteed to have the same state for every +deployment. + + if ((block.height % 2016) != 0) { + return GetStateForBlock(block.parent); + } + +Otherwise, the next state depends on the previous state: + + switch (GetStateForBlock(GetAncestorAtHeight(block, block.height - 2016))) { + +We remain in the initial state until either we pass the start time or the timeout. GetMedianTimePast in the code below +refers to the median nTime of a block and its 10 predecessors. The expression GetMedianTimePast(block.parent) is +referred to as MTP in the diagram above, and is treated as a monotonic clock defined by the chain. + + case DEFINED: + if (GetMedianTimePast(block.parent) >= timeout) { + return FAILED; + } + if (GetMedianTimePast(block.parent) >= starttime) { + return STARTED; + } + return DEFINED; + +After a period in the STARTED state, if we're past the timeout, we switch to FAILED. If not, we tally the bits set, +and transition to LOCKED_IN if a sufficient number of blocks in the past period set the deployment bit in their +version numbers. The threshold is ≥1916 blocks (95% of 2016), or ≥1512 for testnet (75% of 2016). +The transition to FAILED takes precedence, as otherwise an ambiguity can arise. +There could be two non-overlapping deployments on the same bit, where the first one transitions to LOCKED_IN while the +other one simultaneously transitions to STARTED, which would mean both would demand setting the bit. + +Note that a block's state never depends on its own nVersion; only on that of its ancestors. + + case STARTED: + if (GetMedianTimePast(block.parent) >= timeout) { + return FAILED; + } + int count = 0; + walk = block; + for (i = 0; i < 2016; i++) { + walk = walk.parent; + if (walk.nVersion & 0xE0000000 == 0x20000000 && (walk.nVersion >> bit) & 1 == 1) { + count++; + } + } + if (count >= threshold) { + return LOCKED_IN; + } + return STARTED; + +After a retarget period of LOCKED_IN, we automatically transition to ACTIVE. + + case LOCKED_IN: + return ACTIVE; + +And ACTIVE and FAILED are terminal states, which a deployment stays in once they're reached. + + case ACTIVE: + return ACTIVE; + + case FAILED: + return FAILED; + } + } + +**Implementation** + +It should be noted that the states are maintained along block chain +branches, but may need recomputation when a reorganization happens. + +Given that the state for a specific block/deployment combination is completely determined by its ancestry before the +current retarget period (i.e. up to and including its ancestor with height block.height - 1 - (block.height % 2016)), +it is possible to implement the mechanism above efficiently and safely by caching the resulting state of every multiple-of-2016 +block, indexed by its parent. + +### Warning mechanism + +To support upgrade warnings, an extra "unknown upgrade" is tracked, using the "implicit bit" mask = (block.nVersion & ~expectedVersion) != 0. Mask will be non-zero whenever an unexpected bit is set in nVersion. Whenever LOCKED_IN for the unknown upgrade is detected, the software should warn loudly about the upcoming soft fork. It should warn even more loudly after the next retarget period (when the unknown upgrade is in the ACTIVE state). + +### getblocktemplate changes + +The template request Object is extended to include a new item: + +**template request** + +| Key | Required | Type | Description | +|------|-----------|-------|---------------| +| rules | No | Array of Strings | list of supported softfork deployments, by name | + +The template Object is also extended: + +**template** + +| Key | Required | Type | Description | +|------|-----------|-------|---------------| +| rules | Yes | Array of Strings | list of softfork deployments, by name, that are active state | +| vbavailable | Yes | Object | set of pending, supported softfork deployments; each uses the softfork name as the key, and the softfork bit as its value | +| vbrequired | No | Number | bit mask of softfork deployment version bits the server requires enabled in submissions | + +The "version" key of the template is retained, and used to indicate the server's preference of deployments. +If versionbits is being used, "version" MUST be within the versionbits range of [0x20000000...0x3FFFFFFF]. +Miners MAY clear or set bits in the block version WITHOUT any special "mutable" key, provided they are listed among the template's "vbavailable" and (when clearing is desired) NOT included as a bit in "vbrequired". + +Softfork deployment names listed in "rules" or as keys in "vbavailable" may be prefixed by a '!' character. +Without this prefix, GBT clients may assume the rule will not impact usage of the template as-is; typical examples of this would be when previously valid transactions cease to be valid, such as BIPs [16](/protocol/forks/bip-0016), [65](/protocol/forks/bip-0065), [66](/protocol/forks/bip-0066), [68](/protocol/forks/bip-0068), [112](/protocol/forks/bip-0112), and [113](/protocol/forks/bip-0113). +If a client does not understand a rule without the prefix, it may use it unmodified for mining. +On the other hand, when this prefix is used, it indicates a more subtle change to the block structure or generation transaction; examples of this would be BIP 34 (because it modifies coinbase construction) and 141 (since it modifies the txid hashing and adds a commitment to the generation transaction). +A client that does not understand a rule prefixed by '!' must not attempt to process the template, and must not attempt to use it for mining even unmodified. + +## Support for future changes + +The mechanism described above is very generic, and variations are possible for future soft forks. Here are some ideas that can be taken into account. + +**Modified thresholds** + +The 1916 threshold (based on in BIP 34's 95%) does not have to be maintained for eternity, but changes should take the effect on the warning system into account. In particular, having a lock-in threshold that is incompatible with the one used for the warning system may have long-term effects, as the warning system cannot rely on a permanently detectable condition anymore. + +**Conflicting soft forks** +At some point, two mutually exclusive soft forks may be proposed. The naive way to deal with this is to never create software that implements both, but that is making a bet that at least one side is guaranteed to lose. Better would be to encode "soft fork X cannot be locked-in" as consensus rule for the conflicting soft fork - allowing software that supports both, but can never trigger conflicting changes. + +**Multi-stage soft forks** +Soft forks right now are typically treated as booleans: they go from an inactive to an active state in blocks. Perhaps at some point there is demand for a change that has a larger number of stages, with additional validation rules that get enabled one by one. The above mechanism can be adapted to support this, by interpreting a combination of bits as an integer, rather than as isolated bits. The warning system is compatible with this, as (nVersion & ~nExpectedVersion) will always be non-zero for increasing integers. + +## Rationale + +The failure timeout allows eventual reuse of bits even if a soft fork was +never activated, so it's clear that the new use of the bit refers to a +new BIP. It's deliberately very coarse-grained, to take into account +reasonable development and deployment delays. There are unlikely to be +enough failed proposals to cause a bit shortage. + +The fallow period at the conclusion of a soft fork attempt allows some +detection of buggy clients, and allows time for warnings and software +upgrades for successful soft forks. + +## Deployments + +~~A living list of deployment proposals can be found [here](https://github.com/bitcoin/bips/blob/master/bip-0009/assignments.mediawiki)~~. + +## Copyright + +This document is placed in the public domain. diff --git a/protocol/forks/chips/2021-05-multiple-op-returns-for-bitcoin-cash.md b/protocol/forks/chips/2021-05-multiple-op-returns-for-bitcoin-cash.md new file mode 100644 index 0000000..89735ee --- /dev/null +++ b/protocol/forks/chips/2021-05-multiple-op-returns-for-bitcoin-cash.md @@ -0,0 +1,205 @@ +# CHIP: Multiple OP_RETURNs for Bitcoin Cash + + Title: Multiple OP_RETURNs for Bitcoin Cash + First Submission Date: 2021-03-12 + Owner: Benjamin Scherrey @proteusguy on Telegram + Authors: Benjamin Scherrey + Earlier concept - Jonathan Silverblood + Technical spec - BigBlockIfTrue + Type: Technical + Is consensus change: No + Status: FINAL + Last Edit Date: 2021-05-17 + +This CHIP was included in [HF-20210515](/protocol/forks/hf-20210515). + +## Discussions + +[CHIP Discussion at Bitcoincashresearch.org](https://bitcoincashresearch.org/t/multiple-op-returns-this-time-for-real/315) + +[Issues/PRs for this CHIP](https://github.com/ActorForth/Auction-Protocol/issues) + +Our team is available for chat on the [ActorForth gitter](https://gitter.im/ActorForth/community). + +## Summary + +We propose to make presence of multiple OP_RETURN outputs qualify as standard transactions subject to the existing 223 byte limit for OP_RETURNs across all outputs of the transaction. We are silent in this proposal as to whether or not the [223 byte limit](https://github.com/bitcoincashorg/bitcoincash.org/blob/1b2008d3ac2b30a2ab26193dc8d3652fc33fb798/spec/may-2018-hardfork.md) is the correct one for BCH but are content to leave that alone in order to improve the chances of getting consensus for this change for the May 2021 fork. This makes the impact on nodes and miners as minimal and risk-free as possible while allowing developers to use OP_RETURN in a manner that justifies its core benefit - experimentation of new features/protocol updates without breaking existing systems or stressing the block chain with extraneous UTXOs which is an undesirable alternative option should this improvement not be accepted. + +## Motivation and Benefits + +Quite early in Bitcoin history, attempts to inject miscellaneous data into the block chain were made that made correct parsing and identification of transactions more difficult but, most importantly, bloated the UTXOs with superfluous data that potentially had a very real negative impact on operators of nodes, miners, and wallet users. The introduction of OP_RETURN with a restricted size limit that was deemed unspendable by the protocol was the compromise that protected everyone's interests. Allowing this data to be inserted but then also ignored by all who didn't care about it gave BCH developers an excellent tool in which to try out development ideas and protocol improvements in an isolated manner without introducing backwards or forward incompatibilities. Perhaps more importantly, it gave the entire BCH community an experimental model that allowed a natural maturity for protocol proposals to mature informed by actual use on the block chain rather than depend entirely on theoretical opinions on how such a protocol change might impact the BCH chain. SLP is an excellent example of such a circumstance where, after considerable efforts and real-life trials have been made, has resulted in serious proposals such as OP_GROUP to be able to be realistically considered for incorporation into the core protocol with significantly less risk than would otherwise have been possible. + +The primary limitation of OP_RETURN is that the protocol standard only allows for one instance of an OP_RETURN output per transaction which means developers who want to build on top of other OP_RETURN utilizing capabilities must either create complex parsing scripts or divide their efforts across multiple transactions. Both of these options introduce incredible complexity and often are simply not viable for demonstrating a real-world use case for how the feature would behave on the BCH chain should it be incorporated into the core protocol. + +This proposal aims to correct this minor oversight in order to bring the full potential of OP_RETURN's experimental expressiveness to the BCH chain without incurring any additional trade-offs that were part of its original design. + +The benefits of this proposal also reach users and businesses in drastically reducing foodprint when dealing with several OP_RETURN for their given use cases. Users will be able to use OP_RETURN space more efficiently, pack information in fewer transactions, use less space in mined blocks and save fees while mempool will see fewer congestions –for this specific cause. + +## Specification + +The only technical elements we've identified are changes to the existing node systems to remove the limit of a single OP_RETURN and to enforce the existing size limit for OP_RETURN based outputs across all aggregate OP_RETURN outputs in the transaction. + +Formally, we set the rules as follows: + +* An OP_RETURN output is an output with a locking script consisting of the OP_RETURN opcode followed by zero or more data pushes. +* A transaction is non-standard if the total byte size of the locking scripts of all OP_RETURN outputs is greater than 223. +* While the [BIP113](https://github.com/bitcoin/bips/blob/master/bip-0113.mediawiki) median time is less than 1621080000 (2021-05-15T12:00:00Z), a transaction is also non-standard if the number of OP_RETURN outputs is greater than one. + +Some remarks: + +* The size of the locking script is not just the raw data size, but includes the OP_RETURN opcode and the data push opcodes. In case of a single OP_RETURN output, only up to 220 bytes of data can be stored, because you need 1 byte for the OP_RETURN opcode, 1 byte for the OP_PUSHDATA1 opcode, and 1 byte for the length of the data. More bytes are lost if there is more than one data push operation, e.g. when the [4-byte prefix guideline](https://upgradespecs.bitcoincashnode.org/op_return-prefix-guideline/) is followed. +* In case of a single OP_RETURN output, the rules are identical to the status quo. +* In the extreme case, the rules imply a maximum of 223 OP_RETURN outputs, because the locking script of every OP_RETURN output is at least one byte (the OP_RETURN opcode itself). + +## Current Implementations + +* [Full implementation of the rules in Bitcoin Cash Node, including activation logic](https://gitlab.com/bitcoin-cash-node/bitcoin-cash-node/-/merge_requests/1115). +* [Implementation of the rules in Flowee, without activation logic](https://gitlab.com/FloweeTheHub/thehub/-/blob/master/libs/server/policy/policy.cpp) (allows multiple outputs immediately instead of only after 2021-05-15T12:00:00Z). + +Both implementations introduce `"oversize-op-return"` as a new standardness error code, besides the existing `"multi-op-return"` error which becomes obsolete after multiple OP_RETURN outputs are allowed. In both implementations, the number 223 used in the rules can be overridden with the `-datacarriersize=` command-line option. + +* [Implementation of the rules in Bitcoin Unlimited, without activation logic](https://gitlab.com/bitcoinunlimited/BCHUnlimited/-/merge_requests/2453). + + +## Implementation Costs and Risks + +Evaluating the changes required across the popular nodes demonstrates that the impact in terms of lines of code affected are minor and isolated. For Bitcoin Unlimited there's an existing check that only one OP_RETURN exists which can be removed. A mechanism for counting the aggregate size of all the OP_RETURNs is quite simple to introduce in the same source file. Unit tests would be approximately twice the implementation size which we find typical of well designed C++ code. + +APIs that want to support multiple OP_RETURN are also easy to modify. + +## Ongoing Costs and Risks + +After the initial changes are made to the core node systems no ongoing costs are anticipated. Risks are restricted to other non-standard experimental development code that may depend/demand that there only be a single OP_RETURN but, unless the code serves some purpose such as a linter or tx compliance tool, it's unlikely that such code was appropriate in the first place. + +Presently the [SLP specification](https://github.com/simpleledger/slp-specifications/blob/master/slp-token-type-1.md#consensus-rules) requires its OP_RETURN to be at vout[0]. Any protocol code seeking to co-exist with SLP would want to ensure that it be in a later output to appear in the transaction in order to prevent accidental conflicts. We recommend that OP_RETURN based protocols no longer specify a positional requirement for their data but, instead, establish another mechanism for identifying which OP_RETURN belongs to them. + +Now that the limit of a single OP_RETURN has been removed, future well behaved development utilizing OP_RETURN would no longer be designed with such a presumption in mind. + +### Design & Implementation Process Timeline + +2020-09-21 [Initial comment on bitcoincashresearch.org](https://bitcoincashresearch.org/t/2021-bch-upgrade-items-brainstorm/130/23). + +2020-10-14 [Trial implementation of proposal on Bitcoin Unlimited node](https://github.com/ActorForth/BitcoinUnlimited/commit/fd10cbd9872b157d906a03d3a4ccf7c0ddd42c65). (note: this doesn't implement aggregate size limit) + +2020-10-?? Trial modifications to a [test fork of the Javascript bch-js API](https://github.com/ActorForth/bch-js) and the python Bitcash API libraries (currently in a private repo) completed. + +2021-02-24 [Proposal to be introduced for the May 2021 fork](https://bitcoincashresearch.org/t/multiple-op-returns-this-time-for-real/315). + +2021-03-21 This CHIP created. + +2021-03-24 Proposed completion for PRs to public Bitcoin Unlimited, Bitcoin Cash Node, bch-js API, and Bitcash API projects to support this CHIP. Basically T+9 days after proposal is approved. + +2021-03-13 [Flowee PR](https://gitlab.com/FloweeTheHub/thehub/-/commit/a9d3c2ee9279f2aa46890d74ce26f6e252623e72), [2](https://gitlab.com/FloweeTheHub/thehub/-/commit/45dd785f3916caa336a628d879dc7228fb73e520) support implemented by Tom Zander. + +2021-03-14 [BCHN PR](https://gitlab.com/bitcoin-cash-node/bitcoin-cash-node/-/merge_requests/1115) support implemented by BigBlockIfTrue. + +2021-03-25 [Bitcoin Unlimited PR](https://gitlab.com/bitcoinunlimited/BCHUnlimited/-/merge_requests/2453) support implemented by Nicolai Skye. + +2021-05-15 Deployment to BCH Mainnet Chain + +## Evaluation of Alternatives + +Alternatives to this proposal amount to restating original alternatives to OP_RETURN (such as the multi-sig data hack), introducing complex parsing requirements to OP_RETURN outputs, or dividing OP_RETURN dependent submissions across multiple transactions. All are more complex and risky than this proposal. + +Jonathan Silverblood identified 3 other alternative proposals considered in 2020, [BUIP149: Delimited OP_RETURNs](https://bitco.in/forum/threads/buip149-delimited-op_returns.26362/), [BUIP139](https://bitco.in/forum/threads/buip139-multiple-op_return-with-less-rules.24951/), and [BUIP140](https://bitco.in/forum/threads/buip140-multiple-op_return-with-shared-size-limit.24952/). + +BUIP149 puts multiple OP_RETURNs in a single output and requires complex parsing scripts and potentially could collide with existing protocols using OP_RETURNs already including SLP. It also proposes to change the maximum size of OP_RETURN data in a transaction. Community efforts to incorporate this option are significantly higher than this CHIP. + +BUIP139 is actually quite similar to this CHIP except it proposes that there be some fixed limit to the number of OP_RETURNs. One reason why BUIP139 should be considered inferior is because it makes it more difficult to change the op_return max bytes in the future, as it would magnify the impact, for example: + +If BUIP139 took place, and was set to 4 op_returns / transaction, then if we want to change the byte size it now has to be an even number of 4. If we naively increase by 10 bytes, then a total of 40 more bytes can be used, rather than the 10 byte intended. + +BUIP140 is similar to this CHIP but was just not taken forward. Major difference is that it debates or introduces the explicit possibility of increasing the total size of OP_RETURN data but does not require it. + +Without the aggregate size consideration, the future impact of changing the legal sizes of OP_RETURN becomes more profound and possibly difficult to predict but saves tx creators from having to track a total across all OP_RETURNs. The opinion of the author is that the days of being able to consider parts of transactions independent of others are long gone so this is not a meaningful shortcoming. Size reductions would be profound and dangerous changes and are unlikely to be practical to deploy. Size increases should be based on empirical demonstrations of value through experimental apps that push these limits while demonstrating real value to the BCH ecosystem. Regardless of the ultimate size, having that quantity come from a shared pool helps allow OP_RETURN based protocols to be expressed naturally in a manner more closely resembling what their ultimate core protocol implementations would look like rather than having to perform hacks to fit within a per-OP_RETURN limit that would necessarily be smaller. Again these are future considerations outside of the direct scope of this CHIP. + +## List of Major Stakeholders + + +## Statements + +### Full node developers + +from Tom Zander, owner [Flowee](https://flowee.org) + +> This change will have little to no cost on our ecosystem while enabling more usecases to be added over time, to be developed without touching consensus rules in the traditional permissionless manner. I fully support this proposal and have code ready to ship for this. + +from freetrader, lead maintainer of Bitcoin Cash Node + +> This is a simple and logical change that provides more flexibility for OP_RETURN users without affecting the trade-offs associated with the limit. The proposal has been implemented in a BCHN change request and a majority of BCHN maintainers supports activating this change on 15 May 2021. + +> While this CHIP arrived at a fairly late moment, we believe that sufficient awareness has been raised such that it can nevertheless be activated in May provided all major full node clients can implement it by then. + +### Major businesses + +from Benjaim Scherrey + +> My company, [Biggest Fan Productions](https://biggestfan.net), has developed a [protocol](https://github.com/ActorForth/Auction-Protocol/blob/main/proposal-spec.md) that utilizes SLP NFTs & FTs to perform on-chain tracked open call auctions for assets such as concert tickets. To fully be able to represent the state of the auction in a trustless manner it requires an additional OP_RETURN to be allowed in BCH transactions. This is notice of my support and personal interest in this CHIP. + +### Miners and pools + +I have sought out contacts for such organizations and have received no responses. Appreciate any follow up on contacting these entities. + +### Wallets and clients + +I have sought out contacts for such organizations and have received few responses. Appreciate any follow up on contacting these entities. + +An ElectronCash SLP wallet dev had no strong opinion on this CHIP (or the CHIP process) and registered no objection when asked. + +### Application Developers + +from Jonathan Silverblood: + +> I believe multiple OP_RETURNs should be adopted, it is highly valuable as it makes it possible for OP_RETURN based protocols to work together to create value. I also believe that counting the aggregate number of bytes is in line with the intent of the original functionality. + +from Joey Masterpig + +> I would like to add my support to this proposal as a Stakeholder. Founder of the upcoming SLP NFT game enter-the-sphere.com . Co-Founder of Spice Token, and a Director of the SLP Foundation. + +> I believe having multiple_opreturns will add some interesting possibilities for NFTs for Enter The Sphere, our token solution needs to be as competitive as possible, and anything that expands the chance of something innovative being done on SLP, is something I support. + +> As I understand, implementation of this change will allow multiple assets to be on a single tx, something that can be very useful for pairing NFTs with other assets. A function that allows us to link NFT items with other assets easier than current. + +> This is my personal opinion and support as a non-technical stakeholder, this is not a technical endorsement nor have i reviewed deeply about whether these changes have cons on a technical basis (as far as I understand there is none). + +Stoyan Zhekov, bch-js developer + +> I think Multiple OP_RETURN CHIP will provide a way for better NFTs - both NFT (SLP) payload and BCP payload can be parts of one transaction, which will reduce the number of queries to retrieve the external content. + +### Users + +from Leandro Di Marco + +> I see this initiative with great value for users, who will engage with the OP_RETURN resource more efficiently. And while such optimization would seem samll at the moment, it will surely become more relevant as Bitcoin Cash grows in adoption. + +## Copyright + +BSD 3-Clause License + +Copyright (c) 2018, 2020 Benjamin Scherrey, BiggestFan Productions Co. Ltd +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/protocol/forks/chips/2021-05-unconfirmed-transaction-chain-limit.md b/protocol/forks/chips/2021-05-unconfirmed-transaction-chain-limit.md new file mode 100644 index 0000000..d22eecf --- /dev/null +++ b/protocol/forks/chips/2021-05-unconfirmed-transaction-chain-limit.md @@ -0,0 +1,141 @@ +# CHIP: Unconfirmed Transaction Chain Limit + +This CHIP was included in [HF-20210515](/protocol/forks/hf-20210515). + +## Authors + +**CHIP Owner:** +Josh Green, Software Verde + +**Contributors:** + + John Jamiel, Software Verde + Doug McCollough, City of Dublin, OH + Emil Oldenburg, Bitcoin.com + Roger Ver, Bitcoin.com + Mark Lamb, CoinFLEX + +## Summary +**Version 1.2.1** + +When a transaction is first transmitted on the Bitcoin Cash network, it is considered “unconfirmed” until it is “mined” into a block. These transactions that are not yet mined are also referred to as “zero-conf” transactions. Transactions are dependent upon other transactions, such that they are chained together; the value allocated by one transaction is then spent by a subsequent transaction. + +Currently, the Bitcoin Cash network only permits transactions to be chained together 50 times before a block must include them. Transactions exceeding the 50th chain are often ignored by the network, despite being valid. Once a transaction is submitted to the network, it cannot be revoked. This situation, when encountered, can be extremely difficult to remedy with today’s available tools and simultaneously creates an unnecessary amount of complexity when being accounted for by network and applications developers. This CHIP is a formal request to remove the unconfirmed transaction chain limit=depth (50tx) and size (101kb) entirely from the Bitcoin Cash ecosystem. + +**Discussion URL:** https://bitcoincashresearch.org/t/chip-unconfirmed-transaction-chain-limit/302/32 + +**Full Change History URL:** https://github.com/softwareverde/bitcoin-cash-chips/blob/master/unconfirmed-transaction-chain-limit.md + + +## Motivations + +Transactions exceeding the unconfirmed transaction chaining limit are often ignored by the network, despite being considered a valid transaction. For these transactions, this leaves the value transferred in an ambiguous state: it has been transferred, but some (or all) of the network may not record this transfer. Once value has been transferred by a transaction, the balance may not be distributed in a different proportion or to a separate receiver (often known as a “double-spend”) due to the network’s convention to prefer the first-seen transfer rather than the newer transfer. Therefore, the only viable path forward in this scenario is to transmit the same (perfectly identical) transaction again to the network. However, if the wallet or service is connected to peers that accepted the transaction, rebroadcasting the same transaction does not cause the connected peers to retransmit it themselves--causing the transaction to be stuck with no recourse other than hoping to connect to a new peer that has not yet seen the transaction. For this reason, it is important that all nodes agree on the unconfirmed transaction chain limit. + +Additionally, determining if the transaction was not accepted by the network is a difficult to solve problem with the current available toolset. Error-responses from nodes rejecting a transaction have not been standardized, and often times nodes will silently reject the transaction--sometimes the node may not even be aware that the transaction is invalid because its dependent has not been seen yet, and the node itself cannot determine the transaction’s chain depth. + +It is also not always known to the user, service, or wallet how deep the unconfirmed transaction already is when it’s received; it’s entirely possible the coins received are at the limit, and determining that state can be near-impossible without the help of a full-node. + +The problem from a user/app’s perspective is that they have created a valid transaction and are given little indication that it will not be mined within a block. The tools for recourse are limited, and the tools for monitoring for such a situation is also limited. + + +The unconfirmed transaction chain limit is mostly an artifact of a relatively unused feature heldover from artificially restricting block size, a feature called “Child Pays for Parent”. According to research conducted by Tom Zander found [here](https://flowee.org/news/2020-07-cpfp-research/), there is very limited usage of CPfP on the BCH network. In short, in his 3 months of monitoring network activity there were only 7 valid use cases where CPfP was used to lift the transaction above the 1-sat-per-byte. This feature is not used in BCH yet still restricts the user experience and increases the complexity of development of wallets and applications built on top of Bitcoin Cash. + +Issues with transaction chaining are exacerbated by the long block times periodically seen in Bitcoin Cash, the causes of which have been discussed elsewhere and were a major motivating factor in switching to the ASERT difficult adjustment algorithm. Having a static transaction chaining limit while blocks somewhat frequently take over an hour (or even two hours) to be mined, results in a scenario where transactions could be significantly more at risk than normal. Note, though, that even without these extenuating circumstances, this is always a risk with the proof of work system. + +Given the motivations for implementing the transaction chaining limit are largely no longer relevant, the lack of sufficient tooling to allow SPV clients to account for it, and its poor interaction with the current semantics of transaction relaying, it appears that the transaction chaining limit provides little value while simultaneously increasing the difficulty of transacting on the Bitcoin Cash network. + +**Personal Impacts** + +During a Dublin Identity beta test with real users, an issue occurred causing sign-ups to periodically fail. After investigation, it was identified that users’ transactions from the server used to fund SLP token transfers were not being accepted by the network due to the transaction chain limit being enforced. This problem has since been mitigated by the limit being increased to 50, along with some process changes. + +CoinFLEX uses SLP to distribute FLEX token dividends to its users. The server distributes these dividends periodically, via chaining transactions. These distributions were found to periodically fail due to reaching the unconfirmed transaction chaining limit. CoinFLEX is mitigating this problem by using multiple UTXOs to spawn the chains, however their large user base and small limit of 50 transactions per UTXO, are causing disproportionate complexity within their system. Raising the limit combined with increasing the base number of originating UTXOs helps to limit backend complexity. Removing the limit would remove significant complexity for rejection edge-cases where a rejection was unable to be determined or was left unnoticed. + +During Bitcoin Cash meetups it is not uncommon for users of the Bitcoin.com wallet to make more than 50 transactions within the timespan of a block, especially due to the encouraged behavior of brand-new users to transfer their BCH to other members of the meetup to “try it out”. The user experience and “wow” factor of the technology is quickly doused when a new user’s transaction fails to send because their received UTXO is deeply chained. Varying block times exacerbates this problem. + +Software Verde has developed multiple applications that create and distribute transactions across the BCH network. Managing multiple UTXO pools in order to handle appropriately scaling is doable but creates additional unwanted complexity. While transactions will likely never completely be “fire and forget” on BCH, creating a balance with a larger buffer (i.e. supporting a longer chain limit) and having better available tools would allow us to produce applications more reliably and for less cost, facilitating the adoption of Bitcoin Cash to businesses and enterprises. + + +## Technical Description + +The current policy limit of 50 unconfirmed ancestors or descendants, and the 101kb chain limit, is to be removed entirely once MTP >= 1621080000 and this limit removal remains in affect even in the case of a subsequent re-org to below that MTP. + + +## Security Considerations + +Uncoordinated changes to mempool rules would likely result in a degradation of 0-conf transaction security. 0-conf transaction security is dependent on the network’s solution to circumventing double-spends. If nodes do not agree to enforce the same limits, merchants accepting transactions that have exceeded the unconfirmed transaction chaining limit would be at an increased risk of encountering and accepting a double-spend transaction. + +Example: A malicious user submits a transaction exceeding the current chaining limit, knowing the merchant is connected to a node that does not enforce the limit. The node accepts this transaction as it is considered valid and the merchant believes they’ve received a payment from a valid 0-conf transaction. Due to its unconfirmed chain depth, for this transaction to propagate the node in question must wait to broadcast the transaction to its peers until after a new block has been found. During this time a malicious user could prepare a second transaction spending the same coin. If submitted immediately after the new block has been found the two transactions will be in a race. Since the first transaction has not yet been broadcast to the rest of the network, there is an increased likelihood the second transaction could be seen by the majority of the network before the first transaction has had an opportunity to propagate. This situation is exacerbated if the node accepting the longer unconfirmed chain depth transaction does not also re-relay the transaction after a new block is mined that does not contain the transaction. + + +## Implementation Costs and Risks + +From our research and discussions removal of the Unconfirmed Transaction Chain Limit does not present any apparent risks if conducted in a coordinated manner and presents zero risk of a network split. According to the research conducted by developer FreeTrader of BCHN, there is no apparent loss of performance in BCHN with the limit removed. However, if changes to the mempool rules are not coordinated by the different node implementations, 0-conf transaction facility and security will likely suffer. + +Costs associated with implementing this change are hard to encapsulate in this proposal. At a minimum, this CHIP recognizes there is an operational burden that coordinated network upgrades place on node developers and users. Overall, this change will require a non-negligible amount of development time to implement, translating to a cost of labor, of which is bound to vary depending on the full-node implementation and route to resolution. + +Additionally, the cost of investigating solutions for the unconfirmed transaction chaining limit have been significant for those who have undertaken the task. Based on an informal survey of BU and BCHN members, General Protocols has estimated approximately 500 engineering hours have been invested in development and general investigation of increasing the chained tx limit. This commitment of hours has been useful to understand the potential limitations bounding the limit from being completely removed. After thorough investigation, no ill effect on performance has been found. + + +## Evaluation of Alternatives + +If it is deemed necessary to keep the unconfirmed transaction chain limit in some capacity then a significantly larger increase to the limit would be a reasonable alternative. + +From our research, there isn’t a resource that becomes exhausted by a deep 0-conf chain. If there is indeed a technical limit, then we would advocate for node-developers to find what a responsible value is for that limit and suggest that here. + +For the purposes of proposing an alternative solution: a 32MB block can hold approximately 135k transactions. This limit could serve as a hypothetical starting point. + + +## Stakeholders + +Stakeholders relative to this proposal include: + +Full-node implementations +Node Developers +Wallet Developers +Bitcoin Cash related businesses. + +In our previous discussion we have engaged with several key stakeholders to understand their position on the requested change. + +**Stakeholders Engaged in Discussion** + + BCHN + Bitcoin Unlimited + Bitcoin Verde + General Protocols + Bitcoin.com + Coinflex + Flowee + General Protocols + +**Stakeholders Position Unknown** + + BCHD + Knuth + +## Stakeholders Statements + +Jonathan Silverblood - Casual Wallet +>I believe that for money to be useful, it needs to be able to move at low cost and with ease. The current unconfirmed transaction chain limitation is effectively friction that makes Bitcoin Cash less useful as money, and I support a complete removal of the limit. + +John Nieri - General Protocols +>GP supports the updated recommendations of this CHIP and commits any reasonable resources toward its realization. There is still room to expand security considerations and costs which are not trivial. Although this is a non-consensus CHIP, the expansion would make it an even better precedent for the high bar that we want to establish in the BCH ecosystem. + +## CHIP Sponsors + +**Software Verde** is a custom software development company based out of Columbus, Ohio, USA that has been in operation since 2011 and working within public and crypto sectors since early 2017. Software Verde has extensive experience working with local governments to promote the adoption of blockchain technology and utilization of cryptocurrencies, and is the author and maintainer of the BCH Full Node, Bitcoin Verde. + +**City of Dublin, OH** is a municipality of approximately 50k residents that has made an investment into the adoption of blockchain technology. In turn, Dublin has built a blockchain-based digital identity management system utilizing BCH SLP tokens as a reward mechanism. In late 2019, Dublin’s identity management project moved into a beta-testing phase where Software Verde was tasked with creating digital IDs for city employees and rewarding them with tokens for their participation. + +**Bitcoin.com** is a provider of Bitcoin Cash related financial services and the owners of the Bitcoin.com wallet, one of Bitcoin Cash’s most popular non-custodial mobile friendly wallets. Their website provides important services such as a cryptocurrency exchange, reporting network related news, and providing information to help influence the growth and adoption of Bitcoin Cash and Bitcoin Cash related businesses. + +**CoinFLEX** is a popular cryptocurrency exchange service as well as the providers of the first Bitcoin Cash futures and lending exchange. CoinFLEX is the primary distributor of Flex Coins, an SLP token used to pay dividends to their users. Their business provides several unique financial services that attract cryptocurrency investors to the network, as well as foster a culture of professional trading within the Bitcoin Cash community. + +## Timeline + +This proposal is low risk and stands to provide high benefit to the network as a whole. In addition, this request is a network-change only and therefore is not at risk of causing a chain split; however, uncoordinated changes to mempool rules by different full-nodes would likely result in a degradation of 0-conf transaction security. For these reasons, it is requested that this change be implemented in a coordinated manner on May 15th. + +Choosing this date in particular is not significant in and of itself, although there seems to be no reason to deviate from history purely for the sake of it. + +## License + +To the extent possible under law, this work has waived all copyright and related or neighboring rights to this work under CC0. \ No newline at end of file diff --git a/protocol/forks/hf-20200515.md b/protocol/forks/hf-20200515.md new file mode 100644 index 0000000..3dd9196 --- /dev/null +++ b/protocol/forks/hf-20200515.md @@ -0,0 +1,72 @@ +# HF-20200515 + + layout: specification + title: 2020-MAY-15 Network Upgrade Specification + date: 2020-04-26 + category: spec + activation: 1589544000 + version: 0.4 + +## Summary + +When the median time past [[1]](#references) of the most recent 11 blocks (MTP-11) is greater than or equal to UNIX timestamp 1589544000 (May 15th, 2020, 12:00PM UTC), +Bitcoin Cash will execute an upgrade of the network consensus rules according to this specification. +Starting from the next block these consensus rules changes will take effect: + +* Bitcoin Cash's SigOps counting and limiting system is replaced with a new system, referred to as SigChecks. +* A new opcode called OP_REVERSEBYTES has been added to the script system. +* Enforcement of the Infrastructure Funding Plan, subject to activation by [BIP 9](https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki) miner signalling. + +The following are not consensus changes, but are recommended policy changes for Bitcoin Cash implementations: + +* The default for max number of in-mempool ancestors is changed from 25 to 50. +* The default for max number of in-mempool descendants is changed from 25 to 50. +* Automatic replay protection for future upgrade. + +## SigChecks + +Enforcement of sigops limits is removed, and replaced with new limits based on the number of signature checks that are actually executed when running a script. This new system is called SigChecks. + +Details can be found in the [full specification: SigChecks](/protocol/forks/2020-05-15-sigchecks). + +## OP_REVERSEBYTES + +This new opcode reverses the order of bytes in a string. It can be used to change endianness. + +Details can be found in the [full specification: OP_REVERSEBYTES](/protocol/forks/2020-05-15-op_reversebytes). + +## Infrastructure Funding Plan + +The purpose of the Infrastructure Funding Plan (IFP) is to provide funding to development projects working on common Bitcoin Cash infrastructure. +If activated, it enforces that 5% of the block reward is spent to one of a set of specified addresses. +Activation is triggered via [BIP 9](https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki) version bits signalling prior to the May 15 upgrade. + +More detailed can be found in the [full specification](/protocol/forks/2020-05-15-ifp). + +## Automatic Replay Protection + +The purpose of Automatic Replay Protection is to serve as a full node version-deprecation mechanism. It is intended to cause +full validating nodes which do not upgrade, to automatically separate themselves from the main network after the next +upgrade on 15 May 2020. Nodes which implement the next upgrade will remove this automatic replay protection, and thus all regular +wallets can continue using the default ForkID with no change to follow the main upgraded chain. + +When the median time past [[1]](#references) of the most recent 11 blocks (MTP-11) is less than UNIX timestamp 1605441600 (Nov 2020 upgrade) +Bitcoin Cash full nodes MUST enforce the following rule: + + * `forkid` [[2]](#references) to be equal to 0. + +When the median time past [[1]](#references) of the most recent 11 blocks (MTP-11) is greater than or equal to UNIX timestamp 1605441600 +(Nov 2020 upgrade) Bitcoin Cash full nodes implementing the May 2020 consensus rules SHOULD enforce the following change: + + * Update `forkid` [[2]](#references) to be equal to `0xFFXXXX`, where `XXXX` is some arbitrary hex value. + ForkIDs beginning with 0xFF will be reserved for future protocol upgrades. + +This particular consensus rule MUST NOT be implemented by Bitcoin Cash wallet software. Wallets that follow the upgrade +should not have to change anything. + +## References + +[1] Median Time Past is described [here](/protocol/blockchain/transaction#median-time-past). +It is guaranteed by consensus rules to be monotonically increasing. + +[2] The `forkId` is defined as per the [replay protected sighash](/protocol/forks/replay-protected-sighash) specification. \ No newline at end of file diff --git a/protocol/forks/hf-20201115.md b/protocol/forks/hf-20201115.md new file mode 100644 index 0000000..f697410 --- /dev/null +++ b/protocol/forks/hf-20201115.md @@ -0,0 +1,67 @@ +# HF-20201115 + + layout: specification + title: 2020-NOV-15 Network Upgrade Specification + date: 2020-08-15 + category: spec + activation: 1605441600 + version: 0.1 + +## Summary + +When the median time past [[1]](#references) of the most recent 11 blocks (MTP-11) is greater than or equal to UNIX timestamp 1605441600 (Nov 15th, 2020, 12:00PM UTC), +Bitcoin Cash will execute an upgrade of the network consensus rules according to this specification. +Starting from the next block these consensus rules changes will take effect: + +* Bitcoin Cash's Difficulty Adjustment Algorithm (DAA) is replaced with a new system, referred to as aserti3-2d. +* The addition of a new coinbase rule. + +The following are not consensus changes, but are recommended policy changes for Bitcoin Cash implementations: + +* Automatic replay protection for future upgrade. + +## Difficulty Adjustment Algorithm + +Bitcoin Cash's Difficulty Adjustment Algorithm (DAA) is replaced with a new algorithm called [ASERT](http://toom.im/files/da-asert.pdf). + +The specific implementation is called aserti3-2d. Details can be found in the [full specification: ASERT](/protocol/forks/2020-11-15-asert). + +## Coinbase Rule + +The purpose of the new coinbase rule is to provide funding to development projects working on common Bitcoin Cash infrastructure. + +The coinbase rule enforces that at least 8% of the block reward must be spent as a single output to the following Bitcoin Cash address: +`bitcoincash:pqnqv9lt7e5vjyp0w88zf2af0l92l8rxdgnlxww9j9`. + +The amount of the output must be equal to or greater than the integer `required`, calculated as follows using integer math: +``` +required = (8 * blockReward) / 100 +``` + +## Automatic Replay Protection + +The purpose of Automatic Replay Protection is to serve as a full node version-deprecation mechanism. It is intended to cause +full validating nodes which do not upgrade, to automatically separate themselves from the main network after the next +upgrade on 15 May 2021. Nodes which implement the next upgrade will remove this automatic replay protection, and thus all regular +wallets can continue using the default ForkID with no change to follow the main upgraded chain. + +When the median time past [[1]](#references) of the most recent 11 blocks (MTP-11) is less than UNIX timestamp 1621080000 (May 2021 upgrade) +Bitcoin Cash full nodes MUST enforce the following rule: + + * `forkid` [[2]](#references) to be equal to 0. + +When the median time past [[1]](#references) of the most recent 11 blocks (MTP-11) is greater than or equal to UNIX timestamp 1621080000 +(May 2021 upgrade) Bitcoin Cash full nodes implementing the Nov 2020 consensus rules SHOULD enforce the following change: + + * Update `forkid` [[2]](#references) to be equal to `0xFFXXXX`, where `XXXX` is some arbitrary hex value. + ForkIDs beginning with 0xFF will be reserved for future protocol upgrades. + +This particular consensus rule MUST NOT be implemented by Bitcoin Cash wallet software. Wallets that follow the upgrade +should not have to change anything. + +## References + +[1] Median Time Past is described [here](/protocol/blockchain/transaction#median-time-past). +It is guaranteed by consensus rules to be monotonically increasing. + +[2] The `forkId` is defined as per the [replay protected sighash](/protocol/forks/replay-protected-sighash) specification. \ No newline at end of file diff --git a/protocol/forks/hf-20210515.md b/protocol/forks/hf-20210515.md new file mode 100644 index 0000000..b21e0cc --- /dev/null +++ b/protocol/forks/hf-20210515.md @@ -0,0 +1,22 @@ +# HF-20210515 + +The May 2021 hard fork was the first to be comprised of [CHIPs](#chips). + +## CHIPs + +A CasH Improvement Proposal (CHIP) is a change request for the Bitcoin Cash protocol. +CHIPs can be written and published by any member of the Bitcoin Cash community. +They are evaluated publicly, giving the authors an opportunity to make any clarifications or adjustments based on feedback from the rest of the community. +Once there is sufficient support for a CHIP amongst node developers, it is scheduled for release in a future hard fork. +Changes from multiple CHIPs may be included in a single hard fork. + +Along with the creation of the CHIP system, the expectation of biannual releases was relaxed. +If no CHIPs have support, there will be no hard-fork. + +## Contents + +The May 2021 hard fork is comprised the following CHIPs: + +1. [Unconfirmed Transaction Chain Limit](/protocol/forks/chips/2021-05-unconfirmed-transaction-chain-limit) +2. [Multiple OP_RETURNs for Bitcoin Cash](/protocol/forks/chips/2021-05-multiple-op-returns-for-bitcoin-cash) + From 070232bc92ac115998a2e30ad73e3759f24cc5b3 Mon Sep 17 00:00:00 2001 From: Andrew Groot Date: Wed, 19 May 2021 12:46:24 -0400 Subject: [PATCH 28/31] Updates related to May 2021 hard fork. --- .../block-level-validation-rules.md | 3 --- .../network-level-validation-rules.md | 8 +++++--- .../blockchain/transaction/locking-script.md | 20 +++++++++---------- ...05-multiple-op-returns-for-bitcoin-cash.md | 4 ++-- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/protocol/blockchain/transaction-validation/block-level-validation-rules.md b/protocol/blockchain/transaction-validation/block-level-validation-rules.md index 7350662..edc402c 100644 --- a/protocol/blockchain/transaction-validation/block-level-validation-rules.md +++ b/protocol/blockchain/transaction-validation/block-level-validation-rules.md @@ -19,9 +19,6 @@ Other block-level validation rules include: - Coinbase Transaction Reward Validation - The coinbase transaction in a block must collect the correct reward for the block height. For more information see [Coinbase Transaction](/protocol/blockchain/block#coinbase-transaction). - - Transaction Chaining Limit - - Many nodes impose a limit of transactions that can be chained together in a single block. That is, if transaction Z spends an output of transaction Y, which spends an input of transaction X, and so on to Transaction A, the transaction may be rejected. - - This limit is often set to 25 chained transactions. - Coinbase Transaction Block Height - The coinbase transaction in a block must provide an unlocking script that that starts with a push operation which pushes the block height of the block it is contained in. - This requirement was added in [BIP-34](/protocol/forks/bip-0034) to ensure that coinbase transactions are unique. \ No newline at end of file diff --git a/protocol/blockchain/transaction-validation/network-level-validation-rules.md b/protocol/blockchain/transaction-validation/network-level-validation-rules.md index 123b09d..12fe127 100644 --- a/protocol/blockchain/transaction-validation/network-level-validation-rules.md +++ b/protocol/blockchain/transaction-validation/network-level-validation-rules.md @@ -14,12 +14,10 @@ Standard transactions are those that: - Have a version 1 or [version 2](/protocol/forks/bip-0068/) - Have input scripts that only contain push operations - Have input scripts with unlocking scripts less or equal to 1650 bytes in length (see scriptSig limit below) - - Have at most one [data output](/protocol/blockchain/transaction/locking-script#data-output), with a script no longer than 223 bytes (see [data output size limit](#data-output-size-limit) below) + - Have the total size of [data output](/protocol/blockchain/transaction/locking-script#data-output) locking scripts no larger than 223 bytes (see [data output size limit](#data-output-size-limit) below) - For [multisig](/protocol/blockchain/transaction/locking-script#multisig) outputs, must have at most 3 parties and at least 1 required party (i.e. 1-of-1 through 3-of-3). - Have non-data outputs with amount above the [dust](#dust) threshold -\* 223 bytes was chosen to allow for the `OP_RETURN` operation (1 byte), a push operations (2 bytes), and 220 bytes of pushed data. - Be aware, however, that these rules may vary from node-to-node as they are often configurable. Some nodes may also accept and relay non-standard transactions. For this reason, among others, it is always wise to send transactions to multiple nodes. @@ -44,6 +42,10 @@ The data output size limit is calculated as follows: * 2 bytes for a push operation * Up to 220 bytes of data to be "pushed" +In [HF-20210515](/protocol/forks/hf-20210515) this size limit was kept the same but allowed to apply to any number of data outputs in the transaction, provided the total size of data output locking scripts does not exceed the limit. +For example, a transaction is now allowed to have three locking scripts that are each 74 bytes in length. +However, a transaction with two data outputs each with 112-byte locking scripts would be invalid as `112 * 2 = 224` exceeds the 223-byte limit. + ## Dust In order to limit the propagation of transactions with limited utility, outputs that would be cost-prohibitive to spend are rejected as "dust." diff --git a/protocol/blockchain/transaction/locking-script.md b/protocol/blockchain/transaction/locking-script.md index 28ac806..cc7d737 100644 --- a/protocol/blockchain/transaction/locking-script.md +++ b/protocol/blockchain/transaction/locking-script.md @@ -20,7 +20,7 @@ If the signature is valid for the specified public key in the locking script, th | Operation | Description | |--|--| | [OP_DATA_X](/protocol/blockchain/script/op-codes/op-data-x) (public key) | Add the recipient's public key to the stack. The data pushed must be either a compressed or uncompressed public key with appropriate length (33 bytes if the key is compressed, 65 bytes if it is not) for the type for the script to be recognized as P2PK. | -| [OP_CHECKSIG](/protocol/blockchain/script/opcodes/op-checksig) | Check the public key at the top of the stack against the signature below it on the stack. | +| [OP_CHECKSIG](/protocol/blockchain/script#cryptography) | Check the public key at the top of the stack against the signature below it on the stack. | **NOTE:** Pay to Public Key is a largely obsolete type of locking script due to its property of leaking the public key of the recipient before the output is unlocked, resulting in: @@ -38,11 +38,11 @@ If that public key hashes to the expected address, and the signature is valid, t | Operation | Description | |--|--| -| [OP_DUP](/protocol/blockchain/script/opcodes/op-dup) | Copy the value at the top of the stack (public key of the recipient). | -| [OP_HASH160](/protocol/blockchain/script/opcodes/op-hash160) | Perform a SHA-256 then a RIPEMD-160 on the copied value. | +| [OP_DUP](/protocol/blockchain/script#stack) | Copy the value at the top of the stack (public key of the recipient). | +| [OP_HASH160](/protocol/blockchain/script#cryptography) | Perform a SHA-256 then a RIPEMD-160 on the copied value. | | [OP_DATA_X](/protocol/blockchain/script/op-codes/op-data-x) (20 bytes) | Push the expected 20 byte address. | -| [OP_EQUALVERIFY](/protocol/blockchain/script/opcodes/op-equalverify) | Verify that the hash of the copied value matches the expected hash that was pushed. | -| [OP_CHECKSIG](/protocol/blockchain/script/opcodes/op-checksig) | Verify that the stack now contains only a public key (which was duplicated, hashed, and checked against the expected value) and a signature and verify that the signature is valid for that public key. | +| [OP_EQUALVERIFY](/protocol/blockchain/script#bitwise) | Verify that the hash of the copied value matches the expected hash that was pushed. | +| [OP_CHECKSIG](/protocol/blockchain/script#cryptography) | Verify that the stack now contains only a public key (which was duplicated, hashed, and checked against the expected value) and a signature and verify that the signature is valid for that public key. | ### Pay to Script Hash (P2SH) @@ -53,9 +53,9 @@ If this redeem script finishes execution successfully, the output is allowed to | Operation | Description | |--|--| -| [OP_HASH160](/protocol/blockchain/script/opcodes/op-hash160) | Hash the data at the top of the stack, this should be the script to be executed. | +| [OP_HASH160](/protocol/blockchain/script#cryptography) | Hash the data at the top of the stack, this should be the script to be executed. | | [OP_DATA_X](/protocol/blockchain/script/op-codes/op-data-x) (20 bytes) | Push the expected redeem script hash. | -| [OP_EQUAL](/protocol/blockchain/script/opcodes/op-equal) | Verify that the hash of the provided script is equal to the expected hash. | +| [OP_EQUAL](/protocol/blockchain/script#bitwise) | Verify that the hash of the provided script is equal to the expected hash. | Due to the nature of this type of locking script, the following steps must be performed by a node executing this script: @@ -99,7 +99,7 @@ These are also referred to as "bare multisig" scripts to disambiguate them from | [OP_X](/protocol/blockchain/script/op-codes/op-x) | Push the number of parties required to provide signatures. | | 1 or more [OP_DATA_X](/protocol/blockchain/script/op-codes/op-data-x) (public key) | Push 1 or more public keys, indicating all of the parties that could provide signatures. | | [OP_X](/protocol/blockchain/script/op-codes/op-x) | The total number of parties added (i.e. the number of public keys pushed). | -| [OP_CHECKMULTISIG](/protocol/blockchain/script/op-codes/op-checkmultisig) | Check for signatures matching the number of required parties, verify that they correspond to permitted public keys, and that the signatures are valid. | +| [OP_CHECKMULTISIG](/protocol/blockchain/script#cryptography) | Check for signatures matching the number of required parties, verify that they correspond to permitted public keys, and that the signatures are valid. | NOTE: due to a historical bug, the locking script must push an additional value before the signatures. Traditionally this is done via [OP_0](/protocol/blockchain/script/op-codes/op-x). The value is not used but is popped off of the stack by the OP_CHECKMULTISIG at the end of the locking script. @@ -111,5 +111,5 @@ As such, outputs locked with data scripts generally have zero satoshis associate | Operation | Description | |--|--| -| [OP_RETURN](/protocol/blockchain/script/opcodes/op-return) | Fail execution immediately. | -| Data | Any additional data is not executed and thus can be whatever data is desired by the script creator. | +| [OP_RETURN](/protocol/blockchain/script#flow-control) | Fail execution immediately. | +| Data Pushes | Data may optionally be added as a series of push operations. However, these push operations are not executed and thus can push whatever arbitrary data is desired by the script creator. | diff --git a/protocol/forks/chips/2021-05-multiple-op-returns-for-bitcoin-cash.md b/protocol/forks/chips/2021-05-multiple-op-returns-for-bitcoin-cash.md index 89735ee..1e0917d 100644 --- a/protocol/forks/chips/2021-05-multiple-op-returns-for-bitcoin-cash.md +++ b/protocol/forks/chips/2021-05-multiple-op-returns-for-bitcoin-cash.md @@ -1,5 +1,7 @@ # CHIP: Multiple OP_RETURNs for Bitcoin Cash +This CHIP was included in [HF-20210515](/protocol/forks/hf-20210515). + Title: Multiple OP_RETURNs for Bitcoin Cash First Submission Date: 2021-03-12 Owner: Benjamin Scherrey @proteusguy on Telegram @@ -11,8 +13,6 @@ Status: FINAL Last Edit Date: 2021-05-17 -This CHIP was included in [HF-20210515](/protocol/forks/hf-20210515). - ## Discussions [CHIP Discussion at Bitcoincashresearch.org](https://bitcoincashresearch.org/t/multiple-op-returns-this-time-for-real/315) From ec325acb58467111c495780781744da626bd4054 Mon Sep 17 00:00:00 2001 From: Andrew Groot Date: Wed, 19 May 2021 14:42:19 -0400 Subject: [PATCH 29/31] Diagram of P2PKH address derivation. --- objects/wallet__objects.md | 19 ------------------- protocol/blockchain/addresses.md | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 19 deletions(-) delete mode 100644 objects/wallet__objects.md diff --git a/objects/wallet__objects.md b/objects/wallet__objects.md deleted file mode 100644 index 753c6c3..0000000 --- a/objects/wallet__objects.md +++ /dev/null @@ -1,19 +0,0 @@ -

-{ -"title": "Wallet Objects" -}
- -The following graph shows the derivation relationship between wallet objects. - -```mermaid -graph TB -PrivK["Private Key"] ==>PubK[Public key] -PubK == RIPEMD and SHA256 ==> PubKH[Public Key Hash] -PubKH==>Address -Address==>PubKH -Script==>Address -style PubK fill:#906,stroke:#333,stroke-width:2px; -style PrivK fill:#f06,stroke:#333,stroke-width:8px; -style PubKH fill:#2f6,stroke:#333,stroke-width:2px; -style Address fill:#2f6,stroke:#333,stroke-width:2px; -``` \ No newline at end of file diff --git a/protocol/blockchain/addresses.md b/protocol/blockchain/addresses.md index 0873c3c..05a22db 100644 --- a/protocol/blockchain/addresses.md +++ b/protocol/blockchain/addresses.md @@ -19,6 +19,20 @@ Mainnet P2PKH addresses always start with `1` in Base58Check encoding and `q` in Base58Check: 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa CashAddr: bitcoincash:qp3wjpa3tjlj042z2wv7hahsldgwhwy0rq9sywjpyy +The following diagram show the full creation process for a P2PKH address: + +```mermaid +graph LR +PrivK["Private Key"] ==>PubK[Public key] +PubK == SHA256 and RIPEMD160 ==> PubKH[Public Key Hash] +PubKH ==> Address +Address ==> PubKH +style PubK fill:#F06,stroke:#333,stroke-width:2px; +style PrivK fill:#B06,stroke:#333,stroke-width:8px; +style PubKH fill:#0F6,stroke:#333,stroke-width:2px; +style Address fill:#0F6,stroke:#333,stroke-width:2px; +``` + ## Pay to Script Hash (P2SH) Addresses [P2SH](/protocol/blockchain/transaction/locking-script#pay-to-script-hash-p2sh) addresses encode the redeem script hash (i.e. `RIPEMD-160(redeemScript)`). From 961201e375704f525c7b81ac0dae0b18c0a7e44c Mon Sep 17 00:00:00 2001 From: Andrew Groot Date: Wed, 19 May 2021 17:08:12 -0400 Subject: [PATCH 30/31] Expanding documentation of consensus/standardness rules. This includes documenting SigChecks in validation rules. --- home.md | 2 +- .../block-level-validation-rules.md | 40 +++++++++++++++++-- .../network-level-validation-rules.md | 1 + 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/home.md b/home.md index 7fa619d..a81d65e 100644 --- a/home.md +++ b/home.md @@ -67,7 +67,7 @@ [sendcmpct](/protocol/network/messages/sendcmpct) — [get_xthin](/protocol/network/messages/get_xthin) — [xthinblock](/protocol/network/messages/xthinblock) — [thinblock](/protocol/network/messages/thinblock) — [get_xblocktx](/protocol/network/messages/get_xblocktx) — [xblocktx](/protocol/network/messages/xblocktx) — [xupdate](/protocol/network/messages/xupdate) — [xversion](/protocol/network/messages/xversion) — [xverack](/protocol/network/messages/xverack) ### Simple Payment Verification (SPV) -[SPV](/protocol/spv) - [Bloom Filters](/protocol/spv/bloom-filter) +[SPV](/protocol/spv) — [Bloom Filters](/protocol/spv/bloom-filter) ### Simple Ledger Protocol [SLP](/protocol/slp) ### Miscellaneous diff --git a/protocol/blockchain/transaction-validation/block-level-validation-rules.md b/protocol/blockchain/transaction-validation/block-level-validation-rules.md index edc402c..1e8cb19 100644 --- a/protocol/blockchain/transaction-validation/block-level-validation-rules.md +++ b/protocol/blockchain/transaction-validation/block-level-validation-rules.md @@ -1,8 +1,13 @@ # Block-Level Validation Rules +Block-level validation rules, also referred to as consensus rules, define what is permitted to be included in a block. +Block-level validation rules are absolute and any block or transaction that would cause a violation such a rule must be rejected. +These differ from [network-level validation rules](/protocol/blockchain/transaction-validation/network-level-validation-rules), also referred to as standardness rules, which can be circumvented by miners, should they wish to include a non-standard transaction in a block. +In short, consensus (block-level) rules define what is permitted in a block, while standardness (network-level) rules define recommended behavior for nodes on the network. + When validating a transaction, it must be done within the context of a block. That may be a historical (or new) block that the transaction is a part of or it may be as a part of a hypothetical "next" block. The latter category, often referred to as "mempool" transactions, represent transactions that a node is aware of, and considers valid, but that have not yet been added to a block. In this case, they are treated as though they are all in a new block that follows after the last block in the longest chain the node is currently aware of. -The reason that transaction validation is context-dependent in this way stems from what is probably the most important validation rule: the inputs to a transaction must be a UTXO. That is, transactions must spend transaction outputs that were created by a prior transaction but that have not been spent by another transaction in the target block or its history. Note that this means that blocks with divergent histories will treat different transactions as valid. For example, consider the following scenario: +The reason that transaction validation is context-dependent in this way stems from what is probably the most important validation rule: the inputs to a transaction must be UTXOs. That is, transactions must spend transaction outputs that were created by a prior transaction but that have not been spent by another transaction in the target block or its history. Note that this means that blocks with divergent histories will treat different transactions as valid. For example, consider the following scenario: ```mermaid graph LR; @@ -15,10 +20,39 @@ blockb --> blockb2(Block B') Since `Block A'` and `Block B'` are at the same block height, there may be some nodes that treat `Block A'` as the most recent block (e.g. `Node A`) and others that treat `Block B'` as the most recent block (e.g. `Node B`). If a transaction is submitted to both `Node A` and `Node B` that spends an output created in a transaction in `Block A`, `Node A` may consider the transaction valid while `Node B` would reject it on the grounds that it is dependent on a UTXO that is not a part of `Block B'`'s history, which only contains `Block B'`, `Block B`, and `Block N` (and its parents). -Other block-level validation rules include: +## Consensus Rules + - Double-Spend Validation + - The inputs of a transaction may only be spent once on a given blockchain fork. + - That is, if two transactions spend a given input, only one may be valid at any given time. + - See [blockchain reorganization](/protocol/blockchain#blockchain-reorganization) for information on how resolution of such conflicts is resolved. + - Transaction Input and Output Validation + - The total value of the outputs of a transaction may not exceed the total input value of the transaction, except in the case of [coinbase transactions](/protocol/blockchain/block#coinbase-transaction). - Coinbase Transaction Reward Validation - The coinbase transaction in a block must collect the correct reward for the block height. For more information see [Coinbase Transaction](/protocol/blockchain/block#coinbase-transaction). + - Coinbase Maturity + - Outputs of coinbase transactions may not be spent for 100 blocks. + - That is, the block reward from block 1,000 may not be spent until block 1,100. - Coinbase Transaction Block Height - The coinbase transaction in a block must provide an unlocking script that that starts with a push operation which pushes the block height of the block it is contained in. - - This requirement was added in [BIP-34](/protocol/forks/bip-0034) to ensure that coinbase transactions are unique. \ No newline at end of file + - This requirement was added in [BIP-34](/protocol/forks/bip-0034) to ensure that coinbase transactions are unique. + - Signature Check Counting + - The number of signature checks in a transaction may not exceed 3,000. + - The number of signature checks in a block may not exceed the max block size divided by 141 (currently this is 226,950). + - For details on how signature checks are counted, see [SigChecks](#sigchecks) + - Transaction + +### SigChecks + +SigChecks was implemented as a part of [HF-20200515](/protocol/forks/hf-20200515) and replaced the existing system of signature operation counting (SigOps). +During script execution, signature checks are counted using the following rules: + + - Executing OP_CHECKSIG / OP_CHECKSIGVERIFY / OP_CHECKDATASIG / OP_CHECKDATASIGVERIFY increments SigChecks by: + - +0, if signature is NULL. + - +1, if signature is non-NULL. + - Executing an M-of-N OP_CHECKMULTISIG / OP_CHECKMULTISIGVERIFY increments SigChecks by: + - +0, if all M signatures are NULL. + - +M, if at least one signature is non-NULL and the verification is in [New/Schnorr mode](/protocol/forks/2019-11-15-schnorrmultisig) (dummy element is non-NULL). + - +N, if at least one signature is non-NULL and the verification is in Old/ECDSA mode (dummy element is NULL). + + diff --git a/protocol/blockchain/transaction-validation/network-level-validation-rules.md b/protocol/blockchain/transaction-validation/network-level-validation-rules.md index 12fe127..e58026f 100644 --- a/protocol/blockchain/transaction-validation/network-level-validation-rules.md +++ b/protocol/blockchain/transaction-validation/network-level-validation-rules.md @@ -17,6 +17,7 @@ Standard transactions are those that: - Have the total size of [data output](/protocol/blockchain/transaction/locking-script#data-output) locking scripts no larger than 223 bytes (see [data output size limit](#data-output-size-limit) below) - For [multisig](/protocol/blockchain/transaction/locking-script#multisig) outputs, must have at most 3 parties and at least 1 required party (i.e. 1-of-1 through 3-of-3). - Have non-data outputs with amount above the [dust](#dust) threshold + - Each input of the transaction, must require no more than `((scriptLength + 60) / 43)` [SigChecks](/protocol/blockchain/transaction-validation/block-level-validation-rules#sigchecks) Be aware, however, that these rules may vary from node-to-node as they are often configurable. Some nodes may also accept and relay non-standard transactions. From 1e73c65b87e3f603163271cdc8512e92bb4d732d Mon Sep 17 00:00:00 2001 From: Andrew Groot Date: Mon, 24 May 2021 14:41:38 -0400 Subject: [PATCH 31/31] Minor tweaks for SLP and endian pages. --- home.md | 6 +++++- protocol/misc/endian.md | 6 +++++- protocol/slp.md | 2 +- protocol/slp/commit.md | 2 +- protocol/slp/genesis.md | 2 +- protocol/slp/mint.md | 2 +- protocol/slp/send.md | 4 ++-- 7 files changed, 16 insertions(+), 8 deletions(-) diff --git a/home.md b/home.md index a81d65e..80dd52e 100644 --- a/home.md +++ b/home.md @@ -67,8 +67,12 @@ [sendcmpct](/protocol/network/messages/sendcmpct) — [get_xthin](/protocol/network/messages/get_xthin) — [xthinblock](/protocol/network/messages/xthinblock) — [thinblock](/protocol/network/messages/thinblock) — [get_xblocktx](/protocol/network/messages/get_xblocktx) — [xblocktx](/protocol/network/messages/xblocktx) — [xupdate](/protocol/network/messages/xupdate) — [xversion](/protocol/network/messages/xversion) — [xverack](/protocol/network/messages/xverack) ### Simple Payment Verification (SPV) + [SPV](/protocol/spv) — [Bloom Filters](/protocol/spv/bloom-filter) + ### Simple Ledger Protocol -[SLP](/protocol/slp) + +[SLP Overview](/protocol/slp) — [GENESIS](/protocol/slp/genesis) — [MINT](/protocol/slp/mint) — [SEND](/protocol/slp/send) — [COMMIT](/protocol/slp/commit) + ### Miscellaneous [Endian](/protocol/misc/endian) diff --git a/protocol/misc/endian.md b/protocol/misc/endian.md index 2560296..9d6affc 100644 --- a/protocol/misc/endian.md +++ b/protocol/misc/endian.md @@ -1 +1,5 @@ -# Endianness +# Endian + +[Endianness](https://en.wikipedia.org/wiki/Endianness) refers to the implies order of bytes for a given value. + +Values are generally either [big-endian](/protocol/misc/endian/big), with the most significant bytes come first, or [little-endian](/protocol/misc/endian/little), with the least significant values first. Bitcoin Cash used a mix of little- and big-endian values, with little-endian byte order generally being used for integers. \ No newline at end of file diff --git a/protocol/slp.md b/protocol/slp.md index ede6bc0..7426397 100644 --- a/protocol/slp.md +++ b/protocol/slp.md @@ -20,7 +20,7 @@ Users and creators of the tokens can utilize the computational power and other b Simple Ledger Protocol (SLP) is one of the most prevalent token systems on Bitcoin Cash. SLP employs a “colored coins” design that associates token amounts with BCH [transaction](/protocol/blockchain/transaction) outputs. An SLP transaction will utilize a [data output](/protocol/blockchain/transaction/locking-script#data-output) to include a message in one of four predefined formats to annotate the SLP transaction information associated with each transaction output in the same transaction. -The predefined formats include: [GENESIS](/protocol/slp/genesis), [MINT](protocol/slp/mint), [SEND](/protocol/slp/send), and [COMMIT](/protocol/slp/commit). +The predefined formats include: [GENESIS](/protocol/slp/genesis), [MINT](/protocol/slp/mint), [SEND](/protocol/slp/send), and [COMMIT](/protocol/slp/commit). The GENESIS message defines the SLP token and issues the first batch of tokens. The MINT message issues further batches of tokens. The SEND message denotes the number of tokens sent to each output. diff --git a/protocol/slp/commit.md b/protocol/slp/commit.md index 5191cb9..e4534c1 100644 --- a/protocol/slp/commit.md +++ b/protocol/slp/commit.md @@ -23,6 +23,6 @@ The set will be carefully chosen to satisfy the above requirements with a minima **Transaction outputs**: | vout | ScriptPubKey ("Address") | BCH amount | -|-|-|-| +|--|--|--| | 0 | OP_RETURN
<lokad_id: 'SLP\x00'> (4 bytes, ascii)
<token_type: 1> (1 to 2 byte integer)
<transaction_type: 'COMMIT'> (6 bytes, ascii)
<token_id> (32 bytes)
<for_bitcoin_block_hash> (32 bytes)
<block_height> (8 byte integer)
<token_txn_set_hash> (32 bytes)
<txn_set_data_url> (0 to ∞ bytes, ascii) [to be determined] | any | | ... | Any | any | diff --git a/protocol/slp/genesis.md b/protocol/slp/genesis.md index 1d9654b..e054377 100644 --- a/protocol/slp/genesis.md +++ b/protocol/slp/genesis.md @@ -29,7 +29,7 @@ The genesis transaction includes an initial minting of `initial_token_mint_quant **Transaction outputs**: | vout | ScriptPubKey ("Address")| BCH amount| Implied token amount (base units) | -| - | - | - | - | +|--|--|--|--| | 0 | OP_RETURN
<lokad_id: 'SLP\x00'> (4 bytes, ascii)1
<token_type: 1> (1 to 2 byte integer)
<transaction_type: 'GENESIS'> (7 bytes, ascii)
<token_ticker> (0 to ∞ bytes, suggested utf-8)
<token_name> (0 to ∞ bytes, suggested utf-8)
<token_document_url> (0 to ∞ bytes, suggested ascii)
<token_document_hash> (0 bytes or 32 bytes)
<decimals> (1 byte in range 0x00-0x09)
<mint_baton_vout> (0 bytes, or 1 byte in range 0x02-0xff)
<initial_token_mint_quantity> (8 byte integer)
| any2 | 0 | | 1 | Initial mint receiver | any2 | initial_token_mint_quantity | | ... | Any | any2 | 0 | diff --git a/protocol/slp/mint.md b/protocol/slp/mint.md index f4c079d..1b548c7 100644 --- a/protocol/slp/mint.md +++ b/protocol/slp/mint.md @@ -11,7 +11,7 @@ This makes it possible to prove end-of-minting capabilities for a token even aft **Transaction outputs**: | vout | ScriptPubKey ("Address") | BCH amount | Implied token amount (base units) | -|-|-|-|-| +|--|--|--|--| | 0 | OP_RETURN
< lokad_id: 'SLP\x00'> (4 bytes, ascii)
< token_type: 1> (1 to 2 byte integer)
< transaction_type: 'MINT'> (4 bytes, ascii)
< token_id> (32 bytes)
< mint_baton_vout> (0 bytes or 1 byte between 0x02-0xff)
< additional_token_quantity> (8 byte integer) | any | 0 | | 1 | Token mint receiver | any | additional_token_quantity | | ... | Any | any | 0 | diff --git a/protocol/slp/send.md b/protocol/slp/send.md index 77a69db..e50e8c7 100644 --- a/protocol/slp/send.md +++ b/protocol/slp/send.md @@ -6,12 +6,12 @@ Tokens will be assigned to the outputs with indexes 1 to 19 as indicated within Any number of additional BCH-only outputs will be allowed. A BCH-only output can come before token outputs, but a token quantity of 0 must be specified for this output. -**Transaction inputs**: Any number of inputs or content of inputs, in any order, but must include sufficient tokens coming from valid token transactions of matching `token_id`, `token_type` (see [Consensus Rules](/protocol/slp#Consensus-Rules)). +**Transaction inputs**: Any number of inputs or content of inputs, in any order, but must include sufficient tokens coming from valid token transactions of matching `token_id`, `token_type` (see [SLP consensus rules](/protocol/slp#consensus-rules)). **Transaction outputs**: | vout | ScriptPubKey ("Address") | BCH amount | Implied token amount (base units) | -|-|-|-|-| +|--|--|--|--| | 0 | OP_RETURN
<lokad id: 'SLP\x00'> (4 bytes, ascii)
<token_type: 1> (1 to 2 byte integer)
<transaction_type: 'SEND'> (4 bytes, ascii)
<token_id> (32 bytes)
<token_output_quantity1> (required, 8 byte integer)
<token_output_quantity2> (optional, 8 byte integer)
...
<token_output_quantity19> (optional, 8 byte integer)
| any | 0 | | 1 | Receiver 1 | any | token_output_quantity1 | | ... | ... | any | ... |