Tapscript與Schnorr簽名在比特幣中如何實現(xiàn)硬分叉
軟叉與硬叉
需要注意的是,Taproot和Schnorr都可以作為軟分叉實現(xiàn)。雖然在技術(shù)上可以在比特幣中實現(xiàn)硬分叉,但它通常被認(rèn)為是最糟糕的升級路徑,原因如下:
· 協(xié)調(diào)
· 向后兼容性
· 社區(qū)分裂的風(fēng)險
由于比特幣的分散性,在這一點上,主要的經(jīng)濟、技術(shù)和社區(qū)參與者之間的協(xié)調(diào)幾乎是不可能的。設(shè)置每個人都需要升級的最后期限是一個嚴(yán)重的挑戰(zhàn)。軟件開發(fā)團隊有設(shè)計和迭代階段,世界范圍內(nèi)的經(jīng)濟參與者并不總是使用相同的渠道。向后兼容性也是設(shè)計軟件時不可忽視的一個重要設(shè)計決策。幾乎所有保持向后兼容性的軟件升級在長期運行中都會勝出,而那些破壞并使舊版本無法使用的設(shè)計則會失敗。軟分叉通常向后兼容,而硬分叉則不兼容。最后,當(dāng)建議使用硬分叉時,存在社區(qū)分裂的主要風(fēng)險。
簽名方案和多重簽名
1999年和2000年接受了數(shù)字簽名算法(DSA)、橢圓曲線數(shù)字簽名算法(ECDSA)作為ANSI、IEEE和NIST標(biāo)準(zhǔn), 并提供了許多優(yōu)點,包括更快的計算時間以及對內(nèi)存和帶寬的更低要求。值得注意的是, 比特幣公鑰和私鑰可與 ECDSA 一起使用, 使用 secp256k1 曲線可用于生成 Schnorr 簽名。
在許多情況下,只需要一個簽名就可以對消息進(jìn)行簽名。然而,很明顯,在某些情況下,擁有多個密鑰簽名消息尤其有用,而且更安全。大多數(shù)多重簽名方案通常需要來自多個人員、機構(gòu)或編程腳本的m-of-n簽名。這限制了資金的轉(zhuǎn)移,直到滿足m方之間合作的要求。
比特幣中的基本交易(將比特幣發(fā)送到公鑰)稱為payto - public - key - hash (P2PKH)。與P2PKH不同,Pay to Script Hash (P2SH)是比特幣中使用的一種高級交易類型,它允許發(fā)送方將資金提交到任意有效腳本的哈希值中。P2SH主要用于多重簽名和非本地SegWit交易(P2WPKH-in-P2SH)。最初在BIP 16中概述,P2SH的目的是“將提供贖回交易條件的責(zé)任從資金的發(fā)送方轉(zhuǎn)移到贖回方”。不會強制發(fā)送者在scriptPubKey中放入長腳本的消費條件,相反,發(fā)送者可以將其消費條件的哈希值放入到贖回腳本中。P2SH資金交易包含scriptPubKey中贖回腳本的哈希值。
發(fā)送方可以資助贖回腳本,而其他人不知道腳本的具體支出條件——只有接收方知道進(jìn)一步支出的條件。對于多團體交易,發(fā)送者可以在不知道多簽名地址所需公鑰的情況下發(fā)送資金。公鑰只有在接收方使用資金時才會顯示。當(dāng)受助人選擇使用資金時,必須披露整個腳本以及腳本的解決方案;任何人都可以驗證提供的腳本確實是原始腳本。
然而,P2SH也有缺點。必須揭示所有可能滿足的條件。這自然會產(chǎn)生潛在的隱私問題,因為網(wǎng)絡(luò)參與者可以了解所有可能滿足條件的方法,比如使用哪種錢包,等等。此外,如果有許多可能的條件,計算和驗證就會變得非常麻煩,在這種情況下,計算和驗證就會變得非常繁重。
其他多重簽名方案包括Shamir的秘密共享(SSS)、Threshold ECDSA、Threshold Ed25519、Bohen-Lynn-Shacham (BLS)簽名和Schnorr簽名;這些方案之間有許多權(quán)衡,包括但不限于預(yù)圖像、可信設(shè)置、交互輪、隱私和計算效率。
Schnorr簽名
Schnorr簽名于1991年獲得克勞斯·施諾爾(Claus Schnorr)的專利,并于2008年到期。Schnorr簽名的主要好處是它使區(qū)塊鏈上的多簽名和單簽名交易無法區(qū)分。使用Schnorr簽名,多個簽名者可以生成聚合的公鑰,然后使用一個簽名聯(lián)合簽名,而不是在區(qū)塊鏈上分別發(fā)布每個公鑰和每個簽名。這是一個重要的可擴展性和隱私增強的功能。Schnorr簽名了取代ECDSA,使比特幣的數(shù)字簽名基礎(chǔ)設(shè)施在多個方面變得更好,有三個關(guān)鍵的新功能:
· 非延展性
· 線性核查
· 通過密鑰聚合實現(xiàn)多簽名隱私
對于在比特幣區(qū)塊鏈上建立第二層網(wǎng)絡(luò)來說,非延展性是一個顯著優(yōu)勢。ECDSA的主要問題之一是: 接受一連串未經(jīng)確認(rèn)的交易是不安全的,因為后面的交易依賴于以前交易的哈希值,因此建議等到交易確認(rèn)6次之后再進(jìn)行。使用Schnorr,可塑性不再是一個問題,簡化了第2層的采用并提高了安全性。
Schnorr簽名可以顯著節(jié)省空間和驗證時間。Schnorr簽名驗證是線性的,這意味著可以聚合簽名驗證步驟中的密鑰和簽名部分。這是一個稱為批量驗證的新特性,這意味著一次驗證多個簽名的速度比以前更快。它是通過一次驗證多個簽名而不是逐個線性驗證來加速的。自然,隨著簽名集的增加,儲蓄會增加,但最終會逐漸減少。
分別驗證n個簽名和驗證一批n個簽名所需的時間之比隨簽名數(shù)量的增加呈對數(shù)增長;驗證一批100個簽名的時間要快1.75倍,
BIPSchnorr使錢包軟件能夠?qū)⒚荑€聚合在一起。Schnorr的多簽名輸出看起來像單個簽名輸出。在Schnorr之前,多簽名交易很容易被發(fā)現(xiàn),并且可以與網(wǎng)絡(luò)上的正常交易區(qū)分開來。在P2SH中,網(wǎng)絡(luò)知道存在多簽名交易、簽名者是誰以及有多少簽名者。使用Schnorr,外部觀察者不可能看出其中的區(qū)別,因為簽名者創(chuàng)建了一個具有單個簽名的聚合公鑰。這有助于提高可擴展性、可替換性和隱私性。
Schnorr還獲得了其他小的收益。Schnorr簽名是一個固定的64字節(jié)簽名,它低于現(xiàn)有的70-72字節(jié)ECDSA簽名。
Schnorr有正式的安全證明,ECDSA沒有。Schnorr具有自適應(yīng)簽名,這是一個有助于原子交換的特性,也可以用于一般的支付渠道。
Taproot & Tapscript
Merkelized Abstract Syntax Tree (MAST)
MAST最初是由比特幣協(xié)議開發(fā)者劉江森博士于2016年提出的。MAST提出了一個新的witness程序,它使用Merkle樹在腳本中編碼互斥分支,從而實現(xiàn)更復(fù)雜的阻礙條件,通過隱藏未執(zhí)行的條件來改善隱私,其成本非常低。MAST允許在Merkle樹中構(gòu)造多個支出條件,并且只需要公開滿足的條件(與P2SH要求公開所有條件相反)。 如果滿足任何條件,可以使用Merkle root和path來驗證條件是否駐留在Merkle樹中,同時隱藏Merkle樹的其余部分。
除了隱私方面的好處,MAST還可以創(chuàng)建更小的交易大小。非主交易大小在成本上呈線性增長,而主交易大小僅呈對數(shù)增長,為更復(fù)雜的產(chǎn)權(quán)負(fù)擔(dān)情況提供了顯著的縮放效率。鑒于比特幣的字節(jié)大小受到嚴(yán)格限制,這一點尤其重要;裸腳本和SegWit有10,000字節(jié)的限制,P2SH交易有520字節(jié)的限制。
具有和不具有 MAST 的子腳本和保留項數(shù)據(jù)大小的數(shù)量
Taproot
Taproot 升級是 MAST 協(xié)議的一個特殊實現(xiàn), 它使輸出和協(xié)作支出之間無法區(qū)分。[3, 4]與 MAST 一樣, taproot 使用 Merkle 分支來隱藏腳本中未執(zhí)行的分支。此腳本更新 (稱為 Tapscript) 意味著部分執(zhí)行的腳本在使用之前將其其余執(zhí)行代碼隱藏, 同時在以后由對等方驗證和驗證該代碼時仍保留該代碼的完整性。Taproot 和 Tapscript 從一開始就被設(shè)計為可控制和升級的版本。它們加入代碼庫并不是什么大的變化, 總的來說, 實現(xiàn) Taproot 和 Tapscript 的共識變化只有500行代碼左右。
使用專門的比特幣腳本很容易識別,而且從一個地址到一個外部觀察者的簡單支出看起來也不一樣。對于Taproot,所有輸出看起來都一樣。Taproot真正的創(chuàng)新之處在于它對保護(hù)隱私的合作開銷的靈活性:在某些情況下,Merkle樹存在的證據(jù)不需要發(fā)布,只需要發(fā)布一個公鑰和一個簽名。比特幣用戶可以將比特幣作為可編程貨幣使用,而無需識別他們是否在為此目的使用比特幣,從而提高了比特幣的隱私性和可替代性。
腳本的所有參與者都可以就結(jié)果達(dá)成一致,而不考慮現(xiàn)有的條件,只需一起簽署一個消費交易。這種“合作關(guān)閉”使用了Schnorr的Threshold簽名”,使交易看起來像一個常規(guī)交易——參與者的公鑰聚合在一起成為Threshold公鑰。對于鏈,此合作交易作為常規(guī)交易的出現(xiàn),具有傳統(tǒng)的公鑰和簽名。
只有在非協(xié)作的支出下,Merkle樹的存在才會被揭示出來。在非協(xié)作開銷中,可以使用滿足條件的腳本對初始閾值公鑰進(jìn)行調(diào)整,以創(chuàng)建調(diào)整后的閾值公鑰;這證明了只要滿足劇本的具體條件,劇本的資金是可以使用的?;蛘?,可以使用桅桿結(jié)構(gòu)的Merkle root對閾值公鑰進(jìn)行調(diào)整,該結(jié)構(gòu)適用于支出腳本資金的所有不同條件。這種方式只需要暴露滿足的支出條件,其余條件可以隱藏,從而提高隱私,優(yōu)化網(wǎng)絡(luò)資源的使用。
未來的升級路徑
使用Tapscript的Schnorr簽名和主Taproot根通過隱藏腳本和模糊密鑰提高了可擴展性和隱私性,并限制了第三方確定發(fā)生的交易類型的能力。這些改進(jìn)可以極大地改進(jìn)多簽名交易的采用。未來,比特幣開發(fā)者及其社區(qū)計劃將這些增強功能集成到核心代碼中。比特幣的核心代碼還將進(jìn)行各種以隱私為重點的升級,這將使交易更安全、更私密以及使比特幣更具可替代性。