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