From d84186c01caa6728aff157b596908e8c5fdd2ad0 Mon Sep 17 00:00:00 2001 From: Chris Stewart Date: Tue, 3 Jan 2017 17:07:37 -0600 Subject: [PATCH 001/335] Specify which 1 byte push op codes are valid This adds documentation to BIP141 about which 1 byte push op codes are valid for segwit. This is needed because `OP_1NEGATE` is a 1 byte push op code, but is NOT a valid 1 byte push op code for segwit. See the implementation here for why `OP_1NEGATE` is not valid: https://github.com/bitcoin/bitcoin/blob/14d01309bed59afb08651f2b701ff90371b15b20/src/script/script.cpp#L228 --- bip-0141.mediawiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bip-0141.mediawiki b/bip-0141.mediawiki index 7cc587a2..cbdf5ced 100644 --- a/bip-0141.mediawiki +++ b/bip-0141.mediawiki @@ -83,7 +83,7 @@ If all transactions in a block do not have witness data, the commitment is optio === Witness program === -A scriptPubKey (or redeemScript as defined in BIP16/P2SH) that consists of a 1-byte push opcode (for 0 to 16) followed by a data push between 2 and 40 bytes gets a new special meaning. The value of the first push is called the "version byte". The following byte vector pushed is called the "witness program". +A scriptPubKey (or redeemScript as defined in BIP16/P2SH) that consists of a valid 1-byte push opcode (OP_0,OP_1,OP_2...,OP_16) followed by a data push between 2 and 40 bytes gets a new special meaning. The value of the first push is called the "version byte". The following byte vector pushed is called the "witness program". There are two cases in which witness validation logic are triggered. Each case determines the location of the witness version byte and program, as well as the form of the scriptSig: # Triggered by a scriptPubKey that is exactly a push of a version byte, plus a push of a witness program. The scriptSig must be exactly empty or validation fails. (''"native witness program"'') From 608d5dc95f2ddcee32758fe73de6d68b99021e39 Mon Sep 17 00:00:00 2001 From: Chris Stewart Date: Tue, 3 Jan 2017 17:46:14 -0600 Subject: [PATCH 002/335] Update bip-0141.mediawiki Clarifying rewording, `OP_0` is not a 1 byte push op code since it pushes the empty byte vector onto the stack. --- bip-0141.mediawiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bip-0141.mediawiki b/bip-0141.mediawiki index cbdf5ced..eeb6eb93 100644 --- a/bip-0141.mediawiki +++ b/bip-0141.mediawiki @@ -83,7 +83,7 @@ If all transactions in a block do not have witness data, the commitment is optio === Witness program === -A scriptPubKey (or redeemScript as defined in BIP16/P2SH) that consists of a valid 1-byte push opcode (OP_0,OP_1,OP_2...,OP_16) followed by a data push between 2 and 40 bytes gets a new special meaning. The value of the first push is called the "version byte". The following byte vector pushed is called the "witness program". +A scriptPubKey (or redeemScript as defined in BIP16/P2SH) that consists of a select subset of opcodes (OP_0,OP_1,OP_2,...,OP_16) followed by a data push between 2 and 40 bytes gets a new special meaning. The value of the first push is called the "version byte". The following byte vector pushed is called the "witness program". There are two cases in which witness validation logic are triggered. Each case determines the location of the witness version byte and program, as well as the form of the scriptSig: # Triggered by a scriptPubKey that is exactly a push of a version byte, plus a push of a witness program. The scriptSig must be exactly empty or validation fails. (''"native witness program"'') From b2b24b53935544f45188fbe1ae8701074b8cc9f6 Mon Sep 17 00:00:00 2001 From: azuchi Date: Sun, 19 Feb 2017 16:19:17 +0900 Subject: [PATCH 003/335] BIP 143: Unify coin unit --- bip-0143.mediawiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bip-0143.mediawiki b/bip-0143.mediawiki index 476b84da..77d75c9a 100644 --- a/bip-0143.mediawiki +++ b/bip-0143.mediawiki @@ -551,7 +551,7 @@ These examples show that FindAndDelete for the signature is not app nLockTime: 00000000 The input comes from a P2WSH witness program: - scriptPubKey : 00209e1be07558ea5cc8e02ed1d80c0911048afad949affa36d5c3951e3159dbea19, value: 200000 + scriptPubKey : 00209e1be07558ea5cc8e02ed1d80c0911048afad949affa36d5c3951e3159dbea19, value: 0.00200000 redeemScript : OP_CHECKSIGVERIFY <0x30450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e01> ad4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e01 From ce5d831516bfdb34904a765b3f742e38621ec036 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Wed, 27 Sep 2017 18:50:05 +0000 Subject: [PATCH 004/335] BIP 2: Allow editors to fix typos --- bip-0002.mediawiki | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bip-0002.mediawiki b/bip-0002.mediawiki index ea60d1d7..05f13e54 100644 --- a/bip-0002.mediawiki +++ b/bip-0002.mediawiki @@ -95,6 +95,8 @@ The BIP editor will: The BIP editors are intended to fulfill administrative and editorial responsibilities. The BIP editors monitor BIP changes, and update BIP headers as appropriate. +BIP editors may also, at their option, unilaterally make and merge strictly-editorial changes to BIPs, such as correcting misspellings, fixing broken links, etc. + ==BIP format and structure== ===Specification=== From b84deb2adf23695a0f21b5f056257be65294c064 Mon Sep 17 00:00:00 2001 From: philsmd <921533+philsmd@users.noreply.github.com> Date: Tue, 7 Nov 2017 22:19:47 +0100 Subject: [PATCH 005/335] bip38 typo: specifid -> specified There was a small typo in the bip38 specification. If I'm not totally mistaken the word should be "specified" (not specifid) Thx --- bip-0038.mediawiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bip-0038.mediawiki b/bip-0038.mediawiki index bfe1f4ab..9e4d3ef1 100644 --- a/bip-0038.mediawiki +++ b/bip-0038.mediawiki @@ -170,7 +170,7 @@ To recalculate the address: # Derive ''passfactor'' using scrypt with ''ownerentropy'' and the user's passphrase and use it to recompute ''passpoint'' # Derive decryption key for ''pointb'' using scrypt with ''passpoint'', ''addresshash'', and ''ownerentropy'' # Decrypt ''encryptedpointb'' to yield ''pointb'' -# ECMultiply ''pointb'' by ''passfactor''. Use the resulting EC point as a public key and hash it into ''address'' using either compressed or uncompressed public key methodology as specifid in ''flagbyte''. +# ECMultiply ''pointb'' by ''passfactor''. Use the resulting EC point as a public key and hash it into ''address'' using either compressed or uncompressed public key methodology as specified in ''flagbyte''. =====Decryption===== # Collect encrypted private key and passphrase from user. From be9595a4eca728d75371495b5444635b486b33f3 Mon Sep 17 00:00:00 2001 From: Randolf Richardson Date: Tue, 30 Jan 2018 16:08:00 -0800 Subject: [PATCH 006/335] Minor improvements Improved the clarity of the "that candy cost me 2 bits" example to make it easier for people to understand the meaning of "2 bits." Corrected punctuation for "e.g.," and for quotation mark usage. --- bip-0176.mediawiki | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bip-0176.mediawiki b/bip-0176.mediawiki index 8a49bfa7..60311c4c 100644 --- a/bip-0176.mediawiki +++ b/bip-0176.mediawiki @@ -28,7 +28,7 @@ Potential benefits of utilizing "bits" include: == Specification == Definition: 1 bit = 100 satoshis. -Plural of "bit" is "bits". The terms "bit" and "bits" are not proper nouns and thus should not be capitalized unless used at the start of a sentence, etc. +Plural of "bit" is "bits." The terms "bit" and "bits" are not proper nouns and thus should not be capitalized unless used at the start of a sentence, etc. All bitcoin-denominated items are encouraged to also show the denomination in bits, either as the default or as an option. @@ -37,16 +37,16 @@ As bitcoin grows in price versus fiat currencies, it's important to give users t Existing terms used in bitcoin such as satoshi, milli-bitcoin (mBTC) and bitcoin (BTC) do not conflict as they operate at different orders of magnitude. -The term micro-bitcoin (µBTC) can continue to exist in tandem with the term "bits". +The term micro-bitcoin (µBTC) can continue to exist in tandem with the term "bits." == Backwards Compatibility == -Software such as the Bitcoin Core GUI currently use the µBTC denomination and can continue to do so. There is no obligation to switch to "bits". +Software such as the Bitcoin Core GUI currently use the µBTC denomination and can continue to do so. There is no obligation to switch to "bits." The term "bit" has many different definitions, but the ones of particular note are these: -* 1 bit = 1/8 dollar (e.g. That candy cost me 2 bits) -* bit meaning some amount of data (e.g. The first bit of the version field is 0) -* bit meaning strength of a cryptographic algorithm (e.g. 256-bit ECDSA is used in Bitcoin) +* 1 bit = 1/8 dollar (e.g., that candy cost me 2 bits {or 1/4 dollar}) +* bit meaning some amount of data (e.g., the first bit of the version field is 0) +* bit meaning strength of a cryptographic algorithm (e.g., 256-bit ECDSA is used in Bitcoin) The first is a bit dated and isn't likely to confuse people dealing with Bitcoin. The second and third are computer science terms and context should be sufficient to figure out what the user of the word means. @@ -54,4 +54,4 @@ The first is a bit dated and isn't likely to confuse people dealing with Bitcoin This BIP is licensed under the BSD 2-clause license. == Credit == -It's hard to ascertain exactly who invented the term "bits", but the term has been around for a while and the author of this BIP does not take any credit for inventing the term. \ No newline at end of file +It's hard to ascertain exactly who invented the term "bits," but the term has been around for a while and the author of this BIP does not take any credit for inventing the term. From 9d879aaf5ce36c270d6874ef72aa723732f3bc12 Mon Sep 17 00:00:00 2001 From: nopara73 Date: Sat, 12 May 2018 21:51:18 +0700 Subject: [PATCH 007/335] Fix typos --- bip-0126.mediawiki | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bip-0126.mediawiki b/bip-0126.mediawiki index f498b1cb..4cfa2929 100644 --- a/bip-0126.mediawiki +++ b/bip-0126.mediawiki @@ -50,7 +50,7 @@ Applications which wish to comply both with this procedure and BIP69 should appl A HIT is Standard form if it adheres to all of the following rules: -# The number of unique output scripts must be equal to the number of unique inputs scripts (irrespective of the number of inputs and outputs). +# The number of unique output scripts must be equal to the number of unique input scripts (irrespective of the number of inputs and outputs). # All output scripts must be unique. # At least one pair of outputs must be of equal value. # The largest output in the transaction is a member of a set containing at least two identically-sized outputs. @@ -88,7 +88,7 @@ Clients which create intentional HITs must have the capability to form alternate An HIT formed via the preceding procedure will adhere to the following conditions: -# The number of unique inputs scripts must exceed the number of output scripts. +# The number of unique input scripts must exceed the number of output scripts. # All output scripts must be unique. # At least one pair of outputs must be of equal value. ## "Standard outputs" refers to the set of outputs with equal value From 2195aac4d3be2faf29d89b5df5317135d40b0f25 Mon Sep 17 00:00:00 2001 From: Jeff Rade Date: Tue, 4 Sep 2018 20:11:40 -0500 Subject: [PATCH 008/335] BIP-70 Fixing sipa's gist proposal url --- bip-0070.mediawiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bip-0070.mediawiki b/bip-0070.mediawiki index 28349ee3..fce60234 100644 --- a/bip-0070.mediawiki +++ b/bip-0070.mediawiki @@ -314,7 +314,7 @@ http://datatracker.ietf.org/wg/jose/ Wikipedia's page on Invoices: http://en.wikipedia.org/wiki/Invoice especially the list of Electronic Invoice standards -sipa's payment protocol proposal: https://gist.github.com/1237788 +sipa's payment protocol proposal: https://gist.github.com/sipa/1237788 ThomasV's "Signed Aliases" proposal : http://ecdsa.org/bitcoin_URIs.html From 1dcb4eef3083323f17a3446e240e07a1115c3b3f Mon Sep 17 00:00:00 2001 From: tadhg Date: Fri, 30 Nov 2018 18:37:42 +0100 Subject: [PATCH 009/335] Fix typo in BIP47 --- bip-0047.mediawiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bip-0047.mediawiki b/bip-0047.mediawiki index af801f96..4b1763fb 100644 --- a/bip-0047.mediawiki +++ b/bip-0047.mediawiki @@ -150,7 +150,7 @@ It is assumed that Alice can easily obtain Bob's payment code via a suitable met Prior to the first time Alice initiates a transaction to Bob, Alice MUST inform Bob of her payment code via the following procedure: -Note: this procedure is used if Bob uses a version 1 payment code (regardless of the the version of Alice's payment code). If Bob's payment code is not version 1, see the appropriate section in this specification. +Note: this procedure is used if Bob uses a version 1 payment code (regardless of the version of Alice's payment code). If Bob's payment code is not version 1, see the appropriate section in this specification. # Alice constructs a transaction which sends a small quantity of bitcoins to Bob's notification address (notification transaction) ## The inputs selected for this transaction MUST NOT be easily associated with Alice's notification address From a66d1852a27007e14d1d233afbeb3ce362f1c13c Mon Sep 17 00:00:00 2001 From: tadhg Date: Fri, 7 Dec 2018 01:25:19 +0100 Subject: [PATCH 010/335] Missing word --- bip-0047.mediawiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bip-0047.mediawiki b/bip-0047.mediawiki index af801f96..ce4af498 100644 --- a/bip-0047.mediawiki +++ b/bip-0047.mediawiki @@ -229,7 +229,7 @@ The following actions are recommended to reduce this risk: # Bob is watching for incoming payments on B' ever since he received the notification transaction from Alice. -## Bob calculates n shared secrets with Alice, using the 0th public key derived Alice's payment code, and private keys 0 - n derived from Bob's payment code, where n is his desired lookahead window. +## Bob calculates n shared secrets with Alice, using the 0th public key derived from Alice's payment code, and private keys 0 - n derived from Bob's payment code, where n is his desired lookahead window. ## Bob calculates the ephemeral deposit addresses using the same procedure as Alice:
B' = B + sG
## Bob calculate the private key for each ephemeral address as:
b' = b + s
From e5c708b3e74f8ab0e855c215f94ed8aadbca3e7d Mon Sep 17 00:00:00 2001 From: Chm Date: Sat, 22 Dec 2018 23:50:26 +0800 Subject: [PATCH 011/335] Typo of test data in bip 143 Transaction signature got sigHashType byte missing in decomposed block. --- bip-0143.mediawiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bip-0143.mediawiki b/bip-0143.mediawiki index ed07c828..9619da1c 100644 --- a/bip-0143.mediawiki +++ b/bip-0143.mediawiki @@ -187,7 +187,7 @@ To ensure consistency in consensus-critical behaviour, developers should test th nHashType: 01000000 sigHash: c37af31116d1b27caf68aae9e3ac82f1477929014d5b917657d0eb49478cb670 - signature: 304402203609e17b84f6a7d30c80bfa610b5b4542f32a8a0d5447a12fb1366d7f01cc44a0220573a954c4518331561406f90300e8f3358f51928d43c212a8caed02de67eebee + signature: 304402203609e17b84f6a7d30c80bfa610b5b4542f32a8a0d5447a12fb1366d7f01cc44a0220573a954c4518331561406f90300e8f3358f51928d43c212a8caed02de67eebee01 The serialized signed transaction is: 01000000000102fff7f7881a8099afa6940d42d1e7f6362bec38171ea3edf433541db4e4ad969f00000000494830450221008b9d1dc26ba6a9cb62127b02742fa9d754cd3bebf337f7a55d114c8e5cdd30be022040529b194ba3f9281a99f2b1c0a19c0489bc22ede944ccf4ecbab4cc618ef3ed01eeffffffef51e1b804cc89d182d279655c3aa89e815b1b309fe287d9b2b55d57b90ec68a0100000000ffffffff02202cb206000000001976a9148280b37df378db99f66f85c95a783a76ac7a6d5988ac9093510d000000001976a9143bde42dbee7e4dbe6a21b2d50ce2f0167faa815988ac000247304402203609e17b84f6a7d30c80bfa610b5b4542f32a8a0d5447a12fb1366d7f01cc44a0220573a954c4518331561406f90300e8f3358f51928d43c212a8caed02de67eebee0121025476c2e83188368da1ff3e292e7acafcdb3566bb0ad253f62fc70f07aeee635711000000 From 9b03604c5bae35510c420b7a8a42dd00eed41dd3 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Thu, 25 Oct 2018 21:00:52 +0530 Subject: [PATCH 012/335] bip158: update test vectors --- bip-0158.mediawiki | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bip-0158.mediawiki b/bip-0158.mediawiki index 535ffd9a..5ebfaed3 100644 --- a/bip-0158.mediawiki +++ b/bip-0158.mediawiki @@ -315,6 +315,8 @@ complete serialization of a filter is: * N, encoded as a CompactSize * The bytes of the compressed filter itself +A zero element filter MUST be written as one byte containing zeroes. + ==== Signaling ==== This BIP allocates a new service bit: From c7cc17f14ec44fa2c0463a6ed2fd9bfcaac7535c Mon Sep 17 00:00:00 2001 From: Luke Childs Date: Fri, 7 Jun 2019 14:26:45 +0700 Subject: [PATCH 013/335] [bip38] Consistent hyphenation usage --- bip-0038.mediawiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bip-0038.mediawiki b/bip-0038.mediawiki index bfe1f4ab..9642f42f 100644 --- a/bip-0038.mediawiki +++ b/bip-0038.mediawiki @@ -39,7 +39,7 @@ This proposal is hereby placed in the public domain. :'''''User story:''' As a Bitcoin user who uses paper wallets, I would like the ability to add encryption, so that my Bitcoin paper storage can be two factor: something I have plus something I know.'' :'''''User story:''' As a Bitcoin user who would like to pay a person or a company with a private key, I do not want to worry that any part of the communication path may result in the interception of the key and theft of my funds. I would prefer to offer an encrypted private key, and then follow it up with the password using a different communication channel (e.g. a phone call or SMS).'' :'''''User story:''' (EC-multiplied keys) As a user of physical bitcoins, I would like a third party to be able to create password-protected Bitcoin private keys for me, without them knowing the password, so I can benefit from the physical bitcoin without the issuer having access to the private key. I would like to be able to choose a password whose minimum length and required format does not preclude me from memorizing it or engraving it on my physical bitcoin, without exposing me to an undue risk of password cracking and/or theft by the manufacturer of the item.'' -:'''''User story:''' (EC multiplied keys) As a user of paper wallets, I would like the ability to generate a large number of Bitcoin addresses protected by the same password, while enjoying a high degree of security (highly expensive scrypt parameters), but without having to incur the scrypt delay for each address I generate. +:'''''User story:''' (EC-multiplied keys) As a user of paper wallets, I would like the ability to generate a large number of Bitcoin addresses protected by the same password, while enjoying a high degree of security (highly expensive scrypt parameters), but without having to incur the scrypt delay for each address I generate. ==Specification== This proposal makes use of the following functions and definitions: From 62c759eae68c380c1a494540331254039cbbd1ee Mon Sep 17 00:00:00 2001 From: Bryan Bishop Date: Sat, 3 Aug 2019 13:55:29 -0500 Subject: [PATCH 014/335] bip112: fix trivial typo --- bip-0112.mediawiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bip-0112.mediawiki b/bip-0112.mediawiki index f3d370a3..b1597865 100644 --- a/bip-0112.mediawiki +++ b/bip-0112.mediawiki @@ -36,7 +36,7 @@ When executed, if any of the following conditions are true, the script interpret Otherwise, script execution will continue as if a NOP had been executed. -BIP 68 prevents a non-final transaction from being selected for inclusion in a block until the corresponding input has reached the specified age, as measured in block-height or block-time. By comparing the argument to CHECKSEQUENCEVERIFY against the nSequence field, we indirectly verify a desired minimum age of the +BIP 68 prevents a non-final transaction from being selected for inclusion in a block until the corresponding input has reached the specified age, as measured in block-height or block-time. By comparing the argument to CHECKSEQUENCEVERIFY against the nSequence field, we indirectly verify a desired minimum age of the output being spent; until that relative age has been reached any script execution pathway including the CHECKSEQUENCEVERIFY will fail to validate, causing the transaction not to be selected for inclusion in a block. From a0481edf92c91ca785d3b6da577aba5a0929213d Mon Sep 17 00:00:00 2001 From: Enegnei Date: Sun, 30 Aug 2020 22:01:46 +0200 Subject: [PATCH 015/335] Minor grammar fix --- bip-0032.mediawiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bip-0032.mediawiki b/bip-0032.mediawiki index f2f1e48b..5a1d7784 100644 --- a/bip-0032.mediawiki +++ b/bip-0032.mediawiki @@ -118,7 +118,7 @@ To shorten notation, we will write CKDpriv(CKDpriv(CKDpriv(m,3H),2),5 * N(m/aH/b/c) = N(m/aH/b)/c = N(m/aH)/b/c. However, N(m/aH) cannot be rewritten as N(m)/aH, as the latter is not possible. -Each leaf node in the tree corresponds to an actual key, while the internal nodes correspond to the collections of keys that descend from them. The chain codes of the leaf nodes are ignored, and only their embedded private or public key is relevant. Because of this construction, knowing an extended private key allows reconstruction of all descendant private keys and public keys, and knowing an extended public keys allows reconstruction of all descendant non-hardened public keys. +Each leaf node in the tree corresponds to an actual key, while the internal nodes correspond to the collections of keys that descend from them. The chain codes of the leaf nodes are ignored, and only their embedded private or public key is relevant. Because of this construction, knowing an extended private key allows reconstruction of all descendant private keys and public keys, and knowing an extended public key allows reconstruction of all descendant non-hardened public keys. ===Key identifiers=== From 688b0dabab2fcdadffe69bf1bdf5d4773b5be391 Mon Sep 17 00:00:00 2001 From: Enegnei Date: Sun, 30 Aug 2020 22:41:52 +0200 Subject: [PATCH 016/335] A few more minor grammar fixes / improvements --- bip-0032.mediawiki | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/bip-0032.mediawiki b/bip-0032.mediawiki index 5a1d7784..341dc089 100644 --- a/bip-0032.mediawiki +++ b/bip-0032.mediawiki @@ -24,7 +24,7 @@ This document describes hierarchical deterministic wallets (or "HD Wallets"): wa The specification is intended to set a standard for deterministic wallets that can be interchanged between different clients. Although the wallets described here have many features, not all are required by supporting clients. -The specification consists of two parts. In a first part, a system for deriving a tree of keypairs from a single seed is presented. The second part demonstrates how to build a wallet structure on top of such a tree. +The specification consists of two parts. In the first part, a system for deriving a tree of keypairs from a single seed is presented. The second part demonstrates how to build a wallet structure on top of such a tree. ==Copyright== @@ -36,7 +36,7 @@ The Bitcoin reference client uses randomly generated keys. In order to avoid the Deterministic wallets do not require such frequent backups, and elliptic curve mathematics permit schemes where one can calculate the public keys without revealing the private keys. This permits for example a webshop business to let its webserver generate fresh addresses (public key hashes) for each order or for each customer, without giving the webserver access to the corresponding private keys (which are required for spending the received funds). -However, deterministic wallets typically consist of a single "chain" of keypairs. The fact that there is only one chain means that sharing a wallet happens on an all-or-nothing basis. However, in some cases one only wants some (public) keys to be shared and recoverable. In the example of a webshop, the webserver does not need access to all public keys of the merchant's wallet; only to those addresses which are used to receive customer's payments, and not for example the change addresses that are generated when the merchant spends money. Hierarchical deterministic wallets allow such selective sharing by supporting multiple keypair chains, derived from a single root. +However, deterministic wallets typically consist of a single "chain" of keypairs. The fact that there is only one chain means that sharing a wallet happens on an all-or-nothing basis. However, in some cases one only wants some (public) keys to be shared and recoverable. In the example of a webshop, the webserver does not need access to all public keys of the merchant's wallet; only to those addresses which are used to receive customers' payments, and not for example the change addresses that are generated when the merchant spends money. Hierarchical deterministic wallets allow such selective sharing by supporting multiple keypair chains, derived from a single root. ==Specification: Key derivation== @@ -103,7 +103,7 @@ The function N((k, c)) → (K, c) computes the extended public key correspond To compute the public child key of a parent private key: * N(CKDpriv((kpar, cpar), i)) (works always). * CKDpub(N(kpar, cpar), i) (works only for non-hardened child keys). -The fact that they are equivalent is what makes non-hardened keys useful (one can derive child public keys of a given parent key without knowing any private key), and also what distinguishes them from hardened keys. The reason for not always using non-hardened keys (which are more useful) is security; see further for more information. +The fact that they are equivalent is what makes non-hardened keys useful (one can derive child public keys of a given parent key without knowing any private key), and also what distinguishes them from hardened keys. The reason for not always using non-hardened keys (which are more useful) is security; see further below for more information. ====Public parent key → private child key==== @@ -183,7 +183,7 @@ When a business has several independent offices, they can all use wallets derive ====Recurrent business-to-business transactions: N(m/iH/0)==== In case two business partners often transfer money, one can use the extended public key for the external chain of a specific account (M/i h/0) as a sort of "super address", allowing frequent transactions that cannot (easily) be associated, but without needing to request a new address for each payment. -Such a mechanism could also be used by mining pool operators as variable payout address. +Such a mechanism could also be used by mining pool operators as a variable payout address. ====Unsecure money receiver: N(m/iH/0)==== @@ -211,7 +211,7 @@ Private and public keys must be kept safe as usual. Leaking a private key means Somewhat more care must be taken regarding extended keys, as these correspond to an entire (sub)tree of keys. One weakness that may not be immediately obvious, is that knowledge of a parent extended public key plus any non-hardened private key descending from it is equivalent to knowing the parent extended private key (and thus every private and public key descending from it). This means that extended public keys must be treated more carefully than regular public keys. -It is also the reason for the existence of hardened keys, and why they are used for the account level in the tree. This way, a leak of account-specific (or below) private key never risks compromising the master or other accounts. +It is also the reason for the existence of hardened keys, and why they are used for the account level in the tree. This way, a leak of account-specific (or below) private keys never risks compromising the master or other accounts. ==Test Vectors== From 5ec9df085ebc2adfef5ab667662a8aba967f06cd Mon Sep 17 00:00:00 2001 From: Justus Ranvier Date: Thu, 28 Sep 2017 08:47:50 -0500 Subject: [PATCH 017/335] BIP-0047: Adjust text to match test vectors The original implementation of BIP-47 in Samourai Wallet reversed the parameters in the calculation of the HMAC-SHA512 step of notification transaction blinding. This change adjusts the text to match the as-implementend behavior in deployed BIP-47 wallets and the test vectors. --- bip-0047.mediawiki | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bip-0047.mediawiki b/bip-0047.mediawiki index af801f96..ada9deb5 100644 --- a/bip-0047.mediawiki +++ b/bip-0047.mediawiki @@ -1,7 +1,7 @@ RECENT CHANGES: +* (28 Sep 2017) Adjust text to match test vectors * (19 Apr 2016) Define version 2 payment codes * (17 Apr 2016) Clarify usage of outpoints in notification transactions -* (18 Dec 2015) Update explanations to resolve FAQs
   BIP: 47
@@ -158,7 +158,7 @@ Note: this procedure is used if Bob uses a version 1 payment code (regardless of
 ## Alice selects the private key corresponding to the designated pubkey: 
a
## Alice selects the public key associated with Bob's notification address:
B, where B = bG
## Alice calculates a secret point:
S = aB
-## Alice calculates a 64 byte blinding factor:
s = HMAC-SHA512(x, o)
+## Alice calculates a 64 byte blinding factor:
s = HMAC-SHA512(o, x)
### "x" is the x value of the secret point ### "o" is the outpoint being spent by the designated input # Alice serializes her payment code in binary form. From bc069fa050fb9816746c9e13b34d9d13a7d89562 Mon Sep 17 00:00:00 2001 From: Justus Ranvier Date: Mon, 15 Feb 2021 06:22:42 -0900 Subject: [PATCH 018/335] Finalize BIP-47 --- bip-0047.mediawiki | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/bip-0047.mediawiki b/bip-0047.mediawiki index ada9deb5..4806b0b6 100644 --- a/bip-0047.mediawiki +++ b/bip-0047.mediawiki @@ -1,7 +1,7 @@ RECENT CHANGES: +* (15 Feb 2021) Finalize specification * (28 Sep 2017) Adjust text to match test vectors * (19 Apr 2016) Define version 2 payment codes -* (17 Apr 2016) Clarify usage of outpoints in notification transactions
   BIP: 47
@@ -10,11 +10,17 @@ RECENT CHANGES:
   Author: Justus Ranvier 
   Comments-Summary: Unanimously Discourage for implementation
   Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0047
-  Status: Draft
+  Status: Final
   Type: Informational
   Created: 2015-04-24
 
+==Status== + +This BIP can be be considered final in terms of enabling compatibility with wallets that implement version 1 and version 2 reusable payment codes, however future developments of the reusable payment codes specification will not be distributed via the BIP process. + +The Open Bitcoin Privacy Project RFC repo should be consulted for specifications related to version 3 or higher payment codes: https://github.com/OpenBitcoinPrivacyProject/rfc + ==Abstract== This BIP defines a technique for creating a payment code which can be publicly advertised and associated with a real-life identity without creating the loss of security or privacy inherent to P2PKH address reuse. From aa206adf59483979fda5de30264c4017b2fcd8a5 Mon Sep 17 00:00:00 2001 From: Tobin Harding Date: Tue, 17 Aug 2021 18:35:36 +1000 Subject: [PATCH 019/335] Remove newline to fix list rendering Currently the newline in list items is causing the text on the new line to be rendered as a code section. I am unsure why but I'm guessing putting all the text for each list item on a single line will fix it. --- bip-0158.mediawiki | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/bip-0158.mediawiki b/bip-0158.mediawiki index ce4a4af9..1ac0c9c1 100644 --- a/bip-0158.mediawiki +++ b/bip-0158.mediawiki @@ -273,10 +273,8 @@ This BIP defines one initial filter type: The basic filter is designed to contain everything that a light client needs to sync a regular Bitcoin wallet. A basic filter MUST contain exactly the following items for each transaction in a block: -* The previous output script (the script being spent) for each input, except - for the coinbase transaction. -* The scriptPubKey of each output, aside from all OP_RETURN output - scripts. +* The previous output script (the script being spent) for each input, except for the coinbase transaction. +* The scriptPubKey of each output, aside from all OP_RETURN output scripts. Any "nil" items MUST NOT be included into the final set of filter elements. From 497ad1c81a8d7e882c86ffe780db5b01db66d686 Mon Sep 17 00:00:00 2001 From: katesalazar Date: Fri, 17 Sep 2021 21:08:05 +0200 Subject: [PATCH 020/335] Remove transparent background from figure. Before this change, the figure presented black text on transparent background, which might be unconvenient when using a browser able to pass a dark theme preference to some environments where this document is published, currently notably GitHub. A white background could help a better visualization compromise. White background on the figure is the single purpose of this revision. This PNG was compiled using: dot -Tpng states.gv -o states.png --- bip-0009/states.gv | 22 ++++++++++++++++++++++ bip-0009/states.png | Bin 30632 -> 50153 bytes 2 files changed, 22 insertions(+) create mode 100644 bip-0009/states.gv diff --git a/bip-0009/states.gv b/bip-0009/states.gv new file mode 100644 index 00000000..9dc95c56 --- /dev/null +++ b/bip-0009/states.gv @@ -0,0 +1,22 @@ +/* There are many ways to compile this, but one of them is: + * + * $ dot -Tpng states.gv -o states.png + */ +digraph { + /* States. */ + DEFINED; FAILED; STARTED; LOCKED_IN; ACTIVE; + + /* Relationships between states, labeled where applicable. */ + DEFINED -> DEFINED; + DEFINED -> FAILED [label = "timeout ≤ MTP"]; + DEFINED -> STARTED [label = "starttime ≤ MTP < timeout"]; + FAILED -> FAILED; + STARTED -> STARTED; + STARTED -> FAILED [label = "timeout ≤ MTP"]; + STARTED -> LOCKED_IN [label = "(MTP < timeout) AND (threshold reached)"]; + LOCKED_IN -> ACTIVE [label = "Always"]; + ACTIVE -> ACTIVE; + + /* Visualization hack to unclutter output. */ + nodesep = 1.2; +} diff --git a/bip-0009/states.png b/bip-0009/states.png index 09312a1c0381845d10afe2ffbbec912ee1b1b1e0..2048ed870df296d86bef1145b1f10aa980801c8f 100644 GIT binary patch literal 50153 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 literal 30632 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 Date: Thu, 18 Nov 2021 23:55:55 +0100 Subject: [PATCH 021/335] BIP 155: add Yggdrasil --- bip-0155.mediawiki | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/bip-0155.mediawiki b/bip-0155.mediawiki index 3e7b0d82..0ec68019 100644 --- a/bip-0155.mediawiki +++ b/bip-0155.mediawiki @@ -117,6 +117,11 @@ The list of reserved network IDs is as follows: | CJDNS | 16 | Cjdns overlay network address +|- +| 0x07 +| YGGDRASIL +| 16 +| Yggdrasil overlay network address |} Clients are RECOMMENDED to gossip addresses from all known networks even if they are currently not connected to some of them. That could help multi-homed nodes and make it more difficult for an observer to tell which networks a node is connected to. @@ -184,6 +189,10 @@ I2P addresses MUST be sent with the I2P network ID, with the decode Cjdns addresses are simply IPv6 addresses in the fc00::/8 range[https://github.com/cjdelisle/cjdns/blob/6e46fa41f5647d6b414612d9d63626b0b952746b/doc/Whitepaper.md#pulling-it-all-together Cjdns whitepaper: Pulling It All Together]. They MUST be sent with the CJDNS network ID. +==Appendix E: Yggdrasil address encoding== + +Yggdrasil addresses are simply IPv6 addresses in the 0200::/7 range[https://yggdrasil-network.github.io/faq.html#will-yggdrasil-conflict-with-my-network-routing Yggdrasil FAQ]. They MUST be sent with the YGGDRASIL network ID. + ==References== From a14a5dbcba1ef6dd76275e826e28c1d936db1fe8 Mon Sep 17 00:00:00 2001 From: Sunit Roy Date: Tue, 10 May 2022 01:05:11 +0530 Subject: [PATCH 022/335] bip-39 dart implementation added --- bip-0039.mediawiki | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bip-0039.mediawiki b/bip-0039.mediawiki index 7b98a39d..19c16c62 100644 --- a/bip-0039.mediawiki +++ b/bip-0039.mediawiki @@ -197,3 +197,6 @@ C (with Python/Java/Javascript bindings): Python: * https://github.com/scgbckbone/btc-hd-wallet + +Dart: +* https://github.com/dart-bitcoin/bip39 From c8c8e27c2c4623bb17b20a9aebea965a23d425de Mon Sep 17 00:00:00 2001 From: Jeremy Rubin Date: Tue, 10 May 2022 08:33:05 -0700 Subject: [PATCH 023/335] [BIP-119] Use mediawiki syntax highlighting, add comment to spec --- bip-0119.mediawiki | 129 +++++++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 58 deletions(-) diff --git a/bip-0119.mediawiki b/bip-0119.mediawiki index 304f228c..cd7c8aaf 100644 --- a/bip-0119.mediawiki +++ b/bip-0119.mediawiki @@ -167,31 +167,40 @@ OP_CHECKTEMPLATEVERIFY as implemented in C++ in the context of Bitcoin Core can be seen in the reference implementation. The execution of the opcode is as follows: - def execute_bip_119(self): - # Before soft-fork activation / failed activation - if not self.flags.script_verify_default_check_template_verify_hash: - # Potentially set for node-local policy to discourage premature use - if self.flags.script_verify_discourage_upgradable_nops: - return self.errors_with(errors.script_err_discourage_upgradable_nops) - return self.return_as_nop() - # CTV always requires at least one stack argument - if len(self.stack) < 1: - return self.errors_with(errors.script_err_invalid_stack_operation) - # CTV only verifies the hash against a 32 byte argument - if len(self.stack[-1]) == 32: - # Ensure the precomputed data required for anti-DoS is available, - # or cache it on first use - if self.context.precomputed_ctv_data == None: - self.context.precomputed_ctv_data = self.context.tx.get_default_check_template_precomputed_data() - if stack[-1] != self.context.tx.get_default_check_template_hash(self.context.nIn, self.context.precomputed_ctv_data) - return self.errors_with(errors.script_err_template_mismatch) - return self.return_as_nop() - # future upgrade can add semantics for this opcode with different length args - # so discourage use when applicable + +def execute_bip_119(self): + # Before soft-fork activation / failed activation + # continue to treat as NOP4 + if not self.flags.script_verify_default_check_template_verify_hash: + # Potentially set for node-local policy to discourage premature use if self.flags.script_verify_discourage_upgradable_nops: return self.errors_with(errors.script_err_discourage_upgradable_nops) - else: - return self.return_as_nop() + return self.return_as_nop() + + # CTV always requires at least one stack argument + if len(self.stack) < 1: + return self.errors_with(errors.script_err_invalid_stack_operation) + + # CTV only verifies the hash against a 32 byte argument + if len(self.stack[-1]) == 32: + # Ensure the precomputed data required for anti-DoS is available, + # or cache it on first use + if self.context.precomputed_ctv_data == None: + self.context.precomputed_ctv_data = self.context.tx.get_default_check_template_precomputed_data() + + # If the hashes do not match, return error + if stack[-1] != self.context.tx.get_default_check_template_hash(self.context.nIn, self.context.precomputed_ctv_data) + return self.errors_with(errors.script_err_template_mismatch) + + return self.return_as_nop() + + # future upgrade can add semantics for this opcode with different length args + # so discourage use when applicable + if self.flags.script_verify_discourage_upgradable_nops: + return self.errors_with(errors.script_err_discourage_upgradable_nops) + else: + return self.return_as_nop() + The computation of this hash can be implemented as specified below (where self is the transaction type). Care must be taken that in any validation context, @@ -202,46 +211,50 @@ including hashes of the scriptsigs, sequences, and outputs. See the section "Denial of Service and Validation Costs" below. This is not a performance optimization. - def get_default_check_template_precomputed_data(self): - result = {} - # If there are no scriptSigs we do not need to precompute a hash - if any(inp.scriptSig for inp in self.vin): - result["scriptSigs"] = sha256(b"".join(ser_string(inp.scriptSig) for inp in self.vin)) - # The same value is also pre-computed for and defined in BIP-341 and can be shared - result["sequences"] = sha256(b"".join(struct.pack(" +def get_default_check_template_precomputed_data(self): + result = {} + # If there are no scriptSigs we do not need to precompute a hash + if any(inp.scriptSig for inp in self.vin): + result["scriptSigs"] = sha256(b"".join(ser_string(inp.scriptSig) for inp in self.vin)) + # The same value is also pre-computed for and defined in BIP-341 and can be shared + result["sequences"] = sha256(b"".join(struct.pack(" A PayToBareDefaultCheckTemplateVerifyHash output matches the following template: - # Extra-fast test for pay-to-basic-standard-template CScripts: - def is_pay_to_bare_default_check_template_verify_hash(self): - return len(self) == 34 and self[0] == 0x20 and self[-1] == OP_CHECKTEMPLATEVERIFY + +# Extra-fast test for pay-to-basic-standard-template CScripts: +def is_pay_to_bare_default_check_template_verify_hash(self): + return len(self) == 34 and self[0] == 0x20 and self[-1] == OP_CHECKTEMPLATEVERIFY + ==Deployment== From ec3688a6102a7686acb3a014418a2dd685711827 Mon Sep 17 00:00:00 2001 From: Jeremy Rubin Date: Tue, 10 May 2022 08:38:37 -0700 Subject: [PATCH 024/335] [BIP-119] Clarify Endianness of serializations --- bip-0119.mediawiki | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/bip-0119.mediawiki b/bip-0119.mediawiki index cd7c8aaf..99a91501 100644 --- a/bip-0119.mediawiki +++ b/bip-0119.mediawiki @@ -217,7 +217,8 @@ def get_default_check_template_precomputed_data(self): # If there are no scriptSigs we do not need to precompute a hash if any(inp.scriptSig for inp in self.vin): result["scriptSigs"] = sha256(b"".join(ser_string(inp.scriptSig) for inp in self.vin)) - # The same value is also pre-computed for and defined in BIP-341 and can be shared + # The same value is also pre-computed for and defined in BIP-341 and can be shared. + # each nSequence is packed as 4 byte unsigned integer (little endian) result["sequences"] = sha256(b"".join(struct.pack(" From aa1871b149b96e5d355df4253526231e006d313b Mon Sep 17 00:00:00 2001 From: Jeremy Rubin Date: Tue, 10 May 2022 08:45:03 -0700 Subject: [PATCH 025/335] [BIP-119] Make serialization specification complete, defining all functions fully --- bip-0119.mediawiki | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/bip-0119.mediawiki b/bip-0119.mediawiki index 99a91501..c2d9912a 100644 --- a/bip-0119.mediawiki +++ b/bip-0119.mediawiki @@ -212,6 +212,34 @@ including hashes of the scriptsigs, sequences, and outputs. See the section optimization. + +def ser_compact_size(l): + r = b"" + if l < 253: + # Serialize as unsigned char + r = struct.pack("B", l) + elif l < 0x10000: + # Serialize as unsigned char 253 followed by unsigned 2 byte integer (little endian) + r = struct.pack(" From de0ff362fc70a814978b6b11ee8887109a6bdc40 Mon Sep 17 00:00:00 2001 From: Jeremy Rubin Date: Tue, 10 May 2022 09:09:44 -0700 Subject: [PATCH 026/335] [BIP-119] Slim down motivation, add more references --- bip-0119.mediawiki | 141 ++++++++------------------------------------- 1 file changed, 24 insertions(+), 117 deletions(-) diff --git a/bip-0119.mediawiki b/bip-0119.mediawiki index 304f228c..67e21b2f 100644 --- a/bip-0119.mediawiki +++ b/bip-0119.mediawiki @@ -39,125 +39,24 @@ The recommended standardness rules additionally: ==Motivation== -Covenants are restrictions on how a coin may be spent beyond key ownership. This is a general -definition based on the legal definition which even simple scripts using CSV would satisfy. -Covenants in Bitcoin transactions usually refer to restrictions on where coins can be transferred. -Covenants can be useful to construct smart contracts. As covenants are complex to implement -and risk of introducing fungibility discriminants they have not been seriously considered for -inclusion in Bitcoin. +Covenants are restrictions on how a coin may be spent beyond key ownership. +This is a general definition based on the legal definition which even simple +scripts using CSV would satisfy. Covenants in Bitcoin transactions usually +refer to restrictions on where coins can be transferred. Covenants can be +useful to construct smart contracts. As covenants are complex to implement and +risk of introducing fungibility discriminants they have not been seriously +considered for inclusion in Bitcoin. -This BIP introduces a simple covenant called a *template* which enables a limited set of highly -valuable use cases without significant risk. +This BIP introduces a simple covenant called a *template* which enables a +limited set of highly valuable use cases without significant risk. BIP-119 +templates allow for non-recursive fully-enumerated covenants with no dynamic +state. CTV serves as a replacement for a pre-signed transaction oracle, which +eliminates the trust and interactivity requirements. Examples of uses include +wallet vaults, non-interactive payment channel creation, congestion controlled +batching, efficient to construct discreet log contracts, and payment pools, +among many others. For more details on these applications, please see the +references. -A few examples are described below, which should be the subject of future non-consensus -standardization efforts. - -===Congestion Controlled Transactions=== - -When there is a high demand for blockspace it becomes very expensive to make transactions. A large -volume payment processor may aggregate all their payments into a single O(1) transaction commitment -for purposes of confirmation using CHECKTEMPLATEVERIFY. Then, some time later, the payments can -be expanded out of that UTXO when the demand for blockspace is decreased. These payments can be -structured in a tree-like fashion to reduce individual costs of redemption. - -The below chart showcases the structure of these transactions in comparison to -normal transactions and batched transactions. - - - -A simulation is shown below of what impact this could have on mempool backlog -given 5% network adoption, and 50% network adoption. The code for the simulation -is provided in this BIP's subdirectory. - - - - -===Payment Channels=== - -There are numerous payment channel related uses. - -====Batched Channel Creation==== - -Using CHECKTEMPLATEVERIFY for Batched Channel Creation is similar to the use for Congestion Control, -except the leaf node transactions are channels instead of plain payments. The channel can be between -the sender and recipient or a target of recipient's choice. Using an CHECKTEMPLATEVERIFY, the -recipient may give the sender an address which makes a tree of channels unbeknownst to them. -These channels are time insensitive for setup, as all punishments are relative timelocked to the -penultimate transaction node. -Thus, coins sent using a congestion controlled transaction can still enjoy instant liquidity. - -====Non-Interactive Channels==== - -When opening a traditional payment channel, both parties to the channel must participate. This is -because the channel uses pre-signed multi-sig transactions to ensure that a channel can always be -exited by either party, before entering. -With CHECKTEMPLATEVERIFY, it’s possible for a single party to construct a channel which either -party can exit from without requiring signatures from both parties. -These payment channels can operate in one direction, paying to the channel "listener" without need -for their private key to be online. - - -====Increased Channel Routes==== - -In the Lightning Network protocol, Hashed Time Locked Contracts (HTLCS) are used in the construction -of channels. A new HTLC is required per route that the channel is serving in. -In BOLT #2, this maximum number of HTLCs in a channel is hard limited to 483 as the maximum safe -size to prevent the transaction from being too large to be valid. In common software implementations -such as LND, this limit is set much lower to 12 HTLCS. This is because accepting a larger number of -HTLCS makes it more difficult for transactions to confirm during congested periods as they must pay -higher fees. -Therefore, similarly to how congestion control is handled for normal transaction, lightning channel -updates can be done across an CHECKTEMPLATEVERIFY tree, allowing nodes to safely use many more -HTLCS. -Because each HTLC can have its own relative time lock in the tree, this also improves the latency -sensitivity of the lightning protocol on contested channel close. - -===Wallet Vaults=== - -This section will detail two variants of wallet vault that can be built using -CTV. Wallet vaults are a useful tool when greater security is required for -cold storage solutions, providing default transactional paths that move funds -from one's cold storage to a hot wallet. - -One type of cold wallet can be set up such that a customer support desk can, -without further authorization, move a portion of the funds (using multiple -pre-set amounts) into a lukewarm wallet operated by an isolated support desk. -The support desk can then issue some funds to a hot wallet, and send the -remainder back to cold storage with a similar withdrawal mechanism in place. -This is all possible without CHECKTEMPLATEVERIFY, but CHECKTEMPLATEVERIFY -eliminates the need for coordination and online signers, as well as reducing -the ability for a support desk to improperly move funds. Furthermore, all such -designs can be combined with relative time locks to give time for compliance -and risk desks to intervene. This is a 'Coins at Rest' or 'Optically Isolated' -vault, and is shown below. - - - -An alternative design for vaults is also highly effective and simpler to -implement in Sapio, a smart contract programming language. In this design, the -user commits to a single UTXO that contains a program for an annuity of -withdrawals from cold storage to a hot wallet. At any time, the remaining -balance for the annuity can be cancelled and funds locked entirely in cold -storage. The withdrawals to the hot wallet can be 'cancelled' before a maturity -date to ensure the action was authorized. These sort of vaults strongly benefit -from non-interactivity because the withdrawal program can be set up with cold -keys that are permanently offline, except in case of emergency. The image below -shows an instance of this type of wallet vault created with Sapio in Sapio -Studio. These types of wallet vault can also be chained together by taking -advantage of CTV's scriptSig commitment. This type of vault is a 'Coins in Motion' -variant where the coins move along the control path. - - - -===CoinJoin / Payment Pools / Join Pools === - -CHECKTEMPLATEVERIFY makes it much easier to set up trustless CoinJoins than -previously because participants agree on a single output which pays all -participants, which will be lower fee than before. Further each participant -doesn't need to know the totality of the outputs committed to by that output, -they only have to verify their own sub-tree will pay them. These trees can -then, using a top-level Schnorr key, be interactively updated on a rolling basis -forming a "Payment Pool". ==Detailed Specification== @@ -725,6 +624,14 @@ for older node versions that can be patched but not upgraded to a newer major re *[https://fc16.ifca.ai/bitcoin/papers/MES16.pdf Bitcoin Covenants] *[https://bitcointalk.org/index.php?topic=278122.0 CoinCovenants using SCIP signatures, an amusingly bad idea.] *[https://fc17.ifca.ai/bitcoin/papers/bitcoin17-final28.pdf Enhancing Bitcoin Transactions with Covenants] +*[https://github.com/jamesob/simple-ctv-vault Simple CTV Vaults] +*[https://github.com/kanzure/python-vaults Python Vaults] +*[https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2022-January/019808.html CTV Dramatically Improves DLCs] +*[https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2022-April/020225.html Calculus of Covenants] +*[https://rubin.io/bitcoin/2021/12/10/advent-13/ Payment Pools with CTV] +*[https://rubin.io/bitcoin/2021/12/11/advent-14/ Channels with CTV] +*[https://rubin.io/bitcoin/2021/12/09/advent-12/ Congestion Control with CTV] +*[https://rubin.io/bitcoin/2021/12/07/advent-10/ Building Vaults on Bitcoin] ===Note on Similar Alternatives=== From 424498ae2bbbae9017ee12d699d0fa46225bd1e3 Mon Sep 17 00:00:00 2001 From: Alex Bosworth Date: Fri, 20 May 2022 17:19:06 -0700 Subject: [PATCH 027/335] BIP 0371: Make hex example consistent with base64 --- bip-0371.mediawiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bip-0371.mediawiki b/bip-0371.mediawiki index 665a97be..82a407ed 100644 --- a/bip-0371.mediawiki +++ b/bip-0371.mediawiki @@ -196,7 +196,7 @@ The following are invalid PSBTs: ** Base64 String:
cHNidP8BAF4CAAAAAZvUh2UjC/mnLmYgAflyVW5U8Mb5f+tWvLVgDYF/aZUmAQAAAAD/////AUjmBSoBAAAAIlEgAw2k/OT32yjCyylRYx4ANxOFZZf+ljiCy1AOaBEsymMAAAAAAAEBKwDyBSoBAAAAIlEgwiR++/2SrEf29AuNQtFpF1oZ+p+hDkol1/NetN2FtpJCFAIssTrGgkjegGqmo2Wc88A+toIdCcgRSk6Gj+vehlu20s2XDhX1P8DIL5UP1WD/qRm3YXK+AXNoqJkTrwdPQAsJQIl1aqNznMxonsD886NgvjLMC1mxbpOh6LtGBXJrLKej/3BsQXZkljKyzGjh+RK4pXjjcZzncQiFx6lm9JvNQ8sAAA==
* Case: PSBT With PSBT_IN_TAP_SCRIPT_SIG signature that is too long -** Bytes in Hex:
0736274ff01005e02000000019bd48765230bf9a72e662001f972556e54f0c6f97feb56bcb5600d817f6995260100000000ffffffff0148e6052a01000000225120030da4fce4f7db28c2cb2951631e003713856597fe963882cb500e68112cca63000000000001012b00f2052a01000000225120c2247efbfd92ac47f6f40b8d42d169175a19fa9fa10e4a25d7f35eb4dd85b69241142cb13ac68248de806aa6a3659cf3c03eb6821d09c8114a4e868febde865bb6d2cd970e15f53fc0c82f950fd560ffa919b76172be017368a89913af074f400b094289756aa3739ccc689ec0fcf3a360be32cc0b59b16e93a1e8bb4605726b2ca7a3ff706c4176649632b2cc68e1f912b8a578e3719ce7710885c7a966f49bcd43cb01010000
+** Bytes in Hex:
70736274ff01005e02000000019bd48765230bf9a72e662001f972556e54f0c6f97feb56bcb5600d817f6995260100000000ffffffff0148e6052a01000000225120030da4fce4f7db28c2cb2951631e003713856597fe963882cb500e68112cca63000000000001012b00f2052a01000000225120c2247efbfd92ac47f6f40b8d42d169175a19fa9fa10e4a25d7f35eb4dd85b69241142cb13ac68248de806aa6a3659cf3c03eb6821d09c8114a4e868febde865bb6d2cd970e15f53fc0c82f950fd560ffa919b76172be017368a89913af074f400b094289756aa3739ccc689ec0fcf3a360be32cc0b59b16e93a1e8bb4605726b2ca7a3ff706c4176649632b2cc68e1f912b8a578e3719ce7710885c7a966f49bcd43cb01010000
** Base64 String:
cHNidP8BAF4CAAAAAZvUh2UjC/mnLmYgAflyVW5U8Mb5f+tWvLVgDYF/aZUmAQAAAAD/////AUjmBSoBAAAAIlEgAw2k/OT32yjCyylRYx4ANxOFZZf+ljiCy1AOaBEsymMAAAAAAAEBKwDyBSoBAAAAIlEgwiR++/2SrEf29AuNQtFpF1oZ+p+hDkol1/NetN2FtpJBFCyxOsaCSN6AaqajZZzzwD62gh0JyBFKToaP696GW7bSzZcOFfU/wMgvlQ/VYP+pGbdhcr4Bc2iomROvB09ACwlCiXVqo3OczGiewPzzo2C+MswLWbFuk6Hou0YFcmssp6P/cGxBdmSWMrLMaOH5ErileONxnOdxCIXHqWb0m81DywEBAAA=
* Case: PSBT With PSBT_IN_TAP_SCRIPT_SIG signature that is too short From 3248581928b5299525b32979c8a569ce9107fdfc Mon Sep 17 00:00:00 2001 From: katesalazar Date: Fri, 13 May 2022 20:20:49 +0000 Subject: [PATCH 028/335] Bring back transparent background to figures Black arrows are visible only in light theme (unless white background for dark theme). Two-color arrows are visible in light theme and in dark theme. --- .gitignore | 6 + bip-0174/build.sh | 9 + bip-0174/coinjoin-workflow.svg | 1372 ++++++++++++--- bip-0174/coinjoin-workflow.tex | 12 +- bip-0174/multisig-workflow.svg | 2957 ++++++++++++++++++++++++++------ bip-0174/multisig-workflow.tex | 19 +- 6 files changed, 3568 insertions(+), 807 deletions(-) create mode 100644 .gitignore create mode 100755 bip-0174/build.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..d939d2a5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +bip-0174/coinjoin-workflow.aux +bip-0174/coinjoin-workflow.log +bip-0174/coinjoin-workflow.pdf +bip-0174/multisig-workflow.aux +bip-0174/multisig-workflow.log +bip-0174/multisig-workflow.pdf diff --git a/bip-0174/build.sh b/bip-0174/build.sh new file mode 100755 index 00000000..2de1e562 --- /dev/null +++ b/bip-0174/build.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +pdflatex -output-format=pdf coinjoin-workflow.tex && \ +inkscape --with-gui --export-text-to-path \ + --export-plain-svg=coinjoin-workflow.svg coinjoin-workflow.pdf && \ +pdflatex -output-format=pdf multisig-workflow.tex && \ +inkscape --with-gui --export-text-to-path \ + --export-plain-svg=multisig-workflow.svg multisig-workflow.pdf && \ +echo '"success"' diff --git a/bip-0174/coinjoin-workflow.svg b/bip-0174/coinjoin-workflow.svg index 4c2a041d..3b6b952e 100644 --- a/bip-0174/coinjoin-workflow.svg +++ b/bip-0174/coinjoin-workflow.svg @@ -1,8 +1,54 @@ - - - - + + + + + + image/svg+xml + + + + + + + + @@ -107,7 +153,7 @@ - + @@ -376,281 +422,1133 @@ - + - + - - - - - + + + + + - - - - - - - - + + + + + + + + - - - + + + - - - + + + - + - + - - - + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - + + + + - - + + - - - - - - - - - - + + + + + + + + + + - - - - + + + + - - - - - - - + + + + + + + - - - - - - + + + + + + - - - + + + - - + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - + + + + - - - - - - - - - + + + + + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - - + + + + + - - - - - - + + + + + + - - - - + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - - + + + + + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/bip-0174/coinjoin-workflow.tex b/bip-0174/coinjoin-workflow.tex index e0516ffe..a325321a 100644 --- a/bip-0174/coinjoin-workflow.tex +++ b/bip-0174/coinjoin-workflow.tex @@ -7,7 +7,7 @@ \usepackage{lmodern} \renewcommand*\familydefault{\sfdefault} \usepackage{tikz} -\usetikzlibrary{shapes,arrows} +\usetikzlibrary{shapes,arrows.meta} \tikzset{>=latex} \begin{document} % \sffamily{} @@ -22,7 +22,7 @@ rounded corners] \begin{tikzpicture}[auto] % outlining the flowchart on a grid - \matrix[column sep=3ex,row sep=2ex]{ + \matrix[column sep=3ex,row sep=3ex]{ \node [block_center] (0alice1) {Alice creates a PSBT with only her inputs with UTXOs filled in.\\Sends it to Bob.}; @@ -49,7 +49,13 @@ \\ };% end matrix % connecting nodes with paths - \draw[line width = 1pt, ->] + \draw [ultra thick, draw=black, -{Stealth[length=8pt]}] + (0alice1) edge (1bob1) + (1bob1) edge (2carol1) + (2carol1) edge (3bob2) + (3bob2) edge (4alice1) + (4alice1) edge (5alice2); + \draw [thin, white, -{Stealth[color=black, fill=white, length=8pt]}] (0alice1) edge (1bob1) (1bob1) edge (2carol1) (2carol1) edge (3bob2) diff --git a/bip-0174/multisig-workflow.svg b/bip-0174/multisig-workflow.svg index 8abe4c51..2d873b05 100644 --- a/bip-0174/multisig-workflow.svg +++ b/bip-0174/multisig-workflow.svg @@ -1,6 +1,47 @@ - + + viewBox="0 0 375.988 411.906" version="1.2" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + id="svg1424" + sodipodi:docname="multisig-workflow.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> + + + + image/svg+xml + + + + + + @@ -192,277 +233,931 @@ - - - - - - - + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + @@ -471,397 +1166,1381 @@ - - - - - + - - - - - + + + + + - - - - - - - - - + + + + + + + + + - + - - - - + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -873,23 +2552,173 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bip-0174/multisig-workflow.tex b/bip-0174/multisig-workflow.tex index 2b8744d3..d2250cfa 100644 --- a/bip-0174/multisig-workflow.tex +++ b/bip-0174/multisig-workflow.tex @@ -7,7 +7,7 @@ \usepackage{lmodern} \renewcommand*\familydefault{\sfdefault} \usepackage{tikz} -\usetikzlibrary{shapes,arrows} +\usetikzlibrary{shapes,arrows.meta} \tikzset{>=latex} %\pgfdeclarelayer{bg} % declare background layer %\pgfsetlayers{bg,main} % set order of layers @@ -83,7 +83,15 @@ };% end matrix % connecting nodes with paths % \begin{pgfonlayer}{bg} - \draw[line width = 1pt, ->] + \draw [ultra thick, draw=black, -{Stealth[length=8pt]}] + (R1) edge (R2) + (R2) edge (R3) + (R3) -| (R4C1) + (R3) edge (R4C2) + (R5) edge (R6) + (R6) edge (R7) + (R7) edge (stop); + \draw [thin, white, -{Stealth[color=black, fill=white, length=8pt]}] (R1) edge (R2) (R2) edge (R3) (R3) -| (R4C1) @@ -92,7 +100,12 @@ (R6) edge (R7) (R7) edge (stop); % circumvent missing arrow - \draw[line width = 1pt, ->] + \draw [ultra thick, draw=black, -{Stealth[length=8pt]}] + (R4C1) |-+(0,-2.2em)-| (R5) + (R4C2) edge (R5) + (R4C3) |-+(0,-2.2em)-| (R5) + (R3) -| (R4C3); + \draw [thin, white, -{Stealth[color=black, fill=white, length=8pt]}] (R4C1) |-+(0,-2.2em)-| (R5) (R4C2) edge (R5) (R4C3) |-+(0,-2.2em)-| (R5) From b29a3d27bfd51949c6d7a98092b601f6b79abc49 Mon Sep 17 00:00:00 2001 From: Jeremy Rubin Date: Mon, 23 May 2022 09:28:01 -0700 Subject: [PATCH 029/335] [BIP-119] No double space after period, no trailing whitespaces --- bip-0119.mediawiki | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/bip-0119.mediawiki b/bip-0119.mediawiki index 67e21b2f..e043f7df 100644 --- a/bip-0119.mediawiki +++ b/bip-0119.mediawiki @@ -41,8 +41,8 @@ The recommended standardness rules additionally: Covenants are restrictions on how a coin may be spent beyond key ownership. This is a general definition based on the legal definition which even simple -scripts using CSV would satisfy. Covenants in Bitcoin transactions usually -refer to restrictions on where coins can be transferred. Covenants can be +scripts using CSV would satisfy. Covenants in Bitcoin transactions usually +refer to restrictions on where coins can be transferred. Covenants can be useful to construct smart contracts. As covenants are complex to implement and risk of introducing fungibility discriminants they have not been seriously considered for inclusion in Bitcoin. @@ -51,7 +51,7 @@ This BIP introduces a simple covenant called a *template* which enables a limited set of highly valuable use cases without significant risk. BIP-119 templates allow for non-recursive fully-enumerated covenants with no dynamic state. CTV serves as a replacement for a pre-signed transaction oracle, which -eliminates the trust and interactivity requirements. Examples of uses include +eliminates the trust and interactivity requirements. Examples of uses include wallet vaults, non-interactive payment channel creation, congestion controlled batching, efficient to construct discreet log contracts, and payment pools, among many others. For more details on these applications, please see the @@ -162,7 +162,7 @@ For the avoidance of unclarity, the parameters to be determined are: consensus.vDeployments[Consensus::DEPLOYMENT_CHECKTEMPLATEVERIFY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT; consensus.vDeployments[Consensus::DEPLOYMENT_CHECKTEMPLATEVERIFY].min_activation_height = 0; -Until BIP-119 reaches ACTIVE state and the +Until BIP-119 reaches ACTIVE state and the SCRIPT_VERIFY_DEFAULT_CHECK_TEMPLATE_VERIFY_HASH flag is enforced, node implementations should (are recommended to) execute a NOP4 as SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS (to deny entry to the mempool) for policy and must evaluate as a NOP for consensus (during block validation). @@ -195,7 +195,7 @@ Below we'll discuss the rules one-by-one: The set of data committed to is a superset of data which can impact the TXID of the transaction, other than the inputs. This ensures that for a given known input, the TXIDs can also be known ahead -of time. Otherwise, CHECKTEMPLATEVERIFY would not be usable for Batched Channel Creation constructions +of time. Otherwise, CHECKTEMPLATEVERIFY would not be usable for Batched Channel Creation constructions as the redemption TXID could be malleated and pre-signed transactions invalidated, unless the channels are built using an Eltoo-like protocol. Note that there may be other types of pre-signed contracts that may or may not be able to use Eltoo-like constructs, therefore making TXIDs predictable makes CTV more @@ -341,7 +341,7 @@ programs. RIPEMD160, a 20 byte hash, might also be a viable hash in some contexts and has some benefits. For fee efficiency, RIPEMD160 saves 12 bytes. However, RIPEMD160 was not chosen for BIP-119 because it introduces -risks around the verification of programs created by third parties to be subject to a +risks around the verification of programs created by third parties to be subject to a [birthday-attack https://bitcoin.stackexchange.com/questions/54841/birthday-attack-on-p2sh] on transaction preimages. @@ -523,11 +523,11 @@ CHECKTEMPLATEVERIFY has benefits in terms of script size (depending on choice of PK, SIGHASH_ANYPREVOUTANYSCRIPT may use about 2x-3x the bytes) and verification speed, as OP_CHECKTEMPLATEVERIFY requires only hash computation rather than signature operations. This can be significant when constructing large payment -trees or programmatic compilations. CHECKTEMPLATEVERIFY also has a feature-wise +trees or programmatic compilations. CHECKTEMPLATEVERIFY also has a feature-wise benefit in that it provides a robust pathway for future template upgrades. OP_CHECKSIGFROMSTACKVERIFY along with OP_CAT may also be used to emulate -CHECKTEMPLATEVERIFY. However such constructions are more complicated to use +CHECKTEMPLATEVERIFY. However such constructions are more complicated to use than CHECKTEMPLATEVERIFY, and encumbers additional verification overhead absent from CHECKTEMPLATEVERIFY. These types of covenants also bear similar potential recursion issues to OP_COV which make it unlikely for inclusion in Bitcoin. @@ -545,7 +545,7 @@ the future as well as synergies with other possible upgrades. =====CHECKTEMPLATEVERIFY Versions===== OP_CHECKTEMPLATEVERIFY currently only verifies properties of 32 byte arguments. -In the future, meaning could be ascribed to other length arguments. For +In the future, meaning could be ascribed to other length arguments. For example, a 33-byte argument could just the last byte as a control program. In that case, DefaultCheckTemplateVerifyHash could be computed when the flag byte is set to CTVHASH_ALL. Other programs could be added similar to SIGHASH_TYPEs. From c05f4042f47730a2b7f1e6e46f38db08ee774ff9 Mon Sep 17 00:00:00 2001 From: Jeremy Rubin Date: Mon, 23 May 2022 09:35:04 -0700 Subject: [PATCH 030/335] [BIP-119] Reword section on fungibility in motivation --- bip-0119.mediawiki | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bip-0119.mediawiki b/bip-0119.mediawiki index e043f7df..37cb4773 100644 --- a/bip-0119.mediawiki +++ b/bip-0119.mediawiki @@ -43,9 +43,9 @@ Covenants are restrictions on how a coin may be spent beyond key ownership. This is a general definition based on the legal definition which even simple scripts using CSV would satisfy. Covenants in Bitcoin transactions usually refer to restrictions on where coins can be transferred. Covenants can be -useful to construct smart contracts. As covenants are complex to implement and -risk of introducing fungibility discriminants they have not been seriously -considered for inclusion in Bitcoin. +useful to construct smart contracts. Covenants have historically been widely +considered to be unfit for Bitcoin because they are too complex to implement +and risk reducing the fungibility of coins bound by them. This BIP introduces a simple covenant called a *template* which enables a limited set of highly valuable use cases without significant risk. BIP-119 From cde2bd31a28a38a4f8b3acdc1929938655f0c966 Mon Sep 17 00:00:00 2001 From: Jeremy Rubin Date: Tue, 10 May 2022 10:14:49 -0700 Subject: [PATCH 031/335] [BIP-119] Minor wording fixups Co-authored-by: /dev/fd0 <94559964+1440000bytes@users.noreply.github.com> --- bip-0119.mediawiki | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bip-0119.mediawiki b/bip-0119.mediawiki index 37cb4773..552e1f01 100644 --- a/bip-0119.mediawiki +++ b/bip-0119.mediawiki @@ -49,10 +49,10 @@ and risk reducing the fungibility of coins bound by them. This BIP introduces a simple covenant called a *template* which enables a limited set of highly valuable use cases without significant risk. BIP-119 -templates allow for non-recursive fully-enumerated covenants with no dynamic +templates allow for '''non-recursive''' fully-enumerated covenants with no dynamic state. CTV serves as a replacement for a pre-signed transaction oracle, which eliminates the trust and interactivity requirements. Examples of uses include -wallet vaults, non-interactive payment channel creation, congestion controlled +vaults, non-interactive payment channel creation, congestion controlled batching, efficient to construct discreet log contracts, and payment pools, among many others. For more details on these applications, please see the references. From 96bcfef0505911634118eec1d63bb5646c9e2351 Mon Sep 17 00:00:00 2001 From: Alex Bosworth Date: Thu, 26 May 2022 09:26:54 -0700 Subject: [PATCH 032/335] typo: correct mispelling --- bip-0370.mediawiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bip-0370.mediawiki b/bip-0370.mediawiki index 263fd139..bb6ffd64 100644 --- a/bip-0370.mediawiki +++ b/bip-0370.mediawiki @@ -29,7 +29,7 @@ inputs and outputs be added to the transaction. The fixed global unsigned transa cannot be changed which prevents any additional inputs or outputs to be added. PSBT Version 2 is intended to rectify this problem. -An additional benficial side effect is that all information for a given input or output will be +An additional beneficial side effect is that all information for a given input or output will be provided by its or . With Version 0, to retrieve all of the information for an input or output, data would need to be found in two locations: the / and the global unsigned transaction. PSBT From 1c8afe6ea4769c3efd42bd7c10b738fbe5263d7f Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Wed, 1 Jun 2022 19:56:23 -0400 Subject: [PATCH 033/335] 370: Describe locktime type tiebreaker --- bip-0370.mediawiki | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bip-0370.mediawiki b/bip-0370.mediawiki index 263fd139..89a435ba 100644 --- a/bip-0370.mediawiki +++ b/bip-0370.mediawiki @@ -213,11 +213,15 @@ The nLockTime field of a transaction is determined by inspecting the PSBT_GLOBAL If none of the inputs have a PSBT_IN_REQUIRED_TIME_LOCKTIME and PSBT_IN_REQUIRED_HEIGHT_LOCKTIME, then PSBT_GLOBAL_FALLBACK_LOCKTIME must be used. If PSBT_GLOBAL_FALLBACK_LOCKTIME is not provided, then it is assumed to be 0. -If one or more inuts have a PSBT_IN_REQUIRED_TIME_LOCKTIME or PSBT_IN_REQUIRED_HEIGHT_LOCKTIME, then the field chosen is the one which is supported by all of the inputs. +If one or more inputs have a PSBT_IN_REQUIRED_TIME_LOCKTIME or PSBT_IN_REQUIRED_HEIGHT_LOCKTIME, then the field chosen is the one which is supported by all of the inputs. This can be determined by looking at all of the inputs which specify a locktime in either of those fields, and choosing the field which is present in all of those inputs. Inputs not specifying a lock time field can take both types of lock times, as can those that specify both. The lock time chosen is then the maximum value of the chosen type of lock time. +If a PSBT has both types of locktimes possible because one or more inputs specify both PSBT_IN_REQUIRED_TIME_LOCKTIME and PSBT_IN_REQUIRED_HEIGHT_LOCKTIME, then locktime determined by looking at the PSBT_IN_REQUIRED_HEIGHT_LOCKTIME fields of the inputs must be chosen.'''Why choose the height based locktime?''' +In the event of a tie for the locktime type, signers need to be able to know which locktime to use as their signatures will commit to the locktime in the transaction, so choosing the wrong one will result in an invalid transaction. +Height based locktime is preferred over time based as Bitcoin's unit of time is the block height, so a height makes more sense in the context of Bitcoin. + ===Unique Identification=== PSBTv2s can be uniquely identified by constructing an unsigned transaction given the information provided in the PSBT and computing the transaction ID of that transaction. From aa807d5a139cb36cf258553da4510142edf53edb Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Wed, 1 Jun 2022 21:14:25 -0400 Subject: [PATCH 034/335] 370: height lock must be greater than 0 --- bip-0370.mediawiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bip-0370.mediawiki b/bip-0370.mediawiki index 89a435ba..533d6da8 100644 --- a/bip-0370.mediawiki +++ b/bip-0370.mediawiki @@ -167,7 +167,7 @@ The new per-input types for PSBT Version 2 are defined as follows: | None | No key data | <32-bit uiht> -| 32 bit unsigned little endian integer less than 500000000 representing the minimum block height that this input requires to be set as the transaction's lock time. +| 32 bit unsigned little endian integer greater than 0 and less than 500000000 representing the minimum block height that this input requires to be set as the transaction's lock time. | | 0 | 2 From 5861862f598a7837a101dada50ee22aaa09e5c4f Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Thu, 2 Jun 2022 19:31:32 -0400 Subject: [PATCH 035/335] 370: clarify inputs/outputs modifiable Clarify that these flags only mean whether inputs/outputs can be removed, not whether fields can be added or removed for each input/output. --- bip-0370.mediawiki | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bip-0370.mediawiki b/bip-0370.mediawiki index 533d6da8..cecd4ae4 100644 --- a/bip-0370.mediawiki +++ b/bip-0370.mediawiki @@ -103,7 +103,7 @@ The new global types for PSBT Version 2 are as follows: | None | No key data | <8-bit uint> -| An 8 bit little endian unsigned integer as a bitfield for various transaction modification flags. Bit 0 is the Inputs Modifiable Flag and indicates whether inputs can be modified. Bit 1 is the Outputs Modifiable Flag and indicates whether outputs can be modified. Bit 2 is the Has SIGHASH_SINGLE flag and indicates whether the transaction has a SIGHASH_SINGLE signature who's input and output pairing must be preserved. Bit 2 essentially indicates that the Constructor must iterate the inputs to determine whether and how to add an input. +| An 8 bit unsigned integer as a bitfield for various transaction modification flags. Bit 0 is the Inputs Modifiable Flag and indicates whether inputs can be added or removed. Bit 1 is the Outputs Modifiable Flag and indicates whether outputs can be added or removed. Bit 2 is the Has SIGHASH_SINGLE flag and indicates whether the transaction has a SIGHASH_SINGLE signature who's input and output pairing must be preserved. Bit 2 essentially indicates that the Constructor must iterate the inputs to determine whether and how to add or remove an input. | | 0 | 2 From 0a169e5d0d6272c87e4ad7741a45ae8937777c0c Mon Sep 17 00:00:00 2001 From: Tim Wang Date: Sun, 12 Jun 2022 08:33:38 +1000 Subject: [PATCH 036/335] Add one Swift implementation featured with full native syntax, exception handling & fully unit tested with all supported language wordlists --- bip-0039.mediawiki | 1 + 1 file changed, 1 insertion(+) diff --git a/bip-0039.mediawiki b/bip-0039.mediawiki index 7b98a39d..24d14fdd 100644 --- a/bip-0039.mediawiki +++ b/bip-0039.mediawiki @@ -188,6 +188,7 @@ Swift: * https://github.com/pengpengliu/BIP39 * https://github.com/matter-labs/web3swift/blob/develop/Sources/web3swift/KeystoreManager/BIP39.swift * https://github.com/zcash-hackworks/MnemonicSwift +* https://github.com/ShenghaiWang/BIP39 C++: * https://github.com/libbitcoin/libbitcoin-system/blob/master/include/bitcoin/system/wallet/mnemonic.hpp From 02ab2bfd79d860208fe09e7b2afa12541aba5eb2 Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Mon, 13 Jun 2022 12:21:42 -0400 Subject: [PATCH 037/335] 370: Clarify that modifiable flags are bits --- bip-0370.mediawiki | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bip-0370.mediawiki b/bip-0370.mediawiki index cecd4ae4..c0ea6d93 100644 --- a/bip-0370.mediawiki +++ b/bip-0370.mediawiki @@ -103,7 +103,7 @@ The new global types for PSBT Version 2 are as follows: | None | No key data | <8-bit uint> -| An 8 bit unsigned integer as a bitfield for various transaction modification flags. Bit 0 is the Inputs Modifiable Flag and indicates whether inputs can be added or removed. Bit 1 is the Outputs Modifiable Flag and indicates whether outputs can be added or removed. Bit 2 is the Has SIGHASH_SINGLE flag and indicates whether the transaction has a SIGHASH_SINGLE signature who's input and output pairing must be preserved. Bit 2 essentially indicates that the Constructor must iterate the inputs to determine whether and how to add or remove an input. +| An 8 bit unsigned integer as a bitfield for various transaction modification flags. Bit 0 is the Inputs Modifiable Flag, set to 1 to indicate whether inputs can be added or removed. Bit 1 is the Outputs Modifiable Flag, set to 1 to indicate whether outputs can be added or removed. Bit 2 is the Has SIGHASH_SINGLE flag, set to 1 to indicate whether the transaction has a SIGHASH_SINGLE signature who's input and output pairing must be preserved. Bit 2 essentially indicates that the Constructor must iterate the inputs to determine whether and how to add or remove an input. | | 0 | 2 @@ -265,7 +265,7 @@ If it changes the transaction's locktime when there are existing signatures, it If the Has SIGHASH_SINGLE flag is True, then the Constructor must iterate through the inputs and find the inputs which have signatures that use SIGHASH_SINGLE. The same number of inputs and outputs must be added before those inputs and their corresponding outputs. -A Constructor may choose to declare that no further inputs and outputs can be added to the transaction by setting the booleans in PSBT_GLOBAL_TX_MODIFIABLE to False or by removing this field entirely. +A Constructor may choose to declare that no further inputs and outputs can be added to the transaction by setting the appropriate bits in PSBT_GLOBAL_TX_MODIFIABLE to 0 or by removing the field entirely. A single entity is likely to be both a Creator and Constructor. From 858b6beb79933f2a77178bc6ec048ac91fa96d98 Mon Sep 17 00:00:00 2001 From: 54627384 <72476593+54627384@users.noreply.github.com> Date: Sun, 19 Jun 2022 10:05:04 +1000 Subject: [PATCH 038/335] Update bip-0300.mediawiki I've assumed that all mentions of ACK value and ACK counter are synonymous and therefore have updated all instances of this within the BIP to be "ACK-counter". I've noticed that M4 shows the different terms on two different lines (Line 256 and Line 257), which has made me think that potentially these terms aren't synonymous. Updates made to align with term used through out the BIP: Line 213 - adding explicit mention of "ACK-counter" Line 229 - adding explicit mention of "ACK-counter" Line 257 - replaced "ACK-value" with "ACK-counter" Line 288 - replaced "ACK value" with "ACK-counter" --- bip-0300.mediawiki | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bip-0300.mediawiki b/bip-0300.mediawiki index f8c9b4d7..3cecd850 100644 --- a/bip-0300.mediawiki +++ b/bip-0300.mediawiki @@ -210,7 +210,7 @@ D2 controls Bundles, and is driven by M3, M4, M5, and M6. | 3 | ACKs (Work Score) | uint16_t -| The current total number of ACKs (the PoW that has been used to validate the Bundle). +| The current ACK-counter, which is the total number of ACKs (the PoW that has been used to validate the Bundle). |- | 4 | Blocks Remaining (Age) @@ -226,7 +226,7 @@ A hash of D2 exists in each coinbase txn, and has consensus-significance. # The Bundles must be listed in a canonical order (so that the hashes match). # From one block to the next, "Age" fields must increase by exactly 1 (ie, Blocks Remaining decreases by 1). # Bundles are stored in D2 until they fail (which occurs at "Age" = "MaxAge"), or they succeed (Bundle is paid out). -# From one block to the next, the value in the ACKs field can increase or decrease by a maximum of 1 (see below). +# From one block to the next, the value in the ACKs field (ACK-counter) can increase or decrease by a maximum of 1 (see below). If a Bundle succeeds (in D2), it "becomes" an M6 message and is included in a block. @@ -254,7 +254,7 @@ Once a Bundle is in D2, how can we give it enough ACKs to make it valid? From one block to the next, "ACKs" can only change as follows: * The ACK-counter of any Bundle can only change by (-1,0,+1). -* Within a sidechain-group, upvoting one Bundle ("+1") requires you to downvote all other Bundles in that group. However, the minimum ACK-value is zero. +* Within a sidechain-group, upvoting one Bundle ("+1") requires you to downvote all other Bundles in that group. However, the minimum ACK-counter is zero. * While only one Bundle can be upvoted at once; the whole group can all be unchanged at once ("abstain"), and they can all be downvoted at once ("alarm"). M4 does not need to be explicitly transmitted. It can simply be inferred from the new state of D2. M4 can therefore be improved over time, without affecting consensus. @@ -285,7 +285,7 @@ As far as mainchain consensus is concerned, all deposits to a sidechain are alwa We come, finally, to the critical matter: where users can take their money *out* of the sidechain. -In each block, a Bundle in D2 is considered "approved" if its "ACKs" value meets the threshold (13,150). +In each block, a Bundle in D2 is considered "approved" if its "ACK-counter" value meets the threshold (13,150). The Bundle must meet all these criteria: From 0144413e91bf5d71b54126783acaf339422abe7e Mon Sep 17 00:00:00 2001 From: Jonas Nick Date: Mon, 20 Jun 2022 13:16:27 +0000 Subject: [PATCH 039/335] bip-0340: clarify that lift_x fails with out-of-range inputs Without this commit, it's not defined what happens if x is not in range 0..p-1. However, lift_x may easily be called with out of range values. The reference implementation of lift_x correctly returns failure in such cases. --- bip-0340.mediawiki | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bip-0340.mediawiki b/bip-0340.mediawiki index 9573846e..a67afe36 100644 --- a/bip-0340.mediawiki +++ b/bip-0340.mediawiki @@ -109,8 +109,9 @@ The following conventions are used, with constants as defined for [https://www.s ** The function ''bytes(P)'', where ''P'' is a point, returns ''bytes(x(P))''. ** The function ''int(x)'', where ''x'' is a 32-byte array, returns the 256-bit unsigned integer whose most significant byte first encoding is ''x''. ** The function ''has_even_y(P)'', where ''P'' is a point for which ''not is_infinite(P)'', returns ''y(P) mod 2 = 0''. -** The function ''lift_x(x)'', where ''x'' is an integer in range ''0..p-1'', returns the point ''P'' for which ''x(P) = x'' - Given a 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''. The valid Y coordinates for a given candidate ''x'' are the square roots of ''c = x3 + 7 mod p'' and they can be computed as ''y = ±c(p+1)/4 mod p'' (see [https://en.wikipedia.org/wiki/Quadratic_residue#Prime_or_prime_power_modulus Quadratic residue]) if they exist, which can be checked by squaring and comparing with ''c''. and ''has_even_y(P)'', or fails if no such point exists. The function ''lift_x(x)'' is equivalent to the following pseudocode: +** The function ''lift_x(x)'', where ''x'' is a 256-bit unsigned integer, returns the point ''P'' for which ''x(P) = x'' + Given a 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''. The valid Y coordinates for a given candidate ''x'' are the square roots of ''c = x3 + 7 mod p'' and they can be computed as ''y = ±c(p+1)/4 mod p'' (see [https://en.wikipedia.org/wiki/Quadratic_residue#Prime_or_prime_power_modulus Quadratic residue]) if they exist, which can be checked by squaring and comparing with ''c''. and ''has_even_y(P)'', or fails if ''x'' is greater than ''p-1'' or no such point exists. The function ''lift_x(x)'' is equivalent to the following pseudocode: +*** Fail if ''x ≥ p''. *** Let ''c = x3 + 7 mod p''. *** Let ''y = c(p+1)/4 mod p''. *** Fail if ''c ≠ y2 mod p''. From d448bf667c54291b827d2962b4eca9f13d6910c1 Mon Sep 17 00:00:00 2001 From: hujiulong Date: Sat, 2 Jul 2022 18:13:59 +0800 Subject: [PATCH 040/335] Add BIP39 implementation reference Add a reference to the JS implementation --- bip-0039.mediawiki | 1 + 1 file changed, 1 insertion(+) diff --git a/bip-0039.mediawiki b/bip-0039.mediawiki index 7b98a39d..9ff4d5f7 100644 --- a/bip-0039.mediawiki +++ b/bip-0039.mediawiki @@ -168,6 +168,7 @@ Haskell: JavaScript: * https://github.com/bitpay/bitcore/tree/master/packages/bitcore-mnemonic * https://github.com/bitcoinjs/bip39 (used by [[https://github.com/blockchain/My-Wallet-V3/blob/v3.8.0/src/hd-wallet.js#L121-L146|blockchain.info]]) +* https://github.com/hujiulong/web-bip39 Java: * https://github.com/bitcoinj/bitcoinj/blob/master/core/src/main/java/org/bitcoinj/crypto/MnemonicCode.java From 62e305bf281a83112fd4944f500cf38d97e86835 Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Tue, 5 Jul 2022 17:53:02 -0400 Subject: [PATCH 041/335] 370: Add test vectors --- bip-0370.mediawiki | 193 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 192 insertions(+), 1 deletion(-) diff --git a/bip-0370.mediawiki b/bip-0370.mediawiki index 263fd139..baddbcab 100644 --- a/bip-0370.mediawiki +++ b/bip-0370.mediawiki @@ -294,7 +294,198 @@ transaction from the PSBTv2 fields. ==Test Vectors== -TBD +The following are invalid PSBTs: + +* Case: PSBTv0 but with PSBT_GLOBAL_VERSION set to 2. +** Bytes in Hex:
70736274ff01007102000000010b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc80000000000feffffff020008af2f00000000160014c430f64c4756da310dbd1a085572ef299926272c8bbdeb0b00000000160014a07dac8ab6ca942d379ed795f835ba71c9cc68850000000001fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e01086b02473044022005275a485734e0ae1f3b971237586f0e72dc85833d278c0e474cd23112c0fa5e02206b048c83cebc3c41d0b93cc7da76185cedbd030d005b08018be2b98bbacbdf7b012103760dcca05f3997dc65b293060f7f29f1514c8c527048e12802b041d4fc340a2700220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a000000002202036efe2c255621986553ba9d65c3ddc64165ca1436e05aa35a4c6eb02451cf796d18f69d873e540000800100008000000080010000006200000000
+** Base64 String:
cHNidP8BAHECAAAAAQsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAAAAAAD+////AgAIry8AAAAAFgAUxDD2TEdW2jENvRoIVXLvKZkmJyyLvesLAAAAABYAFKB9rIq2ypQtN57Xlfg1unHJzGiFAAAAAAH7BAIAAAAAAQBSAgAAAAHBqiVuIUuWoYIvk95Cv/O18/+NBRkwbjUV11FaXoBbEgAAAAAA/////wEYxpo7AAAAABYAFLCjrxRCCEEmk8p9FmhStS2wrvBuAAAAAAEBHxjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4BCGsCRzBEAiAFJ1pIVzTgrh87lxI3WG8OctyFgz0njA5HTNIxEsD6XgIgawSMg868PEHQuTzH2nYYXO29Aw0AWwgBi+K5i7rL33sBIQN2DcygXzmX3GWykwYPfynxUUyMUnBI4SgCsEHU/DQKJwAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAAAIgIDbv4sJVYhmGVTup1lw93GQWXKFDbgWqNaTG6wJFHPeW0Y9p2HPlQAAIABAACAAAAAgAEAAABiAAAAAA==
+ +* Case: PSBTv0 but with PSBT_GLOBAL_TX_VERSION. +** Bytes in Hex:
70736274ff01007102000000010b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc80000000000feffffff020008af2f00000000160014c430f64c4756da310dbd1a085572ef299926272c8bbdeb0b00000000160014a07dac8ab6ca942d379ed795f835ba71c9cc68850000000001020402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e01086b02473044022005275a485734e0ae1f3b971237586f0e72dc85833d278c0e474cd23112c0fa5e02206b048c83cebc3c41d0b93cc7da76185cedbd030d005b08018be2b98bbacbdf7b012103760dcca05f3997dc65b293060f7f29f1514c8c527048e12802b041d4fc340a2700220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a000000002202036efe2c255621986553ba9d65c3ddc64165ca1436e05aa35a4c6eb02451cf796d18f69d873e540000800100008000000080010000006200000000
+** Base64 String:
cHNidP8BAHECAAAAAQsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAAAAAAD+////AgAIry8AAAAAFgAUxDD2TEdW2jENvRoIVXLvKZkmJyyLvesLAAAAABYAFKB9rIq2ypQtN57Xlfg1unHJzGiFAAAAAAECBAIAAAAAAQBSAgAAAAHBqiVuIUuWoYIvk95Cv/O18/+NBRkwbjUV11FaXoBbEgAAAAAA/////wEYxpo7AAAAABYAFLCjrxRCCEEmk8p9FmhStS2wrvBuAAAAAAEBHxjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4BCGsCRzBEAiAFJ1pIVzTgrh87lxI3WG8OctyFgz0njA5HTNIxEsD6XgIgawSMg868PEHQuTzH2nYYXO29Aw0AWwgBi+K5i7rL33sBIQN2DcygXzmX3GWykwYPfynxUUyMUnBI4SgCsEHU/DQKJwAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAAAIgIDbv4sJVYhmGVTup1lw93GQWXKFDbgWqNaTG6wJFHPeW0Y9p2HPlQAAIABAACAAAAAgAEAAABiAAAAAA==
+ +* Case: PSBTv0 but with PSBT_GLOBAL_FALLBACK_LOCKTIME. +** Bytes in Hex:
70736274ff01007102000000010b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc80000000000feffffff020008af2f00000000160014c430f64c4756da310dbd1a085572ef299926272c8bbdeb0b00000000160014a07dac8ab6ca942d379ed795f835ba71c9cc68850000000001030402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e01086b02473044022005275a485734e0ae1f3b971237586f0e72dc85833d278c0e474cd23112c0fa5e02206b048c83cebc3c41d0b93cc7da76185cedbd030d005b08018be2b98bbacbdf7b012103760dcca05f3997dc65b293060f7f29f1514c8c527048e12802b041d4fc340a2700220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a000000002202036efe2c255621986553ba9d65c3ddc64165ca1436e05aa35a4c6eb02451cf796d18f69d873e540000800100008000000080010000006200000000
+** Base64 String:
cHNidP8BAHECAAAAAQsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAAAAAAD+////AgAIry8AAAAAFgAUxDD2TEdW2jENvRoIVXLvKZkmJyyLvesLAAAAABYAFKB9rIq2ypQtN57Xlfg1unHJzGiFAAAAAAEDBAIAAAAAAQBSAgAAAAHBqiVuIUuWoYIvk95Cv/O18/+NBRkwbjUV11FaXoBbEgAAAAAA/////wEYxpo7AAAAABYAFLCjrxRCCEEmk8p9FmhStS2wrvBuAAAAAAEBHxjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4BCGsCRzBEAiAFJ1pIVzTgrh87lxI3WG8OctyFgz0njA5HTNIxEsD6XgIgawSMg868PEHQuTzH2nYYXO29Aw0AWwgBi+K5i7rL33sBIQN2DcygXzmX3GWykwYPfynxUUyMUnBI4SgCsEHU/DQKJwAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAAAIgIDbv4sJVYhmGVTup1lw93GQWXKFDbgWqNaTG6wJFHPeW0Y9p2HPlQAAIABAACAAAAAgAEAAABiAAAAAA==
+ +* Case: PSBTv0 but with PSBT_GLOBAL_INPUT_COUNT. +** Bytes in Hex:
70736274ff01007102000000010b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc80000000000feffffff020008af2f00000000160014c430f64c4756da310dbd1a085572ef299926272c8bbdeb0b00000000160014a07dac8ab6ca942d379ed795f835ba71c9cc68850000000001040102000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e01086b02473044022005275a485734e0ae1f3b971237586f0e72dc85833d278c0e474cd23112c0fa5e02206b048c83cebc3c41d0b93cc7da76185cedbd030d005b08018be2b98bbacbdf7b012103760dcca05f3997dc65b293060f7f29f1514c8c527048e12802b041d4fc340a2700220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a000000002202036efe2c255621986553ba9d65c3ddc64165ca1436e05aa35a4c6eb02451cf796d18f69d873e540000800100008000000080010000006200000000
+** Base64 String:
cHNidP8BAHECAAAAAQsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAAAAAAD+////AgAIry8AAAAAFgAUxDD2TEdW2jENvRoIVXLvKZkmJyyLvesLAAAAABYAFKB9rIq2ypQtN57Xlfg1unHJzGiFAAAAAAEEAQIAAQBSAgAAAAHBqiVuIUuWoYIvk95Cv/O18/+NBRkwbjUV11FaXoBbEgAAAAAA/////wEYxpo7AAAAABYAFLCjrxRCCEEmk8p9FmhStS2wrvBuAAAAAAEBHxjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4BCGsCRzBEAiAFJ1pIVzTgrh87lxI3WG8OctyFgz0njA5HTNIxEsD6XgIgawSMg868PEHQuTzH2nYYXO29Aw0AWwgBi+K5i7rL33sBIQN2DcygXzmX3GWykwYPfynxUUyMUnBI4SgCsEHU/DQKJwAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAAAIgIDbv4sJVYhmGVTup1lw93GQWXKFDbgWqNaTG6wJFHPeW0Y9p2HPlQAAIABAACAAAAAgAEAAABiAAAAAA==
+ +* Case: PSBTv0 but with PSBT_GLOBAL_OUTPUT_COUNT. +** Bytes in Hex:
i70736274ff01007102000000010b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc80000000000feffffff020008af2f00000000160014c430f64c4756da310dbd1a085572ef299926272c8bbdeb0b00000000160014a07dac8ab6ca942d379ed795f835ba71c9cc68850000000001050102000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e01086b02473044022005275a485734e0ae1f3b971237586f0e72dc85833d278c0e474cd23112c0fa5e02206b048c83cebc3c41d0b93cc7da76185cedbd030d005b08018be2b98bbacbdf7b012103760dcca05f3997dc65b293060f7f29f1514c8c527048e12802b041d4fc340a2700220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a000000002202036efe2c255621986553ba9d65c3ddc64165ca1436e05aa35a4c6eb02451cf796d18f69d873e540000800100008000000080010000006200000000
+** Base64 String:
cHNidP8BAHECAAAAAQsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAAAAAAD+////AgAIry8AAAAAFgAUxDD2TEdW2jENvRoIVXLvKZkmJyyLvesLAAAAABYAFKB9rIq2ypQtN57Xlfg1unHJzGiFAAAAAAEFAQIAAQBSAgAAAAHBqiVuIUuWoYIvk95Cv/O18/+NBRkwbjUV11FaXoBbEgAAAAAA/////wEYxpo7AAAAABYAFLCjrxRCCEEmk8p9FmhStS2wrvBuAAAAAAEBHxjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4BCGsCRzBEAiAFJ1pIVzTgrh87lxI3WG8OctyFgz0njA5HTNIxEsD6XgIgawSMg868PEHQuTzH2nYYXO29Aw0AWwgBi+K5i7rL33sBIQN2DcygXzmX3GWykwYPfynxUUyMUnBI4SgCsEHU/DQKJwAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAAAIgIDbv4sJVYhmGVTup1lw93GQWXKFDbgWqNaTG6wJFHPeW0Y9p2HPlQAAIABAACAAAAAgAEAAABiAAAAAA==
+ +* Case: PSBTv0 but with PSBT_GLOABAL_TX_MODIFIABLE. +** Bytes in Hex:
<70736274ff01007102000000010b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc80000000000feffffff020008af2f00000000160014c430f64c4756da310dbd1a085572ef299926272c8bbdeb0b00000000160014a07dac8ab6ca942d379ed795f835ba71c9cc68850000000001060100000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e01086b02473044022005275a485734e0ae1f3b971237586f0e72dc85833d278c0e474cd23112c0fa5e02206b048c83cebc3c41d0b93cc7da76185cedbd030d005b08018be2b98bbacbdf7b012103760dcca05f3997dc65b293060f7f29f1514c8c527048e12802b041d4fc340a2700220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a000000002202036efe2c255621986553ba9d65c3ddc64165ca1436e05aa35a4c6eb02451cf796d18f69d873e540000800100008000000080010000006200000000/pre>
+** Base64 String: 
cHNidP8BAHECAAAAAQsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAAAAAAD+////AgAIry8AAAAAFgAUxDD2TEdW2jENvRoIVXLvKZkmJyyLvesLAAAAABYAFKB9rIq2ypQtN57Xlfg1unHJzGiFAAAAAAEGAQAAAQBSAgAAAAHBqiVuIUuWoYIvk95Cv/O18/+NBRkwbjUV11FaXoBbEgAAAAAA/////wEYxpo7AAAAABYAFLCjrxRCCEEmk8p9FmhStS2wrvBuAAAAAAEBHxjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4BCGsCRzBEAiAFJ1pIVzTgrh87lxI3WG8OctyFgz0njA5HTNIxEsD6XgIgawSMg868PEHQuTzH2nYYXO29Aw0AWwgBi+K5i7rL33sBIQN2DcygXzmX3GWykwYPfynxUUyMUnBI4SgCsEHU/DQKJwAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAAAIgIDbv4sJVYhmGVTup1lw93GQWXKFDbgWqNaTG6wJFHPeW0Y9p2HPlQAAIABAACAAAAAgAEAAABiAAAAAA==
+ +* Case: PSBTv0 but with PSBT_IN_PREVIOUS_TXID. +** Bytes in Hex:
70736274ff01007102000000010b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc80000000000feffffff020008af2f00000000160014c430f64c4756da310dbd1a085572ef299926272c8bbdeb0b00000000160014a07dac8ab6ca942d379ed795f835ba71c9cc688500000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e01086b02473044022005275a485734e0ae1f3b971237586f0e72dc85833d278c0e474cd23112c0fa5e02206b048c83cebc3c41d0b93cc7da76185cedbd030d005b08018be2b98bbacbdf7b012103760dcca05f3997dc65b293060f7f29f1514c8c527048e12802b041d4fc340a27010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc800220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a000000002202036efe2c255621986553ba9d65c3ddc64165ca1436e05aa35a4c6eb02451cf796d18f69d873e540000800100008000000080010000006200000000
+** Base64 String:
cHNidP8BAHECAAAAAQsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAAAAAAD+////AgAIry8AAAAAFgAUxDD2TEdW2jENvRoIVXLvKZkmJyyLvesLAAAAABYAFKB9rIq2ypQtN57Xlfg1unHJzGiFAAAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEIawJHMEQCIAUnWkhXNOCuHzuXEjdYbw5y3IWDPSeMDkdM0jESwPpeAiBrBIyDzrw8QdC5PMfadhhc7b0DDQBbCAGL4rmLusvfewEhA3YNzKBfOZfcZbKTBg9/KfFRTIxScEjhKAKwQdT8NAonAQ4gCwrZIUGcHIcZc11y3HOfnqngY40f5MHu8PmUQISBX8gAIgIC1gH4SEamdV93a+AOPZ3o+xCsyTX7g8RfsBYtTK1at5IY9p2HPlQAAIABAACAAAAAgAAAAAAqAAAAACICA27+LCVWIZhlU7qdZcPdxkFlyhQ24FqjWkxusCRRz3ltGPadhz5UAACAAQAAgAAAAIABAAAAYgAAAAA=
+ +* Case: PSBTv0 but with PSBT_IN_OUTPUT_INDEX. +** Bytes in Hex:
70736274ff01007102000000010b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc80000000000feffffff020008af2f00000000160014c430f64c4756da310dbd1a085572ef299926272c8bbdeb0b00000000160014a07dac8ab6ca942d379ed795f835ba71c9cc688500000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e01086b02473044022005275a485734e0ae1f3b971237586f0e72dc85833d278c0e474cd23112c0fa5e02206b048c83cebc3c41d0b93cc7da76185cedbd030d005b08018be2b98bbacbdf7b012103760dcca05f3997dc65b293060f7f29f1514c8c527048e12802b041d4fc340a27010f040000000000220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a000000002202036efe2c255621986553ba9d65c3ddc64165ca1436e05aa35a4c6eb02451cf796d18f69d873e540000800100008000000080010000006200000000
+** Base64 String:
cHNidP8BAHECAAAAAQsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAAAAAAD+////AgAIry8AAAAAFgAUxDD2TEdW2jENvRoIVXLvKZkmJyyLvesLAAAAABYAFKB9rIq2ypQtN57Xlfg1unHJzGiFAAAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEIawJHMEQCIAUnWkhXNOCuHzuXEjdYbw5y3IWDPSeMDkdM0jESwPpeAiBrBIyDzrw8QdC5PMfadhhc7b0DDQBbCAGL4rmLusvfewEhA3YNzKBfOZfcZbKTBg9/KfFRTIxScEjhKAKwQdT8NAonAQ8EAAAAAAAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAAAIgIDbv4sJVYhmGVTup1lw93GQWXKFDbgWqNaTG6wJFHPeW0Y9p2HPlQAAIABAACAAAAAgAEAAABiAAAAAA==
+ +* Case: PSBTv0 but with PSBT_IN_SEQUENCE. +** Bytes in Hex:
70736274ff01007102000000010b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc80000000000feffffff020008af2f00000000160014c430f64c4756da310dbd1a085572ef299926272c8bbdeb0b00000000160014a07dac8ab6ca942d379ed795f835ba71c9cc688500000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e01086b02473044022005275a485734e0ae1f3b971237586f0e72dc85833d278c0e474cd23112c0fa5e02206b048c83cebc3c41d0b93cc7da76185cedbd030d005b08018be2b98bbacbdf7b012103760dcca05f3997dc65b293060f7f29f1514c8c527048e12802b041d4fc340a27011004ffffffff00220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a000000002202036efe2c255621986553ba9d65c3ddc64165ca1436e05aa35a4c6eb02451cf796d18f69d873e540000800100008000000080010000006200000000
+** Base64 String:
cHNidP8BAHECAAAAAQsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAAAAAAD+////AgAIry8AAAAAFgAUxDD2TEdW2jENvRoIVXLvKZkmJyyLvesLAAAAABYAFKB9rIq2ypQtN57Xlfg1unHJzGiFAAAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEIawJHMEQCIAUnWkhXNOCuHzuXEjdYbw5y3IWDPSeMDkdM0jESwPpeAiBrBIyDzrw8QdC5PMfadhhc7b0DDQBbCAGL4rmLusvfewEhA3YNzKBfOZfcZbKTBg9/KfFRTIxScEjhKAKwQdT8NAonARAE/////wAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAAAIgIDbv4sJVYhmGVTup1lw93GQWXKFDbgWqNaTG6wJFHPeW0Y9p2HPlQAAIABAACAAAAAgAEAAABiAAAAAA==
+ +* Case: PSBTv0 but with PSBT_IN_REQUIRED_TIME_LOCKTIME. +** Bytes in Hex:
70736274ff01007102000000010b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc80000000000feffffff020008af2f00000000160014c430f64c4756da310dbd1a085572ef299926272c8bbdeb0b00000000160014a07dac8ab6ca942d379ed795f835ba71c9cc688500000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e01086b02473044022005275a485734e0ae1f3b971237586f0e72dc85833d278c0e474cd23112c0fa5e02206b048c83cebc3c41d0b93cc7da76185cedbd030d005b08018be2b98bbacbdf7b012103760dcca05f3997dc65b293060f7f29f1514c8c527048e12802b041d4fc340a270111048c8dc46200220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a000000002202036efe2c255621986553ba9d65c3ddc64165ca1436e05aa35a4c6eb02451cf796d18f69d873e540000800100008000000080010000006200000000
+** Base64 String:
cHNidP8BAHECAAAAAQsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAAAAAAD+////AgAIry8AAAAAFgAUxDD2TEdW2jENvRoIVXLvKZkmJyyLvesLAAAAABYAFKB9rIq2ypQtN57Xlfg1unHJzGiFAAAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEIawJHMEQCIAUnWkhXNOCuHzuXEjdYbw5y3IWDPSeMDkdM0jESwPpeAiBrBIyDzrw8QdC5PMfadhhc7b0DDQBbCAGL4rmLusvfewEhA3YNzKBfOZfcZbKTBg9/KfFRTIxScEjhKAKwQdT8NAonAREEjI3EYgAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAAAIgIDbv4sJVYhmGVTup1lw93GQWXKFDbgWqNaTG6wJFHPeW0Y9p2HPlQAAIABAACAAAAAgAEAAABiAAAAAA==
+ +* Case: PSBTv0 but with PSBT_IN_REQUIRED_HEIGHT_LOCKTIME. +** Bytes in Hex:
70736274ff01007102000000010b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc80000000000feffffff020008af2f00000000160014c430f64c4756da310dbd1a085572ef299926272c8bbdeb0b00000000160014a07dac8ab6ca942d379ed795f835ba71c9cc688500000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e01086b02473044022005275a485734e0ae1f3b971237586f0e72dc85833d278c0e474cd23112c0fa5e02206b048c83cebc3c41d0b93cc7da76185cedbd030d005b08018be2b98bbacbdf7b012103760dcca05f3997dc65b293060f7f29f1514c8c527048e12802b041d4fc340a270112041027000000220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a000000002202036efe2c255621986553ba9d65c3ddc64165ca1436e05aa35a4c6eb02451cf796d18f69d873e540000800100008000000080010000006200000000
+** Base64 String:
cHNidP8BAHECAAAAAQsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAAAAAAD+////AgAIry8AAAAAFgAUxDD2TEdW2jENvRoIVXLvKZkmJyyLvesLAAAAABYAFKB9rIq2ypQtN57Xlfg1unHJzGiFAAAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEIawJHMEQCIAUnWkhXNOCuHzuXEjdYbw5y3IWDPSeMDkdM0jESwPpeAiBrBIyDzrw8QdC5PMfadhhc7b0DDQBbCAGL4rmLusvfewEhA3YNzKBfOZfcZbKTBg9/KfFRTIxScEjhKAKwQdT8NAonARIEECcAAAAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAAAIgIDbv4sJVYhmGVTup1lw93GQWXKFDbgWqNaTG6wJFHPeW0Y9p2HPlQAAIABAACAAAAAgAEAAABiAAAAAA==
+ +* Case: PSBTv0 but with PSBT_OUT_AMOUNT. +** Bytes in Hex:
70736274ff01007102000000010b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc80000000000feffffff020008af2f00000000160014c430f64c4756da310dbd1a085572ef299926272c8bbdeb0b00000000160014a07dac8ab6ca942d379ed795f835ba71c9cc688500000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e01086b02473044022005275a485734e0ae1f3b971237586f0e72dc85833d278c0e474cd23112c0fa5e02206b048c83cebc3c41d0b93cc7da76185cedbd030d005b08018be2b98bbacbdf7b012103760dcca05f3997dc65b293060f7f29f1514c8c527048e12802b041d4fc340a2700220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f00000000002202036efe2c255621986553ba9d65c3ddc64165ca1436e05aa35a4c6eb02451cf796d18f69d873e540000800100008000000080010000006200000000
+** Base64 String:
cHNidP8BAHECAAAAAQsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAAAAAAD+////AgAIry8AAAAAFgAUxDD2TEdW2jENvRoIVXLvKZkmJyyLvesLAAAAABYAFKB9rIq2ypQtN57Xlfg1unHJzGiFAAAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEIawJHMEQCIAUnWkhXNOCuHzuXEjdYbw5y3IWDPSeMDkdM0jESwPpeAiBrBIyDzrw8QdC5PMfadhhc7b0DDQBbCAGL4rmLusvfewEhA3YNzKBfOZfcZbKTBg9/KfFRTIxScEjhKAKwQdT8NAonACICAtYB+EhGpnVfd2vgDj2d6PsQrMk1+4PEX7AWLUytWreSGPadhz5UAACAAQAAgAAAAIAAAAAAKgAAAAEDCAAIry8AAAAAACICA27+LCVWIZhlU7qdZcPdxkFlyhQ24FqjWkxusCRRz3ltGPadhz5UAACAAQAAgAAAAIABAAAAYgAAAAA=
+ +* Case: PSBTv0 but with PSBT_OUT_SCRIPT. +** Bytes in Hex:
70736274ff01007102000000010b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc80000000000feffffff020008af2f00000000160014c430f64c4756da310dbd1a085572ef299926272c8bbdeb0b00000000160014a07dac8ab6ca942d379ed795f835ba71c9cc688500000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e01086b02473044022005275a485734e0ae1f3b971237586f0e72dc85833d278c0e474cd23112c0fa5e02206b048c83cebc3c41d0b93cc7da76185cedbd030d005b08018be2b98bbacbdf7b012103760dcca05f3997dc65b293060f7f29f1514c8c527048e12802b041d4fc340a2700220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000104160014a07dac8ab6ca942d379ed795f835ba71c9cc6885002202036efe2c255621986553ba9d65c3ddc64165ca1436e05aa35a4c6eb02451cf796d18f69d873e540000800100008000000080010000006200000000
+** Base64 String:
cHNidP8BAHECAAAAAQsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAAAAAAD+////AgAIry8AAAAAFgAUxDD2TEdW2jENvRoIVXLvKZkmJyyLvesLAAAAABYAFKB9rIq2ypQtN57Xlfg1unHJzGiFAAAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEIawJHMEQCIAUnWkhXNOCuHzuXEjdYbw5y3IWDPSeMDkdM0jESwPpeAiBrBIyDzrw8QdC5PMfadhhc7b0DDQBbCAGL4rmLusvfewEhA3YNzKBfOZfcZbKTBg9/KfFRTIxScEjhKAKwQdT8NAonACICAtYB+EhGpnVfd2vgDj2d6PsQrMk1+4PEX7AWLUytWreSGPadhz5UAACAAQAAgAAAAIAAAAAAKgAAAAEEFgAUoH2sirbKlC03nteV+DW6ccnMaIUAIgIDbv4sJVYhmGVTup1lw93GQWXKFDbgWqNaTG6wJFHPeW0Y9p2HPlQAAIABAACAAAAAgAEAAABiAAAAAA==
+ +* Case: PSBTv2 missing PSBT_GLOBAL_INPUT_COUNT. +** Bytes in Hex:
70736274ff01020402000000010304000000000105010201fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f0400000000011004feffffff00220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEFAQIB+wQCAAAAAAEAUgIAAAABwaolbiFLlqGCL5PeQr/ztfP/jQUZMG41FddRWl6AWxIAAAAAAP////8BGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgAAAAABAR8Yxpo7AAAAABYAFLCjrxRCCEEmk8p9FmhStS2wrvBuAQ4gCwrZIUGcHIcZc11y3HOfnqngY40f5MHu8PmUQISBX8gBDwQAAAAAARAE/v///wAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: PSBTv2 missing PSBT_GLOBAL_OUTPUT_COUNT. +** Bytes in Hex:
70736274ff01020402000000010304000000000104010101fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f0400000000011004feffffff00220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQEB+wQCAAAAAAEAUgIAAAABwaolbiFLlqGCL5PeQr/ztfP/jQUZMG41FddRWl6AWxIAAAAAAP////8BGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgAAAAABAR8Yxpo7AAAAABYAFLCjrxRCCEEmk8p9FmhStS2wrvBuAQ4gCwrZIUGcHIcZc11y3HOfnqngY40f5MHu8PmUQISBX8gBDwQAAAAAARAE/v///wAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: PSBTv2 missing PSBT_IN_PREVIOUS_TXID. +** Bytes in Hex:
70736274ff0102040200000001030400000000010401010105010201fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010f0400000000011004feffffff00220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQEBBQECAfsEAgAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEPBAAAAAABEAT+////ACICAtYB+EhGpnVfd2vgDj2d6PsQrMk1+4PEX7AWLUytWreSGPadhz5UAACAAQAAgAAAAIAAAAAAKgAAAAEDCAAIry8AAAAAAQQWABTEMPZMR1baMQ29GghVcu8pmSYnLAAiAgLjb7/1PdU0Bwz4/TlmFGgPNXqbhdtzQL8c+nRdKtezQBj2nYc+VAAAgAEAAIAAAACAAQAAAGQAAAABAwiLvesLAAAAAAEEFgAUTdGTrJZKVqwbnhzKhFT+L0dPhRMA
+ +* Case: PSBTv2 missing PSBT_IN_OUTPUT_INDEX. +** Bytes in Hex:
70736274ff0102040200000001030400000000010401010105010201fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8011004feffffff00220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQEBBQECAfsEAgAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IARAE/v///wAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: PSBTv2 missing PSBT_OUT_AMOUNT. +** Bytes in Hex:
70736274ff0102040200000001030400000000010401010105010201fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f0400000000011004feffffff00220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQEBBQECAfsEAgAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAQ8EAAAAAAEQBP7///8AIgIC1gH4SEamdV93a+AOPZ3o+xCsyTX7g8RfsBYtTK1at5IY9p2HPlQAAIABAACAAAAAgAAAAAAqAAAAAQQWABTEMPZMR1baMQ29GghVcu8pmSYnLAAiAgLjb7/1PdU0Bwz4/TlmFGgPNXqbhdtzQL8c+nRdKtezQBj2nYc+VAAAgAEAAIAAAACAAQAAAGQAAAABAwiLvesLAAAAAAEEFgAUTdGTrJZKVqwbnhzKhFT+L0dPhRMA
+ +* Case: PSBTv2 missing PSBT_OUT_SCRIPT. +** Bytes in Hex:
70736274ff0102040200000001030400000000010401010105010201fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f0400000000011004feffffff00220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f0000000000220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQEBBQECAfsEAgAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAQ8EAAAAAAEQBP7///8AIgIC1gH4SEamdV93a+AOPZ3o+xCsyTX7g8RfsBYtTK1at5IY9p2HPlQAAIABAACAAAAAgAAAAAAqAAAAAQMIAAivLwAAAAAAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: PSBTv2 with PSBT_IN_REQUIRED_TIME_LOCKTIME less than 500000000. +** Bytes in Hex:
70736274ff01020402000000010401010105010201fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f0400000000011104ff64cd1d00220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQQBAQEFAQIB+wQCAAAAAAEAUgIAAAABwaolbiFLlqGCL5PeQr/ztfP/jQUZMG41FddRWl6AWxIAAAAAAP////8BGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgAAAAABAR8Yxpo7AAAAABYAFLCjrxRCCEEmk8p9FmhStS2wrvBuAQ4gCwrZIUGcHIcZc11y3HOfnqngY40f5MHu8PmUQISBX8gBDwQAAAAAAREE/2TNHQAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: PSBTv2 with PSBT_IN_REQUIRED_HEIGHT_LOCKTIME greater than or equal to 500000000. +** Bytes in Hex:
70736274ff01020402000000010401010105010201fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f04000000000112040065cd1d00220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQQBAQEFAQIB+wQCAAAAAAEAUgIAAAABwaolbiFLlqGCL5PeQr/ztfP/jQUZMG41FddRWl6AWxIAAAAAAP////8BGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgAAAAABAR8Yxpo7AAAAABYAFLCjrxRCCEEmk8p9FmhStS2wrvBuAQ4gCwrZIUGcHIcZc11y3HOfnqngY40f5MHu8PmUQISBX8gBDwQAAAAAARIEAGXNHQAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +The following are valid PSBTs + +* Case: 1 input, 2 output PSBTv2, required fields only. +** Bytes in Hex:
70736274ff01020402000000010401010105010201fb040200000000010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f0400000000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQQBAQEFAQIB+wQCAAAAAAEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAQ8EAAAAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: 1 input, 2 output updated PSBTv2. +** Bytes in HEx:
70736274ff01020402000000010401010105010201fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f040000000000220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQQBAQEFAQIB+wQCAAAAAAEAUgIAAAABwaolbiFLlqGCL5PeQr/ztfP/jQUZMG41FddRWl6AWxIAAAAAAP////8BGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgAAAAABAR8Yxpo7AAAAABYAFLCjrxRCCEEmk8p9FmhStS2wrvBuAQ4gCwrZIUGcHIcZc11y3HOfnqngY40f5MHu8PmUQISBX8gBDwQAAAAAACICAtYB+EhGpnVfd2vgDj2d6PsQrMk1+4PEX7AWLUytWreSGPadhz5UAACAAQAAgAAAAIAAAAAAKgAAAAEDCAAIry8AAAAAAQQWABTEMPZMR1baMQ29GghVcu8pmSYnLAAiAgLjb7/1PdU0Bwz4/TlmFGgPNXqbhdtzQL8c+nRdKtezQBj2nYc+VAAAgAEAAIAAAACAAQAAAGQAAAABAwiLvesLAAAAAAEEFgAUTdGTrJZKVqwbnhzKhFT+L0dPhRMA
+ +* Case: 1 input, 2 output updated PSBTv2, with PSBT_IN_SEQUENCE. +** Bytes in Hex:
70736274ff01020402000000010401010105010201fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f0400000000011004feffffff00220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQQBAQEFAQIB+wQCAAAAAAEAUgIAAAABwaolbiFLlqGCL5PeQr/ztfP/jQUZMG41FddRWl6AWxIAAAAAAP////8BGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgAAAAABAR8Yxpo7AAAAABYAFLCjrxRCCEEmk8p9FmhStS2wrvBuAQ4gCwrZIUGcHIcZc11y3HOfnqngY40f5MHu8PmUQISBX8gBDwQAAAAAARAE/v///wAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: 1 input, 2 output updated PSBTv2, with PSBT_IN_SEQUENCE, and all locktime fields +** Bytes in Hex:
70736274ff0102040200000001030400000000010401010105010201fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f0400000000011004feffffff0111048c8dc4620112041027000000220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQEBBQECAfsEAgAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAQ8EAAAAAAEQBP7///8BEQSMjcRiARIEECcAAAAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: 1 input, 2 output updated PSBTv2, with Inputs Modifiable Flag (bit 0) of PSBT_GLOBAL_TX_MODIFIABLE set +** Bytes in Hex:
70736274ff0102040200000001040101010501020106010101fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f040000000000220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQQBAQEFAQIBBgEBAfsEAgAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAQ8EAAAAAAAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: 1 input, 2 output updated PSBTv2, with Outputs Modifiable Flag (bit 1) of PSBT_GLOBAL_TX_MODIFIABLE set +** Bytes in Hex:
70736274ff0102040200000001040101010501020106010201fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f040000000000220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQQBAQEFAQIBBgECAfsEAgAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAQ8EAAAAAAAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: 1 input, 2 output updated PSBTv2, with Has SIGHASH_SINGLE Flag (bit 2) of PSBT_GLOBAL_TX_MODIFIABLE set +** Bytes in Hex:
70736274ff0102040200000001040101010501020106010401fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f040000000000220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQQBAQEFAQIBBgEEAfsEAgAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAQ8EAAAAAAAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: 1 input, 2 output updated PSBTv2, with an undefined flag (bit 3) of PSBT_GLOBAL_TX_MODIFIABLE set +** Bytes in Hex:
70736274ff0102040200000001040101010501020106010801fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f040000000000220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQQBAQEFAQIBBgEIAfsEAgAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAQ8EAAAAAAAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: 1 input, 2 output updated PSBTv2, with both Inputs Modifiable Flag (bit 0) and Outputs Modifiable Flag (bit 1) of PSBT_GLOBAL_TX_MODIFIABLE set +** Bytes in Hex:
70736274ff0102040200000001040101010501020106010301fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f040000000000220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQQBAQEFAQIBBgEDAfsEAgAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAQ8EAAAAAAAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: 1 input, 2 output updated PSBTv2, with both Inputs Modifiable Flag (bit 0) and Has SIGHASH_SINGLE Flag (bit 2) of PSBT_GLOBAL_TX_MODIFIABLE set +** Bytes in Hex:
70736274ff0102040200000001040101010501020106010501fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f040000000000220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQQBAQEFAQIBBgEFAfsEAgAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAQ8EAAAAAAAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: 1 input, 2 output updated PSBTv2, with both Outputs Modifiable Flag (bit 1) and Has SIGHASH_SINGLE FLag (bit 2) of PSBT_GLOBAL_TX_MODIFIABLE set +** Bytes in Hex:
70736274ff0102040200000001040101010501020106010601fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f040000000000220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQQBAQEFAQIBBgEGAfsEAgAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAQ8EAAAAAAAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: 1 input, 2 output updated PSBTv2, with all defined PSBT_GLOBAL_TX_MODIFIABLE flags set +** Bytes in Hex:
70736274ff0102040200000001040101010501020106010701fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f040000000000220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQQBAQEFAQIBBgEHAfsEAgAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAQ8EAAAAAAAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: 1 input, 2 output updated PSBTv2, with all possible PSBT_GLOBAL_TX_MODIFIABLE flags set +** Bytes in Hex:
+** Base64 String:
cHNidP8BAgQCAAAAAQQBAQEFAQIBBgH/AfsEAgAAAAABAFICAAAAAcGqJW4hS5ahgi+T3kK/87Xz/40FGTBuNRXXUVpegFsSAAAAAAD/////ARjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4AAAAAAQEfGMaaOwAAAAAWABSwo68UQghBJpPKfRZoUrUtsK7wbgEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAQ8EAAAAAAAiAgLWAfhIRqZ1X3dr4A49nej7EKzJNfuDxF+wFi1MrVq3khj2nYc+VAAAgAEAAIAAAACAAAAAACoAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAIgIC42+/9T3VNAcM+P05ZhRoDzV6m4Xbc0C/HPp0XSrXs0AY9p2HPlQAAIABAACAAAAAgAEAAABkAAAAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: 1 input, 2 output updated PSBTv2, with all PSBTv2 fields +** Bytes in Hex:
70736274ff010204020000000103040000000001040101010501020106010701fb0402000000000100520200000001c1aa256e214b96a1822f93de42bff3b5f3ff8d0519306e3515d7515a5e805b120000000000ffffffff0118c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e0000000001011f18c69a3b00000000160014b0a3af144208412693ca7d166852b52db0aef06e010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f0400000000011004feffffff0111048c8dc4620112041027000000220202d601f84846a6755f776be00e3d9de8fb10acc935fb83c45fb0162d4cad5ab79218f69d873e540000800100008000000080000000002a0000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c00220202e36fbff53dd534070cf8fd396614680f357a9b85db7340bf1cfa745d2ad7b34018f69d873e54000080010000800000008001000000640000000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQEBBQECAQYBBwH7BAIAAAAAAQBSAgAAAAHBqiVuIUuWoYIvk95Cv/O18/+NBRkwbjUV11FaXoBbEgAAAAAA/////wEYxpo7AAAAABYAFLCjrxRCCEEmk8p9FmhStS2wrvBuAAAAAAEBHxjGmjsAAAAAFgAUsKOvFEIIQSaTyn0WaFK1LbCu8G4BDiALCtkhQZwchxlzXXLcc5+eqeBjjR/kwe7w+ZRAhIFfyAEPBAAAAAABEAT+////AREEjI3EYgESBBAnAAAAIgIC1gH4SEamdV93a+AOPZ3o+xCsyTX7g8RfsBYtTK1at5IY9p2HPlQAAIABAACAAAAAgAAAAAAqAAAAAQMIAAivLwAAAAABBBYAFMQw9kxHVtoxDb0aCFVy7ymZJicsACICAuNvv/U91TQHDPj9OWYUaA81epuF23NAvxz6dF0q17NAGPadhz5UAACAAQAAgAAAAIABAAAAZAAAAAEDCIu96wsAAAAAAQQWABRN0ZOslkpWrBueHMqEVP4vR0+FEwA=
+ +The following tests are the timelock determination algorithm. + +The timelock for the following PSBTs should be computed to be 0: + +* Case: No locktimes specified +** Bytes in Hex:
70736274ff01020402000000010401010105010201fb040200000000010e200b0ad921419c1c8719735d72dc739f9ea9e0638d1fe4c1eef0f9944084815fc8010f0400000000000103080008af2f000000000104160014c430f64c4756da310dbd1a085572ef299926272c000103088bbdeb0b0000000001041600144dd193ac964a56ac1b9e1cca8454fe2f474f851300
+** Base64 String:
cHNidP8BAgQCAAAAAQQBAQEFAQIB+wQCAAAAAAEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAQ8EAAAAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==
+ +* Case: Fallback locktime of 0 +** Bytes in Hex:
70736274ff0102040200000001030400000000010401020105010101fb040200000000010e200f758dbfbd4da7c16c8a3309c3c81e1100f561ea646db5b01752c485e1bdde9f010f040100000000010e203a1b3b3c837d6489ea7a31d8e6c7dd503c001bef3e06958e7574808d68ca78a5010f0400000000000103084f9335770000000001041600140b1352cacd03cf6aa1b7f3c8d6388671b34a5e1100
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAAAAQ4gOhs7PIN9ZInqejHY5sfdUDwAG+8+BpWOdXSAjWjKeKUBDwQAAAAAAAEDCE+TNXcAAAAAAQQWABQLE1LKzQPPaqG388jWOIZxs0peEQA=
+ +The timelock for the following PSBTs should be computed to be 10000: + +* Case: Input 1 has PSBT_IN_REQUIRED_HEIGHT_LOCKTIME of 10000, Input 2 has no locktime fields +** Bytes in Hex:
70736274ff0102040200000001030400000000010401020105010101fb040200000000010e200f758dbfbd4da7c16c8a3309c3c81e1100f561ea646db5b01752c485e1bdde9f010f04010000000112041027000000010e203a1b3b3c837d6489ea7a31d8e6c7dd503c001bef3e06958e7574808d68ca78a5010f0400000000000103084f9335770000000001041600140b1352cacd03cf6aa1b7f3c8d6388671b34a5e1100
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAABEgQQJwAAAAEOIDobOzyDfWSJ6nox2ObH3VA8ABvvPgaVjnV0gI1oynilAQ8EAAAAAAABAwhPkzV3AAAAAAEEFgAUCxNSys0Dz2qht/PI1jiGcbNKXhEA
+ +* Case: Input 1 has PSBT_IN_REQUIRED_HEIGHT_LOCKTIME of 10000, Input 2 has PSBT_IN_REQUIRED_HEIGHT_LOCKTIME of 9000 +** Bytes in Hex:
70736274ff0102040200000001030400000000010401020105010101fb040200000000010e200f758dbfbd4da7c16c8a3309c3c81e1100f561ea646db5b01752c485e1bdde9f010f04010000000112041027000000010e203a1b3b3c837d6489ea7a31d8e6c7dd503c001bef3e06958e7574808d68ca78a5010f040000000001120428230000000103084f9335770000000001041600140b1352cacd03cf6aa1b7f3c8d6388671b34a5e1100
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAABEgQQJwAAAAEOIDobOzyDfWSJ6nox2ObH3VA8ABvvPgaVjnV0gI1oynilAQ8EAAAAAAESBCgjAAAAAQMIT5M1dwAAAAABBBYAFAsTUsrNA89qobfzyNY4hnGzSl4RAA==
+ +* Case: Input 1 has PSBT_IN_REQUIRED_HEIGHT_LOCKTIME of 10000, Input 2 has PSBT_IN_REQUIRED_HEIGHT_LOCKTIME of 9000 and PSBT_IN_REQUIRED_TIME_LOCKTIME of 1657048460 +** Bytes in Hex:
70736274ff0102040200000001030400000000010401020105010101fb040200000000010e200f758dbfbd4da7c16c8a3309c3c81e1100f561ea646db5b01752c485e1bdde9f010f04010000000112041027000000010e203a1b3b3c837d6489ea7a31d8e6c7dd503c001bef3e06958e7574808d68ca78a5010f04000000000111048c8dc46201120428230000000103084f9335770000000001041600140b1352cacd03cf6aa1b7f3c8d6388671b34a5e1100
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAABEgQQJwAAAAEOIDobOzyDfWSJ6nox2ObH3VA8ABvvPgaVjnV0gI1oynilAQ8EAAAAAAERBIyNxGIBEgQoIwAAAAEDCE+TNXcAAAAAAQQWABQLE1LKzQPPaqG388jWOIZxs0peEQA=
+ +* Case: Input 1 has PSBT_IN_REQUIRED_HEIGHT_LOCKTIME of 10000 and PSBT_IN_REQUIRED_TIME_LOCKTIME of 1657048459, Input 2 has PSBT_IN_REQUIRED_HEIGHT_LOCKTIME of 9000 and PSBT_IN_REQUIRED_TIME_LOCKTIME of 1657048460 +** Bytes in Hex:
70736274ff0102040200000001030400000000010401020105010101fb040200000000010e200f758dbfbd4da7c16c8a3309c3c81e1100f561ea646db5b01752c485e1bdde9f010f04010000000111048b8dc4620112041027000000010e203a1b3b3c837d6489ea7a31d8e6c7dd503c001bef3e06958e7574808d68ca78a5010f04000000000111048c8dc46201120428230000000103084f9335770000000001041600140b1352cacd03cf6aa1b7f3c8d6388671b34a5e1100
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAABEQSLjcRiARIEECcAAAABDiA6Gzs8g31kiep6Mdjmx91QPAAb7z4GlY51dICNaMp4pQEPBAAAAAABEQSMjcRiARIEKCMAAAABAwhPkzV3AAAAAAEEFgAUCxNSys0Dz2qht/PI1jiGcbNKXhEA
+ +The timelock for the following PSBTs should be computed to be 1657048460: + +* Case: Input 1 has PSBT_IN_REQUIRED_TIME_LOCKTIME of 1657048459, Input 2 has PSBT_IN_REQUIRED_HEIGHT_LOCKTIME of 9000 and PSBT_IN_REQUIRED_TIME_LOCKTIME of 1657048460 +** Bytes in Hex:
70736274ff0102040200000001030400000000010401020105010101fb040200000000010e200f758dbfbd4da7c16c8a3309c3c81e1100f561ea646db5b01752c485e1bdde9f010f04010000000111048b8dc46200010e203a1b3b3c837d6489ea7a31d8e6c7dd503c001bef3e06958e7574808d68ca78a5010f04000000000111048c8dc46201120428230000000103084f9335770000000001041600140b1352cacd03cf6aa1b7f3c8d6388671b34a5e1100
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAABEQSLjcRiAAEOIDobOzyDfWSJ6nox2ObH3VA8ABvvPgaVjnV0gI1oynilAQ8EAAAAAAERBIyNxGIBEgQoIwAAAAEDCE+TNXcAAAAAAQQWABQLE1LKzQPPaqG388jWOIZxs0peEQA=
+ +* Case: Input 1 has PSBT_IN_REQUIRED_HEIGHT_LOCKTIME of 10000 and PSBT_IN_REQUIRED_TIME_LOCKTIME of 1657048459, Input 2 has PSBT_IN_REQUIRED_TIME_LOCKTIME of 1657048460 +** Bytes in Hex:
70736274ff0102040200000001030400000000010401020105010101fb040200000000010e200f758dbfbd4da7c16c8a3309c3c81e1100f561ea646db5b01752c485e1bdde9f010f04010000000111048b8dc4620112041027000000010e203a1b3b3c837d6489ea7a31d8e6c7dd503c001bef3e06958e7574808d68ca78a5010f04000000000111048c8dc462000103084f9335770000000001041600140b1352cacd03cf6aa1b7f3c8d6388671b34a5e1100
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAABEQSLjcRiARIEECcAAAABDiA6Gzs8g31kiep6Mdjmx91QPAAb7z4GlY51dICNaMp4pQEPBAAAAAABEQSMjcRiAAEDCE+TNXcAAAAAAQQWABQLE1LKzQPPaqG388jWOIZxs0peEQA=
+ +** Bytes in Hex:
70736274ff0102040200000001030400000000010401020105010101fb040200000000010e200f758dbfbd4da7c16c8a3309c3c81e1100f561ea646db5b01752c485e1bdde9f010f040100000000010e203a1b3b3c837d6489ea7a31d8e6c7dd503c001bef3e06958e7574808d68ca78a5010f04000000000111048c8dc462000103084f9335770000000001041600140b1352cacd03cf6aa1b7f3c8d6388671b34a5e1100
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAAAAQ4gOhs7PIN9ZInqejHY5sfdUDwAG+8+BpWOdXSAjWjKeKUBDwQAAAAAAREEjI3EYgABAwhPkzV3AAAAAAEEFgAUCxNSys0Dz2qht/PI1jiGcbNKXhEA
+ +The timelock for the following PSBTs cannot be computed: + +* Case: Input 1 has PSBT_IN_REQUIRED_HEIGHT_LOCKTIME of 10000, Input 2 has PSBT_IN_REQUIRED_TIME_LOCKTIME of 1657048460 +** Bytes in Hex:
70736274ff0102040200000001030400000000010401020105010101fb040200000000010e200f758dbfbd4da7c16c8a3309c3c81e1100f561ea646db5b01752c485e1bdde9f010f04010000000112041027000000010e203a1b3b3c837d6489ea7a31d8e6c7dd503c001bef3e06958e7574808d68ca78a5010f04000000000111048c8dc462000103084f9335770000000001041600140b1352cacd03cf6aa1b7f3c8d6388671b34a5e1100
+** Base64 String:
cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAABEgQQJwAAAAEOIDobOzyDfWSJ6nox2ObH3VA8ABvvPgaVjnV0gI1oynilAQ8EAAAAAAERBIyNxGIAAQMIT5M1dwAAAAABBBYAFAsTUsrNA89qobfzyNY4hnGzSl4RAA==
==Rationale== From b505101a2dfc8e61c79c47520d863f860a505d18 Mon Sep 17 00:00:00 2001 From: MacroFake Date: Tue, 12 Jul 2022 05:38:41 +0200 Subject: [PATCH 042/335] 179: Remove my email due to spam (#1337) 179: Remove my email due to spam --- README.mediawiki | 2 +- bip-0179.mediawiki | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/README.mediawiki b/README.mediawiki index 47d3822a..bbfb63c8 100644 --- a/README.mediawiki +++ b/README.mediawiki @@ -921,7 +921,7 @@ Those proposing changes should consider that ultimately consent may rest with th | [[bip-0179.mediawiki|179]] | | Name for payment recipient identifiers -| Emil Engler, MarcoFalke, Luke Dashjr +| Emil Engler, Luke Dashjr | Informational | Draft |- style="background-color: #ffcfcf" diff --git a/bip-0179.mediawiki b/bip-0179.mediawiki index 7894f2d0..b34e2f6c 100644 --- a/bip-0179.mediawiki +++ b/bip-0179.mediawiki @@ -2,7 +2,6 @@ BIP: 179 Title: Name for payment recipient identifiers Author: Emil Engler - MarcoFalke Luke Dashjr Comments-Summary: No comments yet. Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0179 From 7cd8ecd111ff89d03729011feb8265a6ff25c59d Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Wed, 13 Jul 2022 15:02:21 -0400 Subject: [PATCH 043/335] psbt: Unify formatting of key-value data to specify data type and name --- bip-0174.mediawiki | 114 ++++++++++++++++++++++----------------------- bip-0370.mediawiki | 24 +++++----- bip-0371.mediawiki | 22 ++++----- 3 files changed, 80 insertions(+), 80 deletions(-) diff --git a/bip-0174.mediawiki b/bip-0174.mediawiki index f1decfd8..67f1c69f 100644 --- a/bip-0174.mediawiki +++ b/bip-0174.mediawiki @@ -98,7 +98,7 @@ The currently defined global types are as follows: | PSBT_GLOBAL_UNSIGNED_TX = 0x00 | None | No key data -| +| | The transaction in network serialization. The scriptSigs and witnesses for each input must be empty. The transaction must be in the old serialization format (without witnesses). | 0 | 2 @@ -107,9 +107,9 @@ The currently defined global types are as follows: |- | Extended Public Key | PSBT_GLOBAL_XPUB = 0x01 -| +| | The 78 byte serialized extended public key as defined by BIP 32. Extended public keys are those that can be used to derive public keys used in the inputs and outputs of this transaction. It should be the public key at the highest hardened derivation index so that the unhardened child keys used in the transaction can be derived. -| <32-bit uint> <32-bit uint>* +| <4 byte fingerprint> <32-bit little endian uint path element>* | The master key fingerprint as defined by BIP 32 concatenated with the derivation path of the public key. The derivation path is represented as 32-bit little endian unsigned integer indexes concatenated with each other. The number of 32 bit unsigned integer indexes must match the depth provided in the extended public key. | | @@ -120,7 +120,7 @@ The currently defined global types are as follows: | PSBT_GLOBAL_TX_VERSION = 0x02 | None | No key data -| <32-bit uint> +| <32-bit little endian uint version> | The 32-bit little endian signed integer representing the version number of the transaction being created. Note that this is not the same as the PSBT version number specified by the PSBT_GLOBAL_VERSION field. | 2 | 0 @@ -131,7 +131,7 @@ The currently defined global types are as follows: | PSBT_GLOBAL_FALLBACK_LOCKTIME = 0x03 | None | No key data -| <32-bit uint> +| <32-bit little endian uint locktime> | The 32-bit little endian unsigned integer representing the transaction locktime to use if no inputs specify a required locktime. | | 0 @@ -142,7 +142,7 @@ The currently defined global types are as follows: | PSBT_GLOBAL_INPUT_COUNT = 0x04 | None | No key data -| +| | Compact size unsigned integer representing the number of inputs in this PSBT. | 2 | 0 @@ -153,7 +153,7 @@ The currently defined global types are as follows: | PSBT_GLOBAL_OUTPUT_COUNT = 0x05 | None | No key data -| +| | Compact size unsigned integer representing the number of outputs in this PSBT. | 2 | 0 @@ -164,7 +164,7 @@ The currently defined global types are as follows: | PSBT_GLOBAL_TX_MODIFIABLE = 0x06 | None | No key data -| <8-bit uint> +| <8-bit uint flags> | An 8 bit little endian unsigned integer as a bitfield for various transaction modification flags. Bit 0 is the Inputs Modifiable Flag and indicates whether inputs can be modified. Bit 1 is the Outputs Modifiable Flag and indicates whether outputs can be modified. Bit 2 is the Has SIGHASH_SINGLE flag and indicates whether the transaction has a SIGHASH_SINGLE signature who's input and output pairing must be preserved. Bit 2 essentially indicates that the Constructor must iterate the inputs to determine whether and how to add an input. | | 0 @@ -175,7 +175,7 @@ The currently defined global types are as follows: | PSBT_GLOBAL_VERSION = 0xFB | None | No key data -| <32-bit uint> +| <32-bit little endian uint version> | The 32-bit little endian unsigned integer representing the version number of this PSBT. If omitted, the version number is 0. | | @@ -184,9 +184,9 @@ The currently defined global types are as follows: |- | Proprietary Use Type | PSBT_GLOBAL_PROPRIETARY = 0xFC -| -| Compact size unsigned integer , followed by identifier prefix of that length , followed by a subtype , followed by the key data itself . -| +| +| Compact size unsigned integer of the length of the identifier, followed by identifier prefix, followed by a compact size unsigned integer subtype, followed by the key data itself. +| | Any value data as defined by the proprietary type user. | | @@ -212,7 +212,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_NON_WITNESS_UTXO = 0x00 | None | No key data -| +| | The transaction in network serialization format the current input spends from. This should be present for inputs that spend non-segwit outputs and can be present for inputs that spend segwit outputs. An input can have both PSBT_IN_NON_WITNESS_UTXO and PSBT_IN_WITNESS_UTXO. '''Why can both UTXO types be provided?''' Many wallets began requiring the full previous transaction (i.e. PSBT_IN_NON_WITNESS_UTXO) for segwit inputs when PSBT was already in use. In order to be compatible with software which were expecting PSBT_IN_WITNESS_UTXO, both UTXO types must be allowed. | | @@ -223,7 +223,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_WITNESS_UTXO = 0x01 | None | No key data -| <64-bit int> +| <64-bit little endian int amount> | The entire transaction output in network serialization which the current input spends from. This should only be present for inputs which spend segwit outputs, including P2SH embedded ones. An input can have both PSBT_IN_NON_WITNESS_UTXO and PSBT_IN_WITNESS_UTXO | | @@ -232,9 +232,9 @@ The currently defined per-input types are defined as follows: |- | Partial Signature | PSBT_IN_PARTIAL_SIG = 0x02 -| +| | The public key which corresponds to this signature. -| +| | The signature as would be pushed to the stack from a scriptSig or witness. The signature should be a valid ECDSA signature corresponding to the pubkey that would return true when verified and not a value that would return false or be invalid otherwise (such as a NULLDUMMY). | | @@ -245,7 +245,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_SIGHASH_TYPE = 0x03 | None | No key data -| <32-bit uint> +| <32-bit little endian uint sighash type> | The 32-bit unsigned integer specifying the sighash type to be used for this input. Signatures for this input must use the sighash type, finalizers must fail to finalize inputs which have signatures that do not match the specified sighash type. Signers who cannot produce signatures with the sighash type must not provide a signature. | | @@ -256,7 +256,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_REDEEM_SCRIPT = 0x04 | None | No key data -| +| | The redeemScript for this input if it has one. | | @@ -267,7 +267,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_WITNESS_SCRIPT = 0x05 | None | No key data -| +| | The witnessScript for this input if it has one. | | @@ -276,9 +276,9 @@ The currently defined per-input types are defined as follows: |- | BIP 32 Derivation Path | PSBT_IN_BIP32_DERIVATION = 0x06 -| +| | The public key -| <32-bit uint> <32-bit uint>* +| <4 byte fingerprint> <32-bit little endian uint path element>* | The master key fingerprint as defined by BIP 32 concatenated with the derivation path of the public key. The derivation path is represented as 32 bit unsigned integer indexes concatenated with each other. Public keys are those that will be needed to sign this input. | | @@ -289,7 +289,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_FINAL_SCRIPTSIG = 0x07 | None | No key data -| +| | The Finalized scriptSig contains a fully constructed scriptSig with signatures and any other scripts necessary for the input to pass validation. | | @@ -300,7 +300,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_FINAL_SCRIPTWITNESS = 0x08 | None | No key data -| +| | The Finalized scriptWitness contains a fully constructed scriptWitness with signatures and any other scripts necessary for the input to pass validation. | | @@ -311,7 +311,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_POR_COMMITMENT = 0x09 | None | No key data -| +| | The UTF-8 encoded commitment message string for the proof-of-reserves. See [[bip-0127.mediawiki|BIP 127]] for more information. | | @@ -322,7 +322,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_RIPEMD160 = 0x0a | <20-byte hash> | The resulting hash of the preimage -| +| | The hash preimage, encoded as a byte vector, which must equal the key when run through the RIPEMD160 algorithm | | @@ -333,7 +333,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_SHA256 = 0x0b | <32-byte hash> | The resulting hash of the preimage -| +| | The hash preimage, encoded as a byte vector, which must equal the key when run through the SHA256 algorithm | | @@ -344,7 +344,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_HASH160 = 0x0c | <20-byte hash> | The resulting hash of the preimage -| +| | The hash preimage, encoded as a byte vector, which must equal the key when run through the SHA256 algorithm followed by the RIPEMD160 algorithm | | @@ -355,7 +355,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_HASH256 = 0x0d | <32-byte hash> | The resulting hash of the preimage -| +| | The hash preimage, encoded as a byte vector, which must equal the key when run through the SHA256 algorithm twice | | @@ -366,7 +366,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_PREVIOUS_TXID = 0x0e | None | No key data -| +| <32 byte txid> | 32 byte txid of the previous transaction whose output at PSBT_IN_OUTPUT_INDEX is being spent. | 2 | 0 @@ -377,7 +377,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_OUTPUT_INDEX = 0x0f | None | No key data -| <32-bit uint> +| <32-bit little endian uint index> | 32 bit little endian integer representing the index of the output being spent in the transaction with the txid of PSBT_IN_PREVIOUS_TXID. | 2 | 0 @@ -388,7 +388,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_SEQUENCE = 0x10 | None | No key data -| <32-bit uint> +| <32-bit little endian uint sequence> | The 32 bit unsigned little endian integer for the sequence number of this input. If omitted, the sequence number is assumed to be the final sequence number (0xffffffff). | | 0 @@ -399,7 +399,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_REQUIRED_TIME_LOCKTIME = 0x11 | None | No key data -| <32-bit uint> +| <32-bit little endian uint locktime> | 32 bit unsigned little endian integer greater than or equal to 500000000 representing the minimum Unix timestamp that this input requires to be set as the transaction's lock time. | | 0 @@ -410,7 +410,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_REQUIRED_HEIGHT_LOCKTIME = 0x12 | None | No key data -| <32-bit uiht> +| <32-bit uiht locktime> | 32 bit unsigned little endian integer less than 500000000 representing the minimum block height that this input requires to be set as the transaction's lock time. | | 0 @@ -421,7 +421,7 @@ The currently defined per-input types are defined as follows: | PSBT_IN_TAP_KEY_SIG = 0x13 | None | No key data -| +| <64 or 65 byte signature> | The 64 or 65 byte Schnorr signature for key path spending a Taproot output. Finalizers should remove this field after PSBT_IN_FINAL_SCRIPTWITNESS is constructed. | | @@ -430,9 +430,9 @@ The currently defined per-input types are defined as follows: |- | Taproot Script Spend Signature | PSBT_IN_TAP_SCRIPT_SIG = 0x14 -| +| <32 byte xonlypubkey> | A 32 byte X-only public key involved in a leaf script concatenated with the 32 byte hash of the leaf it is part of. -| +| <64 or 65 byte signature> | The 64 or 65 byte Schnorr signature for this pubkey and leaf combination. Finalizers should remove this field after PSBT_IN_FINAL_SCRIPTWITNESS is constructed. | | @@ -441,9 +441,9 @@ The currently defined per-input types are defined as follows: |- | Taproot Leaf Script | PSBT_IN_TAP_LEAF_SCRIPT = 0x15 -| +| | The control block for this leaf as specified in BIP 341. The control block contains the merkle tree path to this leaf. -|