[翻譯]BIP141 隔離見(jiàn)證交易

綜述

本提案定義了一個(gè)新結(jié)構(gòu)“witness”提交到區(qū)塊中,與交易的merkle tree不同。該結(jié)構(gòu)包含檢查交易有效性所需的數(shù)據(jù)。此外,腳本和簽名移動(dòng)到了這個(gè)新結(jié)構(gòu)。

為了確保BIP軟分叉的兼容性,該結(jié)構(gòu)通過(guò)coinbase交易嵌套在區(qū)塊已存在的merkle root。未來(lái)的硬分叉可以給該樹(shù)分配一個(gè)自己的分支。

動(dòng)機(jī)

整個(gè)交易的效果由引用的交易輸出和新創(chuàng)建的交易輸出決定。其他的交易數(shù)據(jù),尤其是簽名,僅僅只在驗(yàn)證塊鏈的狀態(tài)的時(shí)候需要,其他的時(shí)候并不需要它。

通過(guò)從交易結(jié)構(gòu)中移除這些數(shù)據(jù),提交給交易merkle tree,幾個(gè)問(wèn)題得到修正:

  1. 無(wú)意導(dǎo)致的交易延展性變的不可能 : 因?yàn)楹灻麛?shù)據(jù)不再是組成交易哈希數(shù)據(jù)的一部分,所以交易簽名的變化將不再影響到對(duì)應(yīng)交易的確定。作為一個(gè)交易延展性的解決方案,它比經(jīng)典的簽名編碼解決方案更好(BIP62)。
  • 對(duì)于所有類(lèi)型的腳本,該方案阻止了無(wú)意導(dǎo)致的簽名延展性,只要所有的交易輸入被簽名(使用至少一個(gè)CHECKSIG或CHECKMULTISIG操作碼)。
  • 在m-of-n的CHECKMULTISIG的多重簽名腳本中,只有得到所有私鑰所有者的同意,該交易才可能被延展(而不是BIP62中僅一個(gè)私鑰的持有者).
  • 防止未知的ECDSA簽名延展性造成的交易延展。
  • 允許沒(méi)有風(fēng)險(xiǎn)的創(chuàng)建未確認(rèn)的交易依賴(lài)鏈,這是對(duì)于offchain協(xié)議一個(gè)重要的功能(例如:閃電網(wǎng)絡(luò))
  1. 傳輸簽名數(shù)據(jù)變得可選擇 : 簽名數(shù)據(jù)只有當(dāng)一個(gè)對(duì)等節(jié)點(diǎn)準(zhǔn)備驗(yàn)證該交易有效性是才需要,對(duì)于只檢查該交易是否存在,并不需要該交易的簽名數(shù)據(jù)。這將減少SPV 節(jié)點(diǎn)證明的字節(jié)大小,提升SPV節(jié)點(diǎn)的隱私性,因?yàn)镾PV節(jié)點(diǎn)可以使用相同的帶寬下載更多的交易,
  2. 一些限制可以通過(guò)軟分叉繞過(guò) : 通過(guò)轉(zhuǎn)移交易的部分?jǐn)?shù)據(jù)到當(dāng)前協(xié)議未知的數(shù)據(jù)結(jié)構(gòu)中,例如:
  • 當(dāng)計(jì)算區(qū)塊字節(jié)大小時(shí),witness的字節(jié)可以被忽略或減少,一定程度上增大了區(qū)塊的字節(jié)。
  • 硬編碼常量,例如最大的push字節(jié)數(shù)或操作碼個(gè)數(shù)的限制可以被移除或重新評(píng)估。
  • 新的腳本系統(tǒng)可以不受現(xiàn)有腳本語(yǔ)義的限制被引入。例如:對(duì)于交易的簽名驗(yàn)證,一個(gè)新的交易摘要算法被引入(BIP143)

規(guī)范

交易ID

一個(gè)新的數(shù)據(jù)結(jié)構(gòu):witness被定義。每個(gè)交易有兩個(gè)ID。

txid的定義未變;
[nVersion] [txins] [txouts] [nLockTime]

