本文件的大部份內容能夠在與隔離認證相關的BIP中找到,包括BIP141,BIP143,BIP144和BIP145。請將此視爲閱讀其餘相關文件的第一個參考點,並做爲那些應該作和那些不該該作的檢查清單。php
錢包必須實現本節中的全部功能,以便在基本級別被視爲segwit兼容:java
pay-to-script-hash
(BIP16)及其地址格式(BIP13)。scriptPubKey
,並建立一個交易。redeemScript
以前,P2SH-P2WPKH地址與非segwit P2SH地址沒法區分(例如非segwit多簽名地址)。0x02
或0x03
開頭。使用任何其餘格式(如未壓縮的公鑰)可能會致使不可撤銷的資金損失。keyhash
)的SHA256的RIPEMD160。儘管keyhash
公式與P2PKH相同,但應避免重用keyhash
以得到更好的隱私並防止意外使用未壓縮密鑰。redeemScript
始終爲22個字節。它以OP_0
開頭,而後是keyhash
的規範推送(如0x0014{20-byte keyhash}
)。scriptPubKey
是OP_HASH160 hash160(redeemScript)OP_EQUAL
,地址是對應的P2SH地址,前綴爲3。nVersion|txins|txouts|nLockTime
。nVersion|marker|flag|txins|txouts|witness|nLockTime
。nVersion
,txins
,txouts
和nLockTime
的格式與原始格式相同。marker
必須是0x00
。flag
必須是0x01
。witness
是交易的全部見證數據的序列化。txins
的數量默認的。compactSize integer
開頭,以指示該項的字節數。txin
未與任何見證數據相關聯,則其對應的見證字段精確爲0x00
,表示見證堆棧項的數量爲零。txins
都沒有與任何見證數據相關聯,則交易必須以原始交易格式序列化,不包括marker
, flag
, witness
。例如,若是沒有txins
來自segwit UTXO,它必須以原始交易格式序列化。(coinbase交易例外)txid
的定義保持不變:原始序列化格式的double SHA256。wtxid
,它是具備見證數據的新序列化格式的double SHA256。wtxid
與txid
相同。txid
仍然是交易的主要標識符:txin
中使用。txid
來識別交易,則預示着它將繼續使用segwit。scriptSig
必須只包含一個redeemScript
。sighash
。scriptCode
老是26個字節,包括前導大小字節,如0x1976a914{20-byte keyhash}88ac
,不是redeemScript
,也不是scriptPubKey
。NODE_WITNESS=(1<<3)
。NODE_WITNESS
支持的節點。NODE_WITNESS
支持的節點。vsize
)。vsize
等於原始序列化大小的3倍,加上新格式序列化的大小,將結果除以4並向上舍入到下一個整數。例如,若是一個交易是200字節的新格式序列化,而且變爲99字節,刪除了marker
,flag
,witness
,則vsize
爲(99*3+200)/4=125並向上舍入。vsize
只是它自己的大小。vsize
與其餘交易而不是大小來估算。若是錢包支持除單一簽名以外的腳本類型,例如多重簽名,則必須知足如下基本要求:git
#### 建立P2SH-P2WSH地址github
witnessScript
的腳本。witnessScript
(scripthash
)的SHA256。請注意使用單個SHA256,而不是雙SHA256和RIPEMD160(SHA256)。redeemScript
老是34個字節。它以OP_0
開頭,而後是scripthash
的規範推送(即0x0020{32-byte scripthash}
)。scriptPubKey
是OP_HASH160 hash160(redeemScript) OP_EQUAL
,地址是對應的P2SH地址,前綴爲3。OP_IF
或OP_NOTIF
,則其參數必須是空向量(對於false)或0x01
(對於true)。使用其餘值可能致使永久性資金損失。(BIP草案)。OP_CHECKSIG
或OP_CHECKMULTISIG
返回失敗,則全部簽名必須爲空向量。不然,資金可能會永久丟失。(BIP146)。witnessScript
的默認策略限制爲3600字節。除了witnessScript
,最多能夠有100個見證堆棧項,每一個最多80個字節。超出這些限制的交易不得轉發或包含在一個區塊中。nOpCount
,仍然適用於P2SH-P2WSH。scriptSig
必須只包含一個redeemScript
。witnessScript
。OP_CODESEPARATOR
的狀況下,scriptCode
是witnessScript
,前面是一個compactSize integer
,用於witnessScript
的大小。例如,若是腳本是OP_1
(0x51
),則序列化的scriptCode
是(0x0151
)。OP_CODESEPARATOR
的任何異常腳本,請參閱BIP143以獲取確切的語義。witnessScript
以前的任何見證堆棧項目都用做腳本評測的輸入堆棧。輸入堆棧不會被解釋爲腳本。例如,不須要使用0x4c
(OP_PUSHDATA1)來「push」大項。初始segwit支持不須要如下功能。算法
scriptPubKey
。它以OP_0
開頭,而後是keyhash
的規範推送(即0x0014{20-byte keyhash}
)。keyhash
是壓縮公鑰的RIPEMD160(SHA256)。scriptSig
必須爲空,見證堆棧格式和簽名生成規則與P2SH-P2WPKH相同(包括使用壓縮公鑰的要求)。scriptPubKey
。它以OP_0
開頭,而後是scripthash
的規範推送(即0x0020{32-byte scripthash}
)。scripthash
是witnessScript
的SHA256。scriptSig
必須爲空,見證堆棧格式和簽名生成規則與P2SH-P2WSH相同(包括使用壓縮公鑰的要求)。vsize
較小,所以可能須要較少的費用。scriptPubKey
協議一塊兒使用,例如支付協議(BIP70)。可是,它可能會影響付款人和收件人的隱私(見下文)。分享2個比特幣相關的交互式在線編程實戰教程:編程
- java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Java代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
- php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Php代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
這裏是原文比特幣錢包隔離認證開發指南json