從川普發(fā)推到孫哥道歉,最近圈子里出現(xiàn)很多“吸引眼球”的事件,但他們會(huì)對(duì)整個(gè)生態(tài)真的產(chǎn)生什么重大影響么?
我覺得未必,把時(shí)間維度拉長,技術(shù)的進(jìn)步才是關(guān)鍵的影響因素。
今天的文章是上周在Reddit熱度最高的帖子之一,它用很通俗的例子解釋了為什么比特幣需要閃電網(wǎng)絡(luò),以及比特幣支付是怎么逐漸進(jìn)步的。
1. 初代:中本聰殘破的nSequence 通道
中本聰雖然把產(chǎn)品做出來了,但中本聰?shù)陌姹荆òㄖЦ锻ǖ溃┩瓿傻膶?shí)在太糟糕。我們不得不自己動(dòng)手修復(fù)它,順帶增加了RBF作為附帶功能。
最開始的規(guī)則是如果A交易的輸入與B交易相同,且A的nSequence更大,那么內(nèi)存池會(huì)將會(huì)用A替換B。
0xFFFFFFFF是nSequence能夠取到的最大值,這會(huì)導(dǎo)致該筆交易被標(biāo)記為“最終交易”,且不能在內(nèi)存池中被替換掉。
nLockTime和nSequence正是“nSequence通道”有著如此奇怪規(guī)則的原因。nLockTime只能在nSequence小于0xFFFFFFFF時(shí)才能起作用。如果nSequence是0xFFFFFFFF,nLocktime就不會(huì)起作用。
舉一個(gè)簡單的例子:
1.你去一個(gè)酒吧,對(duì)酒保說你會(huì)在酒吧關(guān)門的時(shí)候結(jié)賬。因?yàn)槲覀兪窃诒忍貛庞钪?,時(shí)間是以區(qū)塊高度的形式被測(cè)量的,所以酒吧關(guān)門的時(shí)間是未來的某個(gè)區(qū)塊高度。
2.當(dāng)你喝第一杯酒時(shí),你會(huì)從你的資金里拿出一筆錢,進(jìn)行一筆交易付給酒保。這筆交易有一個(gè)起始為0的nSequence和一個(gè)nLocktime(相當(dāng)于酒吧的關(guān)門時(shí)間)。你創(chuàng)建這筆交易然后酒保給你酒。
3.如果你想多喝幾杯,你需要重新創(chuàng)建類似的交易,把要多付的錢加到給酒保的交易中(所以隨著酒錢的增加,交易的輸出也不斷變大),但是這筆交易的nSequence要比原來的那個(gè)增加1。
4.不管怎樣,最終你可能還是會(huì)因?yàn)閮蓚€(gè)原因離開酒吧:
(1) 酒吧關(guān)門了,nLockTime標(biāo)記的關(guān)門時(shí)間一到,酒保就可以廣播最新的交易,然后讓保安不客氣把你踢出門。
(2)你不想再喝酒傷肝了,所以你把最新交易的nSequence重簽成0xFFFFFFFF,也就是它能到的最大值。這讓酒保能夠立即拿到他的錢(如果nSequence為0xFFFFFFFF,nLocktine就不再起作用了),所以他就可以讓保安客氣的把你送出門。
這就是支付通道,它是通過創(chuàng)造一筆“最終”交易來關(guān)閉的,這筆交易包含此前的交易。這里當(dāng)然不存在rounting,因?yàn)橥ǖ朗菃蜗虻亩矣凶畲笊芷诘南拗啤5沁€是放過中本聰吧,他需要休息,那時(shí)他也正忙著發(fā)明比特幣呢。
還記得我說這種支付通道是殘破的么?
這是因?yàn)閮?nèi)存池規(guī)則不是共識(shí)規(guī)則,而且不能被驗(yàn)證(在內(nèi)存池中任何東西都不能在鏈上驗(yàn)證,每當(dāng)我聽到有人提出“讓我們根據(jù)內(nèi)存池的大小確定區(qū)塊大小吧!”我都要嘆氣,內(nèi)存池的狀態(tài)不能被鏈上的數(shù)據(jù)驗(yàn)證)。全節(jié)點(diǎn)并不能看到你簽名的 所有交易,只有帶有最大的nSequence的那筆交易才是真正在鏈上使用的。
所以你可以像下面這樣做:
1.成為吳忌寒的朋友,因?yàn)樗麚碛?1%以上的算力。
2.給吳忌寒一些你定的酒作為與你合作的獎(jiǎng)勵(lì)。比如說你定了一百杯酒,你和吳忌寒把酒分了,給他了50杯。
3.當(dāng)酒吧關(guān)門時(shí),吳忌寒讓他的礦機(jī)挖nSequence為0的那筆交易。就是那筆你只付了一杯酒錢的那筆交易。
4.因?yàn)槿?jié)點(diǎn)沒有辦法驗(yàn)證nSequence,它們會(huì)接受nSequence=0的版本然后確認(rèn),傻傻地把僅付了一杯酒的錢寫進(jìn)區(qū)塊鏈。
5.這個(gè)酒保被激怒了,從吧臺(tái)下面拿出一把槍,想把你和吳忌寒打死。
6.吳忌寒用他的魔法力量(其實(shí)是礦機(jī)的蒸汽)來讓子彈減速,結(jié)果子彈只是像風(fēng)吹花瓣一樣輕輕接觸了你一下。
7.酒保嘴里嘟囔著聽不清的話,突然他的衣服被撕開了,他真的變成了一頭熊!
8. 你盯著它,心里想著萊昂納多能從熊的爪子下活下來, 那你也能活下來,況且他只是一個(gè)有錢的演員而已,然后你擺好了姿勢(shì),嘴里喊著“吃我一招!”
9.有人能繼續(xù)幫我編下去么?
下面是知識(shí)點(diǎn):
1.遇到熊人非常糟糕。
2.你不能僅僅因?yàn)殚W電網(wǎng)絡(luò)不是鏈上的,就馬上否定它,然后啟用所謂的“中本聰版本”。
中本聰版本是一個(gè)帶有nSequence支付通道的半成品,在這個(gè)方案中鏈上交易代表著多個(gè)邏輯上交易款項(xiàng)的和,這幾乎和現(xiàn)代版本的鏈下技術(shù)做的一樣(先不管現(xiàn)代的鏈下技術(shù)到底是如何工作的)。nSequence(單指這個(gè)字段,不是指它現(xiàn)代意義上的意思)早在windows Alpha 0.1.0版本就存在了。
3.礦工完全能夠繞過內(nèi)存池規(guī)則。實(shí)際上,nSequence能夠變成一個(gè)可選的功能(RBF)是因?yàn)榈V工被nSequence系統(tǒng)激勵(lì)著一直遵守RBF規(guī)則罷了。
我的意思是,你給吳忌寒的酒,除了能是你給礦工挖特定版本的交易的手續(xù)費(fèi),還能是什么其他東西呢?
4.中本聰也會(huì)犯錯(cuò),最初的nSequence的設(shè)計(jì)就是其中之一。今天,我們不再這樣使用nSequence了。
改進(jìn)中本聰最初的版本是比特幣開發(fā)的一部分,因?yàn)殡S著時(shí)間的發(fā)展,我們學(xué)到了一些中本聰永遠(yuǎn)不會(huì)不知道的東西。中本聰是這項(xiàng)科技的一個(gè)里程碑。但是他永遠(yuǎn)不會(huì)是最后一個(gè),也不會(huì)是最重要的一個(gè),他會(huì)被歷史牢記,但也只是作為一個(gè)先行者的身份。
2. Spilman通道
Spilman通道是激勵(lì)兼容-限時(shí)型單向通道,實(shí)際上就是一種改進(jìn)版的中本聰通道。
現(xiàn)在,我們知道如果你想在交易通道上作弊,酒保會(huì)變成一頭熊咬你。而且我們知道你是吳忌寒的好朋友,酒保再也不會(huì)接受一個(gè)能夠讓顧客和礦工聯(lián)合起來騙人的支付通道方案。
好消息來了, Jeremy Spilman提出了一個(gè)新方案能夠讓顧客再也騙不到酒保了。首先,你和酒保進(jìn)行一個(gè)這樣的儀式:
1.你拿出一些資金,然后創(chuàng)造一筆注資交易付給一個(gè)你和酒保之間的2/2多重簽名地址。你現(xiàn)在不會(huì)廣播這筆交易:你只是進(jìn)行了簽名,得到了交易ID。
2.你再創(chuàng)造另一筆交易用來返還的上面資金。這筆交易有一個(gè)nLocktime,它的值是酒吧的關(guān)門時(shí)間再加上一個(gè)區(qū)塊高度。你給它簽名然后把這筆退款交易(但不是上面提到的那筆注資交易)給酒保。
3.酒保給退款交易簽名,然后又還給你。現(xiàn)在它就是合法的了,因?yàn)槟愫途票6己灻恕?/p>
4.現(xiàn)在你把第一筆交易廣播到鏈上。你和酒保等待這筆交易深度確認(rèn),然后你再開始消費(fèi)。
上面的步驟也許對(duì)閃電網(wǎng)絡(luò)用戶來說依稀有些熟悉。這是支付通道的資金創(chuàng)建過程!第一筆付給2/2多重簽名地址的交易是用來給通道提供資金的。
然后你開始像這樣買酒:
1.第一杯酒,你創(chuàng)建一個(gè)花費(fèi)注資交易(也就是第一筆交易)的輸出,把酒品的花費(fèi)發(fā)送給酒保,然后剩余的返還給你。
2.你給這筆交易簽名然后把它交給酒保,酒保就給你第一杯酒。
3.為了能再拿一杯酒,你要再創(chuàng)建一筆類似的交易,先新酒的錢加到之前給酒保的錢上,然后再把剩余的錢返回給你。你給這筆交易簽名又發(fā)給酒保,酒保就再給你一杯。
4. 到最后:
(1)如果酒店關(guān)門的時(shí)間到了,酒保就給最新的交易簽名,將需要的雙重簽名補(bǔ)全然后向比特幣網(wǎng)絡(luò)廣播這筆交易。因?yàn)橥丝罱灰椎氖菑V播的時(shí)間是關(guān)門時(shí)間+1,所以在關(guān)門以前它不能使用。
(2)如果你的肝受不了所以你想早走,你只需要告訴酒保關(guān)閉通道就好了(酒??梢栽谌魏螘r(shí)候廣播最新版本的交易來關(guān)閉通道,酒保不這樣做是因?yàn)橄M隳軌蚨啻粫?huì),多喝兩杯)。
(3)如果你僅僅是在酒吧里閑逛但是從來沒有買東西,這樣的話當(dāng)?shù)搅岁P(guān)門時(shí)間+1的時(shí)候你就廣播你的退款交易,拿回你全部的資金。
現(xiàn)在,即使你給吳忌寒50杯酒,你也不能讓他挖最開始的那筆交易(那筆交易只支付了一杯酒的錢),因?yàn)檫@是一筆2/2的多簽名地址但是它只有你自己的簽名。
你需要酒保的簽名讓這筆交易合法,但是他當(dāng)然不會(huì)這么傻,酒保不會(huì)給出自己的簽名讓舊版本的交易合法,自己得到更少的錢。
所以,問題被解決了是吧?解決了嗎?讓我們來試試吧。你拿到了你的資金,把他們放入一個(gè)注資交易中,弄好退款交易,確認(rèn)注資交易… …
一旦注資交易深度確認(rèn)完成,酒保意味深長的笑了。他叫來了保安,氣勢(shì)洶洶的盯著你。
“我拒絕給你服務(wù)”,酒保說。
“好吧,那我走好了”你面帶傻笑,“我會(huì)用退款交易拿回我的錢,然后在大眾點(diǎn)評(píng)上給你個(gè)大差評(píng)!”
“先別急”酒保說。他的聲音讓你背脊發(fā)冷,就像是他還記得你之前玩弄他的事,“瞧瞧剛才確認(rèn)的那筆注資交易的交易ID?!?/p>
“它咋啦?”你面無懼色的問道,說著你打開了你的筆記本電腦,然后找到了一個(gè)可靠的區(qū)塊鏈瀏覽器。
接下來的看到的東西把你嚇壞了。
“啥玩意?交易ID變了?!你他媽改了我的簽名??怎么可能?我把我唯一一份私鑰藏在了一個(gè)密封的信封里,然后把它放在一個(gè)神秘戈壁灘的保險(xiǎn)柜里,一群驍勇的游牧民族守護(hù)它,他們以自己兒女的鮮血起誓,要誓死捍衛(wèi)這份秘密!”
“難道你不知道?”酒保笑了?!昂灻麅H僅是非常大的數(shù)字。簽名中的一個(gè)標(biāo)記可以被改變,從正變到負(fù),或者從負(fù)變到正,但是簽名仍然是合法的。即使不知道私鑰,任何人都可以這么做。但是比特幣在生成交易ID時(shí)在其中包含了簽名,所以這一點(diǎn)小改變也讓交易ID改變。有人想把簽名從交易主體中分離出去,他們說這樣簽名延展性(signature malleability)就不再會(huì)影響到交易ID了,但是我打賭我可以讓我的好哥們吳忌寒拖延這個(gè)’Sepsig’(分離簽名)計(jì)劃好長時(shí)間。
吳忌寒是個(gè)好人,只要我給他51杯啤酒,他就愿意挖那筆改動(dòng)了的交易”他笑得更開心了“恐怕你的退款交易不會(huì)起作用了,因?yàn)樗牖ǖ哪莻€(gè)交易ID根本不存在。
好吧,讓我們來談?wù)劙?。你把你注資交易里99%的資金給我,作為交換,我會(huì)給你在鏈上的那筆交易簽名。如果拒絕,那你一毛不剩。但是我和所有的HODLer都會(huì)因?yàn)榱魍ㄓ譁p少了一些歡呼雀躍。接受這筆交易你可以剩1%的錢。如果你拒絕我,我也分毫不會(huì)損失,好好考慮一下吧!”他的眼睛發(fā)著貪婪的光。
學(xué)到什么嗎?
(1)報(bào)復(fù)行為很糟糕。
(2 )交易延展性更糟糕。這就是我們?yōu)槭裁匆诟綦x見證里修復(fù)這個(gè)bug的原因。MtGox宣稱他們就是被這種漏洞攻擊了,有人一直搞亂他們交易的簽名,導(dǎo)致他們資金去向被重復(fù)提款,但是修復(fù)交易延展性更主要的是為了支持支付通道。
(3) 把簽名包括進(jìn)去取哈希,最終決定交易ID的設(shè)計(jì)是一個(gè)錯(cuò)誤。中本聰犯了許多這樣的錯(cuò)誤。我們必須重申“中本聰并不是一個(gè)有著無限智慧的天龍人”。
3. CLTV保護(hù)型Spilman通道
使用CLTV做退款分支(branch)。
這和Spilman通道的區(qū)別是退款交易被退款分支給代替了。這種方案只有在2015年后OP_CHECKLOCKTIMEVERIFY(CLTV)被啟用才成為可能。
就像我們?cè)赟pilman通道里討論的那樣,交易延展性導(dǎo)致任何在鏈下被預(yù)注冊(cè)的交易都可以在注資交易未被確認(rèn)的時(shí)候通過改動(dòng)注資交易的簽名使預(yù)注冊(cè)的交易無效化。
這可以通過簡單地在比特幣腳本中把一些特殊的要求加到特定分支中來避免?,F(xiàn)在,退款分支可以為支付通道創(chuàng)造一個(gè)最大的生命周期,通過我們之前對(duì)OP_CHECKLOCKTIMEVERIFY的介紹,我們知道這只有在有一個(gè)預(yù)注冊(cè)的nLockTime的時(shí)候才是可行的。
通過CLTV,我們可以在你要支付的腳本中加入很多分支判斷使它能夠避免上面的問題。
為了設(shè)定好注資交易,你現(xiàn)在不必再向一個(gè)2/2地址付錢了,你現(xiàn)在要向一個(gè)腳本支付資金,這個(gè)腳本基本就相當(dāng)于一個(gè)一開始是2/2但經(jīng)過一段時(shí)間就變成單簽名的地址。這樣就不再需要預(yù)注冊(cè)的交易了。
你可以稍后使用任何已確認(rèn)注資交易的交易ID來創(chuàng)建你的退款交易。既然注資交易已經(jīng)被確認(rèn),所以也就不可能再更改交易ID了。
4. Todd微支付網(wǎng)絡(luò)
閃電網(wǎng)絡(luò)最直接的前輩就是由Peter Todd引入的hub-spoke模式。
在這種模式中,付款人和收款人并不直接聯(lián)系,付款人和收款人都連接上一個(gè)中心hub。
這就使得任何的付款人可以向任何的收款人使用在hub上的同一個(gè)支付通道付費(fèi)。相似的,它也允許任何的收款人從任何的付款人那里使用同一個(gè)通道收款。
還記得之前的Spilman的例子嗎?當(dāng)你向酒保打開一個(gè)通道后,你必須等待注資交易確認(rèn)。這可能會(huì)花費(fèi)一個(gè)小時(shí)的時(shí)間。再想象一下你需要和所有你要付款的人開通通道。這并不具備可拓展性。
所以hub-spoke模式有一個(gè)清算中心,用來將資金從付款人轉(zhuǎn)移到收款人。“Moonbeam”項(xiàng)目采取了這個(gè)模式。當(dāng)然,這個(gè)模式hub會(huì)知道誰是付款者和收款者,所以hub有審查交易的能力。當(dāng)然,通常hub更有效率的審查方式是不再維護(hù)它想審查的付款人和收款人的通道就好了(因?yàn)槿绻鹔ub不處理這筆交易那通道里的資金只能被鎖在里面毫無用處)。
擁有監(jiān)控支付的能力意味著hub可以販賣私人交易數(shù)據(jù)來牟利。在今天,這種對(duì)隱私的破壞是不能容忍的。
另一個(gè)值得注意的點(diǎn)是如果這樣的網(wǎng)絡(luò)真的被大規(guī)模推廣了,但是它只有單向的通道可以使用。但是一個(gè)人可能是付款人,也可能是收款人,你需要分別創(chuàng)建一個(gè)收款通道和付款通道。更糟糕的是,如果你想把錢從收款通道轉(zhuǎn)移到付款通道,你需要在鏈上把他們都關(guān)閉然后再開通一次。
5. Poon-Dryja閃電網(wǎng)絡(luò)
Poon-Dryja是雙向雙參與者通道。
Poon-Dryja通道的機(jī)制有兩個(gè)重要的改變:雙向且沒有時(shí)間限制。
最初的中本聰版本和Spilman變體都是單向的:這里存在不同的兩方,付款者和收款者,如果收款者想要退款,或者收款人想要買一個(gè)付款人的東西,他們也不能使用同一個(gè)通道。
Poon-Dryjam機(jī)制可以使通道變成雙向的,你不只是一個(gè)付款人或者收款人,只要你的對(duì)手方在線,你可以任意的收款和付款。
更進(jìn)一步講,不像是Spilman變體,通道沒有時(shí)間限制。你可以讓通道維持到你想要的任何時(shí)候。
這兩種特性,合在一起形成了一種大多數(shù)人都沒有意識(shí)到的強(qiáng)大的拓展性。在單向的支付通道中,你需要為收錢和付錢單獨(dú)開設(shè)一條通道。你需要定期的在鏈上執(zhí)行操作來“逆轉(zhuǎn)”支付通道的方向。其次,因?yàn)镾pilman通道有一個(gè)固定的生命周期,你必須周期性的關(guān)閉和重開通道。
有了雙向、無限生命周期的通道,可能你一生只需要進(jìn)行兩筆鏈上交易,一次在你開通通道時(shí),一次在你死后遺產(chǎn)分配時(shí)。這就是這種通道的強(qiáng)大之處。
我不會(huì)在去解釋Poon-Dryja雙向通道的交易結(jié)構(gòu),它很復(fù)雜,而且你還可以在其他地方找到簡單易懂的圖示來搞明白它的機(jī)制。
下面我們來講一下Poon-Dryja通道的一些人們常常忽視的缺點(diǎn)(因?yàn)檫@些缺點(diǎn)被完美的解決了)。
你必須存儲(chǔ)這個(gè)通道所有的撤銷密鑰。通道的每一次更新你都需要存儲(chǔ)一個(gè)撤銷密鑰,也就是說僅僅對(duì)一個(gè)通道來講,你需要在你的一生中存儲(chǔ)上百萬的密鑰,大小會(huì)到幾兆。
RustyReddit解決了這個(gè)問題,我們可以從一個(gè)種子密鑰開始生成所有的密鑰。每一個(gè)密鑰都是那個(gè)種子密鑰不斷重復(fù)的取SHA256。
比如,我告訴你我的第一個(gè)撤銷密鑰是SHA256(SHA256(seed))。你可以在O(1)中存儲(chǔ)它。等到下一次撤銷時(shí),我告知你撤銷密鑰是SHA256(seed)。從SHA256(seed)開始,你自己就可以計(jì)算SHA256(SHA256(seed))(也就是之前的撤銷密鑰)。所以你只需要記住最近的撤銷密鑰就可以了,你可以通過計(jì)算得出之前的每一個(gè)密鑰。當(dāng)你開通一個(gè)通道時(shí),你會(huì)在你的種子密鑰上執(zhí)行上百萬次SHA256,然后把最終結(jié)果作為第一次使用的撤銷密鑰,每當(dāng)你需要一個(gè)撤銷密鑰時(shí)你只需要去掉一層SHA256。RustyReddit還提出了一種效率很高的儲(chǔ)存結(jié)構(gòu)O(log n),shachain。如果出現(xiàn)狀況,你能夠很快的找到原來的撤銷密鑰。人們現(xiàn)在不再討論這個(gè)儲(chǔ)存問題了,因?yàn)樗环浅M昝赖慕鉀Q了。
我想強(qiáng)調(diào)的另一件事是,當(dāng)閃電網(wǎng)絡(luò)的論文從老的 hub-spoke模型里被發(fā)展出來時(shí),現(xiàn)代的閃電網(wǎng)絡(luò)吸取了教訓(xùn),不再區(qū)分“hubs”和”spokes”了。
在閃電網(wǎng)絡(luò)中的任何節(jié)點(diǎn)都可以當(dāng)作其他節(jié)點(diǎn)的hub。所以,即使你在執(zhí)行過程中只付款,或者只轉(zhuǎn)發(fā)交易,至少最終你仍然部分是轉(zhuǎn)發(fā)節(jié)點(diǎn)(“hub”)。這大大的減少了只有幾個(gè)hub節(jié)點(diǎn)導(dǎo)致的隱私問題:轉(zhuǎn)發(fā)節(jié)點(diǎn)只能得到通過他們的很少的信息,因?yàn)楦犊钊撕褪湛钊酥g的距離太大了,最終的收款人和付款人可以是閃電網(wǎng)絡(luò)上的任何人。
又到了知識(shí)點(diǎn)時(shí)間:
(1) 只要我們足夠努力我們就可以做到去中心化!
(2) 只要我們都是hub,hub也可以變成一個(gè)好東西。
(3) 聰明的人能夠解決問題,這也是他們聰明的原因。
6. 未來
在閃電網(wǎng)絡(luò)之后,有Decker-Wattenhofer 雙工微支付通道(DMC)。它使用了一種奇妙的“nSequence遞減通道”,使用一種新型的nSequence(不是中本聰殘破的那一款)相對(duì)時(shí)間鎖語義(relative-timelock semantics)。它使用多個(gè)“遞減nSequence”結(jié)構(gòu)體,終止于一對(duì)Spilman通道中,兩個(gè)方向各一個(gè)。
通道結(jié)構(gòu)實(shí)際上可以在其中包含更多通道構(gòu)造(Decker-Wattenhofer將一對(duì)Spilman通道放入一系列“遞減nSequence通道”),這引導(dǎo)我們更進(jìn)一步提出了Burchert-Decker-Wattenhofer通道工廠。
基本上是說,你可以持有多個(gè)雙參與者通道結(jié)構(gòu),這些通道結(jié)構(gòu)又被包含在一個(gè)更大的多方“通道”里(也就是說在一個(gè)“工廠”里持有多個(gè)通道)。
繼續(xù)更進(jìn)一步,我們還有有Decker-Russell-Osuntokun或者“eltoo”結(jié)構(gòu)。這篇文章已經(jīng)夠長了,我準(zhǔn)備以后再討論它。
比特幣鏈下擴(kuò)展性比你想象的還要強(qiáng)大的多。
評(píng)論
查看更多