隔離見證(segwit)是一次比特幣共識(shí)規(guī)則和網(wǎng)絡(luò)協(xié)議的升級(jí),其提議和實(shí)施將基于BIP-9 軟分叉方案,目前(2017年中)尚待激活。
在密碼學(xué)中,術(shù)語“見證”(witness)被用于形容一個(gè)加密難題的解決方案。在比特幣中,“見證”滿足了一種被放置在一個(gè)未使用的交易輸出(unspent transaction output, UTXO)上的加密條件。
在比特幣語境中,一個(gè)數(shù)字簽名就是一種類型的“見證”(one type of witness)。但“見證”是一個(gè)更為廣泛的任意解決方案,能夠滿足加諸于一個(gè)UTXO的條件,使UTXO解鎖后可被花費(fèi)。術(shù)語“見證”一詞是一個(gè)更普遍用于“解鎖腳本”(或scriptSig)的術(shù)語。
在引入“隔離見證”之前,每一個(gè)交易輸入后面都跟著用來對(duì)其解鎖的見證數(shù)據(jù),見證數(shù)據(jù)作為輸入的一部分被內(nèi)嵌其中。術(shù)語“隔離見證”( segregated witness),或簡(jiǎn)稱為“segwit”,簡(jiǎn)單理解就是將某個(gè)特定輸出的簽名分離開,或?qū)⒛硞€(gè)特定輸入的腳本進(jìn)行解鎖。用最簡(jiǎn)單的形式來理解就是“分離解鎖腳本”(separate scriptSig),或“分離簽名”(separate signature)
因此,隔離見證就是比特幣的一種結(jié)構(gòu)性調(diào)整,旨在將見證數(shù)據(jù)部分從一筆交易的scriptSig(解鎖腳本)字段移出至一個(gè)伴隨交易的單獨(dú)的見證數(shù)據(jù)結(jié)構(gòu)。客戶端請(qǐng)求交易數(shù)據(jù)時(shí)可以選擇要或不要該部分伴隨的見證數(shù)據(jù)。
在這一章節(jié),我們將會(huì)看到隔離見證的一些好處,描述用于部署和實(shí)施該結(jié)構(gòu)性調(diào)整的機(jī)制,并展示隔離見證在交易和地址中的運(yùn)用。
隔離見證由以下BIPs定義:
BIP-141隔離見證的主要定義
BIP-143版本0見證程序的交易簽名驗(yàn)證
BIP-144對(duì)等服務(wù)——新的網(wǎng)絡(luò)消息和序列化格式
BIP-145隔離見證(對(duì)于礦工)的 getblocktemplate 升級(jí)
為什么需要隔離見證?
隔離見證是一個(gè)將在多方面產(chǎn)生影響的結(jié)構(gòu)性調(diào)整——可擴(kuò)展性、安全性、經(jīng)濟(jì)刺激以及比特幣整體性能:
交易延展性
將見證移出交易后,用作標(biāo)識(shí)符的交易哈希不在包含見證數(shù)據(jù)。因?yàn)橐娮C數(shù)據(jù)是交易中唯一可被第三方修改(參見 交易識(shí)別符 章節(jié))的部分,移除它的同時(shí)也移除了交易延展性攻擊的機(jī)會(huì)。通過隔離見證,交易變得對(duì)任何人(創(chuàng)建者本人除外)都不可變,這極大地提高了許多其它依賴于高級(jí)比特幣交易架構(gòu)的協(xié)議的可執(zhí)行性。比如支付通道、跨連交易和閃電網(wǎng)絡(luò)。
腳本版本管理
在引入隔離見證腳本后,類似于交易和區(qū)塊都有其版本號(hào),每一個(gè)鎖定腳本前也都有了一個(gè)腳本版本號(hào)。腳本版本號(hào)的條件允許腳本語言用一種向后兼容的方式(也就是軟分叉升級(jí))升級(jí),以引入新的腳本操作數(shù)、語法或語義。非破壞性升級(jí)腳本語言的能力將極大地加快比特幣的創(chuàng)新速度。
網(wǎng)絡(luò)和存儲(chǔ)擴(kuò)展
見證數(shù)據(jù)通常是交易總體積的重要貢獻(xiàn)者。更復(fù)雜的腳本通常非常大,比如那些用于多重簽名或支付通道的腳本。有時(shí)候這些腳本占據(jù)了一筆交易的大部分(超過75%)空間。通過將見證數(shù)據(jù)移出交易,隔離見證提升了比特幣的可擴(kuò)展性。節(jié)點(diǎn)能夠在驗(yàn)證簽名后去除見證數(shù)據(jù),或在作簡(jiǎn)單支付驗(yàn)證時(shí)整個(gè)忽略它。見證數(shù)據(jù)不需要被發(fā)送至所有節(jié)點(diǎn),也不需要被所有節(jié)點(diǎn)存儲(chǔ)在硬盤中。
簽名驗(yàn)證優(yōu)化
隔離見證升級(jí)簽名函數(shù)(CHECKSIG, CHECKMULTISIG, 等)減少了算法的計(jì)算復(fù)雜性。引入隔離見證前,用于生成簽名的算法需要大量的哈希操作,這些操作與交易的大小成正比。在O(n2)中關(guān)于簽名操作數(shù)量方面,數(shù)據(jù)哈希計(jì)算增加,在所有節(jié)點(diǎn)驗(yàn)證簽名上引入了大量計(jì)算負(fù)擔(dān)。引入隔離見證后,算法更改減少了O(n2)的復(fù)雜性。
離線簽名改進(jìn)
隔離見證簽名包含了在被簽名的哈希散列中,每個(gè)輸入所引用的值(數(shù)量)。在此之前,一個(gè)離線簽名裝置,比如硬件錢包,必須在簽署交易前驗(yàn)證每一個(gè)輸入的數(shù)量。這通常是通過大量的數(shù)據(jù)流來完成的,這些數(shù)據(jù)是關(guān)于以前的交易被引用作為輸入的。由于該數(shù)量現(xiàn)在是已簽名的承諾哈希散列的一部分,因此離線裝置不需要以前的交易。如果數(shù)量不匹配(被一個(gè)折中的在線系統(tǒng)誤報(bào)),則簽名無效。
隔離見證如何工作
乍一看,隔離見證似乎是對(duì)交易如何構(gòu)建的更改,因此是一個(gè)交易層面的特性,但事實(shí)并非如此。實(shí)際上,隔離見證也更改了單個(gè)UTXO如何被使用的方式,因此它是一個(gè)輸出層面的特性。
一個(gè)交易可以引用隔離見證輸出或傳統(tǒng)(內(nèi)聯(lián)見證)輸出,或者兩者皆可。因此,把一個(gè)交易稱作“隔離見證交易”是沒有意義的。但是我們可以把某個(gè)特定的交易輸出叫做“隔離見證輸出”。
當(dāng)一個(gè)交易引用一個(gè)UTXO,它必須提供一個(gè)見證。如果是傳統(tǒng)的UTXO,一個(gè)交易在引用它時(shí),UTXO的鎖定腳本要求見證數(shù)據(jù)在該交易輸出部分中以“內(nèi)聯(lián)”(inline)的方式被提供。但隔離見證UTXO指定的鎖定腳本卻能滿足處于輸入之外(被隔離)的見證數(shù)據(jù)。
軟分叉(向后兼容性)
隔離見證對(duì)于輸出和交易的構(gòu)建的方式是一個(gè)十分重大的改變。這樣的改變將通常需要每一個(gè)比特幣節(jié)點(diǎn)和錢包同時(shí)發(fā)生,以改變共識(shí)規(guī)則——即所謂的“硬分叉”。但是,隔離見證通過一個(gè)更少破壞性的改變引入,這種變化能向后兼容,被稱作“軟分叉”。這種類型的升級(jí)允許未升級(jí)的軟件去忽略那些改變?nèi)缓罄^續(xù)去操作避免任何分裂。
隔離見證輸出被設(shè)計(jì)成老的“非隔離見證”系統(tǒng)仍然能夠驗(yàn)證它們,對(duì)于老的錢包或節(jié)點(diǎn)來說,一個(gè)隔離見證輸出看起來就像一個(gè)“任何人都能花費(fèi)”(anyone can spend)的輸出。這樣的輸出能被一個(gè)空的簽名花費(fèi),因此一個(gè)交易里面沒有簽名(簽名被隔離)的事實(shí)也并不會(huì)導(dǎo)致該交易不被驗(yàn)證。但是,更新的錢包和挖礦節(jié)點(diǎn)能夠看到隔離見證輸出,并期望在交易的見證數(shù)據(jù)中為該輸出找到一個(gè)有效的見證。
隔離見證輸出和交易示例
讓我們來看一些交易示例,看看他們是如何隨著隔離見證而改變的。我們將首先看看通過隔離見證程序,如何被改變一個(gè)“支付給公鑰哈希”(Pay-to-Public-Key-Hash ,P2PKH)的支付。然后,我們?cè)倏赐瑯拥母綦x見證如何作用于“支付給腳本公鑰”(Pay-to-Script-Hash ,P2SH)腳本。最后,我們會(huì)看看以上兩種隔離見證程序如何可以被內(nèi)嵌入一個(gè) P2SH 腳本。
1. Pay-to-Witness-Public-Key-Hash (P2WPKH)
在【一杯咖啡】的例子中,Alice為一杯咖啡創(chuàng)建了一筆交易去付款給Bob,該筆交易構(gòu)建了一個(gè)價(jià)值0.015BTC的 P2PKH 輸出(Bob可用來花費(fèi)),該輸出腳本看起來像這樣:
P2PKH 輸出腳本示例:
DUP HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 EQUALVERIFY CHECKSIG
如果通過隔離見證,Alice將會(huì)創(chuàng)建一個(gè)“支付給見證公鑰哈希”(P2WPKH)腳本,看起來是這樣的:
P2WPKH 輸出腳本示例:
0 ab68025513c3dbd2f7b92a94e0581f5d50f654e7
正如你所見,一個(gè)隔離見證輸出的鎖定腳本相對(duì)一個(gè)傳統(tǒng)輸出明顯大為簡(jiǎn)化。它包含兩個(gè)值,這些值被推送到腳本評(píng)估堆棧中。對(duì)于一個(gè)傳統(tǒng)(非隔離見證)比特幣客戶端來說,這兩個(gè)推送值看起來像一個(gè)任何人都能花費(fèi)的輸出而不需要簽名(或者更確切的說,能被空的簽名使用)。而對(duì)一個(gè)更新的、隔離見證客戶端來說,第一個(gè)數(shù)字(0)被解釋為一個(gè)版本號(hào)(見證版本),第二部分(20字節(jié))相當(dāng)于一個(gè)鎖定腳本,被稱為“見證程序”( witness program)。這20字節(jié)的見證程序即是公鑰哈希值,就像在 P2PKH 腳本中一樣。
現(xiàn)在,讓我們來看看Bob用來去花費(fèi)這個(gè)輸出相應(yīng)的交易。對(duì)于初始腳本(非隔離見證),Bob的交易必須包含簽名在交易輸入中:
以下被解碼的交易顯示了一個(gè) P2PKH 輸出被一個(gè)簽名使用:
[。..]“Vin” : [“txid”: “0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2”,“vout”: 0, “scriptSig”: “《Bob’s scriptSig》”,][。..]
但是,使用一個(gè)隔離見證輸出時(shí),交易輸入內(nèi)不存在簽名。替代的,Bob的交易只有一個(gè)空的 scriptSig ,并在交易本身之外包含了一個(gè)隔離見證:
以下被解碼的交易顯示了一個(gè)被隔離見證數(shù)據(jù)使用的 P2WPKH 輸出:
[。..]“Vin” : [“txid”: “0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2”,“vout”: 0, “scriptSig”: “”,][。..]“witness”: “《Bob’s witness data》”[。..]
2. 錢包的P2WPKH (Pay-to-Witness-Script-Hash)構(gòu)造
尤其值得注意的是,P2WPKH 應(yīng)該只有收款人(接收方)創(chuàng)建,而不是由發(fā)送者從已知的公鑰、P2PKH 腳本或地址進(jìn)行轉(zhuǎn)換。發(fā)送方無從知道接收者的錢包是否具有能力構(gòu)建隔離見證交易,并使用 P2WPKH 輸出。
另外,P2WPKH 輸出必須從被壓縮的公鑰的哈希值中創(chuàng)建。未壓縮公鑰在隔離見證中是非標(biāo)準(zhǔn)的,可能會(huì)被將來的軟分叉明確禁用。如果在 P2WPKH 中使用的哈希值來自未壓縮的公鑰,那么它可能不可用,您將可能丟失資金。P2WPKH 輸出應(yīng)該由收款人的錢包,通過從錢包私鑰中獲取壓縮公鑰進(jìn)行創(chuàng)建。
警告 P2WPKH 應(yīng)該由收款人(接收者)通過將被壓縮的公鑰轉(zhuǎn)換成P2WPKH哈希值進(jìn)行創(chuàng)建。你絕不應(yīng)該將P2PKH腳本、比特幣地址或未壓縮公鑰轉(zhuǎn)換成P2WPKH見證腳本。
3. Pay-to-Witness-Script-Hash (P2WSH)
第二種類型的檢證程序?qū)?yīng)一個(gè)“支付給腳本哈希”( Pay-to-Script-Hash , P2SH)腳本。我們?cè)冢踦2sh]這張中見過。在哪個(gè)例子中,穆罕默德的公司使用了P2SH 來表達(dá)一個(gè)多重簽名腳本。對(duì)穆罕默德的公司的支付被編碼成一個(gè)這樣的鎖定腳本:
P2SH 輸出腳本示例:
HASH160 54c557e07dde5bb6cb791c7a540e0a4796f5e97e EQUAL
這個(gè)P2SH腳本引用了一個(gè)贖回腳本( redeem script )的哈希值,改腳本定義了一個(gè)“2 of 3”的多重簽名需求來使用資金。為了使用該輸出,穆罕默德的公司將提供這個(gè)贖回腳本(其哈希值與P2SH 輸出中的腳本哈希值匹配),以及滿足該贖回腳本所需的簽名,所有這些都在交易輸出中:
顯示一個(gè)P2SH輸出被使用的解碼交易:
[。..]“Vin” : [“txid”: “abcdef12345.。.”,“vout”: 0, “scriptSig”: “《SigA》 《SigB》 《2 PubA PubB PubC PubD PubE 5 CHECKMULTISIG》”,]
現(xiàn)在,讓我們看看整個(gè)示例如何升級(jí)成為隔離見證。如果穆罕默德的客戶使用的是一個(gè)隔離見證兼容的錢包,他們就會(huì)付款,創(chuàng)建一個(gè)“支付給腳本哈希”(P2WSH)輸出,看起來就像這樣:
P2WSH 輸出腳本示例:
0 9592d601848d04b172905e0ddb0adde59f1590f1e553ffc81ddc4b0ed927dd73
再一次,就像P2WPKH的例子一樣,你可以看到,隔離見證等同腳本要簡(jiǎn)單得多,省略了各種你在P2SH腳本中見到的腳本操作符。相反,隔離見證程序僅包含兩個(gè)推送到堆棧的值:一個(gè)見證版本(0)和一個(gè)32字節(jié)的贖回腳本的哈希值。
提示 當(dāng)P2SH使用20字節(jié)的RIPEMD160(SHA256(script)) 哈希值時(shí),P2WSH見證程序使用了一個(gè)32字節(jié)的SHA256(腳本)哈希值。在選擇哈希算法時(shí),這一差異是有意為之,被用于通過哈希值長(zhǎng)度來區(qū)分兩種類型的見證程序(P2WPKH and P2WSH),并為P2WSH(128位 而不是 80 位P2SH)提供更強(qiáng)的安全性。
穆罕默德的公司可以通過提供正確的贖回腳本和足夠的簽名滿足并花出P2WSH輸出。作為見證數(shù)據(jù)的一部分,贖回腳本和簽名被隔離在此支出交易之外。在交易輸入內(nèi)部,穆罕默德的錢包會(huì)防止一個(gè)空的scriptSig:
顯示了一個(gè)P2WSH輸出被用隔離見證數(shù)據(jù)花出的解碼交易:
[。..]“Vin” : [“txid”: “abcdef12345.。.”,“vout”: 0, “scriptSig”: “”,][。..]“witness”: “《SigA》 《SigB》 《2 PubA PubB PubC PubD PubE 5 CHECKMULTISIG》”[。..]
4. 區(qū)分P2WPKH和P2WSH
在前面的兩節(jié)中,我們展示了兩種類型的檢證程序:支付給見證公鑰哈希 (P2WPKH)和 支付給見證腳本哈希(P2WSH) 。這兩種檢證程序都有一個(gè)字節(jié)版本號(hào)和一個(gè)跟隨其后的更長(zhǎng)的哈希值組成。它們看起來非常相似,但是被解釋得非常不同:一個(gè)被解釋為一個(gè)公鑰哈希值,它被一個(gè)簽名所滿足,另一個(gè)被解釋為一個(gè)腳本哈希值,它被一個(gè)贖回腳本所滿足。他們之間的關(guān)鍵區(qū)別是哈希值的長(zhǎng)度:
· P2WPKH中的公鑰哈希值是20字節(jié)。
· P2WSH中的腳本哈希值是32字節(jié)。
這個(gè)區(qū)別使得錢包可以對(duì)這兩種類型的見證程序進(jìn)行區(qū)分。通過查看哈希值的長(zhǎng)度,錢包可以確定它是什么類型的見證程序,P2WPKH 或者 P2WSH。
隔離見證升級(jí)
正如我們前面看到的例子,隔離見證的升級(jí)需要經(jīng)過兩步過程。首先,錢包必須創(chuàng)建特殊的隔離型輸出。然后,這些輸出可以被知道如何構(gòu)建隔離見證交易的錢包花費(fèi)。在這些例子中,Alice的錢包是segwit意識(shí)到的,并且能夠使用Segregated Witness腳本創(chuàng)建特殊輸出。Bob的錢包也是segwit意識(shí)到,并能夠花這些輸出。從這個(gè)例子中可能不明顯的是,在實(shí)踐中,Alice的錢包需要知道Bob使用了一個(gè)支持segwit的錢包,并可以使用這些輸出。否則,如果Bob的錢包沒有升級(jí),并且Alice試圖對(duì)Bob進(jìn)行分段付款,那么Bob的錢包將無法檢測(cè)到這些付款。
提示 對(duì)于P2WPKH和P2WSH付款類型,發(fā)件人和收件人錢包都需要升級(jí)才能使用segwit。此外,發(fā)件人的錢包需要知道收件人的錢包是否具有隔離識(shí)別功能。
隔離見證不會(huì)在整個(gè)網(wǎng)絡(luò)中同時(shí)實(shí)施。相反,隔離見證被實(shí)施為向后兼容的升級(jí),其中新老客戶可以共存。錢包開發(fā)人員將獨(dú)立升級(jí)錢包軟件以添加隔離區(qū)功能。當(dāng)發(fā)件人和收件人都可以感知到網(wǎng)志時(shí),使用P2WPKH和P2WSH付款類型。傳統(tǒng)的P2PKH和P2SH將繼續(xù)為非升級(jí)的錢包工作。這留下了兩個(gè)重要的情況,下一節(jié)將討論這個(gè)情況:
· 發(fā)件人的錢包的能力,不是segwit意識(shí)到付款的收件人的錢包,可以處理segwit交易。
· 具有隔離識(shí)別功能的發(fā)件人錢包能夠識(shí)別和區(qū)分具有隔離識(shí)別功能的收件人和不是他們地址的收件人。
1. 在P2SH中嵌入隔離見證
舉個(gè)例子,假設(shè)Alice的錢包沒有升級(jí)到segwit,但是Bob的錢包已經(jīng)升級(jí),可以處理segwit交易。Alice和Bob可以使用“舊”非segwit交易。但是Bob很可能會(huì)使用segwit來降低交易費(fèi)用,利用適用于見證數(shù)據(jù)的折扣。
在這種情況下,Bob的錢包可以構(gòu)建一個(gè)包含一個(gè)segwit腳本的P2SH地址。Alice的錢包認(rèn)為這是一個(gè)“正常的”P2SH地址,并可以在沒有任何segwit的知識(shí)的情況下付款。然后,Bob的錢包可以通過隔離交易來支付這筆款項(xiàng),充分利用隔離交易并降低交易費(fèi)用。
兩種形式的見證腳本P2PKH和P2WSH都可以嵌入到P2SH地址中。第一個(gè)是P2SH(P2PKH),第二個(gè)是P2SH(P2WSH)。
2. 在 P2SH 中的 P2WPKH
見證腳本的第一種形式是P2SH(P2WPKH)。這是一個(gè)Pay-to-Witness-Public-Key-Hash證明程序,嵌入在Pay-to-Script-Hash腳本中,所以它可以被不知道segwit的錢包使用。
Bob的錢包用Bob的公鑰構(gòu)造了一個(gè)P2WPKH證人程序。這個(gè)見證程序然后被散列,結(jié)果散列被編碼為P2SH腳本。P2SH腳本被轉(zhuǎn)換成比特幣地址,一個(gè)以“3”開始的地址,正如我們?cè)冢跴2SH]部分看到的那樣。
Bob的錢包從我們之前看到的P2WPKH 見證程序開始:
Bob的見證程序:
0 ab68025513c3dbd2f7b92a94e0581f5d50f654e7
P2WPKH見證程序由見證版本和Bob的20字節(jié)公鑰散列組成。
Bob的錢包然后散列之前的見證程序,先用SHA256,然后用RIPEMD160,產(chǎn)生另一個(gè)20字節(jié)的散列:
P2WPKH見證程序的HASH160
3e0547268b3b19288b3adef9719ec8659f4b2b0b
然后見證程序的hash嵌入到P2SH腳本中:
HASH160 3e0547268b3b19288b3adef9719ec8659f4b2b0b EQUAL
最后,P2SH腳本轉(zhuǎn)換為P2SH比特幣地址:
37Lx99uaGn5avKBxiW26HjedQE3LrDCZru
現(xiàn)在,Bob可以顯示這個(gè)地址給顧客付錢買咖啡。Alice的錢包可以支付給不支持隔離見證的地址,就像任何其他比特幣地址一樣。盡管Alice的錢包不支持segwit,但它創(chuàng)建的付款可以由Bob使用segwit交易進(jìn)行支付。
3. P2SH內(nèi)的P2WSH
同樣,一個(gè)用于multisig腳本或其他復(fù)雜腳本的P2WSH見證程序可以嵌入到P2SH腳本和地址中,使得任何錢包都可以進(jìn)行與segwit兼容的支付。
正如我們?cè)赑ay-to-Witness-Script-Hash(P2WSH)中看到的,穆罕默德的公司正在使用隔離見證對(duì)多重簽名腳本的付款。為了讓任何客戶支付他的公司,無論他們的錢包是否升級(jí)為隔離開關(guān),穆罕默德的錢包都可以在P2SH腳本中嵌入P2WSH見證程序。
首先,穆罕默德的錢包創(chuàng)建與多重簽名腳本對(duì)應(yīng)的P2WSH見證程序,并用SHA256進(jìn)行哈希處理:
穆罕默德的錢包創(chuàng)建了P2WSH見證程序
0 9592d601848d04b172905e0ddb0adde59f1590f1e553ffc81ddc4b0ed927dd73
然后,見證程序本身用SHA256和RIPEMD160散列,產(chǎn)生一個(gè)新的20字節(jié)散列,如傳統(tǒng)的P2SH所使用的散列:
P2WSH見證程序的HASH160
86762607e8fe87c0c37740cddee880988b9455b2
接下來,穆罕默德的錢包將哈希碼放入P2SH腳本中:
HASH160 86762607e8fe87c0c37740cddee880988b9455b2 EQUAL
最后,錢包從這個(gè)腳本構(gòu)造一個(gè)比特幣地址:
3Dwz1MXhM6EfFoJChHCxh1jWHb8GQqRenG
現(xiàn)在,穆罕默德的客戶可以付款到這個(gè)地址,而不需要支持segwit。然后,穆罕默德的公司可以構(gòu)建隔離交易來支付這些款項(xiàng),利用包括較低的交易費(fèi)用在內(nèi)的隔離功能。
4. 隔離見證地址
在將比特幣部署在比特幣網(wǎng)絡(luò)之后,錢包升級(jí)之前需要一些時(shí)間。因此,很可能像我們?cè)谇耙还?jié)中看到的那樣,segwit將主要用于嵌入到P2SH中,至少幾個(gè)月。
但是,最終幾乎所有的錢包都能夠支持隔離支付。那時(shí)就不再需要在P2SH中嵌入segwit。因此,可能會(huì)創(chuàng)建一種新的比特幣地址形式,表明接收者是具有隔離意識(shí)的,并直接對(duì)證人程序進(jìn)行編碼。有關(guān)隔離見證人地址計(jì)劃的建議有很多,但沒有一個(gè)被積極推行。
5.交易標(biāo)識(shí)符
隔離見證的最大好處之一就是消除了第三方交易延展性。
在segwit之前,交易可以通過第三方微妙地修改其簽名,在不改變?nèi)魏位緦傩裕ㄝ斎耄敵觯痤~)的情況下更改其交易ID(散列)。這為拒絕服務(wù)攻擊創(chuàng)造了機(jī)會(huì),以及攻擊了編寫不好的錢包軟件,這些軟件假定未經(jīng)證實(shí)的交易哈希是不可變的。
通過引入隔離見證,交易有兩個(gè)標(biāo)識(shí)符txid和wtxid。傳統(tǒng)的交易ID txid是序列化交易的雙SHA256散列,沒有見證數(shù)據(jù)。交易wtxid是具有見證數(shù)據(jù)的交易的新序列化格式的雙SHA256散列。
傳統(tǒng)txid的計(jì)算方式與nonsegwit交易完全相同。但是,由于segwit交易在每個(gè)輸入中都有空的scriptSigs,因此沒有可由第三方修改的部分交易。因此,在隔離交易中,即使交易未經(jīng)確認(rèn),txid也是第三方不可改變的。
wtxid就像一個(gè)“擴(kuò)展的”ID,因?yàn)閔ash也包含了見證數(shù)據(jù)。如果交易沒有見證數(shù)據(jù)傳輸,則wtxid和txid是相同的。注意,由于wtxid包含見證數(shù)據(jù)(簽名),并且由于見證數(shù)據(jù)可能具有延展性,所以在交易確認(rèn)之前,wtxid應(yīng)該被認(rèn)為是可延展的。只有當(dāng)交易的輸入是segwit輸入時(shí),第三方才可以認(rèn)定segwit交易的txid不可變。
提示 隔離見證交易有兩個(gè)ID:txid和wtxid。txid是沒有見證數(shù)據(jù)的交易的散列,wtxid是包含見證數(shù)據(jù)的散列。所有輸入為隔離開關(guān)輸入的交易不受第三方交易延展性影響。
隔離見證新的簽名算法
隔離見證修改了四個(gè)簽名驗(yàn)證函數(shù)(CHECKSIG,CHECKSIGVERIFY,CHECKMULTISIG和CHECKMULTISIGVERIFY)的語義,改變了交易承諾散列的計(jì)算方式。
比特幣交易中的簽名應(yīng)用于交易哈希,交易數(shù)據(jù)計(jì)算,鎖定數(shù)據(jù)的特定部分,表明簽名者對(duì)這些值的承諾。例如,在簡(jiǎn)單的SIGHASH_ALL類型簽名中,承諾哈希包括所有的輸入和輸出。
不幸的是,計(jì)算承諾哈希的方式引入了驗(yàn)證簽名的節(jié)點(diǎn)可能被迫執(zhí)行大量哈希計(jì)算的可能性。具體而言,散列運(yùn)算相對(duì)于交易中的簽名操作的數(shù)量增加O(n^2)。因此,攻擊者可以通過大量的簽名操作創(chuàng)建一個(gè)交易,導(dǎo)致整個(gè)比特幣網(wǎng)絡(luò)不得不執(zhí)行數(shù)百或數(shù)千個(gè)哈希操作來驗(yàn)證交易。
Segwit代表了通過改變承諾散列計(jì)算方式來解決這個(gè)問題的機(jī)會(huì)。對(duì)于segwit版本0見證程序,使用BIP-143中規(guī)定的改進(jìn)的承諾哈希算法進(jìn)行簽名驗(yàn)證。
新算法實(shí)現(xiàn)了兩個(gè)重要目標(biāo)。首先,散列操作的數(shù)量比簽名操作的數(shù)量增加了一個(gè)更加漸進(jìn)的O(n),減少了用過于復(fù)雜的交易創(chuàng)建拒絕服務(wù)攻擊的機(jī)會(huì)。其次,承諾散列現(xiàn)在還包括作為承諾的一部分的每個(gè)輸入的值(金額)。這意味著簽名者可以提交特定的輸入值,而不需要“獲取”并檢查輸入引用的前一個(gè)交易。在離線設(shè)備(如硬件錢包)的情況下,這極大地簡(jiǎn)化了主機(jī)與硬件錢包之間的通信,消除了對(duì)以前的交易流進(jìn)行驗(yàn)證的需要。硬件錢包可以接受不可信主機(jī)“輸入”的輸入值。由于簽名是無效的,如果輸入值不正確,硬件錢包在簽名輸入之前不需要驗(yàn)證該值。
隔離見證的經(jīng)濟(jì)激勵(lì)
比特幣挖掘節(jié)點(diǎn)和完整節(jié)點(diǎn)會(huì)產(chǎn)生用于支持比特幣網(wǎng)絡(luò)和區(qū)塊鏈的資源的成本。隨著比特幣交易量的增加,資源成本(CPU,網(wǎng)絡(luò)帶寬,磁盤空間,內(nèi)存)也在增加。礦工通過與每次交易的大小(字節(jié))成比例的費(fèi)用來補(bǔ)償這些成本。Nonmining完整的節(jié)點(diǎn)沒有得到補(bǔ)償,所以他們承擔(dān)這些成本,因?yàn)樗麄冃枰\(yùn)行一個(gè)權(quán)威的充分驗(yàn)證全索引節(jié)點(diǎn),可能是因?yàn)樗麄兪褂霉?jié)點(diǎn)操作比特幣業(yè)務(wù)。
如果沒有交易費(fèi)用,比特幣數(shù)據(jù)的增長(zhǎng)可能會(huì)大幅增加。費(fèi)用旨在通過基于市場(chǎng)的價(jià)格發(fā)現(xiàn)機(jī)制,使比特幣用戶的需求與交易對(duì)網(wǎng)絡(luò)帶來的負(fù)擔(dān)相一致。
基于交易規(guī)模的費(fèi)用計(jì)算將交易中的所有數(shù)據(jù)視為相同的成本。但是從完整節(jié)點(diǎn)和礦工的角度來看,交易的某些部分的成本要高得多。加入比特幣網(wǎng)絡(luò)的每筆交易都會(huì)影響節(jié)點(diǎn)上四種資源的消耗:
· 磁盤空間
每筆交易都存儲(chǔ)在區(qū)塊鏈中,并添加到區(qū)塊鏈的總大小中。區(qū)塊鏈存儲(chǔ)在磁盤上,但可以通過“修剪”較舊的交易來優(yōu)化存儲(chǔ)。
· CPU
每個(gè)交易都必須經(jīng)過驗(yàn)證,這需要CPU時(shí)間。
· 帶寬
每筆交易至少通過網(wǎng)絡(luò)傳輸一次(通過泛洪傳播)。如果在塊傳播協(xié)議中沒有任何優(yōu)化,交易將作為塊的一部分再次傳輸,從而將對(duì)網(wǎng)絡(luò)容量的影響加倍。
· 內(nèi)存
驗(yàn)證交易的節(jié)點(diǎn)將UTXO索引或整個(gè)UTXO設(shè)置在內(nèi)存中,以加速驗(yàn)證。由于內(nèi)存至少比磁盤貴一個(gè)數(shù)量級(jí),所以UTXO集的增長(zhǎng)對(duì)運(yùn)行節(jié)點(diǎn)的成本貢獻(xiàn)不成比例。
從列表中可以看出,并不是交易的每個(gè)部分都對(duì)運(yùn)行節(jié)點(diǎn)的成本或者比特幣支持更多交易的能力產(chǎn)生同等的影響。交易中最昂貴的部分是新創(chuàng)建的輸出,因?yàn)樗鼈儽惶砑拥絻?nèi)存中的UTXO集。相比之下,簽名(又名見證數(shù)據(jù))為網(wǎng)絡(luò)增加了最小的負(fù)擔(dān),并且節(jié)省了運(yùn)行節(jié)點(diǎn)的成本,因?yàn)橐娮C數(shù)據(jù)只被驗(yàn)證一次,之后又不再使用。此外,在收到新的交易并驗(yàn)證見證數(shù)據(jù)之后,節(jié)點(diǎn)可以立即丟棄該見證數(shù)據(jù)。如果按照交易規(guī)模計(jì)算費(fèi)用,而不區(qū)分這兩種數(shù)據(jù),那么市場(chǎng)上的收費(fèi)激勵(lì)就不符合交易實(shí)際成本。事實(shí)上,目前的費(fèi)用結(jié)構(gòu)實(shí)際上鼓勵(lì)了相反的行為,因?yàn)橐娮C數(shù)據(jù)是交易的最大部分。
費(fèi)用所產(chǎn)生的激勵(lì)因?yàn)樗鼈冇绊戝X包的行為。所有的錢包都必須實(shí)行一些策略來組合交易,這些策略要考慮到隱私(減少地址重復(fù)使用),碎片化(大量松動(dòng))以及收費(fèi)等因素。如果費(fèi)用壓倒性地促使錢包在交易中使用盡可能少的投入,這可能導(dǎo)致UTXO選擇和改變地址策略,從而不經(jīng)意地膨脹UTXO集合。
交易在其輸入中消耗UTXO,并用它們的輸出創(chuàng)建新的UTXO。因此,交易輸入比輸出多將導(dǎo)致UTXO集合的減少,而輸出多于輸入的交易將導(dǎo)致UTXO集合的增加。讓我們考慮輸入和輸出之間的差異,并稱之為“Net-new-UTXO”。這是一個(gè)重要的指標(biāo),因?yàn)樗嬖V我們一個(gè)交易對(duì)最昂貴的全網(wǎng)資源,內(nèi)存 UTXO設(shè)置。正值Net-new-UTXO交易增加了這一負(fù)擔(dān)。負(fù)值Net-new-UTXO交易減輕了負(fù)擔(dān)。因此,我們希望鼓勵(lì)交易是負(fù)Net-new-UTXO或零Net-new-UTXO的中值。
讓我們來看一個(gè)例子,說明有無隔離見證交易費(fèi)用計(jì)算產(chǎn)生了哪些激勵(lì)措施。我們將看兩個(gè)不同的交易。交易A是3輸入,2輸出的交易,其具有-1的凈新UTXO度量,這意味著它消耗比它創(chuàng)建的多一個(gè)UTXO,將UTXO減1。交易B是2輸入3輸出的交易,其具有1的凈新UTXO度量,這意味著它向UTXO集增加一個(gè)UTXO,對(duì)整個(gè)比特幣網(wǎng)絡(luò)施加額外的成本。這兩個(gè)交易都使用多重簽名(2/3)腳本來演示復(fù)雜腳本如何增加隔離證人對(duì)費(fèi)用的影響。我們假設(shè)交易費(fèi)為每字節(jié)30 satoshi,證據(jù)數(shù)據(jù)為75%的折扣費(fèi)用:
· 未使用隔離見證
交易費(fèi)用:25,710 satoshi 交易B費(fèi)用:18,990 satoshi
· 使用隔離見證
交易手續(xù)費(fèi):8,130 satoshi 交易B手續(xù)費(fèi):12,045 satoshi
當(dāng)隔離證人實(shí)施時(shí),這兩個(gè)交易都較為便宜。但是比較這兩筆交易的成本,我們發(fā)現(xiàn)在隔離見證之前,交易凈收益為負(fù)的凈新UTXO的收費(fèi)更高。在隔離見證之后,交易費(fèi)用與最小化新的UTXO創(chuàng)造的激勵(lì)相一致,而不會(huì)無意中懲罰許多輸入的交易。
因此,隔離見證對(duì)比特幣用戶支付的費(fèi)用有兩個(gè)主要的影響。首先,segwit通過折扣見證數(shù)據(jù)和增加比特幣區(qū)塊鏈的能力來降低交易的總體成本。其次,segwit對(duì)證人數(shù)據(jù)的折扣糾正了可能無意中在UTXO集合中產(chǎn)生更多膨脹的激勵(lì)的錯(cuò)位。
評(píng)論
查看更多