See also: http://blog.codinglabs.org/articles/bitcoin-mechanism-make-easy.html
周末花時(shí)間看了一些比特幣原理相關(guān)的資料衰抑,雖然不敢說把每個(gè)細(xì)節(jié)都完全搞懂了册着,不過整體思路和關(guān)鍵部分的主要原理還是比較明白。寫一篇文章分享給大家搞挣。這篇文章的定位會(huì)比較科普缅阳,盡量用類比的方法將比特幣的基本原理講出來磕蛇。這篇文章不會(huì)涉及算法和協(xié)議中比較細(xì)節(jié)的部分,打算后面會(huì)再寫一篇程序員視角下的比特幣原理券时,那里會(huì)從技術(shù)人員的視角對(duì)比特幣系統(tǒng)中較為關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)孤里、算法和協(xié)議進(jìn)行一些講解。
在這篇文章中我會(huì)給出一個(gè)虛擬的村莊叫“比特村”橘洞,整個(gè)文章會(huì)以講故事的方式捌袜,逐步告訴大家比特幣提出的動(dòng)機(jī)、解決了什么問題以及一些關(guān)鍵組件的目標(biāo)和設(shè)計(jì)方案炸枣。
問題的提出
我們先從比特幣產(chǎn)生的動(dòng)機(jī)開始虏等。
以物易物的比特村
話說在這個(gè)世界上,有一個(gè)叫比特村的小村莊适肠,村莊共有幾百戶人家霍衫。這個(gè)村莊幾乎與世隔絕,過著自給自足的生活侯养。由于沒有大規(guī)模貿(mào)易敦跌,比特村村民一直過著以物易物的生活,也就是說村民之間并沒有使用統(tǒng)一的貨幣逛揩,互相間的貿(mào)易基本上就是老張家拿一袋面粉換老李家一只羊柠傍,王大嫂拿一筐野果換劉大嬸兩尺布。村民們一直就這么純樸的生活著辩稽。
實(shí)物貨幣
終于有一天惧笛,村民覺得一直這樣以物易物實(shí)在太不方便了,于是村子全員開會(huì)逞泄,討論如何解決這個(gè)問題患整。有人提議拜效,以便于分割且稀有的東西,例如黃金各谚,作為一般等價(jià)物紧憾,把其它物品和黃金的對(duì)應(yīng)關(guān)系編成一張表格,例如一克黃金對(duì)應(yīng)一只羊嘲碧,一克黃金對(duì)應(yīng)一袋面粉等等稻励,此時(shí)老張?jiān)僖膊挥每钢淮娣蹥獯跤醯娜ダ侠罴覔Q羊了父阻,他只要從家里摸出一克金子愈涩,就可以去老李家牽回一只羊,而老李拿著這一克黃金可以從任何愿意出讓面粉的人那里換回一袋面粉加矛,當(dāng)然也可以換取任何和一克黃金等值的物品履婉。
此時(shí)比特村進(jìn)入了實(shí)物貨幣時(shí)代。
符號(hào)貨幣
好景不長斟览,過了一段時(shí)間毁腿,實(shí)物貨幣的弊端也出現(xiàn)了。因?yàn)楸忍卮甯浇鸬V并不多苛茂,開采和冶煉金子太費(fèi)時(shí)費(fèi)力了已烤。而隨著使用,金子總是不斷會(huì)因?yàn)槟p妓羊、丟失或有人故意囤積而發(fā)生損耗胯究。全村人又一次坐在了一起,開始商討對(duì)策躁绸。此時(shí)有人說裕循,其實(shí)大家也不必一定要真的用黃金啊,隨便找張紙净刮,寫上“一克黃金”剥哑,只要全村人都認(rèn)同這張紙就等于一克黃金,問題不就解決了淹父。其他人紛紛表示認(rèn)同株婴,但同時(shí)也有了新的問題:真實(shí)的黃金是需要開采和冶煉的,金礦有限暑认,開采和冶煉也需要成本困介,所以沒有人可以短期憑空制造大量的黃金,可寫字就不同了穷吮,只要我紙夠筆夠逻翁,隨便像寫多少寫多少,那這就變成拼誰家里紙多了捡鱼,搞不好到時(shí)一萬張紙才能換一只羊(實(shí)際上這就發(fā)生了經(jīng)濟(jì)學(xué)上的通貨膨脹)八回。
大家一想也是啊。不過此時(shí)又有人提出了解決方案:這個(gè)紙不是誰寫都有效,我們只認(rèn)村里德高望重的老村長寫得缠诅,大家都認(rèn)識(shí)老村長的字溶浴。老村長寫一些紙,同時(shí)按照各家黃金存量發(fā)給大家等量的紙管引,例如老張家有二百克黃金士败,老村長就發(fā)給老張二百張寫著“一克黃金”的紙,同時(shí)將老張家的黃金拿走作為抵押褥伴。就這樣谅将,老村長將村里所有黃金收歸到自己的家里,并按各家上交的黃金數(shù)量發(fā)給等值的寫有字的紙重慢。此時(shí)村民就可以拿著這些紙當(dāng)黃金進(jìn)行貿(mào)易了饥臂,而且大家都認(rèn)得老村長的字,其他人偽造不出來似踱。另外隅熙,如果誰的紙磨損太嚴(yán)重,也可拿到老村長那里兌換新的等值的紙核芽,另外老村長承諾任何人如果想要換成真黃金囚戚,只要拿紙回來,老村長就會(huì)把等值的黃金還給那人轧简。因?yàn)槔洗彘L寫得紙的黃金量和真實(shí)放在家里的黃金量是一樣的驰坊,所以只要嚴(yán)格按照銷毀多少紙新寫多少紙的原則,每一張有效的紙總能換回相應(yīng)的真黃金吉懊。
此時(shí)庐橙,比特村進(jìn)入了符號(hào)貨幣(紙幣)時(shí)代。而老村長就承擔(dān)了政府和銀行的角色借嗽。
中央系統(tǒng)虛擬貨幣
又過了幾年态鳖,老村長由于每天都要核對(duì)大量的舊紙幣,寫新的紙幣恶导,還要把各種賬目仔細(xì)做好記錄浆竭。一來二去,老村長操勞過度不幸駕鶴西去了惨寿。
比特村再次召開全體大會(huì)邦泄,討論應(yīng)該怎么辦。此時(shí)老村長的兒子二狗子自告奮勇接過了父親的筆裂垦,承擔(dān)起貨幣發(fā)行的責(zé)任顺囊。這個(gè)年輕的村長二狗子很聰明,他做了幾天蕉拢,發(fā)現(xiàn)好像也不用真的寫那么多紙特碳。完全可以這樣:村民把紙幣都交上來诚亚,銷毀,但是二狗子會(huì)記錄下每戶上交的紙幣數(shù)量午乓。以后如果要進(jìn)行付錢站宗,例如老張要拿一克金子向老李換一只羊,就一起給二狗子打個(gè)電話益愈,說明要將老張名下的一克金子劃歸老李名下梢灭,二狗子拿出賬本,看看老張名下是否有一克金子蒸其,如果有就在老張的名下減掉一克敏释,在老李的名下加上一克,這樣就完成了支付枣接,此時(shí)老李在電話中聽到二狗子確認(rèn)轉(zhuǎn)賬完成颂暇,就可以放心讓老張把羊牽走了缺谴。
此時(shí)比特村進(jìn)入了中央系統(tǒng)虛擬貨幣時(shí)代但惶。每個(gè)村民都不需要用實(shí)物支付,支付過程變成了二狗子那邊維護(hù)的賬本上數(shù)字的變更湿蛔。
分布式虛擬貨幣
這新上任的二狗子是聰明膀曾,不過這人有時(shí)候是聰明反被聰明誤。有一天二狗子盯著這賬本阳啥,心想這全村各戶誰有多少錢就是我說的算添谊,那我豈不是……。于是他頭腦一熱察迟,私自從老張帳下劃了十克金子到自己名下斩狱。
本以為天衣無縫,但沒想到老張也有記賬的習(xí)慣扎瓶,有一天他正要付錢卻被二狗子告知賬戶沒錢了所踊。老張核對(duì)了一下自己的賬本,明明還有十克啊概荷,于是拿著賬本去找二狗子理論秕岛,這一核對(duì)發(fā)現(xiàn)了那筆未經(jīng)老張同意的轉(zhuǎn)賬。
東窗事發(fā)误证!比特村炸開鍋了继薛。二狗子被彈劾是不可避免了,不過通過這件事愈捅,大家發(fā)現(xiàn)了賬本集中在一個(gè)人手里的弊端:
- 這個(gè)體系完全依賴于賬本持有人的個(gè)人信用遏考,如果這個(gè)人不守規(guī)矩,隨意篡改賬本蓝谨,那么整個(gè)貨幣系統(tǒng)就會(huì)崩潰
- 如果這個(gè)人家里失火或者賬本失竊灌具,同樣也會(huì)為整個(gè)體系帶來毀滅性的打擊
正當(dāng)人們不知所措時(shí)林束,村里一個(gè)叫中本聰?shù)恼锌茖W(xué)家走上了臺(tái),告訴大家他已經(jīng)設(shè)計(jì)了一套不依賴任何中央處理人的叫比特幣的虛擬貨幣系統(tǒng)稽亏,可以解決上述問題壶冒。然后他緩緩講述了自己的方案。
下面我們就來看看中本聰同學(xué)是如何設(shè)計(jì)這套系統(tǒng)的截歉。
基礎(chǔ)設(shè)施搭建
賬簿公開機(jī)制
中本聰首先說明胖腾,要對(duì)現(xiàn)有賬簿進(jìn)行如下改造:
- 賬簿上不再記載每戶村民的余額,而只記載每一筆交易瘪松。即記載每一筆交易的付款人咸作、收款人和付款金額。只要賬簿的初始狀態(tài)確定宵睦,每一筆交易記錄可靠并有時(shí)序记罚,當(dāng)前每個(gè)人持有多少錢是可以推算出來的。
- 賬簿由私有改為公開壳嚎,只要任何村民需要桐智,都可以獲得當(dāng)前完整的賬簿,賬簿上記錄了從賬簿創(chuàng)建開始到當(dāng)前所有的交易記錄烟馅。
此言一出说庭,下面立刻炸鍋了。第一條還無所謂郑趁,但是第二條簡直無法接受刊驴,因?yàn)橘~簿可是記錄了所有村民的交易,這樣大家的隱私不全暴露了嗎寡润。
中本聰?shù)故遣换挪幻υ鳎贸隽艘粚?duì)奇怪的東西。
身份與簽名機(jī)制(公鑰加密系統(tǒng))
中本聰說梭纹,大家不要慌躲惰。在他的這套機(jī)制下,任何人都不使用真實(shí)身份交易栗柒,而是使用一個(gè)唯一的代號(hào)交易礁扮。
他展示了手里神奇的東西,說這兩件東西分別叫保密印章和印章掃描器瞬沦。后面他會(huì)給村里每一戶發(fā)一個(gè)保密印章和一個(gè)印章掃描器太伊。兩者的作用如下:
- 保密印章可以在紙上蓋一個(gè)章,每個(gè)印章蓋出的章都隱含了一個(gè)全村唯一的一串字符逛钻,但是憑肉眼是看不出來的僚焦。也無法通過觀察來制造出相應(yīng)的印章。
- 印章掃描器可以掃描某個(gè)已經(jīng)蓋好的章曙痘,讀出隱含的信息芳悲,并在液晶屏上顯示出一串字符立肘。
有了這兩個(gè)神奇的東西,大家就可以在不暴露真實(shí)身份的情況下進(jìn)行交易了名扛,而印章隱含的那一串字符就是這戶人家的代號(hào)谅年。具體如何巧妙利用保密印章和印章掃描器進(jìn)行交易,會(huì)在下文詳述肮韧。
成立虛擬礦工組織(挖礦群體)
下一步融蹂,中本聰面向全村招募虛擬礦工,招募要求如下:
- 礦工以組為單位弄企,一組可以是單獨(dú)的一戶超燃,也可以是幾戶聯(lián)合為一組
- 成為礦工不影響正常使用貨幣
- 礦工每天要花費(fèi)一定時(shí)間從事比特幣“挖礦”活動(dòng),但是不同于挖金礦拘领,虛擬礦工不需要拿著工具去野外作業(yè)意乓,在家里就可以完成工作
- 礦工有一定可能性獲得報(bào)酬,在挖礦活動(dòng)中付出的努力越多约素,獲得報(bào)酬的可能性越大
- 礦工可以隨時(shí)退出届良,也可以隨時(shí)有新的礦工加進(jìn)來
很快,大約有五分之一的村民加入比特幣礦工組織业汰,共分成了7個(gè)組伙窃。
建立初始賬簿(創(chuàng)世塊)
下面,中本聰宣布样漆,先根據(jù)二狗子手里的賬簿,把抵押的所有黃金按賬簿記錄的余額退還給每位村民晦闰,然后徹底銷毀這本賬簿放祟。
然后,中本聰拿出一本新賬簿呻右,在賬簿的第一頁上記錄了一些交易記錄跪妥,特別的是,這些記錄的付款人一欄全都是“系統(tǒng)”声滥,而收款人分別是每個(gè)印章對(duì)應(yīng)的隱含字符眉撵,代表初始時(shí)刻,系統(tǒng)為每一戶默認(rèn)分配了一定數(shù)量比特幣落塑,但是數(shù)量非常少纽疟,都只有幾枚,甚至有些不幸的村戶沒有獲得比特幣憾赁。
接著中本聰說污朽,由于目前市面上比特幣非常少,大家可以先回到用黃金做貨幣的時(shí)代龙考,由于我不是村長蟆肆,我也沒有權(quán)利強(qiáng)迫大家一定要承認(rèn)比特幣矾睦,大家可以自行決定要不要接受比特幣。不過隨著比特幣的流動(dòng)和礦工的活動(dòng)炎功,比特幣會(huì)慢慢多起來枚冗。
支付與交易
做了這么多鋪墊,終于說到重點(diǎn)了蛇损,下面說一下在這樣一個(gè)體系下如何完成支付官紫。以老張付給老李10個(gè)比特幣為例。
付款人簽署交易單
為了支付10個(gè)比特幣州藕,老張首先要詢問老李的標(biāo)識(shí)字符串束世,例如是“ABCDEFG”,同時(shí)老張也有一個(gè)標(biāo)識(shí)字符串例如是“HIJKLMN”床玻,然后老張寫一張單子毁涉,內(nèi)容為“HILKLMN支付10比特幣給ABCDEFG”,然后用自己的保密印章改一個(gè)章锈死,將這張單子交給老李贫堰。另外為了便于追溯這筆錢的來源,還要在單子里注明這筆錢的來源記在哪一頁待牵,例如這個(gè)單子里其屏,老張的10比特幣來自建立賬簿時(shí)系統(tǒng)的贈(zèng)送,記錄在賬簿第一頁缨该。
收款人確認(rèn)單據(jù)簽署人
老李拿到這個(gè)單子后偎行,需要確認(rèn)這個(gè)單子確實(shí)是來自“HIJKLMN”這個(gè)人(也就是老張)簽署的,這個(gè)并不困難贰拿。因?yàn)閱巫由媳仨氂斜C苷赂蛱唬侠钅贸鲇≌聮呙杵鳎瑨咭幌抡屡蚋绻壕溜@示出的字符和付款人字符是一致的(這里是“HIJKLMN”)妙真,就可以確認(rèn)單子確實(shí)是付款人簽署的。這是因?yàn)楦鶕?jù)保密印章的機(jī)制荚守,沒有其他人可以偽造印章珍德,任何一個(gè)人只要掃描一下印章,都可以確認(rèn)單子的付款人和蓋章人是否一致矗漾。
收款人確認(rèn)付款人余額
這個(gè)系統(tǒng)到目前還是很有問題锈候。通過保密印章,收款人雖然可以確認(rèn)付款人確實(shí)簽署了這份單子缩功,但是無法自行確認(rèn)付款人是否有足夠的余額支付晴及。之前的中央虛擬貨幣系統(tǒng)中,二狗子負(fù)責(zé)檢查付款人的余額嫡锌,并通知收款人交易是否有效虑稼,現(xiàn)在把二狗子開了琳钉,誰來負(fù)責(zé)記賬和確認(rèn)每筆交易的有效性呢?
之前說過蛛倦,中本聰設(shè)計(jì)的這個(gè)系統(tǒng)是分布式貨幣系統(tǒng)歌懒,不依賴任何中央人物,所以不會(huì)有一個(gè)或少數(shù)幾個(gè)人負(fù)責(zé)這件事溯壶,最終承擔(dān)這份工作的是之前所提到的礦工組織及皂。老張、老李和全村其他任何使用比特幣進(jìn)行交易的村民都依賴礦工組織的工作才能完成交易且改。
礦工的工作
礦工的工作是整個(gè)系統(tǒng)的核心验烧,也是最復(fù)雜性最高的地方。下面逐步介紹礦工的工作內(nèi)容和目的又跛。
礦工的工具
俗話說碍拆,工欲善其事,必先利其器慨蓝。比特幣礦工雖然不用鐵撅感混、鐵锨和探照燈等工具,不過也要有一些必備的東西礼烈。
初始賬簿弧满。每個(gè)組首先自己復(fù)制一份初始賬簿,初始賬簿只有一頁此熬,記錄了系統(tǒng)的第一次贈(zèng)送
空賬簿紙庭呜。每個(gè)小組有若干賬簿紙,每一頁紙上僅有賬簿結(jié)構(gòu)摹迷,沒有填內(nèi)容疟赊,具體內(nèi)容的書寫規(guī)則后面講述。下面是一張空賬簿紙的樣子峡碉,各個(gè)字段的意義后面會(huì)說到
編碼生成器(哈希函數(shù))。中本聰又向礦工組織的每個(gè)組分發(fā)了若干編碼生成器驮审,這個(gè)東西很神奇鲫寄,將一頁賬簿填好內(nèi)容的賬簿紙放入這個(gè)機(jī)器,機(jī)器會(huì)在賬簿紙的“本賬單編號(hào)”一欄自動(dòng)打印一串由“0”和“1”組成的編號(hào)疯淫,共256個(gè)地来。最神奇的是,編號(hào)生成器有如下功能:
- 生成的編號(hào)僅與賬簿紙上填入的內(nèi)容有關(guān)熙掺,與填寫人未斑、字體、填寫時(shí)間等因素均無關(guān)
- 內(nèi)容相同的賬簿紙生成的編號(hào)總是相同币绩,但是如果內(nèi)容哪怕只改一個(gè)字符蜡秽,編號(hào)就會(huì)面目全非
- 編碼生成器在打印編碼時(shí)還需要將所有填入賬簿紙的交易單放入府阀,機(jī)器會(huì)掃描交易單和填入交易單的一致性,尤其是保密印章芽突,如果發(fā)現(xiàn)保密印章和付款人不一致试浙,會(huì)拒絕打印編碼
- 將一張已打印的賬簿紙放入,機(jī)器會(huì)判定編號(hào)是否是有效的機(jī)器打印寞蚌,并且判定編號(hào)和內(nèi)容是否一致田巴,這個(gè)編號(hào)無法偽造
- 交易單收件箱。每個(gè)礦工小組需要在門口掛一個(gè)箱子用于收集交易單挟秤。
- 公告板壹哺。每個(gè)礦工小組同樣需要一個(gè)公告板公示一些信息。
有了上面的工具艘刚,礦工組織就可以開工了管宵!
收集交易單
中本聰規(guī)定,每筆交易的發(fā)起人昔脯,不但要將交易單給到收款人啄糙,還要同時(shí)復(fù)制若干份一模一樣的交易單投遞到每個(gè)礦工小組的收件箱里。
礦工小組的人定期到自己的收件箱里把收集到的交易單一并取出來云稚。
填寫賬簿
此時(shí)小組的人拿出一張空的賬簿紙隧饼,把這些交易填寫到“交易清單”一欄,同時(shí)找到當(dāng)前賬簿最后一頁静陈,將最后一頁的編號(hào)抄寫到“上一張賬單編號(hào)一欄”燕雁。
注意還有個(gè)“幸運(yùn)數(shù)字”,可以隨便填上一個(gè)數(shù)字鲸拥,如12345拐格。然后,將這樣賬簿紙放入編號(hào)生成器刑赶,打印好編號(hào)捏浊,一張賬簿就算完成了侣夷。
如果你以為礦工的工作就這么簡單夸研,那就大錯(cuò)特錯(cuò)了腾夯,中本聰有個(gè)變態(tài)的規(guī)定:只有編號(hào)的前10個(gè)數(shù)均為0洗鸵,這頁賬簿紙才算有效地回。
根據(jù)之前對(duì)編號(hào)生成器的描述虽界,要修改編號(hào)摄乒,只能修改賬簿紙的內(nèi)容歹袁,而“交易清單”和“上一張賬簿紙編號(hào)”是不能隨便改的枷餐,那么只能改幸運(yùn)數(shù)字了靶瘸。于是為了生成有效的賬簿紙,小組里的礦工就不斷抄寫賬簿紙,但每張紙的幸運(yùn)數(shù)字都不同怨咪,然后不斷的重復(fù)將紙放入編碼器屋剑,如果生成的編號(hào)不符合規(guī)定,這張紙就算廢了惊暴,重復(fù)這個(gè)過程直到生成一串有效的編號(hào)饼丘。
我們知道,如果編號(hào)的每一個(gè)數(shù)字都是隨機(jī)的辽话,那么平均寫1000多張幸運(yùn)數(shù)字不同的紙才能獲得一個(gè)有效的編號(hào)肄鸽。
這就奇怪了,這些礦工為什么要拼命干這看似無意義的事情呢油啤?還記得之前說過礦工有報(bào)酬吧典徘,這就是礦工的動(dòng)力了。中本聰規(guī)定:每一張賬簿紙的交易清單第一條交易為“系統(tǒng)給這個(gè)小組支付50個(gè)比特幣”益咬。也就是說逮诲,如果你生成了一張有意義的賬簿紙,并且被所有挖礦小組接受了幽告,那么就意味著這條交易也被接受了梅鹦,你的挖礦小組獲得了50個(gè)比特幣。
這就是礦工被叫做礦工的原因冗锁,也是為什么之前說隨著交易和礦工的活動(dòng)齐唆,比特幣的數(shù)量會(huì)不斷增多。例如下面是一個(gè)挖礦過程冻河,這個(gè)小組的公共比特幣帳號(hào)為“UVWXYZ”箍邮。
在幸運(yùn)數(shù)字嘗試到“533”時(shí),系統(tǒng)生成了一頁有效賬簿叨叙。
確認(rèn)賬簿
當(dāng)某挖礦小組幸運(yùn)的生成了一張有意義的賬簿锭弊,為了得到獎(jiǎng)勵(lì),必須立刻請(qǐng)其它小組確認(rèn)自己的工作擂错。前面說過味滞,當(dāng)前村里有7個(gè)挖礦組,所以這個(gè)小組必須將有效賬簿紙謄抄6份快馬加鞭送到其他6個(gè)小組請(qǐng)求確認(rèn)钮呀。
中本聰規(guī)定桃犬,當(dāng)某個(gè)小組接到其他小組送來的賬簿紙時(shí),必須立即停下手里的挖礦工作進(jìn)行賬簿確認(rèn)行楞。
需要確認(rèn)的信息有三個(gè):
- 賬簿的編號(hào)有效
- 賬簿的前一頁賬簿有效
- 交易清單有效
首先看第一個(gè),這個(gè)確認(rèn)比較簡單土匀。只要將送來的賬簿紙放入編碼生成器進(jìn)行驗(yàn)證子房,如果驗(yàn)證通過,則編號(hào)有效。
第二部分需要將賬簿頁上的“上一頁賬簿紙編號(hào)”和這個(gè)小組目前保存的有效賬簿最后一頁編號(hào)比對(duì)证杭,如果相同則確認(rèn)田度,如果不同,需要順著已有賬簿向前比對(duì)解愤,直到找到這個(gè)編號(hào)的頁镇饺。如果沒有找到指定的“上一頁賬簿紙編號(hào)”對(duì)應(yīng)的頁,這個(gè)小組會(huì)將此頁丟掉送讲。不予確認(rèn)奸笤。
注意,由上面的機(jī)制可以保證哼鬓,如果各個(gè)小組手里的賬簿紙是相同的监右,那么他們都能按同樣的順序裝訂成相同的賬簿。因?yàn)楹竺嬉粡埣埖木幪?hào)總是依賴前面的紙的編號(hào)异希,編碼生成器的機(jī)制保證了所有合法賬簿紙的相對(duì)先后順序在每個(gè)小組那里都是相同的(可能會(huì)有分支健盒,但不會(huì)出現(xiàn)環(huán),后面細(xì)講)称簿。
最后是如何確認(rèn)交易清單有效扣癣,其實(shí)也就是要確認(rèn)當(dāng)前每筆交易的付款人有足夠的余額支付這筆錢。由于交易信息里包含這筆錢是如何來的憨降,還包含了記錄來源交易的賬單編號(hào)父虑。例如,HIJKLMN要給ABCDEFG10個(gè)比特幣券册,并注明了這10個(gè)比特幣來自之前OPQRST支付給HIJKLMN的一筆交易频轿,確認(rèn)時(shí)首先要確認(rèn)之前這筆交易是否存在,同時(shí)還要檢查HIJKLMN在這之前沒有將這10個(gè)比特幣支付給別人烁焙。這一切確認(rèn)后航邢,這筆交易有效性就被確認(rèn)了。
其中第一筆是系統(tǒng)獎(jiǎng)勵(lì)給生成這頁賬簿的小組的50個(gè)骄蝇,這筆交易大家都默認(rèn)承認(rèn)膳殷,后面的只要按照上述方法追溯,就可以確認(rèn)HIJKLMN是否當(dāng)前真有10個(gè)比特幣支付給ABCDEFG九火。
如果完成了所有了上述驗(yàn)證并全部通過赚窃,這個(gè)小組就認(rèn)可了上述賬簿紙有效,然后將這張賬簿紙并入小組的主賬簿岔激,舍棄目前正在進(jìn)行的工作勒极,后面的挖礦工作會(huì)基于這本更新后的主賬本進(jìn)行。
賬簿確認(rèn)反饋
對(duì)于挖礦小組來說虑鼎,當(dāng)賬簿紙送出去后辱匿,如果后面有收到其他小組送來的賬簿紙键痛,其“上一頁賬簿紙編號(hào)”為自己之前送出去的賬簿紙,那么就表示他們的工作成功被其他小組認(rèn)可了匾七,因?yàn)橐呀?jīng)有小組基于他們的賬簿紙繼續(xù)工作了絮短。此時(shí),可以粗略的說可以認(rèn)為已經(jīng)得到了50個(gè)比特幣昨忆。
另外丁频,任何一個(gè)小組當(dāng)新生成有效賬簿紙或確認(rèn)了別的小組的賬簿紙時(shí),就將最新被這個(gè)小組承認(rèn)的交易寫到公告牌上邑贴,那么收款人只要發(fā)現(xiàn)相關(guān)交易被各個(gè)小組認(rèn)可了席里,基本就可以認(rèn)為這筆錢已經(jīng)到了自己的賬上,后面他就可以在付款時(shí)將錢的來源指向這筆交易了痢缎。
以上就是整個(gè)比特幣的支付體系胁勺。下面我們來分析一下,這個(gè)體系為什么可以工作下去独旷,以及這個(gè)體系可能面臨的風(fēng)險(xiǎn)署穗。
工作機(jī)制分析
雖然上面闡述了比特幣的基本運(yùn)作規(guī)則,但是村民們還是有不少疑問嵌洼。所以中本聰同學(xué)專門開了個(gè)答疑會(huì)案疲,解答常見問題。下面總結(jié)一下村民最集中關(guān)心的問題麻养。
核心問題答疑
如果同時(shí)收到兩份合法的賬簿頁怎么辦褐啡?
注意在上面的運(yùn)行機(jī)制中,各個(gè)挖礦小組是并行工作的鳖昌,因此完全可能出現(xiàn)這樣的情況:某小組收到兩份不一樣的賬簿頁备畦,它們都基于當(dāng)前這個(gè)小組的主賬簿的最后一頁,并且內(nèi)容也都完全合法许昨,怎么辦懂盐?
關(guān)于這個(gè)問題,中本聰同學(xué)說糕档,小組不應(yīng)該以線性方式組織賬簿莉恼,而應(yīng)該以樹狀組織賬簿,任何時(shí)刻速那,都以當(dāng)前最長分支作為主賬簿俐银,但是保留其它分支。舉個(gè)例子端仰,某小組同時(shí)收到A捶惜、B兩份賬簿頁,經(jīng)核算都是合法的荔烧,此時(shí)小組應(yīng)該將兩頁以分叉的形式組織起來售躁,如下圖所示:
黑色表示當(dāng)前賬簿主干坞淮。此時(shí),可以隨便選擇一個(gè)頁作為當(dāng)前主分支陪捷,例如選擇A:
此時(shí)如果有一個(gè)新的賬簿頁是基于A的,那么這個(gè)主干就延續(xù)下去:
如果這個(gè)主干一直這么延續(xù)下去诺擅,表示大家基本都以A為主干市袖,B就會(huì)被遺忘。但是也有可能忽然B變成更長了:
那么我們就需要將B分支作為當(dāng)前主干烁涌,基于這個(gè)分支進(jìn)行后續(xù)工作苍碟。
從局部來看,雖然在某一時(shí)刻各個(gè)小組的賬簿主干可能存在不一致撮执,但大方向是一致的微峰,那些偶爾由于不同步產(chǎn)生的小分支,會(huì)很快被淹沒在歷史中抒钱。
如果挖礦小組有人偽造賬簿怎么辦
關(guān)于這個(gè)問題蜓肆,中本聰同學(xué)說,只要挖礦組織中大多數(shù)人是誠實(shí)的谋币,這個(gè)系統(tǒng)就可靠仗扬,具體分幾個(gè)方面給予答復(fù)。
首先蕾额,基于保密印章機(jī)制早芭,沒有人能偽造他人身份進(jìn)行付款,因?yàn)榫幋a生成器在打印編碼時(shí)會(huì)核對(duì)所有交易單的保密印章诅蝶,印章和付款人不一致會(huì)拒絕打印退个。
而且誠實(shí)的礦工也不會(huì)承認(rèn)不合法的交易(如某筆交易付款方余額不夠)。
所以只有一種可能的攻擊行為调炬,即在收款人確認(rèn)收款后语盈,從另一條分支上建立另外的交易單,取消之前的付款筐眷,而將同一筆錢再次付款給另一個(gè)人(即所謂的double-spending問題)黎烈。下面同樣用一個(gè)例子說明這個(gè)問題。
先假設(shè)有一個(gè)攻擊者擁有10個(gè)比特幣匀谣,他準(zhǔn)備將這筆錢同時(shí)支付給兩名受害者A和B照棋,并都得到承認(rèn)。
第一步武翎,攻擊者準(zhǔn)備從受害者A手里買10比特幣的黃金烈炭,他簽署交易單給受害者A,轉(zhuǎn)10個(gè)比特幣給受害者A宝恶。
第二步符隙,這筆交易在最新的賬簿頁中被確認(rèn)趴捅,并被各個(gè)挖礦小組公告出來。受害人A看到公告霹疫,確認(rèn)比特幣到賬拱绑,給了攻擊者10個(gè)比特幣等值的黃金。
第三步丽蝎,攻擊者找到賬簿猎拨,從包含剛才交易的賬簿頁的前一頁做出一個(gè)分支,生成更多的賬單頁屠阻,超過剛才的分支红省。由于此時(shí)剛才攻擊者制造的分支變成了主干分支,而包含受害者A得到錢的分支變成了旁支国觉,因此挖礦組織不再承認(rèn)剛才的轉(zhuǎn)賬吧恃,受害者A得到的10比特幣被取消了。
第四步麻诀,攻擊者可以再次簽署交易單痕寓,將同一筆錢支付給受害者B。受害者B確認(rèn)錢到賬后针饥,支付給攻擊者等值黃金厂抽。
至此,攻擊者將10個(gè)比特幣花了兩次丁眼,從兩名受害者那里各購得等值黃金筷凤。攻擊者還可以如法炮制,取消與受害者B的轉(zhuǎn)賬苞七,將同一筆錢再支付給其他人……
關(guān)于這種攻擊藐守,中本聰給出的解決方案是,建議收款人不要在公告掛出時(shí)立即確認(rèn)交易完成蹂风,而是應(yīng)該再看一段時(shí)間卢厂,等待各個(gè)挖礦小組再掛出6張確認(rèn)賬簿,并且之前的賬簿沒有被取消惠啄,才確認(rèn)錢已到賬慎恒。
中本聰解釋道,之前設(shè)定變態(tài)的編號(hào)規(guī)則撵渡,正是為了防御這一點(diǎn)融柬。根據(jù)前面所述,生成有效賬簿頁不是那么簡單的趋距,要花費(fèi)大量的人力反復(fù)試不同的幸運(yùn)數(shù)字粒氧,而且過程完全是碰運(yùn)氣。如果某賬簿頁包含你收到錢的確認(rèn)节腐,并且在后面又延續(xù)了6個(gè)外盯,那么攻擊者想要在落后6頁的情況下從另一個(gè)分支趕超當(dāng)前主分支是非常困難的摘盆,除非攻擊者擁有非常多的人力,超過其他所有誠實(shí)礦工的人力之和饱苟。
而且孩擂,如果攻擊者有如此多人力,與其花這么大力氣搞這種攻擊掷空,還不如做良民挖礦來的收益大肋殴。這就從動(dòng)機(jī)上杜絕了攻擊的形成。
比特幣會(huì)一直增加下去坦弟,豈不是會(huì)嚴(yán)重通貨膨脹
中本聰說,這一點(diǎn)我也想到了官地。前面忘了說了酿傍,我給礦工組織的操作細(xì)則手冊(cè)會(huì)說明,剛開始我們協(xié)議每生成一頁賬簿驱入,獎(jiǎng)勵(lì)小組50個(gè)比特幣赤炒,后面,每當(dāng)賬簿增加21,000頁亏较,獎(jiǎng)勵(lì)就減半莺褒,例如當(dāng)達(dá)到210,000頁后,每生成一頁賬簿獎(jiǎng)勵(lì)25個(gè)比特幣雪情,420,000頁后遵岩,每生成一頁獎(jiǎng)勵(lì)12.5個(gè),依次類推巡通,等賬簿達(dá)到6,930,000頁后尘执,新生成賬簿頁就沒有獎(jiǎng)勵(lì)了。此時(shí)比特幣全量約為21,000,000個(gè)宴凉,這就是比特幣的總量誊锭,所以不會(huì)無限增加下去。
沒有獎(jiǎng)勵(lì)后弥锄,就沒人做礦工了丧靡,豈不是沒人幫忙確認(rèn)交易了
到時(shí),礦工的收益會(huì)由挖礦所得變?yōu)槭杖∈掷m(xù)費(fèi)籽暇。例如温治,你在轉(zhuǎn)賬時(shí)可以指定其中1%作為手續(xù)費(fèi)支付給生成賬簿頁的小組,各個(gè)小組會(huì)挑選手續(xù)費(fèi)高的交易單優(yōu)先確認(rèn)图仓。
礦工如果越來越多罐盔,比特幣生成速度會(huì)變快嗎
不會(huì)。中本聰解釋救崔,雖然可以任意加入和退出礦工組織惶看,導(dǎo)致礦工人數(shù)變化捏顺,每個(gè)礦工也會(huì)拿到一個(gè)編碼生成器,不過我已經(jīng)在編碼生成器中加入了調(diào)控機(jī)制纬黎,當(dāng)前工作的編碼生成器越多幅骄,每個(gè)機(jī)器的效率就越低,保證新賬簿頁生成速率不變本今。
雖然每個(gè)人的代號(hào)是匿名的拆座,但如果泄露了某個(gè)人的代號(hào),賬簿又是公開的冠息,豈不是他的所有賬目都查出來了
確實(shí)是這樣的挪凑。例如你要和某人交易,必然要要到他的代號(hào)才能填寫交易單逛艰。因?yàn)槭湛钊艘粰谝钊肽侨说拇?hào)躏碳。不過中本聰說可以提供無限制的保密印章,建議每一次交易用不同的保密印章散怖,這樣查賬簿就追查不到同一個(gè)人的所有賬目了菇绵。
答疑完畢。
說明
本文用通俗比喻的方式講解了比特幣的運(yùn)行機(jī)制镇眷。有幾點(diǎn)需要說明:
- 為了便于理解咬最,我做了很多簡化,因此有些機(jī)制細(xì)節(jié)和實(shí)際的比特幣可能不完全相同欠动。但總體思想和關(guān)鍵原理是一致的永乌。
- 由于很多計(jì)算機(jī)世界的東西(如公鑰體系、網(wǎng)絡(luò)傳輸)在現(xiàn)實(shí)世界中并沒有特別好的對(duì)等物翁垂,所以故事里難免有一些生硬和不合常理的細(xì)節(jié)铆遭。
- 本文描述的是比特幣網(wǎng)絡(luò)本身的技術(shù)原理和運(yùn)作機(jī)制,當(dāng)在如Mtgox這種買賣市場(chǎng)中進(jìn)行比特幣交易時(shí)沿猜,市場(chǎng)做了中間代理枚荣,并不遵從上述機(jī)制