01開始吧 不使用術語還能把事情說明白,那就是真明白了。
比特幣是大型網絡生物的始祖,可以存續,卻不能自我迭代和繁衍。
區塊鏈是比特幣的基因,它設定了比特幣的內部運行、存續法則。
中本聰說要有光,一個新世界誕生了。比特幣的基因經過復制和升級,產生了區塊鏈世界。
煤炭的故事? 鱈魚的故事 西部往事? 革命往事? 史記 糖史? 未來簡史,歷史有著各種各樣的記錄方式和理解角度。記賬法的歷史記錄著人類社會生產力的發展歷史。區塊鏈就是一個存放在網絡上的公共賬本,它是進化程度最高的一種記賬法。
比特幣交易有兩重意思。這是理解軟分叉和硬分叉的關鍵。
比特幣交易其中一個含義指的是我們遵守共同的規則在賬本上記賬。不論你用什么記賬窗口(錢包軟件)都必須遵守這套規則,這樣才會通用通行。
另外一個含義是指轉賬(發送和接收)。所有的轉賬記錄構成了歷史記錄,到目前為止其數據量大約80多個G。你可以在你的記賬窗口(錢包軟件)上查看你的所有交易記錄。
02 怎樣記賬和怎樣保存賬本
一筆交易包含著轉出和轉入兩筆數據
所有的窗口(錢包)都必須統一的規則記賬,否則就無法記錄到總賬本上,交易也就不能成立。
總賬本會每隔十分鐘刷新整理打包一次,標記一下時間之后摞在舊賬本上面,也就是加蓋時間戳之后添加到區塊鏈上。所以,你現在應該能明白了,區塊鏈就是10分鐘一本10分鐘一本摞起來的大賬本。這個10分鐘的小賬本就是一個區塊。
03? 分叉后誰軟?誰硬?
什么是分叉?就是區塊鏈這個軟件運行時間長了,數據量大了,跑不動了,需要修改升級。中本聰在喊:“要有光”的時候,忘記設計比特幣成長和繁衍的規則了。
硬分叉:
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.
https://bitcoin.org/en/glossary/hard-fork
新國家的人民改花新幣了,一部分不能也不想一起過的人去了桃花源,花他們原來的錢,改名叫桃花幣。
軟分叉:
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.
https://bitcoin.org/en/glossary/soft-fork
新國家宣告成立,部分前朝遺老遺少看不懂新世界,(只能)于桃花源中自給自足。
本來在新國家新世界一起生活挺好的,可惜,一定會有一部分人無法走到這邊來。
04 真的分過叉嗎
分過。2016年6月分過。那次史稱csv軟分叉,其實就是改變了記賬規則。所有用戶個人的記賬規則都一樣,csv軟分叉把賬本規則中不是很重要且不具有驗證時一票否決權的一條改寫了。之后,賬本還能將就著用。
2012年也有一次類似分叉。
問題是,下次升級咋辦?
。
比特幣在2012年還有一次重要的升級,叫P2SH,被社區稱之為多重簽名軟分叉。這是對比特幣交易簽名腳本的一次修改,使得比特幣可以很方便的通過多重簽名的方式來發送交易。那一次修改了什么呢?
6
圖中的紅字加粗的那個字段就是多重簽名軟分叉主要修改的地方。一開始中本聰定義這個字段是叫P2PKH(Pay-to-Public-Key-Hash,支付給公鑰),目前這個字段可以有5種腳本。
因為多重簽名軟分叉之后,沒有升級的節點在驗證已經升級過的節點產生的區塊時,它們對這種新的P2SH鎖定腳本也可以通過驗證,所以這也是一個軟分叉。
以上兩個軟分叉都是對比特幣交易數據結構的修改。軟分叉還能變相修改比特幣的交易歷史。
在2010年8月15日,有一個黑客利用比特幣代碼的一個漏洞,在第74638高度區塊上刷出一筆交易包含了1844億個比特幣。隨后在半天時間內被開發人員發現,并且發布了補丁,將這筆交易的輸出變為無效。但這并不是簡單地將這筆交易本身定義為無效,而將一類叫“負值輸出”的交易定義為無效,剛才那筆交易就是利用比特幣之前沒有禁止輸出值為負值這個漏洞,只是定義了只要輸出總金額不能高于輸入總金額就可以了。在補?。☉撌侵斜韭敯l布的)修正了這個漏洞,具體修改的是什么呢?
7
圖中的紅字加粗的那個字段就是這個漏洞補丁主要修改的地方。修改之前的規則是“總量”不能高于“交易”,修改之后的規則是添加了“總量”不能是負值。這種修改未升級的節點能夠驗證已經升級的節點產生的區塊,所以也是軟分叉。
現在我們對這三個案例進行抽象化,給出一個軟分叉的定義:軟分叉是指比特幣交易的數據結構(這就是被廣泛流傳的“共識”)發生改變時,未升級的節點可以驗證已經升級的節點生產出的區塊,而且已經升級的節點也可以驗證未升級的節點生產出的區塊。
軟分叉對“共識”的修改肯定還包括對區塊格式的修改,但這里的三個案例均是對交易格式的修改。
下面我們來看硬分叉案例。
第5章 比特幣區塊鏈上執行硬分叉的具體案例
在2013年3月12日,當時是bitcoin qt 0.8.0版本軟件發布了,0.8版本采用了一種新的數據庫level db。有的礦工節點升級了bitcoin qt 0.8版本,有的礦工還繼續使用bitcoin qt0.7版本的軟件。雙方各自生產區塊,但bitcoin qt 0.8采用的新數據庫生產出的區塊被被qt0.7版本節點拒絕掉。具體的原因是舊的數據庫對超過800Kb的區塊有時不接受。因此在區塊高度225430比特幣區塊鏈分成了兩條鏈,結果導致了比特幣區塊鏈產生兩條鏈,一條是包含大于800kb區塊的鏈,另一條是拒絕承認這些包含更大區塊的鏈,這就發生了硬分叉。
當時是采用bitcoin qt 0.8版本的礦工放棄了他們挖的鏈,退回到bitcoin qt 0.7版本上繼續挖礦。
這次硬分叉是一次意外,是bitcoin qt 0.8版本的軟件出了bug,導致采用舊軟件的節點拒絕驗證新軟件節點生產的區塊。但硬分叉的成因就是采用舊軟件版本的節點拒絕驗證采用新軟件版本的節點生產的區塊,然后雙方各自挖礦。
在2015年7月4日比特幣區塊鏈在區塊高度363731發生一次硬分叉。當時是Bitcoin Core 開發者往新版本的Bitcoin Core 0.10.0添加了BIP 66。這本來是一起軟分叉的修改,在比特幣網絡上主要礦池都使用了0.10版本的軟件時,但有一個礦池BTC Nuggets沒有升級,導致BTC Nuggets挖出來的兩個區塊其他礦工拒絕掉,然后雙方就各自挖礦延續自己認為是正確的區塊鏈,由此產生硬分叉,分成了兩條鏈。
隨后bitcoin.org發布公告,呼吁礦工升級到bitcoin core 0.10.2版本來消滅分叉。
這也是一次意外,硬分叉的成因是采用新軟件版本的節點拒絕驗證采用舊軟件版本的節點生產的區塊,然后雙方各自挖礦。
到目前為止這兩次硬分叉都是意外,但硬分叉的成因前一個是因為對新產生的區塊格式在不同節點上產生分歧,后一個是因為對交易格式在不同節點上產生分歧。但因為是意外,社區沒有討論出足夠多的資料,我也搞不清楚具體是區塊或交易的哪個字段被修改而導致的分叉。
到了這里,我們可以對這兩個案例進行抽象化,給出一個硬分叉的定義:硬分叉是指比特幣區塊格式或交易格式(這就是廣泛流傳的“共識”)發生改變時,未升級的節點拒絕驗證已經升級的節點生產出的區塊,不過已經升級的節點可以驗證未升級節點生產出的區塊,然后大家各自延續自己認為正確的鏈,所以分成兩條鏈。
下面我們來看社區正在策劃,但還沒被激活的軟分叉和硬分叉。
第6章 正在策劃的區塊擴容硬分叉
目前比特幣社區正在策劃一次硬分叉,來由是目前的區塊被塞滿了交易,為了能在十分鐘一個區塊里容納更多的交易,就需要對區塊的數據結構做修改。那我們先再來看下區塊的數據結構。
9
目前比特幣網絡主要的完整節點軟件是bitcoin core 0.12,這個軟件規定表6里的“區塊大小”這個字段最大值為1M。這就導致最后一個字段“交易”能夠容納的比特幣交易數據有限,一筆交易至少是250字節,1Mb只能裝下4000多筆交易,平均每秒最多只能處理7筆交易。而因為實際的交易往往會達到500字節的大小,實際上平均每秒往往只能容納3筆交易。
所以有人就提出將這個字段的最大值調高,比如Bitcoin Classic這個軟件就將這個字段的最大值調到2M,并且以后有計劃取前2016個區塊大小的中位數再乘一個約定好的倍數來決定下一批區塊的大小上限。而Bitcoin XT則將這個值修改為20M,并且每兩年翻一倍,直到上限值達到8.3G。而Bitcoin Unlimited則直接將這個字段修改為由礦池決定自己打包多大。
問題是,使用這些修改了這個字段的軟件的節點生產出的區塊就會和沒有升級的節點不兼容,沒升級的會拒絕驗證這些新節點生產的區塊。這就會導致硬分叉。
到這里,我們基本知道了,所謂的硬分叉需要修改的“共識”就是指的是修改區塊數據結構格式,或修改交易數據結構格式。
第7章 隔離見證軟分叉
還有一個對區塊變相擴容的方案是隔離見證,這個方案修改的是比特幣交易數據結構,我們還是來看圖。
10
圖中紅色的字段就是隔離見證主要動手的地方,這是要將這部分數據移出交易定義的數據結構,并且還要移出區塊定義的數據結構。因此交易就少了一部分數據,這樣每一筆交易的體積就會小,而整個區塊1M空間內就能夠容納更多的交易。
但這樣移走這個字段,也會造成沒有升級的節點的拒絕驗證這些升級的節點生產的區塊。但是有辦法讓他們不拒絕,但代碼寫起來就非常非常復雜,反正這個代碼寫了一年多了,到現在還沒有搞出來。代碼越復雜,勢必潛在的漏洞就越多,想想Bip 66都由軟分叉導致了硬分叉,而這個隔離見證更復雜。
到這里,再一次驗證了,所謂的軟分叉需要修改的“共識”就是指修改區塊數據結構格式,或修改交易數據結構格式。
第8章 軟分叉和硬分叉要修改的“共識”都是對數據結構的修改
現在我們可以對軟分叉和硬分叉到底要做什么工作做個總結,特別是軟分叉和硬分叉之間到底有什么區別,以免得被那些定義不準確的“共識”弄暈了。
軟分叉修改的“共識”具體是指修改了比特幣交易數據結構,或修改了比特幣區塊數據結構。
硬分叉修改的“共識”具體是指修改了比特幣交易數據結構,或修改了比特幣區塊數據結構。
在具體修改的對象層面上,軟分叉和硬分叉是完全沒有區別的,就目前止我們看到的所有的已經發生的,和計劃發生的分叉都是這樣子,它們都修改或試圖修改交易數據結構,或區塊數據結構。
目前發生的,或計劃發生的硬分叉和軟分叉都絕對不會去修改交易歷史記錄。哪怕是2010年8月15日發生的刷出天量幣的漏洞,那一次修改的也是交易數據結構,但附帶的作用就是將一個區塊里的交易作廢了,因為那筆交易在新交易數據結構的定義下是非法的。
所以說軟分叉和硬分叉在修改“共識”層面上本質上是沒有區別的。
那軟分叉和硬分叉的區別在哪呢?
第9章 軟分叉和硬分叉主要區別是新舊節點相互兼容性
區別是對新舊節點的兼容方面。軟分叉修改數據結構后,新節點生產的交易和區塊能夠被舊節點驗證并接受,硬分叉就不能。
正因為硬分叉修改數據結構后,新節點生產的區塊會被舊節點拒絕掉,如果舊節點拒絕升級軟件而堅持按照舊數據結構繼續挖礦,那比特幣就會產生兩條鏈。
而軟分叉因為沒有升級的節點能接受新節點生產的新數據,所以不會出現兩條鏈。但軟分叉為了做到新節點和舊節點生產的數據完全兼容,那是非常難的,因為本質上是不一樣的數據結構大家要相互認,一旦出現有節點拒絕驗證不一樣的交易或區塊,那就會變成硬分叉。這也就是Bip 66軟分叉最終變成硬分叉的原因。
從第4章我們看到具體的軟分叉的修改辦法是將原來定義好的字段進行重新定義,如多重簽名軟分叉?;蛘呤菍υ臼橇粼诘淖侄巫龆x,如CSV軟分叉。
但是現在從交易的數據結構來看,所有的字段都已經被占用,并且準確而詳細地定義了,如果你還要再做軟分叉,那就只能將部分字段原有的定義擦除掉,再重新定義。這樣就會導致原有的功能可能會喪失,如果這個功能是不可或缺的,那就會導致硬分叉,新舊節點相互拒絕。所以軟分叉要特別小心。這也就是隔離見證的做法。隔離見證是直接將某個字段刪除掉,但為了保證新舊節點之間的相互兼容,那個是廢了牛勁了。
便硬分叉則不考慮沒有升級的節點會不會拒絕已經升級的節點生產的數據和代碼的情況,情況要簡單許多。
讓我們來看看這種為了實現軟分叉和硬分叉要做的兼容性有什么區別。
軟分叉和硬分叉要實現新舊節點生產的新舊數據涉及到的主要變化量一共有六個:
1.沒有升級的舊節點;
2.升級了的新節點;
3.舊節點發生的舊交易格式的交易;
4.新節點發生的新交易格式的交易;
5.舊節點生產出的只含舊區塊格式的舊區塊;
6.新節點生產出的含新區塊格式的新區塊。
實際上還要考慮更復雜的其他因素,包括完整節點;SPV節點;新舊節點算力占比;SPV挖礦節點;未確認交易和多個確認交易;CSV交易;RBF交易……。所有這些都是兼容性要考慮的因素。但為了簡化,我這里只考慮上面6個主要變化量,我們先來列個表。
11
軟分叉需要保證完美的兼容性就要求達到以下兩種情況:
1.升級過的節點接受沒有升級的節點生產的交易和區塊(向后兼容);
2.沒有升級的節點接受升級過的節點生產的交易和區塊(向前兼容)。
硬分叉需要保證的兼容性只需要達到上面的第1種情況,也就是新節點需要從0高度區塊開始驗證整個區塊鏈就可以了。
我們打個比方來說明這兩種兼容性吧:
向后兼容其實是我們最好理解的,就是我們使用word 2013可以打開word 2010版的文件。向前兼容的意思是舊版本軟件要無條件接受自己所不能理解的新版本軟件生產的數據。就像是你用word 2010去打開word2013版的文件。這種難度不知道有多高啊,舊版軟件怎么會知道還沒有定義過的數據呢?它唯一能做的就是忽略這些新功能。
而硬分叉是不考慮這么復雜的兼容性的,首先是拒絕向前兼容。硬分叉就不會理會沒有升級的節點拒絕驗證升級過的節點生產的區塊這會事,你受驗證不驗證,你不升級我就不跟你玩了。
第10章 對比軟分叉和硬分叉的優缺點
軟分叉可以保證不想升級的人不去升級,這種不想升級的需求在現實生活中其實是很常見的。
硬分叉必須要求所有舊節點進行升級,否則舊節點就無法識別新節點生產的交易和區塊,導致區塊鏈分成兩條鏈。
軟分叉的升級空間有限,因為目前的比特幣交易數據結構和區塊數據結構所有字段都已經詳細定義好了,你想保證向前兼容,就不可能增加新的字段,否則舊節點就會拒絕你。所以軟分叉的升級空間補束縛在對現有字段的重新定義。就包括軟分叉就無法重新定義區塊數據結構里的“區塊大小”這個字段,也就是軟分叉永遠實現不了對1M區塊的突破。而且這種極端復雜的兼容性稍微出點錯,就會新舊節點不兼容,即導致硬分叉。這個事情已經發生過一次了。
硬分叉的升級空間則要大很多,因為硬分叉只要考慮能夠接受以前舊節點生產的交易和區塊就可以了,硬分叉不需要考慮舊節點是否會接受新節點生產的交易和區塊。那硬分叉就可以對交易數據結構和區塊數據結構更大膽的修改。
最后,比特幣交易數據結構和區塊數據結構都有一個字段叫“版本號”,意義是“明確這筆交易或區塊參照的規則”。這意味著中本聰是希望使用硬分叉來修改這些規則,就是說如果我們要修改規則,那就重新定義版本號。但軟分叉在不修改“版本號”的前提下,卻修改了規則。
第11章 結束語
“共識”這個詞忽悠了太多的人了。其實在“不破壞共識”包裝下的軟分叉,本質上和硬分叉是一樣要修改相同的對象的,而且更可怕的代價是向前兼容,即要求不升級的軟件去忽視升級過的軟件生產的數據和代碼,冒這種風險得來的好處僅僅是懶得升級軟件。我想任何理智的人都是不愿意接受這種風險收益比的。
(這個主題我一直想寫,但又誠惶誠恐,怕自己寫不好。今天鼓起勇氣寫出來了。寫了整整一天。請各位過目。有寫錯的地方請您一定指出,如果覺得對您有用,歡迎打賞點幣給我。)
發文時比特幣標準價格 買價:¥4117.00 賣價:¥4112.00
作者:黃世亮(微博@閃電HSL 微信tan90d 微信公眾號 閃電)
我的BTC地址:14mhzjkJ71oMAMkKu3dy98dnUpkyQBHL1r
版權聲明:? by? nc"? sa 作者保留權利。文章為作者獨立觀點,不代表巴比特立場。
來自: 巴比特
評論:13
您需要登錄后才可以回復 登錄|注冊
用新浪微博登錄
Author Image libra17951 5 天前
除了感謝沒有別的,迄今為止最好的一篇關于分叉的說明文。沒有之一!
+1 +1
0? 0
我要點評
Author Image bitdot 35 天前
一篇好文!
+1 +1
0? 0
我要點評
Author Image xmenx 37 天前
寫得很詳細??!
+1 +1
0? 0
我要點評
Author Image zimeng0110 116 天前
今天算是看明白了,以前看了不知道多少遍,但還是不知道什么是硬分叉,什么是軟分叉
+1 +1
0? 0
我要點評
Author Image merry 284 天前
感謝
https://blockmeta.com/btc-tx/89e7f8854c2458b6c0f67e2d3b92d3c4cc54be5e73847323d07595a4f57e5c57
贊助0.0766 BTC
+1 +1
0? 0
我要點評
Author Image cndx 286 天前
《什么是共識,什么是分叉,什么是兼容性》
http://www.8btc.com/compatibility-and-fork
+1 +1
0? 0
我要點評
YichenTANG_不會Java YichenTANG_不會Java 287 天前
是時候推薦你地攤文學 貨幣戰爭 了。。。上下班路上可以聽。。
+1 +1
0? 0
我要點評
我是來圍觀你們炒比特幣的 我是來圍觀你們炒比特幣的 287 天前
最近軟分叉的呼聲越來越高了啊
+1 +1
0? 0
我要點評
長鋏 長鋏 287 天前
歧路之中又有歧焉,吾不知所之,所以反也
+1 +1
0? 0
我要點評
Author Image cndx 287 天前
說得很詳細。但有點太多,看看這個投票貼吧:
http://8btc.com/thread-40509-1-1.html
向前兼容的重要性,尤其是在金融領域的,閃電可能有點忽視了。能軟分叉實現的情況下,盡量不要硬分叉。金融是要求穩定的,你下載了個電子錢包,存了些錢,過了段時間再打開錢包時,發現不能用了,必須要升級才能用,而升級的過程可能存在風險。像這樣的錢包軟件會有人用會有人信任嗎?因此“向前兼容”就算再復雜,也是要盡量實現的。
+1 +1
0? 0
我要點評
Author Image 面神護法 287 天前
還沒看完,先給個大大的贊
+1 +1
0? 0
我要點評
晨風思以自娛 晨風思以自娛 287 天前
系統詳盡的介紹了軟硬分叉,有利于打破人們對硬分叉的恐懼癥。2015年的363731的兩個塊,應該不算硬分叉,最多只是雙方礦工由于規則不同,各自認為自己是合法的最長鏈,但普通的用戶節點,還是只會認一條。//@閃電HSL: 寫這篇文章,我有點誠惶誠恐,如果發現有錯誤,一定記得告訴我。謝謝
+1 +1
0? 0
我要點評
Author Image bixu 287 天前
幣需APP 項目眾籌正式開始
幣需APP客戶端包含,會員注冊,登錄可以直接將比特幣兌換外網的其他虛擬幣(目前上線16種國外的虛擬幣) 不需要會員翻墻去國外網站購買,APP 包含一鍵兌換,各虛擬幣錢包 幣需APP國內首款比特幣與國外交易平臺的中轉站,用戶可以自行選擇。
目前屬于內部眾籌, 眾籌比特幣地址 19YxeEuBiNJUtxzJegscsTtkwEX6xrioKt 最低0.1BTC,時間截至到10.30日。
眾籌會員享有:
1: 眾籌的比特幣數量 直接充值到會員APP,用戶可以參與內測體驗,兌換外幣,交易,提現等一系列的體驗,收益年利率達48%(以等值比特幣方式發放)。
2:眾籌會員 享受幣需股權分配, APP軟件將開通股權積分的交易(股權積分也可以兌換比特幣等虛擬幣)
3:參與眾籌的會員,請將打款的比特幣地址,以及參與眾籌的比特幣數量,以及個人聯系方式 發送到1991999002@qq.com,我們將有專人一對一電話。
+1 +1
0? 0
我要點評
專欄作者
Author Image
tan90d
機械神教和比特神教信徒。前者給我生活,后者給我理想。(希望你們留有一個錢包,存上少量的比特幣并長期持有——私房錢總是在最關鍵的時候能幫上大忙。)
Ta的專欄 Ta的評論 新浪微博 微信號
Copyright?2011-2020 · 巴比特 · 署名-非商業性使用-相同方式共享(BY-NC-SA 3.0 CN) · 滬ICP備11034946號-1? 浙公網安備 33010602002085號 站長統計