比特幣改進(jìn)協(xié)議BIP16(翻譯)
英文原文地址:
https://github.com/bitcoin/bips/blob/master/bip-0016.mediawiki
標(biāo)題 Pay to Script Hash(P2SH)
備注:P2SH 在2012 年被作為一種新型箩绍、強(qiáng)大幽七、且能大大簡(jiǎn)化復(fù)雜交易腳本的交易類型而引入
摘要
此BIP描述了Bitcoin腳本系統(tǒng)的新“標(biāo)準(zhǔn)”交易類型,并定義了僅適用于新交易的其他驗(yàn)證規(guī)則甚纲。
目的
pay-to-script-hash目的是將提供條件的責(zé)任從資金發(fā)送者轉(zhuǎn)移到接收方露泊。
好處是允許發(fā)送者發(fā)起無論多復(fù)雜的交易尤泽,使用足夠短的20字節(jié)固定長(zhǎng)度的散列來掃描QR碼或輕松地復(fù)制和粘貼签杈。
詳細(xì)說明
定義了一個(gè)包含在采礦區(qū)塊中的新標(biāo)準(zhǔn)交易類型:
OP_HASH160 [20-byte-hash-value] OP_EQUAL
[20-byte-hash-value]應(yīng)為推20字節(jié)到堆棧操作碼(0x14),后跟20個(gè)字節(jié)沽一。
這個(gè)新的交易類型被標(biāo)準(zhǔn)腳本代碼贖回:
signatures... {serialized script}
如果序列化腳本(也稱為redeemScript)本身就是其他標(biāo)準(zhǔn)交易類型之一盖溺,那么兌換這些pay-to-script outpoints的交易只能被視為標(biāo)準(zhǔn)。
傳播交易或?qū)⑵浼{入新區(qū)塊時(shí)對(duì)這些outpoints進(jìn)行驗(yàn)證的規(guī)則如下:
- 如果scriptSig(解鎖腳本)中存在除“push data”以外的任何操作铣缠,驗(yàn)證失敗烘嘱。
- 正常驗(yàn)證完成:從簽名和{序列化腳本}創(chuàng)建初始堆棧,并且計(jì)算腳本的哈希值蝗蛙,如果它與outpoint的哈希不匹配蝇庭,則驗(yàn)證失敗。
- {serialized script}從初始堆棧彈出捡硅,并使用彈出的堆棧和反序列化腳本作為scriptPubKey再次驗(yàn)證交易哮内。
這些新規(guī)則只應(yīng)在使用時(shí)間戳=> 1333238400(2012年4月1日)[1]的區(qū)塊中驗(yàn)證交易時(shí)應(yīng)用。
在區(qū)塊鏈中早于1333238400個(gè)的交易壮韭,應(yīng)用這些新的驗(yàn)證規(guī)則會(huì)失敗北发。 [2]。較舊的交易必須根據(jù)舊規(guī)則進(jìn)行驗(yàn)證喷屋。 (有關(guān)詳細(xì)信息琳拨,請(qǐng)參閱向后兼容性部分)。
例如逼蒙,scriptPubKey和相應(yīng)的scriptSig用于單簽名所需的交易:
scriptSig: [signature] {[pubkey] OP_CHECKSIG}
scriptPubKey: OP_HASH160 [20-byte-hash of {[pubkey] OP_CHECKSIG} ] OP_EQUAL
{序列化腳本}中的簽名操作將有助于每個(gè)塊允許的最大數(shù)量(20,000)从绘,如下所示:
- OP_CHECKSIG和OP_CHECKSIGVERIFY計(jì)數(shù)為1簽名操作,不管它們是否被評(píng)估是牢。
- OP_CHECKMULTISIG和OP_CHECKMULTISIGVERIFY之前的OP_1到OP_16將被計(jì)入1到16簽名操作僵井,不管它們是否被評(píng)估。
- 所有其他OP_CHECKMULTISIG和OP_CHECKMULTISIGVERIFY都被計(jì)為20個(gè)簽名操作驳棱。
舉例:
+3 簽名操作:
{2 [pubkey1] [pubkey2] [pubkey3] 3 OP_CHECKMULTISIG}
+22 簽名操作
{OP_CHECKSIG OP_IF OP_CHECKSIGVERIFY OP_ELSE OP_CHECKMULTISIGVERIFY OP_ENDIF}
理論依據(jù)
這個(gè)BIP替代了BIP 12焰盗,它提出了一個(gè)新的腳本操作碼(“OP_EVAL”)來完成此BIP中的所有操作叭喜。
這個(gè)BIP的動(dòng)機(jī)(和BIP 13援奢, pay-to-script-hash地址類型)有些爭(zhēng)議; 有人覺得這是不必要的挚躯,復(fù)雜/多重簽名的交易類型應(yīng)該是通過簡(jiǎn)單地向發(fā)送人提供完整的{序列化腳本}來支持的。 作者認(rèn)為形葬,此BIP已經(jīng)將改動(dòng)做到最小合呐,用以將資金發(fā)送到base58編碼的20字節(jié)比特幣地址,從而允許商家和交易所及其他軟件開始支持多重簽名交易笙以。
識(shí)別scriptPubKey的一個(gè)“特殊”形式淌实,并在檢測(cè)到時(shí)執(zhí)行額外的驗(yàn)證是丑陋的。 然而,一致認(rèn)為拆祈,替代方案要么越來越復(fù)雜恨闪,要么以危險(xiǎn)的方式擴(kuò)大表達(dá)語言的力量。
簽名操作計(jì)數(shù)規(guī)則旨在通過靜態(tài)掃描{序列化腳本}來簡(jiǎn)單快速地實(shí)現(xiàn)放坏。比特幣對(duì)每個(gè)區(qū)塊施加最大數(shù)的簽名操作咙咽,以防止對(duì)礦工的拒絕服務(wù)攻擊。如果沒有限制淤年,流氓礦工可能會(huì)廣播一個(gè)需要數(shù)十萬個(gè)ECDSA簽名操作進(jìn)行驗(yàn)證的區(qū)塊钧敞,并且可能能夠開始計(jì)算下一個(gè)塊,而網(wǎng)絡(luò)的其余部分工作來驗(yàn)證當(dāng)前的這個(gè)區(qū)塊互亮。
對(duì)舊的實(shí)現(xiàn)有 一次確認(rèn) 的攻擊犁享,但在實(shí)踐中是昂貴和困難的余素。攻擊是:
- 攻擊者創(chuàng)建一個(gè)pay-to-script-hash 交易豹休,這對(duì)舊軟件是有效的,但對(duì)新實(shí)現(xiàn)無效桨吊,并使用它發(fā)送一些比特幣威根。
- 攻擊者還創(chuàng)建一個(gè)pay-to-script 標(biāo)準(zhǔn)交易,并支付運(yùn)行舊軟件的受害者视乐。
- 攻擊者運(yùn)算一個(gè)包含這兩個(gè)交易的塊洛搀。
如果受害者接受1次確認(rèn)付款,則攻擊者獲勝佑淀,因?yàn)楫?dāng)網(wǎng)絡(luò)的其余部分覆蓋攻擊者的無效塊時(shí)留美,兩個(gè)交易將被無效。
攻擊是昂貴的伸刃,因?yàn)樗蠊粽邉?chuàng)建一個(gè)他們知道\將被網(wǎng)絡(luò)的其它節(jié)點(diǎn)確認(rèn)無效的區(qū)塊谎砾。這是困難的,因?yàn)閯?chuàng)建區(qū)塊是的代價(jià)是非常高的捧颅,用戶不應(yīng)該接受高價(jià)值交易的一次確認(rèn)交易景图。
向后兼容
這些交易對(duì)于舊的實(shí)現(xiàn)是非標(biāo)準(zhǔn)的,它們(通常)不會(huì)傳播它們或?qū)⑺鼈儼趨^(qū)塊中碉哑。
舊的實(shí)現(xiàn)將驗(yàn)證{serialize script}的哈希值在驗(yàn)證由完全支持此BIP的軟件創(chuàng)建的區(qū)塊時(shí)匹配挚币,但不會(huì)進(jìn)行其他驗(yàn)證。
為了避免區(qū)塊鏈被通過惡意pay-to-script交易分割需要仔細(xì)處理一種情況:
一個(gè)pay-to-script-hash交易對(duì)新客戶/礦工無效扣典,但對(duì)舊客戶/礦工有效妆毕。
為了正常升級(jí)并確保不會(huì)發(fā)生持久的區(qū)塊鏈分裂,超過50%的礦工必須支持對(duì)新交易類型的全面驗(yàn)證贮尖,并且必須同時(shí)從舊的驗(yàn)證規(guī)則切換到新的規(guī)則笛粘。
為了判斷是否有超過50%的散列能力支持此BIP,礦工們被要求升級(jí)他們的軟件,并將字符串“/ P2SH /”輸入到他們創(chuàng)建的區(qū)塊的coinbase交易中闰蛔。
2012年2月1日痕钢,檢查區(qū)塊鏈,以確定在過去7天支持pay-to-script-hash的區(qū)塊數(shù)序六。如果550個(gè)或更多的coinbase交易中包含“/ P2SH /”任连,那么在2012年2月15日00:00:00之后的所有具有時(shí)間戳的區(qū)塊將具有完全驗(yàn)證的pay-to-script-hash交易。一周內(nèi)創(chuàng)建約1,000個(gè)區(qū)塊;因此例诀,550應(yīng)該是支持新功能的網(wǎng)絡(luò)的大約占比55%随抠。
如果大多數(shù)散列算力不支持新的驗(yàn)證規(guī)則,那么推出將被推遲(或者如果明確表示絕大多數(shù)將永遠(yuǎn)不會(huì)實(shí)現(xiàn))繁涂。
序列化腳本大小限制在520字節(jié)拱她。
作為向后兼容性的要求的結(jié)果,序列化腳本本身受到與任何其他PUSHDATA操作相同的規(guī)則扔罪,包括大于520字節(jié)的數(shù)據(jù)可能被推送到堆棧的規(guī)則秉沼。因此,如果所引用的兌換腳本長(zhǎng)度大于520字節(jié)矿酵,則不可能花費(fèi)P2SH輸出唬复。例如,當(dāng)OP_CHECKMULTISIG操作碼本身可以接受多達(dá)20個(gè)pubkey時(shí)全肮,使用33字節(jié)壓縮的公鑰敞咧,只能花費(fèi)最多需要15個(gè)pubkey的P2SH輸出來兌換:3個(gè)字節(jié)+ 15個(gè)pubkeys * 34個(gè)字節(jié)/ pubkey = 513字節(jié)。
參考實(shí)現(xiàn)
https://gist.github.com/gavinandresen/3966071
引申閱讀
- https://bitcointalk.org/index.php?topic=46538
- The Address format for Pay to Script Hash BIP
- M-of-N Multisignature Transactions BIP 11
- Quality Assurance test checklist
參考
- Remove -bip16 and -paytoscripthashtime command-line arguments
- Transaction 6a26d2ecb67f27d1fa5524763b49029d7106e91e3cc05743073461a719776192