區(qū)塊鏈 | 詳解以太坊的工作原理
簡(jiǎn)介
不管你們知不知道以太坊是什么,但是你們大概都聽(tīng)說(shuō)過(guò)以太坊。最近在新聞里出現(xiàn)過(guò)很多次,包括一些專(zhuān)業(yè)雜志的封面,但是如果你們對(duì)以太坊到底是什么沒(méi)有一個(gè)基本的了解的話,看這些文章就會(huì)感覺(jué)跟看天書(shū)一樣。 所以,什么是以太坊?本質(zhì)上,就是一個(gè)保存數(shù)字交易***記錄的公共數(shù)據(jù)庫(kù)。重要的是,這個(gè)數(shù)據(jù)庫(kù)不需要任何中央權(quán)威機(jī)構(gòu)來(lái)維持和保護(hù)它。相反的它以一個(gè)“無(wú)信任”的交易系統(tǒng)來(lái)運(yùn)行——一個(gè)個(gè)體在不需要信任任何第三方或?qū)Ψ降那闆r下進(jìn)行點(diǎn)對(duì)點(diǎn)交易的架構(gòu)。
依然感到很困惑?這就是這篇文章存在的理由。我的目標(biāo)是在技術(shù)層面來(lái)解釋以太坊的工作原理,但是不會(huì)出現(xiàn)很復(fù)雜的數(shù)學(xué)問(wèn)題或看起來(lái)很可怕的公式。即使你不是一個(gè)程序員,我希望你看完之后最起碼對(duì)技術(shù)有個(gè)更好的認(rèn)識(shí)。如果有些部分技術(shù)性太強(qiáng)不好理解,這是非常正常的,真的沒(méi)有必要完全理解每一個(gè)小細(xì)節(jié)。我建議只要宏觀的理解一下事物就行了。
這篇文章中的很多議點(diǎn)都是以太坊黃皮書(shū)中討論過(guò)的概念的細(xì)分。我添加了我自己的解釋和圖表使理解以太坊更加簡(jiǎn)單一點(diǎn)。那些足夠勇敢的人可以挑戰(zhàn)一下技術(shù),去閱讀一下以太坊的黃皮書(shū)。
好了, 讓我們開(kāi)始吧!
區(qū)塊鏈定義
區(qū)塊鏈就是一個(gè)具有共享狀態(tài)的密碼性安全交易的單機(jī)。這有點(diǎn)長(zhǎng),是吧?讓我們將它分開(kāi)來(lái)看:
- “密碼性安全”是指用一個(gè)很難被解開(kāi)的復(fù)雜數(shù)學(xué)機(jī)制算法來(lái)保證數(shù)字貨幣生產(chǎn)的安全性。將它想象成類(lèi)似于防火墻的這種。它們使得欺騙系統(tǒng)近乎是一個(gè)不可能的事情(比如:構(gòu)造一筆假的交易,消除一筆交易等等)。
- “交易的單機(jī)”是指只有一個(gè)權(quán)威的機(jī)器實(shí)例為系統(tǒng)中產(chǎn)生的交易負(fù)責(zé)任。換句話說(shuō),只有一個(gè)全球真相是大家所相信的。
- “具有共享狀態(tài)”是指在這臺(tái)機(jī)器上存儲(chǔ)的狀態(tài)是共享的,對(duì)每個(gè)人都是開(kāi)放的。
以太坊實(shí)現(xiàn)了區(qū)塊鏈的這個(gè)范例。
以太坊模型說(shuō)明
以太坊的本質(zhì)就是一個(gè)基于交易的狀態(tài)機(jī)。在計(jì)算機(jī)科學(xué)中,狀態(tài)機(jī) 是指可以讀取一系列的輸入,然后根據(jù)這些輸入,會(huì)轉(zhuǎn)換成一個(gè)新的狀態(tài)出來(lái)的東西。
根據(jù)以太坊的狀態(tài)機(jī),我們從創(chuàng)世紀(jì)狀態(tài)開(kāi)始。這差不多類(lèi)似于一片空白的石板,在網(wǎng)絡(luò)中還沒(méi)有任何交易的產(chǎn)生狀態(tài)。當(dāng)交易被執(zhí)行后,這個(gè)創(chuàng)世紀(jì)狀態(tài)就會(huì)轉(zhuǎn)變成最終狀態(tài)。在任何時(shí)刻,這個(gè)最終狀態(tài)都代表著以太坊當(dāng)前的狀態(tài)。
以太坊的狀態(tài)有百萬(wàn)個(gè)交易。這些交易都被“組團(tuán)”到一個(gè)區(qū)塊中。一個(gè)區(qū)塊包含了一系列的交易,每個(gè)區(qū)塊都與它的前一個(gè)區(qū)塊鏈接起來(lái)。
為了讓一個(gè)狀態(tài)轉(zhuǎn)換成下一個(gè)狀態(tài),交易必須是有效的。為了讓一個(gè)交易被認(rèn)為是有效的,它必須要經(jīng)過(guò)一個(gè)驗(yàn)證過(guò)程,此過(guò)程也就是挖礦。挖礦就是一組節(jié)點(diǎn)(即電腦)用它們的計(jì)算資源來(lái)創(chuàng)建一個(gè)包含有效交易的區(qū)塊出來(lái)。
任何在網(wǎng)絡(luò)上宣稱(chēng)自己是礦工的節(jié)點(diǎn)都可以嘗試創(chuàng)建和驗(yàn)證區(qū)塊。世界各地的很多礦工都在同一時(shí)間創(chuàng)建和驗(yàn)證區(qū)塊。每個(gè)礦工在提交一個(gè)區(qū)塊到區(qū)塊鏈上的時(shí)候都會(huì)提供一個(gè)數(shù)學(xué)機(jī)制的“證明”,這個(gè)證明就像一個(gè)保證:如果這個(gè)證明存在,那么這個(gè)區(qū)塊一定是有效的。
為了讓一個(gè)區(qū)塊添加到主鏈上,一個(gè)礦工必須要比其他礦工更快的提供出這個(gè)“證明”。通過(guò)礦工提供的一個(gè)數(shù)學(xué)機(jī)制的“證明”來(lái)證實(shí)每個(gè)區(qū)塊的過(guò)程稱(chēng)之為工作量證明。
證實(shí)了一個(gè)新區(qū)塊的礦工都會(huì)被獎(jiǎng)勵(lì)一定價(jià)值的獎(jiǎng)賞。獎(jiǎng)賞是什么?以太坊使用一種內(nèi)在數(shù)字代幣——以太幣作為獎(jiǎng)賞。每次礦工證明了一個(gè)新區(qū)塊,那么就會(huì)產(chǎn)生一個(gè)新的以太幣并被獎(jiǎng)勵(lì)給礦工。
你也許會(huì)在想:什么能確保每個(gè)人都只在區(qū)塊的同一條鏈上呢?我們?cè)趺茨艽_定不會(huì)存在一部分礦工創(chuàng)建一個(gè)他們自己的鏈呢?
前面,我們定義了區(qū)塊鏈就是一個(gè)具有共享狀態(tài)的交易單機(jī)。使用這個(gè)定義,我們可以知道正確的當(dāng)前狀態(tài)是一個(gè)全球真相,所有人都必須要接受它。擁有多個(gè)狀態(tài)(或多個(gè)鏈)會(huì)摧毀這個(gè)系統(tǒng),因?yàn)樗谀膫€(gè)是正確狀態(tài)的問(wèn)題上不可能得到統(tǒng)一結(jié)果。如果鏈分叉了,你有可能在一條鏈上擁有 10 個(gè)幣,一條鏈上擁有 20 個(gè)幣,另一條鏈上擁有 40 個(gè)幣。在這種場(chǎng)景下,是沒(méi)有辦法確定哪個(gè)鏈才是最”有效的“。
不論什么時(shí)候只要多個(gè)路徑產(chǎn)生了,一個(gè)”分叉“就會(huì)出現(xiàn)。我們通常都想避免分叉,因?yàn)樗鼈儠?huì)破壞系統(tǒng),強(qiáng)制人們?nèi)ミx擇哪條鏈?zhǔn)撬麄兿嘈诺逆湣?/p>
為了確定哪個(gè)路徑才是最有效的以及防止多條鏈的產(chǎn)生,以太坊使用了一個(gè)叫做“GHOST 協(xié)議”的數(shù)學(xué)機(jī)制。
GHOST = Greedy Heaviest Observed Subtree
簡(jiǎn)單來(lái)說(shuō),GHOST 協(xié)議就是讓我們必須選擇一個(gè)在其上完成計(jì)算最多的路徑。一個(gè)方法確定路徑就是使用最近一個(gè)區(qū)塊(葉子區(qū)塊)的區(qū)塊號(hào),區(qū)塊號(hào)代表著當(dāng)前路徑上總的區(qū)塊數(shù)(不包含創(chuàng)世紀(jì)區(qū)塊)。區(qū)塊號(hào)越大,路徑就會(huì)越長(zhǎng),就說(shuō)明越多的挖礦算力被消耗在此路徑上以達(dá)到葉子區(qū)塊。使用這種推理就可以允許我們贊同當(dāng)前狀態(tài)的權(quán)威版本。
現(xiàn)在你大概對(duì)區(qū)塊鏈?zhǔn)鞘裁从袀€(gè)理性的認(rèn)識(shí),讓我們?cè)谠偕钊氲亓私庖幌乱蕴幌到y(tǒng)主要組成部分:
- 賬戶
- 狀態(tài)
- 損耗和費(fèi)用
- 交易
- 區(qū)塊
- 交易執(zhí)行
- 挖礦
- 工作量證明
在開(kāi)始之前需要注意的是:每當(dāng)我說(shuō)某某的哈希, 我指的都是 KECCAK-256 哈希,以太坊就是使用這個(gè)哈希算法。