區(qū)塊鏈技術(shù)入門理解

背景

想象一個(gè)場(chǎng)景, Joe是你最好的朋友。他正在海外旅游。他給你一個(gè)電話, “Dude,我把錢花光了,江湖救急?!?你回答”馬上匯款“然后掛掉電話。然后你打電話給你銀行賬戶的經(jīng)理,”請(qǐng)從我的賬戶轉(zhuǎn)1000美元到Joe的賬戶上“。你的賬戶經(jīng)理回復(fù),”收到,先生“。他打開賬簿,查看你的賬戶以確定你有足夠的余額轉(zhuǎn)出1000美元給Joe。因?yàn)槟闶莻€(gè)土豪,賬上還有大量余額,因此,他在賬簿上登記了一個(gè)條目,像這樣:

image

你打電話給Joe,告訴他,“我已經(jīng)轉(zhuǎn)賬了。下一次你去銀行的時(shí)候,你就可以取出我剛剛轉(zhuǎn)過去的1000美元?!?/p>

上面的過程中, 你和Joe都委托銀行來管理你們的錢。并沒有物理票據(jù)的實(shí)際流動(dòng)來轉(zhuǎn)移你們的錢。所需的一切不過是賬簿上的一個(gè)條目?;蛘吒鼫?zhǔn)確一點(diǎn),賬簿上的一個(gè)既不受你和Joe控制、也不被你們所擁有的條目。

這就是現(xiàn)有體系的問題。

為了在我們之間建立互信,我們依賴于獨(dú)立第三方。

你也許會(huì)問,“依賴他們有什么毛?。俊?毛病在于,它們清一色只是數(shù)字。如果其中第三方的一個(gè)人或者一個(gè)機(jī)構(gòu)有意識(shí)地或無意識(shí)地走向貪腐墮落, 即可在社會(huì)上引發(fā)一場(chǎng)混亂。

  • 要是記錄下這筆轉(zhuǎn)賬的賬簿在一場(chǎng)大火中燒成灰燼了呢?
  • 要是,你的銀行經(jīng)理搞錯(cuò)了,寫了個(gè)1500美元而不是1000美元呢?
  • 要是,他根本就是有意為之呢?

提出問題

會(huì)有這樣一個(gè)系統(tǒng)嗎,在那里我們無需銀行就可以轉(zhuǎn)賬?

想一下,轉(zhuǎn)賬意味著什么?只是賬簿上的一個(gè)條目而已。那么更好的問題將是——是否有某種手段,可以在我們中間維護(hù)那本賬簿,而不是讓其他人來為我們操作?

它就是一種在我們中間維護(hù)賬簿而非依賴其他人來為我們代勞的方法。這一方法的要求是:必須有足夠的人不想依賴第三方。只有這樣,這群人才能靠自己來維護(hù)他們的賬簿。

多少人才算是夠?至少要3個(gè)。打個(gè)比方,我們假設(shè)有10個(gè)人想拋棄銀行以及任何第三方。根據(jù)相互之間的協(xié)議,他們可以一直擁有彼此的賬號(hào)信息——但不知道其他人的真實(shí)身份。

在沒有獨(dú)立第三方情況下,需要一個(gè)去中心化的系統(tǒng),這個(gè)系統(tǒng)保證不能輕易被攻擊,才能保證資產(chǎn)是安全的。這樣的去中心化系統(tǒng)對(duì)用戶來說是一個(gè)去中介化的安全可靠的系統(tǒng)。

解決問題的思路

通過一個(gè)記賬簿的例子,可以大致看出區(qū)塊鏈的實(shí)現(xiàn)原理。

  1. 一開始的時(shí)候,每個(gè)人都掌握著一個(gè)空文件夾。正如我們要進(jìn)行的那樣,這10個(gè)人都將持續(xù)向他們的當(dāng)前的文件夾中添加紙張。而這些紙張的集合將形成追蹤交易的賬簿。每個(gè)人都準(zhǔn)備著記錄下該系統(tǒng)內(nèi)部發(fā)生的任何交易。

文件夾代表chain,紙張代表一個(gè)block

  1. 假設(shè)#2想要轉(zhuǎn)10美元 給#9。為了完成這次交易,#2吼了一嗓子,告訴每個(gè)人,“我想轉(zhuǎn)10美元給#9。大家都在自己的小本本上記下來!”

生成交易并廣播

  1. 每個(gè)人都瞄一下#2是不是有足夠的余額可以轉(zhuǎn)10美元給#9。如果她有足夠的錢,每個(gè)人都在自己的空白頁(yè)上為這筆交易做了一個(gè)記錄。