新的wtxid被定義:
[nVersion] [marker] [flag] [txins] [txouts] [witness] [nLockTime]
nVersion, txins, txouts, and nLockTime格式與傳統(tǒng)的序列化相同。
marker 必須是一個(gè)值為0的字節(jié),0x00.
flag 必須是一個(gè)非0的字節(jié):當(dāng)前,必須是0x01。
witness是每個(gè)交易所有witness數(shù)據(jù)的序列化。每個(gè)txin關(guān)聯(lián)一個(gè)witness字段。一個(gè)witness字段以var_int開(kāi)始,標(biāo)識(shí)txin棧中item的數(shù)量,后面緊跟棧上的items,每個(gè)item以var_int開(kāi)始,標(biāo)識(shí)長(zhǎng)度。witness數(shù)據(jù)不是腳本。
一個(gè)非witness程序的txin必須關(guān)聯(lián)一個(gè)空的witness字段,由0x00表示。如果所有的txins都是非witness程序,則交易的wtxid等于它的txid。

承諾結(jié)構(gòu)

一個(gè)新的區(qū)塊規(guī)則被添加,該規(guī)則要求wtxid的承諾結(jié)構(gòu)。coinbase交易的承諾結(jié)構(gòu)被假設(shè)為0x00...000.
witness root hash由所有wtxid做為葉子來(lái)計(jì)算,與塊頭的hashMerkleRoot相同的方式。
該承諾結(jié)構(gòu)被記錄在coinbase交易的scriptPubKey字段。它必須含有至少38個(gè)字節(jié),前6個(gè)字節(jié)是:0x6a24aa21a9ed,

   1-byte - OP_RETURN (0x6a)
   1-byte - Push the following 36 bytes (0x24)
   4-byte - Commitment header (0xaa21a9ed)
  32-byte - Commitment hash: Double-SHA256(witness root hash|witness reserved value)
  39th byte onwards: Optional data with no consensus meaning

并且coinbase的交易輸入必須含有一個(gè)32字節(jié)的數(shù)組,做為witness reserved value.
如果有多個(gè)scriptPubKey匹配這個(gè)格式,則索引最大的輸出被認(rèn)定為承諾結(jié)構(gòu)。
如果區(qū)塊的所有交易都不含witness數(shù)據(jù),此時(shí)這個(gè)承諾結(jié)構(gòu)就可有可無(wú)。

witness program

一個(gè)scriptPubKey(或定義在BIP16/P2SH中的redeemScript)由一個(gè)字節(jié)的push 操作碼,后緊跟一個(gè)2-40字節(jié)的數(shù)據(jù)獲得一個(gè)新的特殊含義。第一個(gè)push的值叫做version byte,接下來(lái)的push字節(jié)向量叫做witness program.

有兩種情況下,witness的驗(yàn)證邏輯被觸發(fā)。每種情況都決定了witness version字節(jié)和程序的位置,以及scriptSig的格式。

  1. 由一個(gè)版本字節(jié)和witness program組成的scriptPubKey觸發(fā)。則scriptSig必須恰好是空或驗(yàn)證失敗("native witness program")。
  2. 被一個(gè)P2SH腳本的scriptPubKey觸發(fā),并且pushscriptSigredeemScript正好是一個(gè)版本字節(jié)加一個(gè)witness program。這個(gè)scriptSig必須恰好是一個(gè)push到BIP16的redeemScript或驗(yàn)證失敗("P2SH witness program")

如果版本字節(jié)是0,并且witness program是20字節(jié)

  • 解釋為一個(gè) pay-to-witness-public-key-hash (P2WPKH)程序。
  • 這個(gè)witness必須正好包含兩個(gè)item,且每個(gè)item小于等于520字節(jié)。第一個(gè)是簽名,第二個(gè)是公鑰。
  • 公鑰的hash160必須匹配20個(gè)字節(jié)的witness program。
  • 正常腳本評(píng)估后,簽名和公鑰通過(guò)CHECKSIG操作驗(yàn)證通過(guò)。驗(yàn)證必須在棧上chanTRUE的輸出。

如果版本字節(jié)是0,并且witness program是32字節(jié):

  • 解釋為一個(gè)pay-to-witness-script-hash(P2SH)程序。
  • witness必須包含一個(gè)輸入棧以供給腳本,然后是一個(gè)腳本的序列化(witnessScript).
  • witnessScript被反序列,并在正常的腳本評(píng)估后使用剩余的witness棧繼續(xù)執(zhí)行(每個(gè)堆棧項(xiàng)小于等于520字節(jié)).
  • 腳本一定不能執(zhí)行失敗,并在棧上產(chǎn)生一個(gè)TRUE。
    如果版本字節(jié)是0,但是witness program既不是20字節(jié),也不是32字節(jié),這個(gè)腳本必須失敗1

如果版本字節(jié)是1到16,且witness program 或witness 堆棧沒(méi)有進(jìn)一步的解釋?zhuān)⑶覍?duì)于witness 堆棧沒(méi)有字節(jié)限制。這些版本號(hào)保留給未來(lái)的拓展2。

其他的共識(shí)規(guī)則限制

Block Size

區(qū)塊當(dāng)前被限制在1,000,000(1M)字節(jié)。如下這樣改變限制:
Block wight = Base size * 3 + Total size; 3.
Base size是不帶witness數(shù)據(jù)的交易序列化后的字節(jié)大小,具體方式查看未升級(jí)節(jié)點(diǎn)。
Total Size 是BIP144中描述的交易序列化方式后的字節(jié)大小,包含基礎(chǔ)數(shù)據(jù)和witness數(shù)據(jù)。
新的規(guī)則是:block wight <= 4,000,000(4M)

Sigops

當(dāng)前每個(gè)塊的操作碼被限制在20,000。如下這樣改變限制:
在當(dāng)前鎖定腳本,簽名腳本,P2SH檢查腳本,操作碼被計(jì)數(shù)為先前值的4倍。操作碼的限制同樣翻了一番 <= 80,000.
每個(gè)P2WPKH的交易輸入被記為1個(gè)操作碼。另外,在P2WSHwitnessScript 中的操作碼被記為與以前P2SHredeemScript中相同的個(gè)數(shù)。也就是說(shuō),CHECKSIG被記為一個(gè)操作碼,CHECKMULTISIG根據(jù)參數(shù)被記為1到20個(gè)操作碼。這個(gè)規(guī)則適用于標(biāo)準(zhǔn)的witness program和P2SH witness program。

額外的定義

接下來(lái)的定義沒(méi)有用于共識(shí)限制,但建議符合上述術(shù)語(yǔ)。

Transaction size calculations(交易字節(jié)計(jì)算)

Transaction weight = Base transaction size * 3 + Total
transaction size。(例如:相同的方法計(jì)算block weight)
Virtual transaction size = Transaction weight / 4. (四舍五入至下一個(gè)整型)
Base transaction size = 不帶witness 數(shù)據(jù)的交易序列化后的大小。
Total transaction size = BIP144中描述的交易序列化后的字節(jié)大小,包含基礎(chǔ)數(shù)據(jù)和witness數(shù)據(jù)。

新的腳本語(yǔ)義

盡管P2WPKH和P2WSH腳本看起來(lái)非常類(lèi)似于預(yù)先隔離驗(yàn)證腳本,但還是有一些顯著的不同。用戶不得假設(shè)在預(yù)先隔離見(jiàn)證中可花費(fèi)的腳本在P2WPKH或P2WSH也可以花費(fèi)。再生產(chǎn)網(wǎng)絡(luò)大規(guī)模部署之前,開(kāi)發(fā)者應(yīng)該在測(cè)試網(wǎng)絡(luò)上使用默認(rèn)的中繼策略測(cè)試腳本,并且在BIP141在主網(wǎng)絡(luò)被激活后,使用較少的金額去測(cè)試。

共識(shí)級(jí)別的主要不同在BIP143中描述,在0號(hào)版本的witness program 為簽名驗(yàn)證定義了一個(gè)新的交易摘要算法。

在參考實(shí)現(xiàn)版本0.13.1中,三個(gè)中繼策略和挖礦政策也被包含在第一版的隔離見(jiàn)證中?;谶@些策略的軟分叉很可能在不久的將來(lái)提出。為了在軟分叉中造成避免無(wú)限期的延遲交易確認(rèn)或永久性的資金丟失,用戶必須仔細(xì)查看新的腳本語(yǔ)義。

  1. 在P2WPKH和P2WSH中只接受壓縮公鑰.BIP143
  2. 在P2WSH中OP_IF/NOTIF的參數(shù)必須是最小的.
  3. 如果OP_CHECKSIG或OP_CHECKMULTISIG失敗,簽名必須是空的字節(jié)向量.(當(dāng)前的segregated witness腳本和P2WSH,請(qǐng)看BIP146)

示例

P2WPKH

接下來(lái)的例子是0號(hào)版本的P2WPKH

witness:      <signature> <pubkey>
scriptSig:    (empty)
scriptPubKey: 0 <20-byte-key-hash>
              (0x0014{20-byte-key-hash})
              

'0'在鎖定腳本中標(biāo)識(shí)接下來(lái)的push數(shù)據(jù)是一個(gè)版本位0的witness program。witness program的長(zhǎng)度標(biāo)識(shí)腳本是一個(gè)P2WPKH類(lèi)型。witness必須恰好包含2項(xiàng),在witness中公鑰的hash160必須匹配witness program。

簽名被如此驗(yàn)證:<signature> <pubkey> CHECKSIG

與傳統(tǒng)的P2PKH輸出相比,P2WPKH在scriptPubKey中占據(jù)少3個(gè)字節(jié),并且從簽名腳本中轉(zhuǎn)移簽名和公鑰至witness字段。

P2WPKH 嵌套在 BIP16 P2SH中

witness:      <signature> <pubkey>
scriptSig:    <0 <20-byte-key-hash>>
              (0x160014{20-byte-key-hash})
scriptPubKey: HASH160 <20-byte-script-hash> EQUAL
          (0xA914{20-byte-script-hash}87)

在簽名腳本中僅包含Hash160,與鎖定腳本中的20字節(jié)的腳本哈希進(jìn)行比較,并被解釋為:0 <20-byte-key-hash>.

與以前的例子比較,scriptPubKey 大1字節(jié),并且簽名腳本大23字節(jié)。盡管一個(gè)嵌套的witness program是不太高效,但它的支付地址是完全透明的,并且向后兼容比特幣0.6.0以后的所有版本。

P2WSH

接下來(lái)的示例是1-of-2的多重簽名,版本號(hào)0

witness:      0 <signature1> <1 <pubkey1> <pubkey2> 2 CHECKMULTISIG>
scriptSig:    (empty)
scriptPubKey: 0 <32-byte-hash>
              (0x0020{32-byte-hash})

在scriptPubKey 中的'0'標(biāo)識(shí)接下來(lái)的push操作是一個(gè)版本號(hào)為0的witness program。witness program的長(zhǎng)度標(biāo)識(shí)是P2WSH類(lèi)型。在witness中最后一項(xiàng)被彈出,并被SHA256后,與在scriptPubKey中的32字節(jié)進(jìn)行比較,和反序列化。1 <pubkey1> <pubkey2> 2 CHECKMULTISIG

腳本使用witness中其余的數(shù)據(jù)進(jìn)行執(zhí)行。
0 <signature1> 1 <pubkey1> <pubkey2> 2 CHECKMULTISIG

P2WSH 允許最大字節(jié)腳本字節(jié)為10,000,520字節(jié)的限制被繞過(guò)。

scriptPubKey 占據(jù)34字節(jié),而不是P2SH中的23字節(jié)。增加字節(jié)提升了可能的碰撞攻擊的安全性,因?yàn)?**80是不再可行??苫ㄙM(fèi)的腳本與BIP16中的交易輸出相同,但被已到了witness字段中。

P2WSH nested in BIP16 P2SH

接下來(lái)的示例是1-of-2的多重簽名,版本號(hào)0,但被嵌套在BIP16的P2SH輸出中。

witness:      0 <signature1> <1 <pubkey1> <pubkey2> 2 CHECKMULTISIG>
scriptSig:    <0 <32-byte-hash>>
              (0x220020{32-byte-hash})
scriptPubKey: HASH160 <20-byte-hash> EQUAL
              (0xA914{20-byte-hash}87)

對(duì)簽名腳本中的唯一項(xiàng)進(jìn)行HASH160,然后與鎖定腳本中的20字節(jié)進(jìn)行比較,被解釋為 0 <32-byte-hash>.

P2WSH的witnessScript接下來(lái)如上述示例繼續(xù)執(zhí)行。

與以前的示例比較,鎖定腳本是小11個(gè)字節(jié)(降低了安全);但是,它在簽名腳本中要求了35字節(jié)的數(shù)據(jù)。

可拓展的承諾結(jié)構(gòu)(Extensible commitment structure)

在coinbase交易中新的承諾結(jié)構(gòu)是哈希witness root hashwitness reserved value。witness reserved value當(dāng)前沒(méi)有共識(shí)含義,但是在未來(lái)的軟分叉中允許成為新的共識(shí)結(jié)構(gòu)。例如:如果在未來(lái)要求一個(gè)新的嚴(yán)格共識(shí)結(jié)構(gòu),在coinbase中的承諾結(jié)構(gòu)將變?yōu)椋?code>Double-SHA256(Witness root hash|Hash(new commitment|witness reserved value))

為了向后兼容,Hash(new commitment|witness reserved value)將移動(dòng)到coinbase的 witness字段,并且witness reserved value將通過(guò)軟分叉被記錄在另一個(gè)地方。任何數(shù)量的新的共識(shí)結(jié)構(gòu)都可以通過(guò)這種方式添加。

任何對(duì)于比特幣不嚴(yán)格共識(shí)的承諾結(jié)構(gòu),如合并挖礦,一定不能使用witness reserved value字段來(lái)保留升級(jí)比特幣共識(shí)協(xié)議的能力。

無(wú)信任的未確認(rèn)交易依賴(lài)鏈

Segregated witness 從根本上修正了交易延展性問(wèn)題,以一種無(wú)信任的方式構(gòu)建未確認(rèn)的交易依賴(lài)鏈。

兩個(gè)成員,Alice和Bob,可能同意發(fā)送一定數(shù)量的比特幣到2-of-2的多重簽名輸出(資金交易)。不需要簽名這個(gè)資金交易,他們就可以創(chuàng)建另一個(gè)交易,時(shí)間鎖定在未來(lái),花費(fèi)2-of-2的多重簽名輸出至第三方(花費(fèi)交易)。ALice和Bob將簽署花費(fèi)交易,并交換簽名。驗(yàn)證通過(guò)簽名后,他們將簽署并提交現(xiàn)金交易至塊鏈。不需要進(jìn)一步的操作,花費(fèi)交易將在時(shí)間戳到達(dá)之后被確認(rèn),并根據(jù)原始合同釋放資金。它也保留了在時(shí)間戳之間撤銷(xiāo)原始合同的靈活性,通過(guò)使用一個(gè)更短的時(shí)間戳的花費(fèi)交易,但是這種情況只能在雙方達(dá)成共識(shí)的情況下發(fā)生。

BIP62 的設(shè)置不可能修復(fù)交易延展性,因?yàn)榛ㄙM(fèi)交易不可能在雙方?jīng)]有簽署資金交易的情況下創(chuàng)建。如果Alice比Bob早一步展示資金交易簽名,Bob可以無(wú)限期的鎖定資金,而無(wú)需簽署任何花費(fèi)交易。

未確認(rèn)的交易依賴(lài)鏈?zhǔn)歉鼜?fù)雜的支付網(wǎng)絡(luò)基本組成部分,例如:全雙工微型支付通道和閃電網(wǎng)絡(luò),可能隱式的極大提升比特幣系統(tǒng)的可拓展性和效率。

未來(lái)的拓展

用于SPV節(jié)點(diǎn)的緊湊型欺詐證明

比特幣當(dāng)前僅含有兩種安全模式。在系統(tǒng)中,用戶要么運(yùn)行全節(jié)點(diǎn)使用所有的規(guī)則驗(yàn)證每個(gè)區(qū)塊,或一個(gè)SPV客戶端僅驗(yàn)證頭部作為一些交易的發(fā)布證明。比特幣白皮書(shū)建議SPV客戶端可以接收來(lái)自全節(jié)點(diǎn)的警告,即當(dāng)全節(jié)點(diǎn)檢測(cè)到一個(gè)無(wú)效的區(qū)塊,提示SPV節(jié)點(diǎn)去下載這個(gè)有問(wèn)題的區(qū)塊和交易去驗(yàn)證。然而,這種方法可能會(huì)成為DOS攻擊的載體,因?yàn)榭梢詭缀鯖](méi)有成本的產(chǎn)生警告。警告必須具有緊湊但確定性的欺詐證明。

在當(dāng)前的比特幣協(xié)議中,對(duì)于幾乎所有的規(guī)則,都能產(chǎn)生緊湊型欺詐證明,除了特別少的一些例外:

  1. 當(dāng)沒(méi)有展示整個(gè)區(qū)塊和它的所有交易輸入,則不可能證明礦工在coinbase交易輸出中引入了太多的比特幣。
  2. 當(dāng)沒(méi)有展示整個(gè)區(qū)塊(和所有的交易輸入操作碼),則不可能證明違反了塊的指定限制(例如:字節(jié)和操作碼數(shù)量限制)。
  3. 沒(méi)有展示塊鏈中的所有的交易ID顯示在創(chuàng)建的區(qū)塊中,則不能證明花費(fèi)了不存在交易輸入。

可以提交額外的witness數(shù)據(jù),以允許SPV節(jié)點(diǎn)可以快速驗(yàn)證無(wú)效的區(qū)塊的簡(jiǎn)短證明。

  1. 交易費(fèi)的總和可以用來(lái)建立簡(jiǎn)短的證明,證明礦工沒(méi)有在coinbase交易中添加額外的交易費(fèi)。類(lèi)似于區(qū)塊的大小和操作碼計(jì)數(shù)限制。
  2. 可以提供交易輸入所花費(fèi)的輸出的反向鏈接。反向鏈接由塊的哈希和一個(gè)偏移量組成,請(qǐng)客戶端可以非常容易的查詢和檢查驗(yàn)證交易輸出的存在。
    這些承諾結(jié)構(gòu)可以通過(guò)軟分叉被包含在可拓展的承諾結(jié)構(gòu)中,并且對(duì)于不理解新規(guī)則的節(jié)點(diǎn)將是透明的。

新的腳本系統(tǒng)

因?yàn)橐粋€(gè)版本字節(jié)在witness program之前被push, 并且使用未知版本號(hào)的program被認(rèn)為是anyone-can-spend腳本,所有可以通過(guò)軟分叉引入任何新的腳本系統(tǒng)。witness結(jié)構(gòu)不會(huì)被任何已存在的腳本語(yǔ)義和限制所限制,特別是520字節(jié)的push限制,因此允許任意大的腳本和簽名。

例如:包含Schnorr簽名的新腳本系統(tǒng)將顯著減少多簽名交易的字節(jié);包含Schnorr簽名的腳本是具有抗量子計(jì)算的,以及Merklized抽象語(yǔ)義樹(shù)允許在非常復(fù)雜的條件腳本上含有非常緊湊的witness數(shù)據(jù)。

每個(gè)輸入的鎖定時(shí)間和相對(duì)鎖定時(shí)間

在交易中僅含有一個(gè)nLockTime字段,所有的交易輸入飛享相同的值。BIP68使用nSequence字段標(biāo)識(shí)相對(duì)鎖定時(shí)間,然而,鎖定時(shí)間和和決議有限制。

使用軟分叉,可以引入一個(gè)分離的witness結(jié)構(gòu),允許每個(gè)交易輸入有自己的鎖定時(shí)間和相當(dāng)鎖定時(shí)間,并且新的腳本系統(tǒng)可以簽名和操作新的數(shù)據(jù)(類(lèi)似于BIP65BIP112)。

向后兼容

作為一個(gè)軟分叉,舊版本的軟件將沒(méi)有任何變化的繼續(xù)執(zhí)行。未升級(jí)的節(jié)點(diǎn),將不能看到并驗(yàn)證witness數(shù)據(jù),并且認(rèn)為所有的witness program都是anyone-can-spend腳本(除了一些邊緣的案例,witness program等于0,該腳本執(zhí)行肯定失敗)。錢(qián)包應(yīng)當(dāng)一直警惕anyone-can-spend腳本,并對(duì)他們持懷疑態(tài)度。所有未升級(jí)的節(jié)點(diǎn)強(qiáng)烈建議去升級(jí),以便可以采用新功能。

未升級(jí)的錢(qián)包可以做什么:

  1. 從已升級(jí)和未升級(jí)的錢(qián)包接收比特幣
  2. 發(fā)送比特幣給未升級(jí)的錢(qián)包,并且升級(jí)傳統(tǒng)P2PKH地址的錢(qián)包(沒(méi)有隔離見(jiàn)證交易的好處)
  3. 使用P2SH地址發(fā)送比特幣給升級(jí)的錢(qián)包
  4. 通過(guò)BIP70 支付協(xié)議,使用本地隔離程序發(fā)送比特幣給升級(jí)的錢(qián)包

未升級(jí)的錢(qián)包不可以做什么:

  1. 驗(yàn)證隔離見(jiàn)證交易。它假設(shè)這樣的一個(gè)交易是一直有效的。

部署

該BIP通過(guò)BIP9的版本字節(jié)和SegWit名稱(chēng),使用bit 1的位置進(jìn)行部署。
主網(wǎng)絡(luò)的部署時(shí)間(都為BIP9的中位數(shù)時(shí)間):開(kāi)始:2016.11.15; 結(jié)束:2017.11.15
測(cè)試網(wǎng)路的部署時(shí)間(都為BIP9的中位數(shù)時(shí)間): 開(kāi)始:2016.05.01; 結(jié)束:2017.05.01

腳注:

案例: 攜帶OP_0以及40個(gè)非0字節(jié)PUSH數(shù)據(jù)的鎖定腳本,由于不正確的字節(jié)長(zhǎng)度,將導(dǎo)致驗(yàn)證失敗。然而,攜帶OP_0以及41個(gè)非0字節(jié)的PUSH數(shù)據(jù)將通過(guò),因?yàn)樗槐徽J(rèn)為是一個(gè)witness程序。

為了向后兼容,對(duì)于從0到16的任何版本字節(jié),如果這個(gè)witness程序的CastToBool的值為0,這個(gè)腳本必須失敗。然而,這樣的哈希是一次成功的對(duì)哈希函數(shù)的原項(xiàng)攻擊,并且風(fēng)險(xiǎn)可以忽略。

合理使用單一復(fù)合約束,替代兩個(gè)分開(kāi)的限制:1M的基本數(shù)據(jù)和3M witness數(shù)據(jù);使用兩個(gè)單獨(dú)的限制將使挖礦和交易費(fèi)預(yù)估幾乎不可能。礦工將要解決一個(gè)復(fù)雜的非線性優(yōu)化問(wèn)題:以找到一組符合兩者的最大交易費(fèi),且錢(qián)包無(wú)法知道需要支付多少交易費(fèi),因?yàn)榇藭r(shí)的交易費(fèi)依賴(lài)于當(dāng)?shù)V工使用交易產(chǎn)生區(qū)塊時(shí),這兩個(gè)條件哪個(gè)條件受到最高約束。這種方法的另一個(gè)問(wèn)題是freeloading。一旦一組交易的基本數(shù)據(jù)達(dá)到1M限制,僅通過(guò)最小化增加費(fèi)用就可以給witness字段添加額外高達(dá)3M的數(shù)據(jù)。在這種情況下,額外witness空間的邊際成本實(shí)際變?yōu)?.

引用實(shí)現(xiàn)

https://github.com/bitcoin/bitcoin/pull/8149

引用

原文地址 : https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki
BIP143 : https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki
BIP62 : https://github.com/bitcoin/bips/blob/master/bip-0062.mediawiki
BIP144 : https://github.com/bitcoin/bips/blob/master/bip-0144.mediawiki
BIP146 : https://github.com/bitcoin/bips/blob/master/bip-0146.mediawiki


本文由 Copernicus團(tuán)隊(duì) 姚永芯翻譯,轉(zhuǎn)載無(wú)需授權(quán)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容