科普一下比特幣的區(qū)塊鏈是什么,老手們可以直接跳過這一部分了。這里說的比特幣,是2017年8月以前的比特幣,后來(lái)分為了 有隔離見證的BTC 和沒有隔離見證的 BCH 兩條鏈。下面會(huì)有不少看起來(lái)很專業(yè)的東西,不過請(qǐng)放心,我不是專業(yè)的程序員,不會(huì)講太深的。稍微理解一點(diǎn)比特幣的架構(gòu)和轉(zhuǎn)賬的方法,對(duì)理解隔離見證的騙局很有幫助。比特幣鏈條大概是長(zhǎng)這個(gè)樣子:
我們可以看到幾個(gè)區(qū)塊(Block),可以看到每個(gè)區(qū)塊都有兩個(gè)部分:一部分是虛線畫出來(lái)的 Prev.block 指向上一個(gè)區(qū)塊,這部分我們叫它“區(qū)塊頭”,另外一部分是“區(qū)塊主體” Transaction,即這個(gè)區(qū)塊里交易的信息。由于每個(gè)區(qū)塊頭都指向上一個(gè)區(qū)塊的頭,所以這個(gè)系統(tǒng)我們叫他區(qū)塊鏈。再詳細(xì)點(diǎn)看這個(gè)區(qū)塊頭:
Prev-Hash 是上一個(gè)區(qū)塊的這4個(gè)信息合起來(lái)的Hash 結(jié)果,Timestamp 是目前的時(shí)間,有這兩個(gè)的限制,礦工至少要收到上一個(gè)區(qū)塊的區(qū)塊頭,才能開始挖下一個(gè)區(qū)塊。Tx_Root 是這個(gè)區(qū)塊的主體里所有交易的Merkle Root,如果有任何一個(gè)交易被改變,這個(gè) Tx_Root 就會(huì)有變化。 如此,比特幣的區(qū)塊形成了一條不能被更改的鏈:加入這個(gè) Block11里面的 Tx1被改變了,那他上面的 Hash1就會(huì)變,Tx_Root 也就變了,這樣 Block11的4個(gè)信息合起來(lái)的 Hash 結(jié)果會(huì)不一樣,就和 Block12的 Prev_Hash 斷開了,Block12就無(wú)效,以此類推。
支付腳本
區(qū)塊鏈里的交易,大概可以理解為是 “A 地址轉(zhuǎn)給 B 地址 xx 個(gè)幣”,“B 地址轉(zhuǎn)給 C 地址 xx 個(gè)幣”這樣的信息。如果 C地址收到了 xx 個(gè)幣,但沒有往外轉(zhuǎn),那這就會(huì)在 UTXO 數(shù)據(jù)庫(kù)里記一條:“C 地址還有 xx 幣沒花掉”。假如 C 地址是普通的1打頭的比特幣地址,要花掉這筆錢,就需要用到一個(gè)腳本,這個(gè)腳本是“B 地址轉(zhuǎn)給 C 地址 xx 個(gè)幣”時(shí)規(guī)定的,定了這筆錢要怎么才能被C 地址花掉。一般這個(gè)腳本是這樣的兩部分
scriptPubKey部分: OP_DUP OP_HASH160 《pubKeyHash》 OP_EQUALVERIFY OP_CHECKSIG
scriptSig部分: 《sig》 《pubKey》
不會(huì)編程的朋友請(qǐng)不要害怕,不難看懂的。scriptPubKey部分有幾個(gè)“操作碼”,是 OP 打頭的,表示幾種操作。《pubKeyHash》就是比特幣地址的中間部分,不帶開頭的版本號(hào)1和末尾的幾位校驗(yàn)碼,這部分是對(duì)公鑰進(jìn)行 Hash 的結(jié)果。scriptSig部分要由想轉(zhuǎn)賬的這個(gè)人提供,公鑰《pubKey》,和用私鑰對(duì)這筆交易的簽名《sig》。由私鑰可以推導(dǎo)出公鑰,公鑰可以推導(dǎo)出比特幣的地址,這兩個(gè)步驟都不能反推(在當(dāng)今科技下)。如果一個(gè)人可以展示私鑰對(duì)這筆交易的簽名,又可以提供這個(gè)地址的公鑰,那我們就相信這筆轉(zhuǎn)賬是他授權(quán)的,別人偽造不了。礦池收到了提供的交易,和交易的簽名,要怎么驗(yàn)證呢?就是運(yùn)行一遍上面的腳本,看看結(jié)果是不是“True”。如果結(jié)果是 True 那就算通過了。首先要把scriptSig里的東西“堆”起來(lái),形成一個(gè)“堆?!保?/p>
《pubKey》
《sig》
然后,就一個(gè)一個(gè)地執(zhí)行scriptPubKey部分。先是一個(gè) OP_DUP,這個(gè)是復(fù)制操作,這些操作都是對(duì)著堆棧的頂部操作。所以復(fù)制操作后堆棧變成了:
《pubKey》
《pubKey》
《sig》
然后是一個(gè) OP_HASH160,是 Hash160算法的操作,把堆棧頂部的《pubKey》變成了《pubKey Hash1》:
《pubKeyHash1》
《pubKey》
《sig》
然后是《pubKeyHash》,把這個(gè)推進(jìn)堆棧:
《pubKeyHash》
《pubKeyHash1》
《pubKey》
《sig》
然后是OP_EQUALVERIFY,是檢查是否相等的操作,對(duì)著堆棧頂部的兩個(gè)元素進(jìn)行。如果提供的《pubKey》是沒錯(cuò)的話,應(yīng)該是一樣的,操作后堆棧變成了:
《pubKey》
《sig》
最后一個(gè)操作碼是OP_CHECKSIG,檢查這個(gè)簽名《sig》和公鑰《pubKey》是不是對(duì)的上,如果沒問題,堆棧就清空了。任何一步出問題都會(huì)造成腳本報(bào)錯(cuò),如果沒出錯(cuò),那腳本結(jié)果是 True,表示通過。
腳本能用的操作碼還有很多,可以進(jìn)行 if,else,add,sub,drop,swap等等等等。比如,B 地址給 C 地址轉(zhuǎn)賬的時(shí)候,在剛才的腳本開頭,加上一個(gè)《expiry time》和一個(gè)操作碼 OP_CHECKLOCKTIMEVERIFY,就可以制造一筆凍結(jié)款,C 地址里的這筆錢要經(jīng)過特定時(shí)間后才能花,在到期之前OP_CHECKLOCKTIMEVERIFY會(huì)讓腳本驗(yàn)證失敗。
據(jù)“2009年就開始參與比特幣開發(fā)”的 Craig Wright 的說法,如果有足夠的操作碼,比特幣系統(tǒng)也是圖靈完備的,也可以運(yùn)行ETH 那樣的智能合約。但是,許多操作碼在2013年被 Core 禁用了(因?yàn)?Core 開發(fā)者看不懂那些操作碼有什么用),對(duì)腳本的限制也更多。BCH 在2018年的開發(fā)路線圖里就包含了修復(fù)操作碼設(shè)計(jì)的部分。
如果,B 地址給 C 地址轉(zhuǎn)賬的時(shí)候,把腳本搞成這樣:
scriptPubKey部分: 留空
scriptSig部分: OP_TRUE
那這個(gè)腳本就是永遠(yuǎn)都可以通過的,不需要提供任何信息。這筆錢誰(shuí)來(lái)轉(zhuǎn)出,怎么轉(zhuǎn)出都是有效的,我們稱這錢現(xiàn)在是 anyone-can-spend。這筆錢等于就是給了礦池,因?yàn)榈V池最終決定誰(shuí)的交易可以被打包進(jìn)塊。如果有人把自己的錢轉(zhuǎn)入這么一個(gè) anyone-can-spend地址,礦池肯定會(huì)把這筆錢打給自己。
這個(gè)anyone-can-spend的腳本,就是隔離見證(Segwit)的基礎(chǔ)。用這個(gè)腳本,轉(zhuǎn)賬的時(shí)候就不用在區(qū)塊里提供簽名了,簽名被“隔離”到了區(qū)塊鏈以外,故名“隔離見證”。雖然簽名挪了地方,但是轉(zhuǎn)賬的話簽名還是要給的,不然豈不是亂轉(zhuǎn)賬了。其實(shí),用戶該發(fā)送的信息沒有少,礦池要驗(yàn)證的信息也沒有少,區(qū)別只是在區(qū)塊鏈里存的信息少了。由于區(qū)塊被設(shè)置了1MB 上限,并且已經(jīng)堵滿了,如果交易在區(qū)塊里占的空間小一點(diǎn),就能多擠幾個(gè)交易進(jìn)這個(gè)1MB 塊。隔離見證技術(shù)被吹噓有1.7 x 的擴(kuò)容效果,如果所有人的交易都用這種 anyone-can-spend的格式的話?,F(xiàn)在問題來(lái)了,這樣把簽名信息挪出區(qū)塊鏈,有什么好處?為什么不直接把1MB 上限放寬到2MB 呢?
軟硬分叉之爭(zhēng)
如上的疑問,就是擴(kuò)容軟硬分叉之爭(zhēng)。因?yàn)?Segwit 是一個(gè)所謂的軟分叉,而提高區(qū)塊大小會(huì)是一個(gè)硬分叉。在之前的文章里已經(jīng)說過,其實(shí)這里面軟硬分叉之爭(zhēng)是個(gè)表象,本質(zhì)上是路線之爭(zhēng):普及后,比特幣是流通的幣,還是流通幣的結(jié)算層;是流通的幣更去中心,還是結(jié)算層更去中心。軟硬分叉其實(shí)都只是技術(shù)手段而已,真正最后的結(jié)果還是被人所控制的。
涉及到“共識(shí)層”的修改,就會(huì)形成“分叉”。共識(shí)的運(yùn)行其實(shí)是兩個(gè)半層面,一層是在有算力的節(jié)點(diǎn)(礦池),第二層是沒有算力的全節(jié)點(diǎn),還有簡(jiǎn)單支付驗(yàn)證的輕錢包 SPV 我們算半層。軟分叉的特點(diǎn)是“舊版軟件還能認(rèn)新共識(shí)”。硬分叉是“舊版軟件不認(rèn)可新版軟件”。我們用下面一張圖來(lái)看軟硬分叉的情況。
?
在 Block8區(qū)塊之后,系統(tǒng)從 V1軟分叉升級(jí)到 V2,這時(shí):
算力層:
運(yùn)行 V2的礦工(大多數(shù)算力)認(rèn)為最長(zhǎng)的有效鏈?zhǔn)巧厦娴倪@一條。
運(yùn)行 V1的礦工(少量未升級(jí)算力)也認(rèn)為最長(zhǎng)的有效鏈?zhǔn)巧厦娴倪@一條,會(huì)放棄掉自己的 Block9(V1)形成孤塊,因?yàn)樗皇亲铋L(zhǎng)了。而 V1礦工挖出的舊版本塊不會(huì)被 V2礦工承認(rèn),這樣,V1礦工不升級(jí),就面臨著不被承認(rèn)的境況,礦機(jī)白白浪費(fèi)電。
全節(jié)點(diǎn)層:
運(yùn)行 V1和V2的全節(jié)點(diǎn)(無(wú)算力)都認(rèn)為最長(zhǎng)的有效鏈?zhǔn)巧厦娴倪@一條。V1節(jié)點(diǎn)因?yàn)闆]有礦機(jī)而無(wú)經(jīng)濟(jì)損失。
SPV 層:
運(yùn)行V1和V2的 SPV錢包都認(rèn)為最長(zhǎng)的有效鏈?zhǔn)巧厦娴倪@一條。
總結(jié)來(lái)看,軟分叉時(shí),只要挖礦的節(jié)點(diǎn)需要升。如果不升級(jí),會(huì)有經(jīng)濟(jì)損失。
對(duì)比一下,系統(tǒng)從 V1硬分叉升級(jí)到 V2,這時(shí):
算力層:
運(yùn)行 V2的礦工(大多數(shù)算力)認(rèn)為最長(zhǎng)的有效鏈?zhǔn)巧厦娴倪@一條。
運(yùn)行 V1的礦工(少量未升級(jí)算力)認(rèn)為最長(zhǎng)的有效鏈?zhǔn)窍旅娴倪@一條,上面一條雖然長(zhǎng)但是無(wú)效。這樣,V1礦工不升級(jí),就會(huì)和 V2形成兩條并行的鏈。
全節(jié)點(diǎn)層:
運(yùn)行 V2的節(jié)點(diǎn)(無(wú)算力)認(rèn)為最長(zhǎng)的有效鏈?zhǔn)巧厦娴倪@一條。
運(yùn)行 V1的節(jié)點(diǎn)(無(wú)算力)認(rèn)為最長(zhǎng)的有效鏈?zhǔn)窍旅娴倪@一條,上面一條雖然長(zhǎng)但是無(wú)效。
SPV 層:
如果這個(gè)硬分叉是擴(kuò)容1M到2M 的話,由于 SPV 錢包不檢查容量限制,所以不會(huì)因?yàn)槿萘慷心虫湡o(wú)效。運(yùn)行V1和V2的 SPV錢包都認(rèn)為最長(zhǎng)的有效鏈?zhǔn)巧厦娴倪@一條。如果這個(gè)硬分叉修改了挖礦算法或者難度調(diào)節(jié)算法,那么 SPV 節(jié)點(diǎn)也會(huì)依新舊版本各自認(rèn)各自的鏈。
總結(jié)來(lái)看,硬分叉時(shí),不只要挖礦的節(jié)點(diǎn)需要升級(jí),不挖礦的節(jié)點(diǎn)也要升級(jí),SPV看情況, 可能可以不用升級(jí)。如果一部分算力不升級(jí),會(huì)被拆成互相不能轉(zhuǎn)賬的兩種幣,像現(xiàn)在的 BTC 和 BCH 一樣。
這么看,軟分叉是不是比硬分叉來(lái)得安全呢?如果擔(dān)心有人因?yàn)椴恢来蠹疑?jí),或忘記及時(shí)升級(jí)的話,看起來(lái)軟分叉可以預(yù)防比特幣被莫名其妙分為兩個(gè)幣。但這種情況是不存在的好么?現(xiàn)在算力都在幾個(gè)礦池手里,只要提前幾個(gè)星期通知一下大家做好準(zhǔn)備,完全不會(huì)出現(xiàn)“忘記升級(jí)”這種事。能出現(xiàn)“忘記升級(jí)”的只能是普通用戶,普通沒有算力的用戶,對(duì)系統(tǒng)的運(yùn)行也沒有影響。BCH 上的 DAA 硬分叉(把難度調(diào)節(jié)算法更改為逐塊調(diào)整)已經(jīng)非常好地展示了這樣的硬分叉,對(duì)普通用戶的使用并不構(gòu)成障礙。我們平時(shí)使用其他軟件,也經(jīng)常面臨著不升級(jí)一下登陸不進(jìn)去這樣的情況,并不是什么要命的事情。Core 開發(fā)組一直在妖魔化硬分叉,表示硬分叉會(huì)造成比特幣分裂為兩種幣,影響市場(chǎng)穩(wěn)定。其實(shí)有分歧造成的硬分叉攔不住(BCH 分離出來(lái)),沒分歧的硬分叉升級(jí)沒危險(xiǎn)(BCH 難度算法調(diào)整),無(wú)視路線分歧硬說軟分叉安全是沒有理由的。
軟硬分叉之爭(zhēng)的結(jié)局:中間派的失敗
在大家對(duì)硬分叉的安全性有質(zhì)疑的時(shí)候,中間派試圖用“合并分叉”這樣的手段來(lái)調(diào)解。大致手法就是先用大家都認(rèn)可安全的軟分叉從 V1升級(jí)到 V1.5,然后在 V1.5里預(yù)埋硬分叉到 V2 的代碼。這樣,如果是有算力“忘記升級(jí)”,他的 V1會(huì)在升級(jí)到 V1.5的時(shí)候被孤立,但不會(huì)立刻形成2種幣。等到 V1.5到 V2進(jìn)行硬分叉升級(jí)的時(shí)候,由于是預(yù)埋的代碼,自動(dòng)運(yùn)行的,不會(huì)“忘記”。沒有鄙視程序員的意思,這是一種典型的“程序員思維”。軟件是死的,人是活的。如果人要搞事情,用代碼是限制不住的。
中間派的最后運(yùn)行的方案是 Segwit2x 方案,合并分叉 Segwit 和2M 這兩個(gè)升級(jí),前一個(gè)是軟分叉,后一個(gè)是硬分叉。這個(gè)方案在紐約得到了超過83%的算力的支持,紐約會(huì)議之后,中國(guó)礦業(yè)又內(nèi)部約定:大家都運(yùn)行 Segwit2x 的軟件,這個(gè)軟件預(yù)埋了代碼,在 Segwit 激活后90天,自動(dòng)激活2M 的升級(jí)。問題就來(lái)了,你如何知道別人運(yùn)行的軟件和你是一樣的?除非是黑進(jìn)礦池的服務(wù)器去,否則從外部完全不能判斷別人會(huì)不會(huì)在3個(gè)月后進(jìn)行2M 分叉。雖然代碼是寫了,但別人可以運(yùn)行別的版本的軟件,可以把那幾行刪掉,改掉,外人無(wú)從得知。反擴(kuò)容派是傾向于要 Segwit而不要2M,中間派是為了要2M 愿意妥協(xié) Segwit。當(dāng) Segwit 激活 以后,中間派沒法靠這2行代碼來(lái)逼反擴(kuò)容派進(jìn)行2M 升級(jí),分裂成2種幣的結(jié)局依然是難免的。最后結(jié)果大家也看到了,中間派認(rèn)慫取消掉了2M 硬分叉的計(jì)劃。
從2016以來(lái),為了不讓比特幣分成兩種幣,大家花了那么多的時(shí)間在開會(huì)談判上,現(xiàn)在才明白過來(lái):如果路線有分歧,沒有技術(shù)手段可以防止比特幣分成兩種幣,也沒有技術(shù)手段可以督促其他方面參與或不參與一個(gè)硬分叉。
隔離見證軟分叉(Segwit)的危險(xiǎn)
前面我們提到,隔離見證是一個(gè)軟分叉,舊版依然可以兼容,在升級(jí)的時(shí)候可以預(yù)防“因?yàn)橥浬?jí)而亂套”。這可以算一個(gè)非常模糊的優(yōu)點(diǎn),具體有沒有用是很值得懷疑的。相比之下,這軟分叉的缺點(diǎn)就要嚴(yán)重得多。還是畫個(gè)圖看一下:
從 Block7開始,系統(tǒng)加入了 Segwit 的功能。前面介紹腳本的段落里已經(jīng)介紹過這種 anyone-can-spend 的地址,假如 Block7里一個(gè) Segwit 交易,把幣發(fā)到了一個(gè)任何人都可以花的地址 C 里面,簽名放在了外面。假設(shè) C 地址的擁有者,打算在 Block8把錢花出去,發(fā)送幣給地址 D,誠(chéng)實(shí)的礦工會(huì)驗(yàn)證C用戶的簽名,安全性基本和以前是一樣的。這里,讀者可以可以看到,“這筆錢是不是 C 的”這個(gè)問題,要靠 Block7下面掛著的那個(gè)小塊 sig來(lái)回答。如果僅看Block7的信息,得出的結(jié)論會(huì)是“這筆錢是無(wú)主的隨便撿”。
眾所周知這個(gè) Segwit 功能是一個(gè)軟分叉,也就是說舊版軟件依然會(huì)承認(rèn) Segwit 版發(fā)出來(lái)的塊,不用升級(jí)。舊版的軟件根本就看不到 這個(gè)小塊 sig。舊版錢包軟件(全節(jié)點(diǎn)或 SPV 錢包)看到這筆錢就是無(wú)主的,任何人都可以花的。好在算力一層是必須全部升級(jí)的,舊版錢包軟件如果提出要轉(zhuǎn)走這筆錢會(huì)被所有算力拒絕,只能眼睜睜地看著錢在那里無(wú)主地放著。舊版錢包不能正確地獲得交易信息,僅僅是驗(yàn)證機(jī)制被繞過了,無(wú)法發(fā)現(xiàn)交易模型已經(jīng)改變了。前面我們介紹過,區(qū)塊鏈的一個(gè)特點(diǎn)就是,后一個(gè)區(qū)塊依賴前一個(gè)區(qū)塊的區(qū)塊頭里的信息,如果修改一筆交易,區(qū)塊頭會(huì)變化,會(huì)造成整個(gè)鏈條的失效??墒乾F(xiàn)在 Segwit 的“外掛見證塊”并不在這個(gè)鏈條里面,修改 sig 里面的內(nèi)容是不會(huì)使鏈條失效的。如果我有算力,但不是 C 地址的擁有者,我無(wú)法提供地址 C 的簽名,但我把地址 C 的錢轉(zhuǎn)給自己,這個(gè)塊一定會(huì)被其他礦池拒絕掉,因?yàn)樗麄凃?yàn)證了 sig 發(fā)現(xiàn)我并沒有資格動(dòng)這筆錢??墒桥f版錢包(全節(jié)點(diǎn)或 SPV 錢包),和新版的 SPV 錢包(不驗(yàn)證和自己不相關(guān)的交易,只接收區(qū)塊頭),都不會(huì)發(fā)現(xiàn),他們只會(huì)跟隨最長(zhǎng)的塊,sig 的內(nèi)容不影響有效與否。
因此,Segwit 帶來(lái)了一種新型的51%攻擊。這種攻擊我在之前的一篇回答里介紹過:
一般幣的51%攻擊:我在高度12345上發(fā)布一個(gè)交易,從 A 地址到 B 地址發(fā)送1000比特幣。同時(shí)我用自己的壓倒性的算力,重新挖出一條12344-12345-12346的鏈,不包含剛才的交易。這樣 B 一開始以為我付款了,后來(lái)我付款的那個(gè)塊被孤立了,最終成型的最長(zhǎng)鏈里不包含我的支付。這也是為什么各大交易所都要求3個(gè)確認(rèn),6個(gè)確認(rèn),就是防止出現(xiàn)你發(fā)送幣給交易所的交易被孤立。一般認(rèn)為6個(gè)確認(rèn)后就幾乎不會(huì)出問題了。小額支付(幾萬(wàn)美金以內(nèi))經(jīng)常1確認(rèn)甚至0確認(rèn)(塊不滿的時(shí)候)也可以,因?yàn)閷?duì)于小額交易你沒有經(jīng)濟(jì)動(dòng)力去攻擊。小額沒賺頭,大額肯定會(huì)要求多個(gè)塊的確認(rèn)很難做到,也沒賺頭,并且攻擊窗口就是交易發(fā)布后的那一兩個(gè)小時(shí),過去了就沒法攻擊了。所以至今比特幣沒有發(fā)生過真正意義上的 51%攻擊。
SW 幣的51%攻擊:Segwit交易帶來(lái)了“AnyOneCanSpend”地址,它實(shí)質(zhì)上是一個(gè)空白的交易簽名。這種交易的簽名被挪移到了附加的見證塊里,因此這個(gè)技術(shù)叫做“隔離見證”。當(dāng)然,雖然這個(gè)交易的簽名不在這里,礦池肯定還是會(huì)去附加的見證塊里找出來(lái)核對(duì)驗(yàn)證。在大家都核對(duì)驗(yàn)證的情況下,安全性和以前是一樣的。控制算力超過50%的礦霸礦池,可以直接放棄附加見證塊的核對(duì),并把AnyOneCanSpend地址里的錢轉(zhuǎn)給自己,然后孤立那些去核對(duì)見證塊的礦池。由于 Segwit 是軟分叉升級(jí),原來(lái)的那些沒有 Segwit 功能的 SPV 錢包和全節(jié)點(diǎn)錢包還是可以用的,這些錢包也沒有核對(duì)附加見證塊的能力,這時(shí)候這些錢包都會(huì)認(rèn)為礦霸的鏈?zhǔn)呛戏ǖ淖铋L(zhǎng)鏈。和一般幣的51%攻擊巨大的區(qū)別就是:一般幣的51%攻擊只能退回自己的一筆支付,而SW 幣的51%可以花掉別人賬上的錢,而且這錢的數(shù)字是從 SW 激活起慢慢積累變多的。SW 運(yùn)行的越久,SW 交易運(yùn)用的越多,這筆錢的數(shù)量也就越大,有動(dòng)力攻擊的算力也就越容易找。參考資料:Risk of SegWit - Mining Cartels - nChain
軟分叉可以在不驚動(dòng)普通用戶的情況下偷偷進(jìn)行,上 Segwit 功能是軟分叉,關(guān)閉 Segwit 功能也是軟分叉,也可以偷偷地進(jìn)行。一旦使用了 Segwit 功能,把幣放在了AnyOneCanSpend地址里,就只能信任51%的算力不會(huì)去進(jìn)行關(guān)閉 Segwit 功能的軟分叉。如果不使用 Segwit 功能,把幣放在“經(jīng)典”的1字頭地址里面,任何軟分叉都不能讓你失去這幣,除非有絕大部分算力針對(duì)你的存幣地址發(fā)動(dòng)一個(gè)硬分叉,才能把這個(gè)地址里面的錢轉(zhuǎn)給別的地址。顯然這種硬分叉是無(wú)法成為主流的,估計(jì)中本聰也得不到這種待遇。放在1字頭地址里的幣就是你的幣,只有你可以轉(zhuǎn)走賣掉,別人都不行。放在 Segwit 地址里的幣,就要看礦業(yè)有沒有誠(chéng)信了,如果超過51%的算力發(fā)動(dòng)取消 Segwit 的軟分叉,剩下的49%里必須有算力主動(dòng)發(fā)起硬分叉才能甩脫51%算力的最長(zhǎng)鏈,保住你的幣??墒?目前 Segwit 鏈的座右銘就是“We don’t hard-fork”,是不是有點(diǎn)尷尬?
有人會(huì)說,51%算力發(fā)起關(guān)閉 Segwit 功能的軟分叉是不可能做到的事情。這點(diǎn)我同意,但是也許你不需要51%算力來(lái)做到這事。如果我是搗亂礦池,占5%算力,我挖出一個(gè)塊以后,簽名 部分拖延1分鐘再發(fā)出去,其他礦池敢不敢再這1分鐘里以我這個(gè)塊為基礎(chǔ)挖下一個(gè)塊?如果挖,一分鐘以后收到 簽名 的內(nèi)容可能會(huì)發(fā)現(xiàn)這個(gè)塊里有非法的交易,這一分鐘就白挖了。如果不挖,一分鐘以后 簽名 內(nèi)容是正常的,就浪費(fèi)了一分鐘。我只要用5%的算力搗亂,每天出幾個(gè)塊,就足以逼很多礦池修改自己的軟件設(shè)定,在收到簽名前就開始挖礦。搗亂礦池可以把 簽名 漸漸拖更久,比如10分鐘后才發(fā),很少的算力就可以把嚴(yán)格驗(yàn)證 簽名搞成成本挺高的事情。不驗(yàn)證簽名的礦工收益更高,這在 Segwit 以前的比特幣上是不可能發(fā)生的事情,如今可能了。如果有30%的算力不驗(yàn)證附加的簽名塊,那我只要21%的算力就可以發(fā)動(dòng)上述的 Segwit 獨(dú)有的51%攻擊了。
隔離見證軟分叉(Segwit)無(wú)法擴(kuò)容
Core的開發(fā)者一直在宣傳,說 Segwit 可以帶來(lái)1.3x,后來(lái)又說1.7x,又四舍五入到2x 的擴(kuò)容效果。從交易數(shù)來(lái)看,2017年8月中旬激活 Segwit 以來(lái),每個(gè)塊的交易數(shù)勉強(qiáng)突破了之前的高點(diǎn)2250,連1.1x 的擴(kuò)容效果也沒有。每個(gè)塊2000+筆的交易能力是不夠的,必須盡快改進(jìn),這一點(diǎn)上各派都沒有異議。Core 的開發(fā)者現(xiàn)在已經(jīng)不提“ Segwit 有立竿見影的擴(kuò)容效果”這話了,著重宣傳閃電網(wǎng)絡(luò)?!靶☆~交易走閃電幾乎零手續(xù)費(fèi),大額結(jié)算上主鏈五十美金一筆”,這已經(jīng)是 Core 支持者的信仰宣言。
第二層交易網(wǎng)絡(luò)
我們來(lái)簡(jiǎn)單對(duì)比一下BCH 的“傳統(tǒng)”單層模型,和閃電網(wǎng)絡(luò)的第二層模型。
手續(xù)費(fèi)方面:
以50美金一筆手續(xù)費(fèi)的大額結(jié)算來(lái)計(jì)算(50美金就是今天的手續(xù)費(fèi)水平),閃電網(wǎng)絡(luò)開閉通道各需要一次交易,就是100美金的成本(閃電節(jié)點(diǎn)的成本沒有計(jì)入)。如果平均每個(gè)通道結(jié)算時(shí)已經(jīng)發(fā)生過1000筆交易,那每個(gè)交易的成本為10美分,勉強(qiáng)還屬于比較低的手續(xù)費(fèi)水平。要什么樣的通道才能1000筆結(jié)算一次呢?以我的想象力,我只能想到這個(gè)是支付寶,銀行或者地下錢莊的模型,把我的幣充值鎖進(jìn)去慢慢花。交易所等機(jī)構(gòu)之間大概更有用一些,對(duì)于普通用戶其實(shí)是毫無(wú)作用。
按照每個(gè)塊開閉2000次閃電網(wǎng)絡(luò)通道(1M 的極限),每個(gè)通道1000筆交易來(lái)算,BCH 的模型里,1000000筆交易差不多也就是500MB 區(qū)塊。nChain 已經(jīng)和 BitcoinUnlimited 聯(lián)合測(cè)試過1GB 區(qū)塊,并沒有很科幻。
安全方面:
Segwit 的安全性問題已經(jīng)是一個(gè)很好的反例了。區(qū)塊鏈,或者說a chain of digital signatures,是中本聰?shù)慕茏?,也是比特幣和支付寶,銀行,信用卡的根本區(qū)別。在比特幣,現(xiàn)在的 BCH 里,沒有私鑰誰(shuí)也沒法挪動(dòng)你的錢,你必須有私鑰才能把錢挪動(dòng)到指定的地方。閃電網(wǎng)絡(luò)雖然已經(jīng)宣稱進(jìn)行過多輪測(cè)試,但“怎么保證通道內(nèi)的交易公正不被修改”這個(gè)問題,依然沒有清楚的回答。如果有哪位朋友有好的資料能夠提供,不勝感激。從我目前的理解是,閃電通道內(nèi)基本還是充值卡的模型,外加了通過多次交換簽名來(lái)讓雙方對(duì)余額有共識(shí),但如果雙方有意或無(wú)意對(duì)余額有分歧,需要由 閃電節(jié)點(diǎn)來(lái)裁決。Segwit 的問題又出現(xiàn)了:有人可以在沒有你的數(shù)字簽名的情況下挪動(dòng)你的錢。
安全方面,這一篇文章值得看看:https://news.bitcoin.com/lightning-network-centralization-leads-economic-censorship/
技術(shù)方面:
剛剛其實(shí)都是我瞎編的,目前閃電網(wǎng)絡(luò)完全沒有如此大流量的公開測(cè)試,考慮到閃電通道內(nèi)多次反復(fù)交換簽名的設(shè)計(jì),同等硬件瓶頸下閃電網(wǎng)絡(luò)的交易容量堪憂。
結(jié)語(yǔ)
我在敲這篇文章的時(shí)候,BTC 正在瘋漲,BCH 和其他所有幣都被“抽血”而下跌。同時(shí),BTC 擁堵了17萬(wàn)筆交易沒有確認(rèn),單筆手續(xù)費(fèi)大約50美金。Steam 宣布放棄比特幣支付渠道,因?yàn)槭掷m(xù)費(fèi)太貴了沒法用了。Bitpay 宣布要投資支持比特幣以外的各種幣,也是因?yàn)槭掷m(xù)費(fèi)太高。
市場(chǎng)在短時(shí)間內(nèi)是不理智的,這個(gè)混亂時(shí)間點(diǎn)上暴漲暴跌都不稀奇。如果說再過十年,市場(chǎng)上主流的是哪種幣?一個(gè)挪動(dòng)困難,安全性堪憂的 BTC 真能保值十年嗎?如今 BTC 確實(shí)是有保值增值的功效,在過去幾年里任何一個(gè)時(shí)間點(diǎn),甚至過去幾個(gè)月的任何一個(gè)時(shí)間點(diǎn)買入,到今天都是大賺。暴漲總是有頭的,如果BTC 不再暴漲,失去了支付渠道和商家支持的 BTC 就沒有上新聞的能力了,在投資者的圈子里,不再暴漲的BTC也失去了增值保值的能力。如今加密貨幣都是新事物,嚴(yán)格意義上來(lái)說BTC 也還沒有進(jìn)入公眾視野,新聞里的 BTC 只有暴漲,沒有應(yīng)用。這兩年新入場(chǎng)投資加密貨幣的,都很少有只買 BTC 的了,都是 ETH等幣搭配著投資,在幣圈 BTC 都不是那么大眾化,終究是會(huì)淡出公眾視野,變得越來(lái)越小眾的。十年后能成為主流的幣,一定是接下來(lái)幾年能第一個(gè)真正進(jìn)入公共視野的幣,我猜這個(gè)幣是BCH。
評(píng)論
查看更多