區塊鏈技術概觀(三):多數決的運作結構

作者 | 發布日期 2017 年 08 月 16 日 15:00 | 分類 Fintech , 數位貨幣 , 科技教育 follow us in feedly

上篇中我們看到比特幣如何實做區塊的結構,但是資料結構是死的,系統的運作協議才是最麻煩的,我們這次來看這個系統是如何運作,以及運作中的各種細節。



多人參與多人共識

從上節看到區塊的封存就是要靠大量電腦做 Proof-of-Works 來保證資料不可被修改,如果參與的電腦只有一台那就沒什麼安全性可言,因此多人參與是第一個設計上的困難點。多人參與的系統最怕就是大家無法同步,因此比特幣設計時採取一個極端保守的做法,每 10 分鐘產生一個區塊,每次全網訊息傳播則要求 15 秒內完成,在這個情況下全域不同步的機率非常低,也就是理論上每台控礦主機自己產生的區塊內容應該一模一樣,至於其他數位貨幣則大多採取較先進的方法來處理這個問題,往後再來看。

那麼一個比特幣系統中有什麼角色?可分類成以下數種:

一般使用者:僅打開電子錢包上傳或接收和自己有關的交易資訊。

網路傳播者:負責架構一個夠快速的 P2P 網路,讓使用者傳送的訊息可以 15 秒內送達全網路參與區塊處理者手上,也要負責將區塊的資訊傳播到全網路。Peer-to-Peer 網路通常都會先在用戶下載的程式中寫死一堆種子點,用戶上線時會先和這個種子點註冊要資料,如果有訊息也同時上傳給大部分種子點,這些種子點也會向用戶推薦其他新加入的種子點以加快網路速度。

區塊處理者:也就是俗稱的挖礦主機,是計算主力,負責產出這個時間內的區塊,公告,並且計算出雜湊值。他們負責的動作很多,交易的合法性、時間等都由這群人經共識決產生,而歷史本文也都留存在些挖礦主機上,因此除非攻擊破壞大部分主機,否則先進區塊鏈的資料不可能消失。多人合作的礦池主機則會把工作分給旗下礦工各自努力。

單純礦工:單一用戶自計算力很小,能找到雜湊值的機率幾乎為 0,因此在比特幣產生後沒幾年就有了礦池概念,礦池的主機就是區塊處理者,但是礦池主機會將工作切分成許多小工作包丟給旗下各礦工去計算,其實也就是將種子數的範圍和區塊內容告訴礦工,讓他們在這個範圍找,若是沒找到,就再換一個範圍大家分著算。

交易如何開始的?

產生交易很簡單,每個用戶都有一個電子錢包,就是一個代表用戶的地址,您只要由您的電子錢包把錢轉給另一個用戶地址就算一筆交易了。比特幣的訊息傳播及儲存就是密碼學大全,因此產生交易的同時,每個交易都會由電子錢包產生電子數位簽章,每個比特幣的用戶都能使用您的公開金鑰來驗證這個交易是不是您本人發出的。接下來電子錢包軟體會將這個交易資料上傳到 P2P 網路讓大家看到,挖礦機會將這交易收入當時的區塊,等到上一個區塊的雜湊值找到,就開始進行當時區塊的公告以及找雜湊值。一旦找到雜湊值,就進入歷史文本,無法修改或否認了。

公開金鑰系統

比特幣的訊息傳播動用了許多密碼學的技巧,因此公開金鑰系統就變成必然會用到的技術。當您在申請比特幣地址時,系統會產出 3 個資料:第一個是您的私密金鑰,第二個是由私密金鑰經過 ECC 產生的公開金鑰,第三個則是由公開金鑰經過 Hash 產生的錢包地址。

公開金鑰系統的設計精神很簡單:使用這個系統的用戶可以用私密金鑰加密或產生電子簽章,其他用戶可使用您的公開金鑰來檢驗電子簽章是否正確,保證文件內容沒有修改過。

因此一切的加密源頭就來自隨機亂數產生、長達 512bit 的種子數,數學上來說就是一組橢圓曲線上的座標,經過橢圓曲線密碼學的步驟可算出另一組座標,它可以公開給其他人看,稱之為公開金鑰。平時就是利用私密金鑰把我們發布的交易訊息做數位簽章,任何一個人只要拿到您的公開金鑰就可以驗證您的訊息有沒有符合數位簽章內容。

在一個不強調去中心化的系統,公開金鑰是可以放在某個公開網站供大家查詢核對,但在去中心化的系統,比如私人 email,就只能夾在訊息中,或用其他路徑或訊息來分開傳送了。比特幣的用戶公開金鑰就是放在交易訊息欄位的一個程式化區塊內。那麼就產生一個問題:我怎麼知道這個欄位的公開金鑰真是屬於比特幣地址 XXX 的所有者呢?答案也不難,因為比特幣的地址就是故意設計由公開金鑰經過 Hash 手法產生的,我們只要拿對方的公開金鑰進行一次 hash ,馬上就可知道這個公開金鑰對不對了!

以上講了許多公開金鑰系統的方法,其實可以使用一個簡單的圖來畫出整個密碼驗證的步驟:

如前所述,交易欄位的公開金鑰放置在一個可程式化的欄位,提供一種類似 Fourth 的語言,可進行一些簡單的動作,用來確認交易是否合法,最簡單的當然就是花錢的人自願提供公開金鑰讓全體挖礦機承認這是一筆合法交易;不過也有複雜一些的可讓好多位用戶一起轉帳並必需集滿 N 個用戶的公開金鑰來解鎖這筆交易。大多數比特幣電子錢包中,我們都只要輸入私密金鑰就可以啟動任何交易,因為公開金鑰及錢包地址可由私密金鑰算出來。因此妥善保管您的私密金鑰就變成非常重要的事,包括使用加密壓縮、印出來鎖進保險箱、埋到祖墳裡(比較可怕點)都是很好的保管方式。把明碼的電子文件檔存在硬碟裡、拍照放在手機裡、把明碼文件放到 Dropbox 等都是錯誤的方法,有一天一定會出事。

共識型的協定

比特幣的發展一直有一個崇高的政治正確指南:去中心化,不讓大權落入少數權貴者之手。因此所有行為模式都是去中心化,採取共識決。但是共識型的協定其實非常難寫,而且在實做上由於網路必然有時間落差,因此有可能產生一些不同步的情況,我們先來看看比特幣和共識有關的有那些:

區塊的產生:每個挖礦在收集到各個交易訊息後會在上個區塊被裝進歷史文本後立即自行產生新的區塊內容。區塊內容並沒有統一公告的人來告訴大家這個區塊應該長什麼樣子,但由於挖礦程式的規格一致(事實上大多數挖礦程式這部分全都是抄原作來的,沒人敢自己亂寫),所以只要出現交易訊息都一樣,大家產生的區塊內容也一定會一樣。那麼要是真的有人不一樣時怎麼辦呢?我們之後再來聊聊究竟要怎麼辦。

總之區塊的產生包括了交易內容、產生多少比特幣等重要內容是一樣的,只有少數可以微調,包括交易時間以及是由誰發現這個區塊的解。值得一提的是由誰發現區塊解這個欄位(也就是產生新比特幣的欄位),基本上是在區塊產生時挖礦機就先填好自己的錢包地址了,所以它也是區塊內容的一部分,千萬不要以為有人可以等著接收別人的答案然後再公告成自己的錢包地址,如果真這樣做,hash 驗算就不會通過了。

區塊的封裝:每一個挖礦機都會依照自己的意志來決定要不要承認某個區塊。通常這同樣是抄原作,因此大家的原則全部都一樣,不會有差異。同樣的問題來了:如果真有人就是亂改程式來亂會怎樣?基本上,現今的系統中,如果你自己封裝錯誤的區塊進入自己的歷史文本,那麼在此之後您所有的區塊再也不會被大家接受,因為從那個有問題的區塊開始您的歷史文本就和大家斷鍊了!而且您公告那個開始錯誤的區塊本身就不會被接受。

馬可夫鏈的競爭:這也就是鏈的長度競爭(所以無論專家學者怎麼說,長度還是很重要的!),事實上就算我們撇除駭客搗蛋的可能性,區塊鏈還是可能出現不同步的情況!也就是這筆交易很可能在部分挖礦機上已被加入本次區塊了,但在其他挖礦機上因為網路阻塞等問題,被安排在下一個區塊!這時就看運氣了,若是沒有這筆交易的區塊比較早算出來,那麼大家會先承認這個區塊,但在下個區塊產生之前,如果有這筆交易的區塊先出來了,那麼仍然有修正的可能!這個也就是馬可夫鏈的作用,比特幣使用馬可夫鏈進行二元排列,同時也可以確定這兩個最新的區塊誰包括的內容較多,通常包括正確內容較多的那個鏈就會取代較短的鏈,這個部分也寫死在程式中。相同的,如果您的程式是自己亂改的,不承認其他人的共識,那麼您的區塊就因為和他人不一樣而永遠被大家視為斷鏈,再也挖不到礦了!除非您的算力超過全網 50%,永遠比人早算到 hash 解,這樣才有可能主導整個鏈的發展。

這也就是先進區塊鏈技術中許多人不斷強調的邪惡 50% 或正義 50%。我們在看比特幣交易時,包括一般區塊勘察網站,都會在區塊後方標註一個 Confirms 欄位,這個欄位其實就是指本區塊自產生後,在它後面又產生了多少區塊,大家還記得在第一篇中筆者就表明了,愈早的區塊愈安全!因此 Confirm 為 1 或 2 的區塊事實上常常會被改變(即便沒有駭客來亂也是一樣,因為馬可夫鏈的長度競爭),如果金額比較大的交易要確認被封裝在歷史文本中無法再被修改,通常收錢的那方都會要求等到 6 個 confirms 才會和您確認交易成功,也就是 1 個小時之後。

總結

我們在共識型協定中,可以看到必須大家的行為都一樣才能得到整體正確的運作結果。如果有少數人不一樣,那麼大多數人都會拒絕承認這些結果,包括不按照協定承認較長的區塊、隨便安插交易內容(比如明明只有 1 元卻在交易中寫轉出 100 元給某人)、竄改交易內容或挖到礦的節點錢包位置等等。

▲ 比特幣的交易步驟總結圖。

(首圖來源:shutterstock)

延伸閱讀: