2017 / 文章

試玩 Blockchain Demo:瞭解區塊鏈如何防止攻擊、挖礦電腦都在算什麼

對比特幣有興趣的人,應該都會發現關於比特幣的入門文章中,一開頭都會提到「共享帳本(ledger)」的概念;讓初學者藉由帳本的概念來想像區塊鏈,是目前最普遍的方法。

但是,我相信有很多人和我一樣,其實這輩子都還沒機會看過帳本長什麼樣子、用在哪裡、還有上面該記錄哪些資訊;當然,也就更難想像區塊鏈是如何運作的。


最近我發現一個叫做「Blockchain Demo」的網站,主要目的就是讓初學者一眼看懂「區塊鏈」是如何運作的。即使你不是技術人員,也能知道區塊上記錄著哪些資訊、如何防止被惡意篡改、以及挖礦的電腦上都在計算些什麼內容。

除此之外,你還可以像個駭客一樣,試著修改已經被記錄在區塊鏈上的資料,親身體驗需要花費多大的成本,才能篡改一台電腦上的區塊鏈紀錄、以及為什麼需要控制整個網路上過半的電腦運算能力,才可能成功攻擊區塊鏈。

理解區塊鏈如何運作之後,你就有能力自己判斷,用「共享帳本」來比喻區塊鏈是否合適。接下來,我會把區塊鏈拆成「區塊」和「鏈」兩個部分來說明。

區塊:記錄交易資訊

交易資訊

如果把區塊鏈視為一份賬本,每一個區塊就是帳本上的每一頁。我們發起的每一次交易,都會被寫在帳本(區塊鏈)最新的一頁(區塊)上。換句話說,區塊(帳本頁面)是用來記錄比特幣交易明細的地方,每一頁會紀錄最近 10 分鐘的數千筆比特幣交易紀錄。

例如下圖就是目前帳本寫到 497654 頁,而這一頁包含了 2538 筆交易。

區塊鏈上的每筆交易,都會以一串經過電腦運算後的亂數(精準說法是雜湊)呈現。

「亂數」和「交易資訊」之間的關係,就像是「指紋」和「人」的關係一樣;每個人都有獨一無二的指紋,每筆交易也都有獨一無二的亂數。這個亂數是用來判斷交易資料是否被竄改、區塊與區塊之間先後順序的重要依據。

利用這個網頁上的服務,你輸入訊息(data)之後,網頁就會產生相對應的亂數(hash);只要訊息內容相同,亂數就會是一樣的。

工作量證明

之前提過,工作量證明是個防止駭客惡意攻擊的防禦機制。有點像是射箭比賽,只有第一個命中紅心的人,才可以獲得獎勵。因此,如果駭客要攻擊的話,就必須有強大的運算能力,以及一直很好的運氣才行。

工作量證明實際上是一套檢查亂數的規則;例如區塊的寫入規則是檢查「亂數是否有『4 個 0』作為開頭」,只有符合規則的亂數,才是在這個區塊上合法運作的記錄。

電腦必須花時間運算、逐個嘗試成千上萬種不同可能,才能找到符合規則的亂數;規則越複雜,找到答案的難度就越高。概念和射箭的紅心範圍越小,選手就必須花更多時間才能命中紅心。

在上述的網頁中輸入訊息之後,方框背景會由綠色轉為紅色;顯示紅色的原因,是亂數不符合區塊「以 4 個 0 為開頭」的寫入規則,而不符合規則的紀錄是無效(invalid)的。

因此,你必須點按「Mine」按鈕,讓電腦花點時間幫你找答案(nonce);找到答案之後,方框就會變回綠色,代表這筆交易可以被合法記錄在「區塊」上。

要改變一個區塊還算單純,但是要改變一串頭尾相連接的區塊「鏈」,就比較複雜了。

鏈:結合時間順序、共識機制的安全設計

時間順序:一條區塊鏈

區塊上除了紀錄交易資訊和區塊編號之外,還明確記錄了前一個區塊的運算結果,以作為排列先後順序的重要依據,並形成一條區塊「鏈」。

假設駭客要篡改 3 個小時前產生、編號「#377」區塊上的一筆交易記錄。除了 #377 區塊的亂數會跑掉,導致 #377 區塊整個失效、必須重新運算(Mine)來找到合法答案之外,還會讓後一個「#378」區塊也立即因為前一個區塊資料不同而失效。

此外,往後一整串彼此相連的區塊們也都會全部失效,必須逐個重新找出答案。這有點像是歹徒企圖侵入銀行結果警鈴大作,導致所有原本可以合法通關的指紋統統失效,必須重新建立指紋資料庫一樣,非常耗費時間與資源。

點按這裡實際體驗一下:凡是更改任何一個區塊內容,都會導致後面所有區塊因為亂數(hash)規則不符而變紅失效;這時候,你得從第一個紅色區塊開始重新「Mine」,逐個修改完一整條區塊鏈。

要改變一台電腦上的記錄還算單純;但要讓網路上的其他電腦,都跟自己電腦有一樣的區塊鏈記錄,那就麻煩了。

共識機制:區塊鏈們

在區塊鏈網路上,一條被修改過、又重新被 Mine 過的區塊鏈,是很容易被抓出來的;因為網路上的每一台電腦,都各自存有一份獨立且完整的區塊鏈原始記錄。

兩相對照之下,即使這份被修改過的區塊鏈顯示為綠色合法,但因為區塊鏈內容和其他電腦上的區塊鏈紀錄完全不同,就顯得非常突兀。

由於整個區塊鏈網路是以「誰先找到答案(nonce)」原則,來判斷哪條區塊鏈是合法的。所有電腦會繼續在合法的那條區塊鏈後方,再串上新的區塊。

因此,即使駭客改了自己電腦上的交易紀錄,還得想辦法影響其他電腦,才能改變區塊鏈的共識。這絕對是一項大工程,而且難度非常高。

點按這裡進入示範網頁,你可以試著修改「Peer A」、「Peer B」、或是「Peer C」三部電腦上的區塊鏈內容;除了被修改的區塊鏈會變紅失效之外,即使重新 Mine 過整條區塊鏈,也會和另外兩台電腦上的區塊鏈紀錄不相同。因此,其他電腦並不會承認這條「特立獨行」的區塊鏈;既然篡改紀錄不被承認,也就不會產生效果了。

加入帳本概念

在每筆交易資料中,至少都會包含付款人、收款人、金額這三項資訊,而且每個區塊的容量都可以記錄多筆交易;無論區塊上哪個欄位被更改,都會改變產生出來的亂數,導致亂數不符合規則且區塊失效。

另外,區塊鏈除了記錄每筆交易之外,還得計算每個人在付錢的時候,錢包裡是真的有錢;因此,區塊鏈會藉由區塊彼此串連的特性,往前追溯歷史交易紀錄。經過一些加減法,就可以迅速確認付款人是否真的有足夠的錢,可以付給其他人了。

到這裡為止,我已經把區塊鏈的主要設計介紹完畢;推薦你到 Blockchain Demo 網站動手玩玩看,或是直接看這部 17 分鐘的解說影片: