通往比特幣的漫長道路之密碼學(xué)和數(shù)字貨幣
重大的技術(shù)創(chuàng)新從來不是政府規(guī)劃、設(shè)計(jì)、主導(dǎo)的結(jié)果。技術(shù)更替、創(chuàng)新與演化依靠的是少數(shù) “先行者” 的勇敢試錯(cuò)和市場自發(fā)的優(yōu)勝劣汰機(jī)制。
<div align = right>------姚前(中國人民銀行數(shù)字貨幣研究所所長)</div>
通往比特幣的漫長道路是Jeremy Clarek(Concordia學(xué)院信息系統(tǒng)工程助理教授)在《區(qū)塊鏈 技術(shù)驅(qū)動(dòng)金融》一書中前言里所用的標(biāo)題。一般情況下,事物的發(fā)展都需要經(jīng)歷起始、上升、鼎盛、衰微、消亡這五個(gè)階段,區(qū)塊鏈從2008年中本聰發(fā)布比特幣白皮書開始到現(xiàn)在已經(jīng)9年了,然而人類對數(shù)字貨幣探索的歷史從上世紀(jì)八九十年代就開始了。從大衛(wèi).喬姆(David Chaum)盲簽技術(shù)面世到如今區(qū)塊鏈已經(jīng)成為了眾所周知的一門技術(shù),ICO更是接近野蠻生長,其發(fā)展也是經(jīng)歷的漫長的伏筆與積累。我想要在本系列中探討的是區(qū)塊鏈技術(shù)的漫長發(fā)展史,先從密碼學(xué)和加密數(shù)字貨幣開始。
提到數(shù)字貨幣,一般情況下繞不開的幾個(gè)問題無非是交易本身安全嗎?交易會被人篡改嗎?如何證明數(shù)字貨幣是屬于我的?個(gè)人信息會被泄露嗎?假使交易出現(xiàn)問題我能追蹤嗎?等等等等,現(xiàn)在我們先就前面列舉的問題一一解釋,看區(qū)塊鏈?zhǔn)侨绾谓鉀Q這些問題的。
首先,談?wù)剠^(qū)塊鏈的結(jié)構(gòu),區(qū)塊鏈的結(jié)構(gòu)大致如下:

區(qū)塊鏈?zhǔn)且粋€(gè)由哈希指針構(gòu)建的鏈表。所謂哈希指針可以理解為一個(gè)數(shù)據(jù)向?qū)В@個(gè)向?qū)Р粌H可以告訴你上個(gè)區(qū)塊在哪里,而且還以告訴你上個(gè)區(qū)塊大概長什么樣子。區(qū)塊中記錄了一段時(shí)間的交易,因此區(qū)塊鏈則記錄了所有的交易,好比一個(gè)全歷史的交易賬本,我們可以將新的數(shù)據(jù)附加到當(dāng)前賬本的末尾,但是如果有人要篡改之前的交易,我們可以檢測到。要理解為什么區(qū)塊鏈的數(shù)據(jù)結(jié)構(gòu)可以防止篡改,我們先了解下哈希函數(shù)。
哈希函數(shù)
哈希函數(shù)是一個(gè)數(shù)學(xué)函數(shù),它具有以下特性:
- 輸入可以是任意大小的字符串
- 產(chǎn)生固定大小的輸出
- 能進(jìn)行有效的計(jì)算
用數(shù)學(xué)公式表示即Addr = H(key),其中key為任意字符串,Addr為等長的字符輸出。在區(qū)塊鏈中使用的哈希函數(shù)還有三個(gè)附加的特性,即1)碰撞阻力;2)隱秘性;3)謎題友好。在本文中我們先介紹碰撞阻力這一特性。
碰撞阻力
如果無法找到兩個(gè)值,x和y,x不等于y,而H(x) = H(y),則稱哈希函數(shù)H是有碰撞阻力的。
雖然無法找到,但并不表示碰撞不存在,只是說找到碰撞的代價(jià)太高,幾率太小,例如一個(gè)256位大小的輸出,選擇2^256+1個(gè)不同的輸入,至少存在一對x和y,其H(x)=H(y)。
哈希函數(shù)碰撞阻力這一特性可用于生成信息摘要,在區(qū)塊鏈中的數(shù)據(jù)向?qū)?-哈希指針正是利用這點(diǎn)才能知道上一個(gè)區(qū)塊“長什么樣子”,將上一區(qū)塊的哈希值作為哈希指針,通過驗(yàn)證上一區(qū)塊哈希與該區(qū)塊的哈希指針是否相等,即可判斷該區(qū)塊是否是上個(gè)區(qū)塊之后的節(jié)點(diǎn)。
現(xiàn)在我們繼續(xù)來說區(qū)塊鏈的防篡改機(jī)制,我們可以先假設(shè)一下如果更改了之前的交易數(shù)據(jù)會發(fā)生什么。假設(shè)當(dāng)前共有m個(gè)區(qū)塊,有人想要篡改第n塊數(shù)據(jù),既然第n塊數(shù)據(jù)發(fā)生改變,因?yàn)楣:瘮?shù)具有碰撞阻力,那么我們可以斷定原本第n+1塊區(qū)塊中記錄的第n塊的哈希值與篡改后的第n塊的哈希值將不再匹配,我們通過檢測區(qū)塊的哈希值與下一區(qū)塊的哈希指針變能檢測到篡改。當(dāng)然他可以繼續(xù)改動(dòng)第n+1塊的哈希指針,那么第n+1塊的哈希也將發(fā)生變化,如此,他需要一直改動(dòng)直到第m塊,我們只需要記住第m塊的哈希指針并保證他人無法改動(dòng),那么變可以保證整個(gè)區(qū)塊鏈的數(shù)據(jù)是安全未篡改的。