image

所有參與者檢查交易是否有效,并記錄到本地交易池

  1. 這樣,一筆轉(zhuǎn)賬就被認(rèn)為是成功發(fā)起。
  2. 這個(gè)網(wǎng)絡(luò)中的更多人想要轉(zhuǎn)賬給其他人。無論什么時(shí)候他們想要做一筆交易,他們就向其他所有人宣告這筆交易。無論是誰,一聽到這個(gè)宣言,就在他/她自己的紙張上寫下來。這樣的實(shí)踐持續(xù)進(jìn)行,直到每個(gè)人都用完了他們當(dāng)前頁(yè)的空間。假設(shè)1頁(yè)紙可以記錄10筆交易,一旦10筆交易完成,每個(gè)人就都用完了空間。紙張被寫滿的時(shí)候, 那么,是時(shí)候該將這頁(yè)紙存到文件夾里面,然后拿出一張新的紙、重復(fù)上述步驟2了。

寫滿的紙張組成一個(gè)block,準(zhǔn)備全網(wǎng)確認(rèn)封存

  1. 在你將這頁(yè)紙存入我們的文件夾之前,我們需要使用該網(wǎng)絡(luò)中每個(gè)人都同意的唯一一把鑰匙來密封它。通過密封,我們可以保證,一旦該頁(yè)紙的備份已經(jīng)被存入每一個(gè)人的文件夾,沒有人能夠?qū)λ鞒鋈魏胃摹恢菇裉?,不止明天,也不止是一年以后?/li>

這把鑰匙可以看做是交易的metkle證明,密封表示將block寫入chain

  1. 一旦放入文件夾中,它將永遠(yuǎn)呆在文件夾里面——被封存起來。而且,如果每個(gè)人都信任這個(gè)封條,那么每個(gè)人都會(huì)相信該頁(yè)紙中的內(nèi)容。而這頁(yè)紙的封存手法,就是這一方法的關(guān)鍵。

早些時(shí)候,第三方/中介為我們賦予信任,其形式是:無論它們?cè)谫~簿上已經(jīng)寫了什么,都永遠(yuǎn)不可變更。在一個(gè)分散式的、去中心化的系統(tǒng)中,就像上述我們的系統(tǒng)一樣,這種封條將提供信任替代。

沒有中介的系統(tǒng),誰也不信任對(duì)方,找誰來封存?選定封存者后他不愿意做這個(gè)人事怎么辦?什么樣的封存方法可以保證已封存的數(shù)據(jù)幾乎不可能被修改?

解決問題的工程實(shí)現(xiàn)

要解決上面的問題,需要涉及一些技術(shù)上的概念:

  1. hash算法:比如sha3. 對(duì)明文進(jìn)行數(shù)字摘要,得到一串無法逆向破解的hash數(shù)據(jù), hash算法可以證明明文沒有被修改, 或者無法被修改, 因?yàn)橐坏┍恍薷木蜔o法得到相同的hash數(shù)據(jù).
  2. hash算法另一個(gè)特點(diǎn)是輸入數(shù)據(jù)只要稍有變化(比如一個(gè)1變成了0)則將得到一個(gè)千差萬別的結(jié)果,且結(jié)果無法事先預(yù)知; 那么, 要想得到三個(gè)0開頭的一串hash數(shù)據(jù), 怎么得到他的明文是什么?
  3. 以目前密碼學(xué)技術(shù),以及計(jì)算機(jī)的算力, 只有一個(gè)笨方法,就是一個(gè)接一個(gè)地遍歷宇宙中所有數(shù)字,直到我們得到一個(gè)三個(gè)0開頭的一串字符. 經(jīng)過幾千次嘗試之后,我們最終會(huì)得到將在右邊產(chǎn)生要求的輸出值的一個(gè)數(shù)字。
  4. 雖然要找到這樣的明文不容易, 但是要驗(yàn)證這個(gè)明文是否符合hash數(shù)據(jù)是3個(gè)0開頭是非常容易的: 再進(jìn)行一次sha3運(yùn)算即可.

總結(jié)上面的hash算法: “給定一個(gè)輸出值,要算出輸入值是極端困難的。但是,給定輸入值和輸出值,要檢驗(yàn)該輸入是否會(huì)導(dǎo)致該輸出,卻是非常容易的?!?/p>

  1. 如何用上面的hash算法來加密一份文件?想象我給你了一頁(yè)紙。寫著數(shù)字20893。然后我問你,“你能不能找出一個(gè)數(shù)字,加上數(shù)字20893以后,進(jìn)行hash運(yùn)算,最終會(huì)給我們一個(gè)以三個(gè)0開頭的字符?”,我們已經(jīng)知道,算出這樣一個(gè)數(shù)字的唯一方法就是窮舉整個(gè)宇宙中每一個(gè)可能的數(shù)字。又是幾千次嘗試之后,我們會(huì)偶然發(fā)現(xiàn)一個(gè)數(shù)字21191符合我們要求.

這個(gè)“碰運(yùn)氣”的過程就是“挖礦”的過程,注意:以太坊的挖礦不僅要求計(jì)算,還對(duì)內(nèi)存大小有要求,因?yàn)樗梢粋€(gè)很大的DAG數(shù)據(jù),在里面找這個(gè)幸運(yùn)隨機(jī)數(shù)字。

  1. 為了密封這個(gè)(比如:使得沒有人能更改這頁(yè)紙上的內(nèi)容),我們將蓋一個(gè)帶有標(biāo)簽‘21191’的徽章在上面。一旦密封數(shù)字(比如:21191)被戳在紙上,這個(gè)紙就被密封了。

密封數(shù)字又被稱為“工作量證明”,意思是,這一數(shù)字證明了為了計(jì)算出它來已經(jīng)付出的努力。蓋戳的過程就是對(duì)這個(gè)block生成一個(gè)hash的過程。

  1. 蓋戳后這頁(yè)紙(該block)就可以廣播給網(wǎng)絡(luò)中的其他人了。代表宣稱我已經(jīng)找到幸運(yùn)數(shù)字了。
  2. 任何人想驗(yàn)證這頁(yè)紙是否已經(jīng)被替換了,他需要做的一切不過是——這頁(yè)紙上的內(nèi)容與密封數(shù)字加在一起、把和值進(jìn)行hash計(jì)算。如果給出了一串三個(gè)0開頭的字符,那么內(nèi)容就沒有被改變。如果出現(xiàn)的字符不能滿足我們的要求,我們就可以丟掉這頁(yè)紙了,因?yàn)樗膬?nèi)容已經(jīng)有了水分,沒有任何用處了。

上述計(jì)算工程也是一個(gè)驗(yàn)證的過程。

  1. 在網(wǎng)絡(luò)中,每個(gè)人都進(jìn)行這個(gè)計(jì)算,而最早算出密封數(shù)字的那個(gè)人會(huì)向其他所有人宣布這個(gè)數(shù)字。聽到密封數(shù)字之后,每個(gè)人都立即驗(yàn)證它是否能產(chǎn)生要求的輸出值。如果是的,每個(gè)人都為他們的紙張標(biāo)上這個(gè)數(shù)字,然后把紙張放入文件夾中。

驗(yàn)證無誤后, 將該block鏈接到鏈上:取鏈上最新的block的hash作為本block的父hash。

  1. 但是,如果對(duì)某人,比如#7來說,那個(gè)被宣布的密封數(shù)字無法產(chǎn)生要求的輸出值,怎么辦?這種情形可并不少見。可能的原因有:
  • 他可能聽錯(cuò)了之前在網(wǎng)絡(luò)中宣布的交易
  • 他可能寫錯(cuò)了之前在網(wǎng)絡(luò)中宣布的交易
  • 他可能在記錄交易的時(shí)候試圖作弊,為了謀私,或串通好網(wǎng)絡(luò)中的某些人

無論原因是什么,#7只有一個(gè)選擇——放棄他的記錄、從其他人處獲得拷貝,以使他也可以將紙張放入文件夾。除非他不將他的紙張放入文件夾,他也就無法繼續(xù)記錄進(jìn)一步的交易,這會(huì)因此禁止他成為網(wǎng)絡(luò)中的一員。

大部分人同意的密封數(shù)字,無論是它是什么,都會(huì)成為那個(gè)可信的密封數(shù)字。誰放棄帶這個(gè)密封數(shù)字的block,他將無法繼續(xù)“挖礦”。因?yàn)榉獯嫦乱粋€(gè)block時(shí)需要鏈上最新block的hash。

