區塊鏈 — ETH.BUILD
示範區塊鏈挖礦的運作方式,包含區塊如何連結成鏈、工作量證明如何保護區塊鏈,以及當有人試圖竄改資料時會發生什麼事。
Date published: 2021年1月14日
這是一篇由奧斯汀·格里菲斯 (Austin Griffith) 撰寫的教學,示範如何使用 ETH.BUILD 視覺化程式設計工具來了解區塊鏈挖礦的運作方式。奧斯汀涵蓋了工作量證明 (PoW) 共識、區塊連結成鏈、挖礦難度、區塊獎勵以及鏈的不可竄改性。
本逐字稿是奧斯汀·格里菲斯發布的原始影片逐字稿 (opens in a new tab)的無障礙副本。為了提升閱讀體驗,內容已稍作編輯。
協調問題 (0:00)
早安,領結星期五快樂!這次的 ETH.BUILD 將重點放在區塊鏈上——這是一件非常酷的事情。我們在這艘小船上,戴著我們的比特幣領結。我們開始吧。
在目前的課程中,我們已經快速學習了金鑰對、雜湊和帳本。我們發現,如果我們想在分散式網路(而非中心化網路)上來回交易價值,最終會遇到協調問題。我們最終會面臨無法在不同參與者之間達成共識的問題,因為他們都在不同時間收到不同的交易。有很多不同的方法可以解決這個問題,但在工作量證明 (PoW) 出現之前,沒有一個是完美的。
我們在支線任務中探討了拜占庭將軍問題,我們從中學到的是,將軍們在不安全的網路上發送訊息時,需要證明他們擁有一支軍隊。這樣接收方就能確認那個人確實是一位準備進攻的將軍,然後他們就可以進行協調。
區塊與隨機數 (1:04)
因此,透過這個帳本,我們不斷從網路中匯入交易。與其讓每個個別使用者證明他們的工作量,我們將工作量證明抽象化為一個交易區塊,並讓礦工來處理它。
我們引入一個包含交易的區塊——無論網路上傳來什麼,我們都將其載入這個區塊中。如果我們查看這個區塊的結構,它還有一個隨機數。這個隨機數讓我們可以微調雜湊。如果我們將整個區塊轉換為字串並進行雜湊運算,我們會得到一個雜湊。當交易改變時,雜湊也會改變,但當我們改變隨機數時,雜湊同樣會改變。
我們在這裡進行一些工作——我們有一組隨機的交易,並且我們不斷改變隨機數,直到雜湊出現前導零。如果你看過關於拜占庭將軍的支線任務,我們選擇這個前導零作為要證明的任意工作量。因此,隨機數會遍歷每個數字——一、二、三、四——當我們得到一個前導零時,我們就說:這是一個有效的區塊。
實際運作中的工作量證明 (3:00)
如果我們拿一個已挖出的區塊,取出雜湊,並將其放入雜湊函數中,我們可以證明它有一個前導零——我們可以證明這個區塊已經被處理過。
雜湊函數會消耗 CPU,這是一種有限的資源。我們投入所有的 CPU 算力,試圖找到一個帶有前導零的雜湊。一旦我們找到了,我們就有了一個有效的區塊——這個區塊基本上就被凍結了。當時在裡面的任何交易現在都在這個區塊中,每個人都承認它,然後我們就可以繼續處理下一個區塊。
將區塊連結成鏈 (3:56)
訣竅在於:我們將舊區塊與新區塊連接起來。如果我們查看結構,新區塊沒有交易,隨機數也是空的,但它有一個包含交易的父區塊。前一個區塊將成為下一個區塊的一部分,因此我們將擁有一整條鏈。
我們從交易池中投入最新的交易,並努力尋找隨機數。二號區塊被挖出來了——我們需要一個值為十的隨機數才能使這些交易有效。然後我們做同樣的事情:連接舊區塊,引入新區塊,投入最新的交易,並再次進行處理。經過足夠的嘗試後,我們找到了三號區塊的隨機數。四號區塊——同樣的過程,我們繼續前進。
挖礦難度 (5:02)
這太簡單了——我們能夠非常快地找到一個有效的區塊,而我們希望它變得更難。我打算將難度調高到二。我們連接五號區塊,引入最新的交易,並讓計數器開始運作。現在我們正在挖礦——使用我們有限的 CPU 算力任意地對此進行隨機雜湊運算,直到我們找到一個帶有兩個前導零的雜湊,因為難度已經被調高了。這將需要一點時間。
現在我們有了這條包含五個區塊的區塊鏈。這些區塊包含交易,並且每個區塊都參考前一個區塊。每個區塊都需要花費任意數量的工作量來產生,而工作量的大小由難度控制。
礦工 (6:46)
讓我們來看看礦工是什麼。在拜占庭將軍問題中,想要「在黎明時分進攻」的將軍需要士兵。每個士兵內部發生的事情,正是我們在這裡對礦工所做的事情——我們拿著一則訊息和一個隨機數,盡可能快地將其投入雜湊函數中,試圖獲得那些前導零。前導零是我們大家都同意的某種任意標準——這足以證明你是一名士兵,或者你可以發動戰爭。
讓我引入一個礦工,讓這個過程快一點。礦工將對我們的區塊做同樣的事情——它從交易池中獲取傳入的交易,將它們注入區塊中,然後不斷處理,直到找到一個有效的雜湊。
礦工的效率稍微高一點。他更專注於挖礦。他隨機地進行雜湊運算——這正是我們的礦工之前所做的事情,只是被抽象化了。我們可以看到它在背景中運作,不斷地進行雜湊運算。找到了——六號區塊被挖出來了。
雙重花費與網路傳播 (10:00)
現在我們談到了雙重花費的問題,甚至還有網路傳播的問題。當我們有一個帳本和一個分散式網路,並且有人發送了一筆交易時,它會在不同的時間到達不同的人手中。因此,網路上可能會有兩個礦工在完全相同的時間挖出一個區塊,而且它們裡面包含不同的交易。
當時每一個都是有效的——他們都完成了工作量證明,他們都有前導零。但它們不可能都是權威的。它們不可能都是真相。因此,我們需要一種方法讓網路達成共識,決定哪一條才是真正的鏈。
多個礦工與共識 (12:27)
讓我抓住這個區塊並把它移到這裡。我想要的是兩個不同的礦工處理同一個問題,有點像是監聽同一個交易池並獨立產生區塊。我們有兩個礦工:Mallory 和 Mike。我已經將難度調到三,兩者都在努力尋找一個帶有三個前導零的雜湊。
所以 Mallory 先找到了一個區塊!太棒了。現在會發生什麼事——因為我們在一個分散式網路上,Mike 可能還不知道 Mallory 的區塊。他可能還在處理他自己的版本。現在 Mike 也找到了一個。所以我們有兩條有效的路徑。
如果你是網路上的對等節點,並且你先看到了 Mallory 的區塊,你會認為那是主區塊。然後稍後 Mike 的區塊到達了。你會把這兩個區塊都保留下來,以防其中一個成為最長的鏈。而規則是:跟隨最長的有效鏈。
Coinbase 與區塊獎勵 (15:33)
當礦工挖出一個區塊時,我們會說:這是我們想要的所有交易,這是隨機數,這是父區塊——但我們也會說這是挖出該區塊的人。這被稱為 coinbase——我想現在有一家公司叫這個名字,但這是不一樣的。我們就稱之為「礦工」。所以我們的區塊現在需要一個礦工欄位。
所以 Mike 剛剛找到了這個區塊,而 Mike 也將從中獲得十的價值。我們需要激勵礦工去做所有這些工作,對吧?他們花錢購買這些設備,基本上是為了確保網路的安全。這些礦工花錢用他們所有的算力來保護網路——所有礦工加起來,可能有成千上萬個。他們花大錢建造處理這些雜湊運算的設備,為了激勵他們,我們從他們挖出的每個區塊中給予他們一部分,稱為區塊獎勵。
區塊獎勵與激勵機制 (16:52)
所以在這個版本的區塊中,Mallory 有十美元,但在這個版本中 Mike 有十美元。這兩位參與者都有動機繼續沿著他們自己的鏈發展,而網路的其餘部分需要找到一個共識。基本上,這取決於誰擁有最長的有效鏈。
Mike 將把他的區塊設定為父區塊,並開始處理下一個區塊。Mallory 也會做同樣的事情。這就取決於網路上還有誰選擇站在哪一邊。因為我們不想懲罰網路狀況不佳的人,我很確定在以太坊中我們會支付叔塊(未進入最長鏈的有效區塊)獎勵——因為它們仍然在幫助保護網路。
我們遇到了協調和共識的問題,我們透過加入必須參與的任意工作量來使交易有效,從而解決了這個問題。Mallory 做了所有這些雜湊、雜湊再雜湊的工作,以找到所有這些交易和前一個區塊的雜湊的三個前導零。
查詢區塊鏈 (18:30)
我們可以與任何最長的鏈進行通訊。Mike 還沒有達到七,所以我們可以看到這裡的高度仍然是六。我們可以做一些事情,例如查詢人們的餘額。所以我們點擊餘額——我們得到了什麼?五百二十四。所以 Heidi 一直持有 524 或這條鏈的任何原生代幣。我們可以看到她的隨機數,我們可以做所有我們能用帳本做的事情,但現在我們正在堆疊區塊,而這些區塊包含著交易。
我們已經將工作從只是發送金錢的使用者身上抽象化,轉移給了礦工,並且我們透過給予他們這個區塊獎勵來激勵他們。每個人每筆交易還需要支付少量費用,但我們會在後面的節目中討論這個。我們現在不想談論燃料,但了解這點有助於知道,不僅有挖出一個區塊的動機,還有挖出一個包含大量交易的完整區塊的動機。但這是一個較小的激勵——我們最終會談到這個。
鏈的不可竄改性 (19:51)
隨著區塊被挖出,它們變得越來越安全。讓我向你展示我的意思。所以 Mike 挖出了一個區塊,Mallory 在這裡做示範,沒能挖出區塊。所以現在 Mike 的鏈將會是最長的,並且它會傳遍整個網路。每個人都會看到它並說:好的,這條鏈有七個區塊,它們都是有效的——這就是我們將要跟隨的鏈。你可能會遇到硬分叉、有爭議的分叉,我們遵守的規則將會改變,不同的人群想要跟隨不同的鏈。很酷的東西。
好的,最後,如果我們回到三號區塊並改變一些東西——改變任何小細節——我要進到這裡。有一筆給 Frank 的交易。假設我們把 Frank 改成 Eve。現在看看當我點擊確定時會發生什麼事:看看那個。我改變了三號區塊的一小部分,突然之間整條鏈就崩潰了。它不再有效了。如果我把這個廣播到網路上,人們會把我笑掉大牙。
一旦區塊被挖出,你就不能改變任何東西,除非你回去並在它改變時重新挖礦。我基本上必須把礦工重新連接到這裡,並試圖擁有足夠的算力來追上已經有七個區塊的 Mike。這將會非常、非常困難。一個區塊越深,就越難以回溯。事實上,在這個三號區塊中,Carlos 發送了 84 給 Bob——Bob 可以非常安心地知道,在多個區塊的深度下,那筆錢肯定在那裡。這裡不可能會出現什麼有爭議的分叉——我很穩。這就是我們所說的最終性。
總結 (22:00)
我們不再使用帳本並面對這個共識問題,而是使用工作量證明 (PoW) 來進行雜湊運算以驗證區塊——而「有效」意味著任意數量的前導零。在我們建立區塊鏈的過程中,我們仍然會遇到問題,也就是挖出的區塊實際上可能會在不同的時間到達不同的地方。因此,我們有一個進一步的共識演算法,它說:跟隨最長的有效鏈,並且該鏈遵循你希望參與的規則集。
好的,領結星期五快樂!這就是 ETH.BUILD 上的區塊鏈。我會把它儲存起來並放上去,這樣你就可以直接點擊「載入」,然後擁有一條可以玩的鏈。星期五快樂!