哈希指針在區(qū)塊鏈中的應(yīng)用除了這一點(diǎn),還有另外一個(gè)地方也用到了,即構(gòu)建梅克爾樹(Merkel trees)。
梅克爾樹
梅克爾樹(Merkle trees)是區(qū)塊鏈的基本組成部分。雖說從理論上來講,沒有梅克爾樹的區(qū)塊鏈當(dāng)然也是可能的,你只需創(chuàng)建直接包含每一筆交易的巨大區(qū)塊頭(block header)就可以實(shí)現(xiàn),但這樣做無疑會帶來可擴(kuò)展性方面的挑戰(zhàn),從長遠(yuǎn)發(fā)展來看,可能最后將只有那些最強(qiáng)大的計(jì)算機(jī),才可以運(yùn)行這些無需受信的區(qū)塊鏈。 正是因?yàn)橛辛嗣房藸枠洌蕴还?jié)點(diǎn)才可以建立運(yùn)行在所有的計(jì)算機(jī)、筆記本、智能手機(jī),甚至是那些由Slock.it生產(chǎn)的物聯(lián)網(wǎng)設(shè)備之上。梅克爾樹的結(jié)構(gòu)如下:

在梅克爾樹的數(shù)據(jù)結(jié)構(gòu)中,所有的數(shù)據(jù)區(qū)塊都被兩兩分組,指向這些數(shù)據(jù)區(qū)塊的指針被存儲在上一層的父節(jié)點(diǎn)中,而這些父節(jié)點(diǎn)再次被兩兩分組,指向父節(jié)點(diǎn)的指針被存儲在上一層的父節(jié)點(diǎn)中,一直持續(xù)這個(gè)過程,直到最后達(dá)到樹的根節(jié)點(diǎn)。
利用梅克爾樹,區(qū)塊可見簡潔的實(shí)現(xiàn)隸屬證明。假設(shè)現(xiàn)在某人需要證明某個(gè)數(shù)據(jù)區(qū)塊隸屬于梅克爾樹,我們只需要記住根節(jié)點(diǎn),然后他需要展示給我們數(shù)據(jù)區(qū)塊的信息以及該數(shù)據(jù)區(qū)塊通向梅克爾根的哪些數(shù)據(jù)區(qū)塊,我們可以忽略梅克爾樹的其余部分,而通過只該分支的數(shù)據(jù)到達(dá)這個(gè)目的。
區(qū)塊鏈中,我們將交易數(shù)據(jù)構(gòu)建成梅爾克數(shù),然后在區(qū)塊頭中記錄梅克爾樹根的值。這樣區(qū)塊鏈節(jié)點(diǎn)只存儲區(qū)塊頭信息,也可以實(shí)現(xiàn)正常交易,需要詳細(xì)交易數(shù)據(jù)時(shí)再針對性下載即可。
現(xiàn)在,我們來更新下區(qū)塊鏈的結(jié)構(gòu)將它進(jìn)一步的細(xì)化。

我們將區(qū)塊分為兩大部分,分為區(qū)塊頭和區(qū)塊體,區(qū)塊頭中存儲著前一個(gè)區(qū)塊的哈希值(即哈希指針)、交易的梅克爾根以及其它的數(shù)據(jù)(后續(xù)會詳細(xì)談到),區(qū)塊體中則存儲著詳細(xì)交易數(shù)據(jù)。