上面的過程解決了第一個(gè)問題:找誰來封存,答案是誰先找到幸運(yùn)數(shù)字就是誰來封存。

  1. 可是, 如果他們知道其他人會(huì)算出它然后宣布它,為什么每個(gè)人都要耗費(fèi)資源來進(jìn)行計(jì)算呢? 為什么不坐視不理、等著抱大腿呢?這就是激勵(lì)加入的原因。每一個(gè)區(qū)塊鏈的成員都有資格獲得獎(jiǎng)勵(lì)。第一個(gè)計(jì)算出密封數(shù)字的人將得到免費(fèi)的金錢作為對(duì)他的努力(比如:付出的CPU算力和電力)的獎(jiǎng)勵(lì)。
  2. 這就是比特幣變?yōu)楝F(xiàn)實(shí)的方式。它是在區(qū)塊鏈(比如:分散式的賬簿)上被用來交易的第一種貨幣。同時(shí),人們被獎(jiǎng)勵(lì)以比特幣作為回報(bào),以使在網(wǎng)絡(luò)上計(jì)算密封數(shù)字的努力會(huì)繼續(xù)進(jìn)行。

有了激勵(lì),很多人愿意成為礦工投入到挖礦行列,這就解決了挖礦動(dòng)機(jī)問題:“無利不起早”。

  1. 上面沒有提到的一個(gè)點(diǎn)是: 想象文件夾中已經(jīng)有5頁(yè)紙——都被一個(gè)密封數(shù)字加密了。如果我回溯到第二頁(yè)紙、改動(dòng)交易記錄以謀私,為修改后的交易記錄計(jì)算出了一個(gè)新的密封數(shù)字, 會(huì)怎么樣?密封數(shù)字會(huì)讓任何人察覺到交易記錄中的矛盾嗎?
  2. 首先來看一下這個(gè)密封數(shù)字是怎么生成的。這個(gè)密封數(shù)字不僅包含一個(gè)隨機(jī)數(shù)字, 還包括上一頁(yè)紙的輸出數(shù)據(jù), 有了這個(gè)優(yōu)雅的小心機(jī),我們可以保證,每一頁(yè)紙張都依賴于它之前的紙張。因此,如果有人要修改一張歷史記錄,他將同樣必須改變?cè)擁?yè)以后所有紙張的內(nèi)容和密封數(shù)字,以使這條鏈保持一致。
  3. 如果某個(gè)人,不屬于我們?cè)谝婚_始設(shè)想的10個(gè)人,試圖作弊,修改區(qū)塊鏈(保存了所有交易記錄清單紙張的文件夾)中的內(nèi)容,他將不得不調(diào)整多頁(yè)紙張、為所有這些紙張計(jì)算新的密封數(shù)字。我們都知道計(jì)算密封數(shù)字有多么困難。因此,這網(wǎng)絡(luò)中的一個(gè)壞蛋欺負(fù)不了九個(gè)老實(shí)人。
  4. 實(shí)際上,從這個(gè)不誠(chéng)實(shí)的家伙嘗試作弊的那一夜開始,他將要在這網(wǎng)絡(luò)中創(chuàng)造另一個(gè)區(qū)塊鏈,但那個(gè)區(qū)塊鏈將永遠(yuǎn)無法趕上可信的區(qū)塊鏈——僅僅因?yàn)橐粋€(gè)家伙的努力和速度不可能戰(zhàn)勝九個(gè)人積累起來的努力和速度。因此,這保證了在一個(gè)網(wǎng)絡(luò)中,最長(zhǎng)的鏈就是可信的鏈。
  5. 萬一,不是一個(gè),而是六個(gè)人搞事情呢?在這種情況下,這個(gè)協(xié)議將會(huì)落空,流于表面。它就是人們所知的“51%攻擊”。如果該網(wǎng)絡(luò)中的大部分人決定變得不誠(chéng)實(shí)并且欺騙網(wǎng)絡(luò)中剩下的人,這個(gè)協(xié)議將無法實(shí)現(xiàn)它的目標(biāo)。這就是其脆弱性的唯一原因。知道了這一點(diǎn),它也就不太可能發(fā)生了。但是,我們所有人都必須知道這個(gè)系統(tǒng)的這個(gè)弱點(diǎn)。它建立在這樣的假設(shè)之上:一群人中的大部分都總是誠(chéng)實(shí)的。

上面為方便理解,使用人數(shù)進(jìn)行攻擊說明, 實(shí)際上51%的攻擊指的是全網(wǎng)計(jì)算機(jī)的算力。上面的假設(shè)就是著名的“拜占庭容錯(cuò)”。

這種以block的hash為紐帶將全部block鏈接在一起的鏈結(jié)構(gòu),保證了已封存的數(shù)據(jù)幾乎不可能被修改,至此, 解決了上面的全部3個(gè)問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容