去年在這里寫了“關(guān)于比特幣的5個想法”,貌似是這里的第一篇關(guān)于比特幣的文章臼朗,今天在這里介紹一下比特幣的協(xié)議豹缀。
本文是翻譯Michael Nielsen關(guān)于比特幣協(xié)議的文章藤巢,這篇文章是譯者覺得寫的最清楚的關(guān)于比特幣的文章竟纳。Michael Nielsen是個研究量子計(jì)算的先驅(qū)科學(xué)家撵溃、作家和程序員,詳細(xì)內(nèi)容請看他自己的介紹锥累。翻譯這篇文章是因?yàn)樽g者認(rèn)為關(guān)于比特幣的文章和討論很多缘挑,很多支持的很多反對的。但大多數(shù)都停留在概念桶略、價格和主觀的思考上语淘,我想拋開比特幣現(xiàn)有價格和表面顯現(xiàn),通過這篇文章际歼,細(xì)致的給大家介紹一下比特幣的協(xié)議工作原理惶翻。我相信弄明白一個事物背后的工作原理對于理解一個事物是非常重要的。我和大多數(shù)人一樣鹅心,一開始看到的時候覺得它就是瘋狂的吕粗,不是騙局就是傳銷。但是后來很多的線索和跡象提示我應(yīng)該認(rèn)真的研究比特幣本身巴帮,就像是我們小時候會喜歡拆開玩具看里面是什么東西一樣溯泣,了解它怎么工作的才能客觀的看一個事物本身虐秋,才能有自己的觀點(diǎn)榕茧,而不是總看著媒體發(fā)布的新聞和某些自己都一知半解的“專家”們的觀點(diǎn)去理解這個東西。去年看到這篇Michael的這篇文章并且后來深入看了其他的關(guān)于協(xié)議本身的文章客给,醍醐灌頂用押,因此先將這片翻譯下來留做記錄,這里省略了作者提出的一些疑問靶剑,如有不足之處蜻拨,錯誤在我,好的地方都在Michael Nielsen桩引。之后我會陸續(xù)發(fā)布一系列曾幫助我理解關(guān)于比特幣的材料缎讼,這些材料都是暗示(hint),我不會去嘗試去銷售(sale)坑匠,而是盡可能的解釋(explain)血崭,我不會負(fù)責(zé)說服你這個東西是好還是壞,理解之后,你可以有你自己的想法夹纫。
中本聰本人從來沒有去說服別人咽瓷,而是將文章發(fā)表到網(wǎng)上,讓別人自己去判斷舰讹。他本人說的 “It would help to condense the article and make it less promotional sounding as soon as possible. Just letting people know what it is, where it fits into the electronic money space, not trying to convince them that it’s good. ” 他的另一個原話是“If you don’t believe me or don’t get it, I don’t have time to try to convince you, sorry.”
以下是正文
成千上萬的文章試圖去解釋比特幣,一個在線的月匣、點(diǎn)對點(diǎn)(Peer-to-Peer)的貨幣桶错。大多數(shù)文章對其底層的協(xié)議一筆帶過航唆,省略了許多細(xì)節(jié)。就算是那些很深入的文章也在關(guān)鍵的地方搪塞過去糯钙。這篇文章的目的是用盡可能清晰的退腥、易理解的方式解釋比特幣協(xié)議背后的要點(diǎn)任岸。我們從第一原則開始,建立一個廣義的理論上理解比特幣協(xié)議狡刘,然后深入到細(xì)節(jié)去,檢查比特幣交易里的元數(shù)據(jù)剑按。
深入的理解這個協(xié)議是困難的澜术,因?yàn)楹苋菀拙蛯⒈忍貛乓暈榻o定的,并且去想如何利用它投機(jī)發(fā)財(cái)猜敢、想其是不是泡沫盒延、想比特幣是否意味著對稅收的終結(jié)等等添寺。想這些很有趣,但是這些想法嚴(yán)重的限制了你的理解博脑。而理解比特幣的協(xié)議本身將會打開其他渠道不可達(dá)到的視角。比如說這個協(xié)議是比特幣內(nèi)置的腳本語言的基礎(chǔ)寨闹,這個腳本語言讓你可以用比特幣創(chuàng)造新的金融工具君账,比如智能合同(smart contracts)乡数。新的金融工具反過來可以創(chuàng)造新的市場和新的人和人之間的合作行為,說到樂趣绳矩,這才是真正的樂趣所在玖翅!
我會在以后的文章中解釋比特幣腳本和智能合同金度。這篇文章我會集中在比特幣協(xié)議的具體細(xì)節(jié)。理解這篇文章你需要大概熟悉一下公鑰密碼 和 與其相關(guān)的數(shù)字簽名中姜,(請了解一下兩個概念)跟伏。同時還大概熟悉一下(哈希)Hash函數(shù) (把任意長度的輸入變換成固定長度的輸出)受扳。這些概念都很棒,如果你不了解辞色,建議你花一些時間熟悉一下他們相满。
比特幣的基礎(chǔ)是密碼學(xué)桦卒,這點(diǎn)可能會讓你吃驚方灾,不是說比特幣是一種貨幣嗎碌更?難道它是一個發(fā)送秘密信息的方式嗎洞慎?實(shí)際上劲腿,比特幣想要解決的問題絕大部分是關(guān)于保護(hù)交易的——保證人們不能偷別人的東西或冒充別人等等。在原子組成的物質(zhì)世界里挥吵,我們通過鎖花椭,簽名矿辽,銀行保險(xiǎn)箱等等來保證安全。在信息世界里我們通過密碼學(xué)來保證安全性嫌松。這就是為什么比特幣的核心是密碼學(xué)的協(xié)議奕污。
這篇文章的策略是一層一層的建立起比特幣碳默。我們會從一個非常簡單的數(shù)字貨幣開始,我們暫時叫他“Infocoin”髓废,用來區(qū)分于Bitcoin慌洪。當(dāng)然我們第一版本的Infocoin會有很多的缺點(diǎn)凑保,所以我們會經(jīng)過幾次迭代欧引,每次迭代會新介紹一到兩個新的概念。經(jīng)過若干次之后憋肖,我們就會得到一個完整的比特幣協(xié)議了。我們會一起重新發(fā)明比特幣鸵膏。
這種辦法比一開始就直接解釋比特幣要慢一些较性。但是即使你可以一下了解比特幣的原理结胀,你也很難理解為什么比特幣要設(shè)計(jì)成這個樣子糟港。而慢慢的一步一步迭代式的解釋,其優(yōu)點(diǎn)就在于它可以讓你對比特幣的每個元素有更清晰的理解速和。
最后我應(yīng)該說的是我在比特幣世界相對來講是新人剥汤。我2011年有粗略的關(guān)注吭敢,但是真正認(rèn)真研究其細(xì)節(jié),是2013年初欲低。歡迎任何人對我錯誤的部分進(jìn)行糾正砾莱。
第一步:簽了名的意向書
怎么設(shè)計(jì)一個貨幣呢凄鼻?
從表面判斷块蚌,一個數(shù)字貨幣聽起來不可能。假設(shè)一個人——我們叫她Alice——有一些想要花掉的數(shù)字貨幣河胎。如果Alice可以用一串字符作為錢的話虎敦,我們怎么能阻止她用同樣的那串字符反復(fù)的使用呢其徙?如果我們能解決這個問題,我們有怎樣能防止其他人偽造一串字符访锻,從Alice那邊偷走呢期犬?
這只是用信息做貨幣要解決的眾多問題中的兩個避诽。在第一版的Infocoin中沙庐,我們想辦法讓Alice供一個字符串來作為錢,并且想個辦法保護(hù)它不被偽造棉安。假設(shè)Alice要把一個infocoin給另一個人Bob贡耽。Alice需要寫下一個消息:“我Alice要給Bob一個infocoin”鹊汛。 她然后用數(shù)字簽名的辦法將這個信息和一個私鑰(這個私鑰是隨機(jī)生成的一個64位數(shù))一起簽下名產(chǎn)生一個結(jié)果柒昏。并且將這個簽了名的結(jié)果字符公布給整個世界。
這個辦法并不怎么出眾氏涩,但還是有一些優(yōu)點(diǎn)的是尖。世界上任何人都可以用Alice的公鑰去驗(yàn)證Alice確實(shí)是那個簽了名的人泥耀。其他任何人都不可能產(chǎn)生那個簽名的結(jié)果(這個簽名只可能從Alice擁有的私鑰產(chǎn)生痰催,原理請看上文提到的數(shù)字簽名)迎瞧,所以Alice不能反悔說“不凶硅,我沒有給Bob那個infocoin”扫皱。這樣韩脑,這個協(xié)議提供了Alice確實(shí)有意向給Bob一個infocoin的證明。同樣允懂,其他任何人都不能產(chǎn)生那樣一個簽了名的信息蕾总,這樣防止了其他人偽造Alice的信息琅捏。當(dāng)然柄延,當(dāng)Alice已經(jīng)發(fā)布了她的消息之后搜吧,其他人是有可能復(fù)制這個消息的,但是發(fā)布之前不可能偽造摆昧。所以蜒程,證明意向和防止消息發(fā)布之前被偽造這兩個功能是這個協(xié)議里真正值得注意的特性昭躺。
我還沒有說這個協(xié)議里的錢到底是什么呢领炫。明確的說:錢其實(shí)就是這個消息本身倦西。也就是說那一串代簽了名的代表著“我Alice要給Bob一個infocoin”的字符汤踏。后面協(xié)議將會在這一點(diǎn)上類似蚓耽,也就是所有的數(shù)字貨幣只是越來越詳細(xì)的消息字符频祝。
用序列號來給貨幣一個唯一的標(biāo)識
我們第一版的Infocoin的問題是Alice可以重復(fù)地給Bob發(fā)送同一個簽了名的消息常空。假設(shè)Bob收到了10份這樣的消息“我盖溺,Alice烘嘱,要給Bob一個infocoin”蝇庭。這是說Alice給Bob了10個不同的infocoin呢?還是Alice給Bob一個infocoin盗棵,只是不小心消息重復(fù)了纹因?或者是她想要欺騙Bob讓給他相信她給了他10個infocoin琳拨,而實(shí)際上給外面世界發(fā)出的消息只證明了她只給了一個infocoin狱庇。
我們想要的是讓infocoin有個唯一的標(biāo)識僵井。它需要一個標(biāo)簽或者序列號。Alice可以在消息“我Alice要給Bob一個序列號為8740348的infocoin”上簽名农曲。之后Alice如果在另一個消息里簽名 “我Alice要給Bob一個序列號為8770431的 infocoin”乳规,這樣,Bob和其他人就會知道這里兩個是不同的infocoin笙以。
為了讓這個方案可行猖腕,我們就必須要一個可信的序列號來源倘感。一種產(chǎn)生序列號的辦法是建立一個機(jī)構(gòu)比如銀行咙咽。這個銀行將會為infocoin產(chǎn)生序列號钧敞,記錄誰擁有著哪個infocoin溉苛,并且驗(yàn)證交易的真實(shí)性。
更詳細(xì)的說桨吊,我們假設(shè)Alice去一個銀行视乐,說“我要從我的賬戶里取一個infocoin”敢茁。這個銀行從她的賬戶里減掉一個infocoin彰檬,然后給她一個新的從沒用過的序列號逢倍,假設(shè)是“1234567”。然后碉哑,當(dāng)Alice想要給Bob發(fā)一個infocoin的時候扣典,她給這個新的消息簽名“我Alice要給Bob一個序列號為1234567的infocoin”贮尖。但是Bob不只接受這個infocoin,而且他去聯(lián)系銀行薪前,確認(rèn)兩件事序六,第一,序列號為1234567的infocoin確實(shí)是屬于Alice的裁着。第二拱她,Alice還沒有花掉那個infocoin秉沼。然后銀行更新它的記錄來顯示那個infocoin現(xiàn)在是屬于Bob而不是Alice唬复。
讓每個人都成為銀行
上面的這個解決方法看起來很有潛力。但是棘捣,我們可以做到更有野心的事乍恐。我們可以從這個協(xié)議里剔除掉銀行茵烈。這樣大幅的改變了這個貨幣的本身屬性砌些。這意味著將不會有一個單獨(dú)的組織負(fù)責(zé)這個貨幣。當(dāng)你想中央銀行擁有著多么大權(quán)利的時候(控制貨幣發(fā)行)——這意味著巨大的改變矩动。
方法是讓每個人共同合作成為銀行悲没。尤其是男图,我們假設(shè)每個用infocoin的人保存一份完整的記錄逊笆,這個記錄包括哪個infocoin屬于哪個人难裆。你可以把它想象成一個共享的公開的賬本乃戈,這個賬本記錄著所有的infocoin的交易記錄症虑。我們就將它叫做“區(qū)塊鏈 blockchain”,因?yàn)楸忍貛爬锩婢褪沁@么叫的匪蝙。
現(xiàn)在逛球,我們假設(shè)Alice要將一個infocoin給Bob需忿。她在消息“我Alice要給Bob一個序列號為1234567的infocoin”上簽名屋厘。并且將簽了名的消息輸出結(jié)果給Bob月而,Bob可以用他自己的那份block chain去檢驗(yàn)父款,“OK,確實(shí)那個infocoin是Alice給我的”阀参。如果他檢查沒問題蛛壳,他就將Alice的消息和自己接受這個infocoin的消息公布給全網(wǎng)絡(luò)衙荐。然后所有的人更新他們的blockchain浮创。
我們?nèi)匀淮嬖凇靶蛄刑枏哪睦飦怼钡膯栴}斩披,但是這件事其實(shí)很容易解決雏掠,所以我推后再解釋乡话。更加難的問題是這個協(xié)議允許Alice重復(fù)的花費(fèi)她的infocoin绑青。她可以發(fā)布一個簽了名的消息“我Alice要給Bob一個序列號為1234567的infocoin” 屋群,同時她也可以發(fā)布一個簽名的消息說“我Alice要給Charlie一個序列號為1234567的infocoin”芍躏。Bob和Charlie兩個人都用他們自己的blockchain去檢驗(yàn)?zāi)莻€infocoin確實(shí)是Alice發(fā)過來的对竣。假設(shè)他們在同一時間進(jìn)行的檢驗(yàn)(在他們兩個互相知道另一個的消息之前)否纬,他們兩個都會發(fā)現(xiàn)临燃,是的,我的blockchain證明那個幣是屬于Alice淫茵。所以他們都接受了那個交易蹬跃,并且公布他們的接受信息給整個網(wǎng)絡(luò)【孀現(xiàn)在就有問題了扼劈。網(wǎng)絡(luò)上其他的人應(yīng)該怎樣更新他們的blockchain呢荐吵?這樣看來貌似不能簡單的達(dá)到統(tǒng)一交易賬本先煎。而且即使每個人都同意用一樣的辦法更新他們的blockchain薯蝎,Bob和Charlie兩個人之間有一個是肯定被騙了占锯。
我們把這個問題叫做“雙重花費(fèi) double spending”(后文稱“雙花”), 一眼看來袒哥,這樣的雙花似乎很難成功。畢竟消略,如果Alice先將消息發(fā)給Bob堡称,然后Bob將消息發(fā)送給其他所有人(包括Charlie),其他人更新了他們的blockchain艺演。這時候却紧,Charlie就不會被Alice騙了。所以似乎雙重花費(fèi)只有在短暫的一段時間內(nèi)可能胎撤。然而,即使這個時間很短哩照,有這個問題也是不可取的挺物。更糟的是,Alice可以用一些技巧讓這一段時間按延長飘弧。比如說她可以用網(wǎng)絡(luò)分析軟件找到Bob和Charlie之間的交流的延遲時間很長的時候识藤⊙庵或者可以做一些事情故意打擾他們之間的網(wǎng)絡(luò)連接。如果她可以減慢這個交流一點(diǎn)點(diǎn)痴昧,就可以使得她的雙花成功變得容易許多稽穆。
那怎么解決這個問題呢?最簡單的辦法是當(dāng)Alice給Bob發(fā)送infocoin的時候赶撰,Bob不應(yīng)該獨(dú)自的檢驗(yàn)這個交易舌镶。而他應(yīng)該將這個可待定的交易公布到整個infocoin網(wǎng)絡(luò)里,讓其他人幫忙判斷這個交易是否合理豪娜。如果他們共同決定這個交易是合理的餐胀,那么Bob可以去接受這個infocoin,然后所有人更新他們的blockchain瘤载。這種類協(xié)議可以防止雙花否灾,因?yàn)槿绻鸄lice想要同時給Bob和Charlie發(fā)送同樣的infocoin時,網(wǎng)絡(luò)上的其他人會注意到鸣奔,并且告訴Bob和Charlie這個交易有問題墨技,然后這個交易就不允許通過。
更具體的來說挎狸,假設(shè)Alice想要給Bob一個infocoin扣汪。和之前一樣,她給一個消息簽名锨匆,“我Alice要給Bob一個序列號為1234567的infocoin”崭别,并將簽好名的消息給Bob。也和之前一樣统刮,Bob用他自己的blockchain做一個檢查紊遵,這個幣確實(shí)屬于Alice。但是協(xié)議不一樣了侥蒙,Bob并不直接接受這個,而是公布Alice的消息給整個網(wǎng)絡(luò)匀奏。網(wǎng)絡(luò)上的其他成員檢查Alice是否擁有這個infocoin鞭衩,如果是,那么他們公布消息說“沒錯娃善,Alice確實(shí)有infocoin 1234567论衍, 現(xiàn)在可以將其轉(zhuǎn)給Bob了”。一旦有足夠的人公布這個消息聚磺,每個人更新他的blockchain來顯示infocoin 1234567現(xiàn)在屬于Bob坯台,交易完成。
這個協(xié)議現(xiàn)在還有很多不確定的因素瘫寝。比如蜒蕾,“一旦有足夠的人公布這個消息”到底是什么意思稠炬,多少個人算是足夠?不可能是整個infocoin網(wǎng)絡(luò)咪啡,因?yàn)槲覀兪孪炔恢勒l在infocoin網(wǎng)絡(luò)上首启。同樣,也不能是固定的一部分用戶撤摸。我們現(xiàn)在先不著急將這些問題弄清楚毅桃。在這里,我將要指出一個這交易個方案的嚴(yán)重的問題准夷,解決那個問題將會同時幫助上面的問題弄清楚钥飞。
工作證明 Proof-of-work
假設(shè)Alice想要在上述的協(xié)議中雙花,他需要掌管整個的infocoin網(wǎng)絡(luò)衫嵌。假設(shè)她用一個自動的系統(tǒng)在infocoin網(wǎng)絡(luò)上建立很多個不同身份的賬戶代承,假設(shè)有10億個。和之前一樣渐扮,她試圖進(jìn)行雙花论悴,將同樣的infocoin給Bob和Charlie,但是當(dāng)Bob和Charlie詢問infocoin網(wǎng)絡(luò)的來檢驗(yàn)這個交易時墓律,Alice的馬甲們淹沒整個網(wǎng)絡(luò)膀估,告訴Bob和Charlie他們可以通過這個交易,并且可能欺騙他們其中一個或者兩個人都接受這個交易耻讽。
有一個聰明的辦法察纯,用一個叫做“工作證明Proof-of-work”的方法。方法并不直觀针肥,需要結(jié)合兩個概念饼记,1)人工的讓檢驗(yàn)交易的過程花費(fèi)較大的計(jì)算開銷;2)獎賞他們幫忙檢驗(yàn)這個交易慰枕。用獎賞的辦法激勵在該網(wǎng)絡(luò)上的人去驗(yàn)證交易具则。加大交易驗(yàn)證開銷的優(yōu)點(diǎn)是驗(yàn)證不會再被那些擁有很多賬戶的人控制,而是只會被他能提供的總共計(jì)算能力控制具帮。我們將會看到博肋,通過一些聰明的設(shè)計(jì),我們可以讓欺騙者必須花費(fèi)非常大的計(jì)算資源來達(dá)到欺騙的目的蜂厅,讓它變的不切實(shí)際匪凡。
這就是工作證明的要點(diǎn)。但是要真正弄明白工作證明掘猿,我們需要深入更加具體的細(xì)節(jié)病游。
假設(shè)Alice給整個網(wǎng)絡(luò)公布消息“我Alice要給Bob一個序列號為1234567的infocoin”。當(dāng)網(wǎng)絡(luò)上的其他人聽到這個消息后稠通,每個人將其加入到一列待定的交易之中衬衬,這些交易都還沒有被整個網(wǎng)絡(luò)通過买猖。比如說網(wǎng)絡(luò)上一個叫做David的人可能有下面這一列待定的交易:
我Tom要給Sue一個序列號為1201174的infocoin。 我Sydney要給Cynthia一個序列號為1295618的infocoin佣耐。
我Alice要給Bob一個序列號為1234567的infocoin政勃。
David檢查他自己的blockchain,看到上述這些交易是合理的兼砖。他要幫助將這個驗(yàn)證消息公布到整個網(wǎng)絡(luò)中去奸远。但是,在這之前讽挟,檢驗(yàn)交易協(xié)議需要David去解決一個計(jì)算難題——也就是工作證明懒叛。若他沒有得到難題的解,網(wǎng)絡(luò)上的其他成員不會接受他的驗(yàn)證耽梅。
那么David到底要解決一個什么的難題呢薛窥?要解釋這個,我們用一個網(wǎng)絡(luò)上面每個人都知道的固定的哈希函數(shù)hash function——將其包括在協(xié)議本身眼姐。比特幣用一個眾所周知的SHA-256哈希函數(shù)诅迷,但是任何密碼學(xué)的哈希函數(shù)在這里都可以用。我們給David的這一組待定的交易一個標(biāo)記众旗,”L”吧罢杉,為了之后可以引用。這一組待定的交易也就相當(dāng)于blockchain里面的block(區(qū)塊)(-理解這個Block很重要贡歧,block也就是一組交易信息組成的集合滩租,一個block包括很多個交易)。假設(shè)David在這個區(qū)塊”L”后添加一個數(shù)字x(叫做nonce利朵,暫時的隨機(jī)數(shù))然后hash他們的結(jié)合律想。比方說,我們用L=“Hello, world!” 作為一些交易的標(biāo)記绍弟。然后加上一個暫時的隨機(jī)數(shù)技即,我們從“x=0”開始吧。
h("hello", world! 0) =1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64
David將要解決的問題(工作證明)是找到一個隨機(jī)數(shù)x晌柬,當(dāng)我們將這個x添加到L后面并且hash這個組合的時候姥份,得到的結(jié)果開始為幾個0開頭。這個難題的難度可以通過調(diào)整開頭零的個數(shù)來調(diào)節(jié)年碘。一個簡單的”工作證明”只需要3或4個零開頭的hash,一個難的“工作證明”則可能需要更多的零開頭展鸡,比如說15個連續(xù)的零屿衅。在上述情況下,x=0的到的hash結(jié)果不成功莹弊,因?yàn)榻Y(jié)果不是由0開始的涤久。那么我們就嘗試x=1涡尘,
可以看到x=1的時候也不成立
h("Hello, world!1") = e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8
然后嘗試x=2, 然后x=3 ,4响迂,5…. 知道最后考抄,發(fā)現(xiàn)x=4350的時候,我們得到了
h("Hello, world!4250") = 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9
這個隨機(jī)數(shù)x給了我們一個結(jié)果是四個零開頭的hash蔗彤。這個就足夠解決一個簡單的“工作證明”的難題了川梅。
讓這個難題不容易解決的是其密碼哈希函數(shù)結(jié)果永遠(yuǎn)是隨機(jī)的,對輸入值做任何細(xì)小的改變將會完全該別整個哈希函數(shù)的輸出結(jié)果然遏,以至于很難去預(yù)測贫途。所以如果我們需要輸出結(jié)果必須是開始于10個0,那么David將平均需要 1610 ≈ 1012 個不同的x才能找到那個合適的值待侵。這是一個非常有挑戰(zhàn)性的任務(wù)丢早,需要很多的計(jì)算能力。
顯然秧倾,我們可以通過規(guī)定需要零的多少來控制工作證明難題的難易程度怨酝。事實(shí)上,比特幣協(xié)議通過對上述的工作證明稍加修改那先,可以對難題的難易程度有更良好的控制农猬。不再是規(guī)定需要多少個開始的零,而是規(guī)定block的hash輸出結(jié)果要小于或等于一個目標(biāo)值胃榕,這個目標(biāo)值是自動調(diào)節(jié)的盛险,用來保證比特幣的每一個區(qū)塊(block)平均要花10分鐘來解。
好了勋又,我們假設(shè)David很幸運(yùn)苦掘,找到了一個合適的x(nonce),恭喜他Pㄈ馈(他將會得到找到這個答案的獎賞)鹤啡。他會公布他已經(jīng)證明了這個區(qū)塊里面的交易是合理的,并且與之同時公布她找到的x值蹲嚣,其他infocoin里的參與者可以證明x那個工作證明的有效解递瑰。然后他們就更新自己的blockchain,來包括David所公布的這些交易隙畜。
為了讓工作證明這個方案的運(yùn)作抖部,網(wǎng)絡(luò)的參與者應(yīng)該需要一個激勵機(jī)制來幫助驗(yàn)證交易。沒有激勵機(jī)制的話议惰,沒有人會愿意花費(fèi)自己的計(jì)算機(jī)算力來幫助檢驗(yàn)交易慎颗。如果網(wǎng)絡(luò)參與者不愿意花費(fèi)算力,那么整個系統(tǒng)就不會運(yùn)轉(zhuǎn)。因此俯萎,我們可以通過給他們一些infocoin的方式來獎勵任何成功驗(yàn)證了交易的人傲宜。若給他們提供的infocoin獎勵足夠的多,可以激勵他們來參與驗(yàn)證夫啊。
在比特幣的協(xié)議里函卒,這個驗(yàn)證的過程被稱作“mining” (挖礦)。每一個交易區(qū)塊的驗(yàn)證成功者都會獲得比特幣作為獎勵撇眯。最開始的時候报嵌,是50個比特幣的獎勵。但是每格21萬個驗(yàn)證的區(qū)塊(也就是大概每4年左右)叛本,獎勵會減半』ε睿現(xiàn)在為止只發(fā)生了一次,也就是說現(xiàn)在驗(yàn)證一個block獲得的獎勵是25個比特幣来候。 減半的過程會持續(xù)發(fā)生跷叉,直到大概2140年。那時候营搅,挖礦的獎勵的將會降低到10-8個比特幣云挟。而10-8個比特幣是比特幣最小的單位(被稱作一個Satoshi),因此到2140年转质,總共的比特幣將會停止增長园欣。然而,這并不會消除驗(yàn)證交易的激勵機(jī)制休蟹,比特幣可以允許參與者加入驗(yàn)證交易的費(fèi)用沸枯,用來獎賞驗(yàn)證交易的人。早期的比特幣赂弓,交易費(fèi)幾乎為零绑榴,但是隨著比特幣的普及,交易費(fèi)會逐漸升高盈魁,現(xiàn)在已經(jīng)成為除了25個比特幣獎勵之外的額外激勵了翔怎。
你可以將工作證明(proof-of-work)看做一個競相驗(yàn)證交易的過程。每個參與者會花費(fèi)一部分的計(jì)算機(jī)算力杨耙。一個挖礦者獲勝的機(jī)會大概等于他們控制的計(jì)算計(jì)算力的大小和整個網(wǎng)絡(luò)的算力的比例赤套。比如說,一個挖礦者控制著整個網(wǎng)絡(luò)算力量百分之一的計(jì)算能力珊膜,那么他的獲勝的概率也大概是百分之一容握。所以提供大量計(jì)算能力是支撐競爭能力的因素,一個不誠實(shí)的挖礦者只有很小的機(jī)會去破壞驗(yàn)證過程车柠,除非他們花費(fèi)巨大的計(jì)算機(jī)資源唯沮。
當(dāng)然脖旱,就算是不誠實(shí)的挖礦者僅有很小的機(jī)會破壞整個blockchain堪遂,我們也沒有足夠的信心拿它來當(dāng)成貨幣介蛉。特別是,我們還沒有最終解決雙花的問題溶褪。
我會馬上分析雙花的問題币旧,但是在那之前,我想在Infocoin的概念里補(bǔ)充一個重要的細(xì)節(jié)猿妈。理想情況下吹菱,我們希望Infocoin網(wǎng)絡(luò)能夠統(tǒng)一交易發(fā)生的順序。如果我們沒有統(tǒng)一的順序彭则,那么誰在哪個特定的時候有哪個infocoin就不是很清楚了鳍刷。為了幫著解決這一點(diǎn)。我們要求新的區(qū)塊(block)必須要包含指向上一個區(qū)塊的指針俯抖,這個指針也其實(shí)就是上一個block的哈希(hash)結(jié)果输瓜。因此,基本上說芬萍,區(qū)塊鏈 (block chain)本身也就是一個線性的一串包含著交易信息的區(qū)塊(blocks)尤揣,一個接著一個,每一個block都包含著指向上一個block的指針柬祠。
偶然情況下北戏,一個blockchain上會產(chǎn)生分支。這種情況是因?yàn)槁祝袝r候兩個挖礦者幾乎同時驗(yàn)證出來一個區(qū)塊的交易嗜愈。他們同時公布到網(wǎng)絡(luò)里,有些人用一個方法更新他們的blockchain莽龟,另一些人用另外一個方法更新他們的blockchain蠕嫁。
這就造成了我們想要避免的情況 ——這種情況,交易的順序就不清楚了轧房,而且誰有哪個infocoin也就不清楚了拌阴。幸運(yùn)的是,有一個簡單的辦法可以用來挪去分支奶镶。規(guī)則是這樣的:如果分支情況出現(xiàn)迟赃,那么網(wǎng)絡(luò)上的人們繼續(xù)保持兩個分支,任何情況下厂镇,挖礦者只在最長的那個blockchain上工作纤壁。
假設(shè)我們有一個分支,有一些挖礦者先收到block A捺信,另一些挖礦者先收到的是block B酌媒。那些收到block A的挖礦者將要繼續(xù)沿著他們的分支挖礦欠痴,而其他人沿著Block B的分支挖礦。我們假設(shè)在B分支上的挖礦者先成功挖到下一個block:
當(dāng)他們收到這個消息后秒咨,在A分支的人會注意到現(xiàn)在B分支是最長的喇辽,于是就會轉(zhuǎn)換到B的分支。在A分支上的工作就會迅速的停止雨席,這樣每個人就會都在同一個順序的blockchain上工作了菩咨。然后block A就會被忽略。當(dāng)然陡厘,所有在block A里面的待定交易將會繼續(xù)保持待定狀態(tài)抽米,隨后會在B分支上被放到新的block里,這樣糙置,所有的交易最終還是會被驗(yàn)證的云茸。
同理,如果在分支A上的挖礦者先挖到下一個block谤饭,那么在B分支上工作的人就是停止标捺,轉(zhuǎn)到A分支上。
不論結(jié)果是什么网持,這個過程保證了blockchain有統(tǒng)一的順序宜岛。在比特幣中,一個交易能不算作確認(rèn)直到 1)它存在于最長的分支中的block里功舀,2)至少有5個驗(yàn)證過的block在其后面得到驗(yàn)證萍倡。這種情況,我們說這個交易有了“6個確認(rèn)”辟汰。這給了整個網(wǎng)絡(luò)時間去統(tǒng)一block的順序列敲。我們在Infocoin里,也用同樣的方案帖汞。
現(xiàn)在我們理解了時間順序戴而,那我們回去想想如果一個不誠實(shí)的人想要雙重花費(fèi)的話會怎么樣。假設(shè)Alice要同時給Bob和Charlie同樣的交易翩蘸。一個可能性就是讓她去驗(yàn)證同時帶有兩個交易的一個block所意。假設(shè)她擁有百分之一的計(jì)算能力,那么她有可能比較幸運(yùn)的驗(yàn)證出了這一個block催首。不幸的是扶踊,這個雙重花費(fèi)將會馬上被其他人發(fā)現(xiàn)并且拒絕,盡管她解決了工作證明里的難題郎任。所以這個可能性我們不用擔(dān)心秧耗。
但是另一種可能性是,她試圖分別公布兩個交易舶治。她可能給一部分挖礦者公布一個交易分井,給另一部分挖礦者公布另一個交易车猬,她希望讓兩個交易都得到驗(yàn)證。幸運(yùn)的是尺锚,這種情況下珠闰,如我們剛才所說,網(wǎng)絡(luò)最終只會確認(rèn)其中一個交易缩麸。所以铸磅,這個也不是問題。
還有一種可能是杭朱,Alice = Bob,也就是說Alice試圖將一個幣給Charlie吹散,同時她又將那個幣給她自己弧械,因?yàn)樗约嚎梢杂卸鄠€賬戶。這種情況下空民,Alice的策略是等到Charlie接受了這個Infocoin刃唐,也就是大概在交易在最長的blockchain中被確認(rèn)6次之后。她再試圖去解決另外一個擁有她發(fā)給自己的交易的那個block分支界轩。
可惜的是画饥,這個時候Alice已經(jīng)比最長的blockchain晚了6步。她很難在跟得上最長的分支了浊猾。其他的挖礦者不會幫助她抖甘,因?yàn)樗麄兌夹枰谧铋L的分支上工作才能得到獎賞。除非Alice在解決工作證明的時候能夠比網(wǎng)絡(luò)上其他人結(jié)合起來還快(也就是說她大概有多于整個網(wǎng)絡(luò)50%的計(jì)算能力)葫慎。當(dāng)然衔彻,她可能會偶然幸運(yùn),在百分之一的算力的情況下能解決一個block偷办,但是同時趕上6個的花相當(dāng)于是 1/1006 = 10-12 艰额。這種情況可以說是想到于零。
當(dāng)然這不是非常嚴(yán)格的說Alice肯定不能雙花了椒涯。這只是一個合理的推論柄沮。比特幣的白皮書原文并沒有進(jìn)行一個嚴(yán)格的安全分析,只是和我這里類似的非正式推論废岂。安全團(tuán)體任然在分析比特幣的安全性和潛在的缺陷祖搓,具體可以看這個列表。
譯者記泪喊,這是上半個部分棕硫,下半部分作者M(jìn)ichael 撇開了Infocoin的概念,通過比特幣交易的視力更詳細(xì)的講解比特幣的協(xié)議袒啼。如果你看到這里了哈扮,你可以關(guān)注我的微博纬纪,和博客 。
另外:如果覺得有幫助滑肉,建議你Tip給這篇文章的原作者Michael Nielsen包各, 他的地址是17ukkKt1bNLAqdJ1QQv8v9Askr6vy3MzTZ , 你也可以follow他的Twitter 靶庙。 或者關(guān)注他的將要出版的關(guān)于neural networks and deep learning新書的第一章.