解读区块链,软分叉和硬分叉
生活随笔
收集整理的這篇文章主要介紹了
解读区块链,软分叉和硬分叉
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
解讀區(qū)塊鏈,軟分叉和硬分叉
最近在交流群和論壇中經(jīng)常聽到軟分叉和硬分叉,起初對(duì)這個(gè)概念只是簡單認(rèn)為是區(qū)塊鏈軟件升級(jí)后新舊協(xié)議造成新舊節(jié)點(diǎn)對(duì)新的區(qū)塊認(rèn)可時(shí)的一種分歧,軟分叉一般不會(huì)產(chǎn)生永久性分叉的鏈,而硬分叉則會(huì)產(chǎn)生兩條鏈,如果大多數(shù)節(jié)點(diǎn)升級(jí)到新版本,則舊鏈存活就看算力的大小的。
查詢了些資料,再次明確下軟硬分叉的概念。
軟硬分叉涉及的問題是去中心化節(jié)點(diǎn)軟件、協(xié)議、版本升級(jí)的問題,所有在區(qū)塊鏈中運(yùn)行的節(jié)點(diǎn)有一樣的軟件,遵守一樣的共識(shí)機(jī)制、維護(hù)同一條鏈,但是一旦軟件、協(xié)議、版本升級(jí)后,所有節(jié)點(diǎn)不可能同一時(shí)間都更新到同一版本,這就造成了一部分節(jié)點(diǎn)擁有新的共識(shí)協(xié)議機(jī)制,這時(shí)候會(huì)網(wǎng)絡(luò)中出現(xiàn)新、老、兩種節(jié)點(diǎn)。那么在區(qū)塊生成的時(shí)候,新節(jié)點(diǎn)產(chǎn)生的區(qū)塊,老節(jié)點(diǎn)就會(huì)認(rèn)為合法或者不合法,老節(jié)點(diǎn)產(chǎn)生的區(qū)塊,新節(jié)點(diǎn)也會(huì)認(rèn)為合法或者不合法。在區(qū)塊鏈中一直有一個(gè)51%算力的臨界點(diǎn),那么我們這里認(rèn)為新節(jié)點(diǎn)的算力是大于50%的。
首先再對(duì)軟硬分叉做一個(gè)解釋:
軟分叉:官方定義:A temporary fork in the block chain which commonly occurs when miners using non-upgraded nodes violate a new consensus rule their nodes don’t know about.(當(dāng)新共識(shí)規(guī)則發(fā)布后,沒有升級(jí)的節(jié)點(diǎn)會(huì)因?yàn)椴恢佬鹿沧R(shí)規(guī)則下,而生產(chǎn)不合法的區(qū)塊,就會(huì)產(chǎn)生臨時(shí)性分叉。)說實(shí)話官方定義感覺有點(diǎn)模糊。
當(dāng)整個(gè)區(qū)塊鏈網(wǎng)絡(luò)中,系統(tǒng)版本或協(xié)議升級(jí)后,且和老版本協(xié)議不兼容,那么升級(jí)后的新節(jié)點(diǎn)就無法接受老節(jié)點(diǎn)挖出來的全部或者部分區(qū)塊,因?yàn)樾鹿?jié)點(diǎn)的算力較大,所以老的節(jié)點(diǎn)挖出來的區(qū)塊沒有機(jī)會(huì)得到認(rèn)可,老節(jié)點(diǎn)產(chǎn)生的區(qū)塊最終會(huì)被認(rèn)為是短鏈而被放棄,新老節(jié)點(diǎn)始終還是在同一條鏈上工作,這種情況稱作軟分叉。新節(jié)點(diǎn)要求比老節(jié)點(diǎn)嚴(yán)格多。
硬分叉:官方定義:A permanent divergence in the the block chain, commonly occurs when non-upgraded nodes can’t validate blocks created by upgraded nodes that follow newer consensus rules.(區(qū)塊鏈發(fā)生永久性分歧,在新共識(shí)規(guī)則發(fā)布后,部分沒有升級(jí)的節(jié)點(diǎn)無法驗(yàn)證已經(jīng)升級(jí)的節(jié)點(diǎn)生產(chǎn)的區(qū)塊,通常硬分叉就會(huì)發(fā)生。)
當(dāng)整個(gè)區(qū)塊鏈網(wǎng)絡(luò)中,系統(tǒng)版本或協(xié)議升級(jí)后,且和老版本協(xié)議不兼容,未升級(jí)的老節(jié)點(diǎn)無法接受新節(jié)點(diǎn)挖出的全部或者部分區(qū)塊,導(dǎo)致出現(xiàn)了兩條鏈,假設(shè)新節(jié)點(diǎn)的算力較大,新節(jié)點(diǎn)們?cè)诰S護(hù)一條鏈,老節(jié)點(diǎn)也始終在維護(hù)一條他認(rèn)可的鏈,如果這時(shí)候大多數(shù)的節(jié)點(diǎn)都開始升級(jí)為新版本,那么老節(jié)點(diǎn)維護(hù)的鏈能不能存活就看算力有多少了,這就稱作硬分叉。
很明顯,最粗淺的理解就是軟分叉還是一條鏈,硬分叉就會(huì)分成兩條鏈。
以太坊和比特幣中都出現(xiàn)過分叉的問題,針對(duì)現(xiàn)實(shí)應(yīng)用,軟分叉和硬分叉在實(shí)際應(yīng)用中有什么優(yōu)缺點(diǎn):
軟分叉只有一條鏈(最簡單明了),開始不要求區(qū)塊鏈中所有節(jié)點(diǎn)統(tǒng)一時(shí)間升級(jí),可以允許逐步升級(jí),并且在軟分叉過程中不影響系統(tǒng)的穩(wěn)定性和有效性。但是軟分叉又有個(gè)前提就是老的未升級(jí)節(jié)點(diǎn)要能接受新節(jié)點(diǎn)產(chǎn)生的區(qū)塊,這就要求系統(tǒng)要向前兼容(forward compatible,這個(gè)和一般我們?cè)谟玫能浖蛳录嫒菔窍喾吹姆绞?#xff0c;要求新出現(xiàn)的區(qū)塊對(duì)老系統(tǒng)留一個(gè)余地,確保兼容),其實(shí)讓老節(jié)點(diǎn)承認(rèn)新的區(qū)塊,實(shí)際是一種欺騙,讓老節(jié)點(diǎn)沒法察覺實(shí)際上發(fā)生的變化,這也違背了單點(diǎn)完整性驗(yàn)證。
以太坊和比特幣中都曾出現(xiàn)過軟硬分叉的事件:
The DAO在2016年黑客通過splitDAO函數(shù)遞歸發(fā)送模式上的漏洞曾經(jīng)竊取了360萬個(gè)以太幣,splitDAO函數(shù)在執(zhí)行時(shí)最后才修改用戶的結(jié)余和交易額,如果能夠在返回splitDAO處理運(yùn)算之前,進(jìn)行多次以太幣的操作調(diào)用,那么多次遞歸來持續(xù)轉(zhuǎn)移以太幣到別的賬戶。(具體代碼分析查看鄒均大神的區(qū)塊鏈技術(shù)指南P210或者網(wǎng)上http://blog.csdn.net/sportshark/article/details/51820008),由于代碼漏洞發(fā)布后無法修改,DAO求助以太坊,以太坊最初采用軟分叉的方式,鎖定the DAO賬號(hào),不允許發(fā)生交易,凍結(jié)以太幣,這里可以發(fā)現(xiàn)軟分叉實(shí)際上是在以太坊軟件上加了約束規(guī)則,使得黑客的以太幣無法交易,這樣不影響以太坊其余的正常交易,不要回滾區(qū)塊鏈的數(shù)據(jù)(回滾影響之大難以想象)。在實(shí)施軟分叉方案時(shí),在以太坊的每個(gè)交易上都會(huì)檢查DAO相關(guān)的地址,如果和DAO有關(guān)聯(lián)就拒絕這個(gè)交易,從而鎖定所有資金,但是這個(gè)方案沒有收取交易GAS費(fèi)用,攻擊者一旦以零成本發(fā)起大量無效交易,那么這個(gè)網(wǎng)絡(luò)就面臨癱瘓,最終各個(gè)節(jié)點(diǎn)回退了軟件版本,軟分叉失敗,隨后實(shí)施了硬分叉,下圖:
硬分叉方案在1880000區(qū)塊把DAO的合約歸在另外一個(gè)L列表中,在1920000區(qū)塊,設(shè)計(jì)一個(gè)非常規(guī)的狀態(tài)變更,強(qiáng)行把L所有地址余額轉(zhuǎn)到一個(gè)退款地址中,這樣眾籌的DAO幣就可以換回以太幣,最終硬分叉成功,上圖中1920000區(qū)塊后面,左邊為區(qū)塊編號(hào),右邊為hash值,直線代表新鏈,節(jié)點(diǎn)升級(jí)后都在新鏈上記賬,沒有升級(jí)的節(jié)點(diǎn)在舊鏈記賬。
現(xiàn)在以太坊上為了區(qū)分新鏈-ETH,舊鏈ETC,兩個(gè)鏈除了DAO涉及部分軟件代碼相同,歷史賬號(hào)分叉前相同,地址和私鑰也相同,故都為合法。(當(dāng)然還有重放攻擊,同樣參考鄒均大神P216)。
同樣在比特幣中,出現(xiàn)過軟分叉(http://ns2.btckan.com/news/topic/29027 談國鵬,這位大神還有視頻講解,youku和巴比特都有,可以搜索下。這個(gè)文章中寫的很詳細(xì)明,筆者就直接拷貝過來了。)P2SH軟分叉升級(jí),P2SH包含在BIP16中,通過軟分叉進(jìn)行升級(jí)比特幣系統(tǒng),讓比特幣在支持P2PKH基礎(chǔ)上,再支持一種叫P2SH的標(biāo)準(zhǔn)交易類型。在此之前,比特幣已經(jīng)支持如下的腳本:”O(jiān)P_HASH160 [20-byte-hash-value] OP_EQUAL”。要花費(fèi)這樣的腳本你只需要把hash值的原數(shù)據(jù)(preimage)推到(push data)棧上即可。
P2SH是對(duì)以上條件的一種更嚴(yán)格限制,在P2SH模式(新節(jié)點(diǎn))下,你不但需要提供該hash值的原數(shù)據(jù),還要保證:
該原數(shù)據(jù)是一個(gè)可執(zhí)行的腳本;
該腳本執(zhí)行結(jié)果返回:true;
該腳本中不能含有”push data”的操作;
以及其它的一些限制;
當(dāng)支持P2SH的新節(jié)點(diǎn)被部署時(shí),新節(jié)點(diǎn)的算力>50%(P2SH升級(jí)時(shí)要求>=55%),系統(tǒng)將處于下面的運(yùn)行狀態(tài)中:P2SH交易被轉(zhuǎn)發(fā)到老節(jié)點(diǎn)時(shí),會(huì)被老節(jié)點(diǎn)認(rèn)定為非標(biāo)準(zhǔn)交易(有了新的,或不能理解的OP_CODE),老節(jié)點(diǎn)不接受、不打包、不轉(zhuǎn)發(fā);當(dāng)包含有P2SH交易的區(qū)塊廣播到老節(jié)點(diǎn)時(shí),老節(jié)點(diǎn)接受區(qū)塊,并按原有規(guī)則驗(yàn)證該P(yáng)2SH交易,結(jié)果通過,因?yàn)槔系囊?guī)則只要驗(yàn)證原數(shù)據(jù)的hash是否相等(顯然是相等的);老的節(jié)點(diǎn)創(chuàng)建了一個(gè)原數(shù)據(jù)為:123456的腳本輸出,并花費(fèi)該輸出。老節(jié)點(diǎn)們能夠接受。但是廣播到新節(jié)點(diǎn)時(shí),按新規(guī)則(必須是腳本…)則不通過,新節(jié)點(diǎn)拒絕接受,認(rèn)定為非法,不會(huì)打包該交易。即使該交易被老節(jié)點(diǎn)打包,也會(huì)被新節(jié)點(diǎn)拒絕。因?yàn)樾鹿?jié)點(diǎn)控制多數(shù)算力,這樣的交易將永遠(yuǎn)無法生效;系統(tǒng)同時(shí)維護(hù)一條鏈。
P2SH的升級(jí)細(xì)節(jié):
要求支持P2SH的礦工在其coinbase交易里包含“/P2SH/” 字樣;
2012年2月1日檢查之前1個(gè)星期內(nèi)的所有區(qū)塊(約1000個(gè)),如果超過550個(gè)包含(約55%)則激活P2SH。
SegWit軟分叉升級(jí)
SegWit主要包含在BIP141-144中,通過軟分叉進(jìn)行升級(jí)比特幣系統(tǒng),讓比特幣支持一系列SegWit的功能集。關(guān)于隔離見證的具體內(nèi)容詳見《談?wù)剠^(qū)塊連(21):比特幣之隔離見證》。
通過軟分叉升級(jí)需要讓老的節(jié)點(diǎn)認(rèn)定新的交易為非標(biāo)準(zhǔn)交易,但同時(shí)是合法的。隔離見證是如何做到的呢?答案是:anyone-can-spend的輸出交易。
anyone-can-spend:
下面是一個(gè)anyone-can-spend的例子:
scriptPubKey: (empty)
要花費(fèi)這樣的輸出,你只需要提供這樣的簽名腳本:
scriptSig: OP_TRUE
隔離見證中將腳本版本(script versioning)和anyone-can-spend完美結(jié)合。一個(gè)標(biāo)準(zhǔn)的P2WPKH的輸出如下:
scriptPubKey: 0 <20-byte-key-hash> (0x0014{20-byte-key-hash})
這開頭的0在新節(jié)點(diǎn)中將是腳本的版本號(hào),在老節(jié)點(diǎn)中是一個(gè)anyone-can-spend的輸出。
當(dāng)支持SegWit的新節(jié)點(diǎn)被部署時(shí),新節(jié)點(diǎn)的算力>50%(SegWit升級(jí)時(shí)要求>=95%),系統(tǒng)將處于下面的運(yùn)行狀態(tài)中:
SegWit交易被轉(zhuǎn)發(fā)到老節(jié)點(diǎn)時(shí),會(huì)被老節(jié)點(diǎn)認(rèn)定為非標(biāo)準(zhǔn)交易(anyone-can-spend),老節(jié)點(diǎn)不接受、不打包、不轉(zhuǎn)發(fā);
當(dāng)包含有SegWit交易的區(qū)塊廣播到老節(jié)點(diǎn)時(shí),老節(jié)點(diǎn)接受區(qū)塊,并按原有規(guī)則驗(yàn)證該SegWit交易,結(jié)果通過(因?yàn)樗钦l都可以花費(fèi)的);
老的節(jié)點(diǎn)嘗試花費(fèi)SegWit交易,因?yàn)樗钦l都可以花費(fèi)的。老節(jié)點(diǎn)們能夠接受。但是廣播到新節(jié)點(diǎn)時(shí),按新規(guī)則(隔離見證的驗(yàn)證規(guī)則)則不通過,新節(jié)點(diǎn)拒絕接受,認(rèn)定為非法,不會(huì)打包該交易。即使該交易被老節(jié)點(diǎn)打包,也會(huì)被新節(jié)點(diǎn)拒絕。因?yàn)樾鹿?jié)點(diǎn)控制多數(shù)算力,這樣的交易將永遠(yuǎn)無法生效;
系統(tǒng)同時(shí)維護(hù)一條鏈。
SegWit的升級(jí)細(xì)節(jié):
升級(jí)到core 0.13.1及以上的支持SegWit;
2017年11月如果95%算力支持,則激活SegWit。
最近在交流群和論壇中經(jīng)常聽到軟分叉和硬分叉,起初對(duì)這個(gè)概念只是簡單認(rèn)為是區(qū)塊鏈軟件升級(jí)后新舊協(xié)議造成新舊節(jié)點(diǎn)對(duì)新的區(qū)塊認(rèn)可時(shí)的一種分歧,軟分叉一般不會(huì)產(chǎn)生永久性分叉的鏈,而硬分叉則會(huì)產(chǎn)生兩條鏈,如果大多數(shù)節(jié)點(diǎn)升級(jí)到新版本,則舊鏈存活就看算力的大小的。
查詢了些資料,再次明確下軟硬分叉的概念。
軟硬分叉涉及的問題是去中心化節(jié)點(diǎn)軟件、協(xié)議、版本升級(jí)的問題,所有在區(qū)塊鏈中運(yùn)行的節(jié)點(diǎn)有一樣的軟件,遵守一樣的共識(shí)機(jī)制、維護(hù)同一條鏈,但是一旦軟件、協(xié)議、版本升級(jí)后,所有節(jié)點(diǎn)不可能同一時(shí)間都更新到同一版本,這就造成了一部分節(jié)點(diǎn)擁有新的共識(shí)協(xié)議機(jī)制,這時(shí)候會(huì)網(wǎng)絡(luò)中出現(xiàn)新、老、兩種節(jié)點(diǎn)。那么在區(qū)塊生成的時(shí)候,新節(jié)點(diǎn)產(chǎn)生的區(qū)塊,老節(jié)點(diǎn)就會(huì)認(rèn)為合法或者不合法,老節(jié)點(diǎn)產(chǎn)生的區(qū)塊,新節(jié)點(diǎn)也會(huì)認(rèn)為合法或者不合法。在區(qū)塊鏈中一直有一個(gè)51%算力的臨界點(diǎn),那么我們這里認(rèn)為新節(jié)點(diǎn)的算力是大于50%的。
首先再對(duì)軟硬分叉做一個(gè)解釋:
軟分叉:官方定義:A temporary fork in the block chain which commonly occurs when miners using non-upgraded nodes violate a new consensus rule their nodes don’t know about.(當(dāng)新共識(shí)規(guī)則發(fā)布后,沒有升級(jí)的節(jié)點(diǎn)會(huì)因?yàn)椴恢佬鹿沧R(shí)規(guī)則下,而生產(chǎn)不合法的區(qū)塊,就會(huì)產(chǎn)生臨時(shí)性分叉。)說實(shí)話官方定義感覺有點(diǎn)模糊。
當(dāng)整個(gè)區(qū)塊鏈網(wǎng)絡(luò)中,系統(tǒng)版本或協(xié)議升級(jí)后,且和老版本協(xié)議不兼容,那么升級(jí)后的新節(jié)點(diǎn)就無法接受老節(jié)點(diǎn)挖出來的全部或者部分區(qū)塊,因?yàn)樾鹿?jié)點(diǎn)的算力較大,所以老的節(jié)點(diǎn)挖出來的區(qū)塊沒有機(jī)會(huì)得到認(rèn)可,老節(jié)點(diǎn)產(chǎn)生的區(qū)塊最終會(huì)被認(rèn)為是短鏈而被放棄,新老節(jié)點(diǎn)始終還是在同一條鏈上工作,這種情況稱作軟分叉。新節(jié)點(diǎn)要求比老節(jié)點(diǎn)嚴(yán)格多。
硬分叉:官方定義:A permanent divergence in the the block chain, commonly occurs when non-upgraded nodes can’t validate blocks created by upgraded nodes that follow newer consensus rules.(區(qū)塊鏈發(fā)生永久性分歧,在新共識(shí)規(guī)則發(fā)布后,部分沒有升級(jí)的節(jié)點(diǎn)無法驗(yàn)證已經(jīng)升級(jí)的節(jié)點(diǎn)生產(chǎn)的區(qū)塊,通常硬分叉就會(huì)發(fā)生。)
當(dāng)整個(gè)區(qū)塊鏈網(wǎng)絡(luò)中,系統(tǒng)版本或協(xié)議升級(jí)后,且和老版本協(xié)議不兼容,未升級(jí)的老節(jié)點(diǎn)無法接受新節(jié)點(diǎn)挖出的全部或者部分區(qū)塊,導(dǎo)致出現(xiàn)了兩條鏈,假設(shè)新節(jié)點(diǎn)的算力較大,新節(jié)點(diǎn)們?cè)诰S護(hù)一條鏈,老節(jié)點(diǎn)也始終在維護(hù)一條他認(rèn)可的鏈,如果這時(shí)候大多數(shù)的節(jié)點(diǎn)都開始升級(jí)為新版本,那么老節(jié)點(diǎn)維護(hù)的鏈能不能存活就看算力有多少了,這就稱作硬分叉。
很明顯,最粗淺的理解就是軟分叉還是一條鏈,硬分叉就會(huì)分成兩條鏈。
以太坊和比特幣中都出現(xiàn)過分叉的問題,針對(duì)現(xiàn)實(shí)應(yīng)用,軟分叉和硬分叉在實(shí)際應(yīng)用中有什么優(yōu)缺點(diǎn):
軟分叉只有一條鏈(最簡單明了),開始不要求區(qū)塊鏈中所有節(jié)點(diǎn)統(tǒng)一時(shí)間升級(jí),可以允許逐步升級(jí),并且在軟分叉過程中不影響系統(tǒng)的穩(wěn)定性和有效性。但是軟分叉又有個(gè)前提就是老的未升級(jí)節(jié)點(diǎn)要能接受新節(jié)點(diǎn)產(chǎn)生的區(qū)塊,這就要求系統(tǒng)要向前兼容(forward compatible,這個(gè)和一般我們?cè)谟玫能浖蛳录嫒菔窍喾吹姆绞?#xff0c;要求新出現(xiàn)的區(qū)塊對(duì)老系統(tǒng)留一個(gè)余地,確保兼容),其實(shí)讓老節(jié)點(diǎn)承認(rèn)新的區(qū)塊,實(shí)際是一種欺騙,讓老節(jié)點(diǎn)沒法察覺實(shí)際上發(fā)生的變化,這也違背了單點(diǎn)完整性驗(yàn)證。
以太坊和比特幣中都曾出現(xiàn)過軟硬分叉的事件:
The DAO在2016年黑客通過splitDAO函數(shù)遞歸發(fā)送模式上的漏洞曾經(jīng)竊取了360萬個(gè)以太幣,splitDAO函數(shù)在執(zhí)行時(shí)最后才修改用戶的結(jié)余和交易額,如果能夠在返回splitDAO處理運(yùn)算之前,進(jìn)行多次以太幣的操作調(diào)用,那么多次遞歸來持續(xù)轉(zhuǎn)移以太幣到別的賬戶。(具體代碼分析查看鄒均大神的區(qū)塊鏈技術(shù)指南P210或者網(wǎng)上http://blog.csdn.net/sportshark/article/details/51820008),由于代碼漏洞發(fā)布后無法修改,DAO求助以太坊,以太坊最初采用軟分叉的方式,鎖定the DAO賬號(hào),不允許發(fā)生交易,凍結(jié)以太幣,這里可以發(fā)現(xiàn)軟分叉實(shí)際上是在以太坊軟件上加了約束規(guī)則,使得黑客的以太幣無法交易,這樣不影響以太坊其余的正常交易,不要回滾區(qū)塊鏈的數(shù)據(jù)(回滾影響之大難以想象)。在實(shí)施軟分叉方案時(shí),在以太坊的每個(gè)交易上都會(huì)檢查DAO相關(guān)的地址,如果和DAO有關(guān)聯(lián)就拒絕這個(gè)交易,從而鎖定所有資金,但是這個(gè)方案沒有收取交易GAS費(fèi)用,攻擊者一旦以零成本發(fā)起大量無效交易,那么這個(gè)網(wǎng)絡(luò)就面臨癱瘓,最終各個(gè)節(jié)點(diǎn)回退了軟件版本,軟分叉失敗,隨后實(shí)施了硬分叉,下圖:
硬分叉方案在1880000區(qū)塊把DAO的合約歸在另外一個(gè)L列表中,在1920000區(qū)塊,設(shè)計(jì)一個(gè)非常規(guī)的狀態(tài)變更,強(qiáng)行把L所有地址余額轉(zhuǎn)到一個(gè)退款地址中,這樣眾籌的DAO幣就可以換回以太幣,最終硬分叉成功,上圖中1920000區(qū)塊后面,左邊為區(qū)塊編號(hào),右邊為hash值,直線代表新鏈,節(jié)點(diǎn)升級(jí)后都在新鏈上記賬,沒有升級(jí)的節(jié)點(diǎn)在舊鏈記賬。
現(xiàn)在以太坊上為了區(qū)分新鏈-ETH,舊鏈ETC,兩個(gè)鏈除了DAO涉及部分軟件代碼相同,歷史賬號(hào)分叉前相同,地址和私鑰也相同,故都為合法。(當(dāng)然還有重放攻擊,同樣參考鄒均大神P216)。
同樣在比特幣中,出現(xiàn)過軟分叉(http://ns2.btckan.com/news/topic/29027 談國鵬,這位大神還有視頻講解,youku和巴比特都有,可以搜索下。這個(gè)文章中寫的很詳細(xì)明,筆者就直接拷貝過來了。)P2SH軟分叉升級(jí),P2SH包含在BIP16中,通過軟分叉進(jìn)行升級(jí)比特幣系統(tǒng),讓比特幣在支持P2PKH基礎(chǔ)上,再支持一種叫P2SH的標(biāo)準(zhǔn)交易類型。在此之前,比特幣已經(jīng)支持如下的腳本:”O(jiān)P_HASH160 [20-byte-hash-value] OP_EQUAL”。要花費(fèi)這樣的腳本你只需要把hash值的原數(shù)據(jù)(preimage)推到(push data)棧上即可。
P2SH是對(duì)以上條件的一種更嚴(yán)格限制,在P2SH模式(新節(jié)點(diǎn))下,你不但需要提供該hash值的原數(shù)據(jù),還要保證:
該原數(shù)據(jù)是一個(gè)可執(zhí)行的腳本;
該腳本執(zhí)行結(jié)果返回:true;
該腳本中不能含有”push data”的操作;
以及其它的一些限制;
當(dāng)支持P2SH的新節(jié)點(diǎn)被部署時(shí),新節(jié)點(diǎn)的算力>50%(P2SH升級(jí)時(shí)要求>=55%),系統(tǒng)將處于下面的運(yùn)行狀態(tài)中:P2SH交易被轉(zhuǎn)發(fā)到老節(jié)點(diǎn)時(shí),會(huì)被老節(jié)點(diǎn)認(rèn)定為非標(biāo)準(zhǔn)交易(有了新的,或不能理解的OP_CODE),老節(jié)點(diǎn)不接受、不打包、不轉(zhuǎn)發(fā);當(dāng)包含有P2SH交易的區(qū)塊廣播到老節(jié)點(diǎn)時(shí),老節(jié)點(diǎn)接受區(qū)塊,并按原有規(guī)則驗(yàn)證該P(yáng)2SH交易,結(jié)果通過,因?yàn)槔系囊?guī)則只要驗(yàn)證原數(shù)據(jù)的hash是否相等(顯然是相等的);老的節(jié)點(diǎn)創(chuàng)建了一個(gè)原數(shù)據(jù)為:123456的腳本輸出,并花費(fèi)該輸出。老節(jié)點(diǎn)們能夠接受。但是廣播到新節(jié)點(diǎn)時(shí),按新規(guī)則(必須是腳本…)則不通過,新節(jié)點(diǎn)拒絕接受,認(rèn)定為非法,不會(huì)打包該交易。即使該交易被老節(jié)點(diǎn)打包,也會(huì)被新節(jié)點(diǎn)拒絕。因?yàn)樾鹿?jié)點(diǎn)控制多數(shù)算力,這樣的交易將永遠(yuǎn)無法生效;系統(tǒng)同時(shí)維護(hù)一條鏈。
P2SH的升級(jí)細(xì)節(jié):
要求支持P2SH的礦工在其coinbase交易里包含“/P2SH/” 字樣;
2012年2月1日檢查之前1個(gè)星期內(nèi)的所有區(qū)塊(約1000個(gè)),如果超過550個(gè)包含(約55%)則激活P2SH。
SegWit軟分叉升級(jí)
SegWit主要包含在BIP141-144中,通過軟分叉進(jìn)行升級(jí)比特幣系統(tǒng),讓比特幣支持一系列SegWit的功能集。關(guān)于隔離見證的具體內(nèi)容詳見《談?wù)剠^(qū)塊連(21):比特幣之隔離見證》。
通過軟分叉升級(jí)需要讓老的節(jié)點(diǎn)認(rèn)定新的交易為非標(biāo)準(zhǔn)交易,但同時(shí)是合法的。隔離見證是如何做到的呢?答案是:anyone-can-spend的輸出交易。
anyone-can-spend:
下面是一個(gè)anyone-can-spend的例子:
scriptPubKey: (empty)
要花費(fèi)這樣的輸出,你只需要提供這樣的簽名腳本:
scriptSig: OP_TRUE
隔離見證中將腳本版本(script versioning)和anyone-can-spend完美結(jié)合。一個(gè)標(biāo)準(zhǔn)的P2WPKH的輸出如下:
scriptPubKey: 0 <20-byte-key-hash> (0x0014{20-byte-key-hash})
這開頭的0在新節(jié)點(diǎn)中將是腳本的版本號(hào),在老節(jié)點(diǎn)中是一個(gè)anyone-can-spend的輸出。
當(dāng)支持SegWit的新節(jié)點(diǎn)被部署時(shí),新節(jié)點(diǎn)的算力>50%(SegWit升級(jí)時(shí)要求>=95%),系統(tǒng)將處于下面的運(yùn)行狀態(tài)中:
SegWit交易被轉(zhuǎn)發(fā)到老節(jié)點(diǎn)時(shí),會(huì)被老節(jié)點(diǎn)認(rèn)定為非標(biāo)準(zhǔn)交易(anyone-can-spend),老節(jié)點(diǎn)不接受、不打包、不轉(zhuǎn)發(fā);
當(dāng)包含有SegWit交易的區(qū)塊廣播到老節(jié)點(diǎn)時(shí),老節(jié)點(diǎn)接受區(qū)塊,并按原有規(guī)則驗(yàn)證該SegWit交易,結(jié)果通過(因?yàn)樗钦l都可以花費(fèi)的);
老的節(jié)點(diǎn)嘗試花費(fèi)SegWit交易,因?yàn)樗钦l都可以花費(fèi)的。老節(jié)點(diǎn)們能夠接受。但是廣播到新節(jié)點(diǎn)時(shí),按新規(guī)則(隔離見證的驗(yàn)證規(guī)則)則不通過,新節(jié)點(diǎn)拒絕接受,認(rèn)定為非法,不會(huì)打包該交易。即使該交易被老節(jié)點(diǎn)打包,也會(huì)被新節(jié)點(diǎn)拒絕。因?yàn)樾鹿?jié)點(diǎn)控制多數(shù)算力,這樣的交易將永遠(yuǎn)無法生效;
系統(tǒng)同時(shí)維護(hù)一條鏈。
SegWit的升級(jí)細(xì)節(jié):
升級(jí)到core 0.13.1及以上的支持SegWit;
2017年11月如果95%算力支持,則激活SegWit。
參考網(wǎng)絡(luò)和區(qū)塊鏈技術(shù)指南上的講解,分析了軟分叉和硬分叉,期間也看到另外一篇文章,http://www.8btc.com/tan90d97有興趣的讀者可以了解下,這個(gè)具體對(duì)亂硬分叉交易數(shù)據(jù)結(jié)構(gòu)作了分析。?
轉(zhuǎn)載來自:https://blog.csdn.net/sxjinmingjie/article/details/77621311
總結(jié)
以上是生活随笔為你收集整理的解读区块链,软分叉和硬分叉的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hyperledger Fabric 排
- 下一篇: 预言机、预言机网络、预测市场