寫給有想要了解區塊鏈,對於專有名詞不太熟悉,希望有人能透過白話文說明協助導覽的你
# 前言
這篇文章,想要給有興趣了解區塊鏈運作原理,卻對於程式不太熟悉的人,有一個踏入這個領域的入門點。
內容與虛擬貨幣沒有什麼的關係,也不會針對商業內容有任何闡述,純粹就是透過一般人都可以理解的角度,分享區塊鏈的概念是什麼,以及它有些什麼樣的特性。
閱讀這篇文章以前,不需要對於區塊鏈有任何了解,也不需要任何的程式基礎。
我會以日常生活的情境去帶入,針對一般人會好奇的點,或者大部分人不容易理解的內容來做分享。
從區塊鏈特性開始,帶你搞懂基本的專有名詞,理解基本的運作架構,讓你可以建立簡單的基礎。
未來在了解更深入的應用時,也會更加快速,更好理解。
本篇文章不會提到加密的概念,由於加密已經算是虛擬貨幣上的應用了,與單純的區塊鏈概念不同,所以這篇文章不會對應用情境有所討論。
# 區塊鏈是什麼?
回朔到我第一次聽到 區塊鏈
這個名詞時,我腦海中浮現的第一個疑問就是:「區塊在哪裡?鏈指的是什麼?是不是每個人的電腦都是一個區塊,然後把每台電腦透過網路連結就是所謂的區塊鏈?」挖礦
是什麼?有一個有資源上限的礦場,大家拼命去把裡面的資源挖出來嗎?
其實光以 區塊鏈
這個名詞,真的沒辦法馬上理解到完整的概念。就算去網路上搜尋,只會得到更多新的專有名詞:複式記帳法
、去中心化
、加密貨幣
...。
大部分網路上的資源提到的都是 區塊鏈
的使用情境,或者生活上應用方式。如果我單純想了解 區塊鏈
本身是什麼東西,很難從這些應用中得到答案。就算去看維基百科的定義,看完也是整個人萌萌噠,完全不懂到底在解釋什麼。
我自己第一次感覺到理解 區塊鏈
是什麼,是等到我看完了 區塊鏈
的程式運作邏輯以後才漸漸曉得的。所以要了解 區塊鏈
是什麼,我認為還是得回到它的程式架構上面來討論。即便我們很難能單純用短短的一句話完美的詮釋 區塊鏈
的定義,但是我相信等我用完整篇文章的篇幅來說明後,大家就能很清楚的在腦海中建立起 區塊鏈
的架構了。
# 區塊鏈的特性
在談到程式的架構以前,我想先提一下區塊鏈所擁有的 特性
,讓大家在腦海中有一些可以關注的方向,這樣待會提到程式架構時,會比較好理解為什麼程式會這樣去設計。
☞ 1. 去中心化
所謂的去中心化,大家可以想像成,不透過中介機構去管理或運行。像我們日常生活中的大小事務,很多都是中心化的:例如我們將錢匯給別人需要透過銀行,或者傳遞訊息需要透過通訊軟體,這些都是中心化,因為有一個中介機構負責管理與執行。
而 去中心化
就是不再透過這些中介機構,大家自己就是自己的銀行,自己管理好自己的錢,當有交易進行的時候,誰給了誰多少錢,會讓所有人都知道,所有人都會把所有交易紀錄寫進自己的帳本當中,這些資訊會分散在每個人手上,不再只是存在一個銀行系統。
☞ 2. 匿名性
在中心化的系統中,我們需要在銀行開戶,留下個人資料。每一次進行交易時,都是以個人名義進行,銀行會知道是誰將錢匯款給了誰,政府也可以去查每個人手上擁有多少財產。
而 去中心化
系統中,每個人只需要擁有一組密碼,不需要任何個人資料就可以註冊,交易也是以該密碼的名義去進行,不會有人知道這些密碼的背後代表的人究竟是誰,所有的交易都是匿名且隱蔽的。
☞ 3. 加密
加密其實是算虛擬貨幣上的應用,區塊鏈
本身的運作不需要透過加密就可以達成(底下的原理說明也不會談到加密),只是因為現今 區塊鏈
的應用都以虛擬貨幣為主,虛擬貨幣又需要有完善的加密系統,所以很多人會把加密這個特性跟 區塊鏈
一起討論。
加密的定義很簡單,當有某些訊息只希望讓特定的第三方看到,我們就可以透過加密來達成。
☞ 4. 不可竄改
這個特性非常重要!區塊鏈上的資料 不可竄改
,意思是每一筆被記錄在區塊鏈上的資料,基本上一定是安全的。至少以現今的電腦或者硬體設備,都無法達成竄改資料的可能。(底下的原理說明,很大的篇幅都在讓大家理解區塊鏈是如何達成 不可竄改
的。)
☞ 5. 共識機制
為了確保區塊鏈上的資料安全,以及達成 不可竄改
的目的,區塊鏈必須具備特定的 共識機制
,來定義清楚,如何可以將資料寫進區塊鏈,誰有權力把資料寫進去,如何證明這個人有這個權利,這套證明機制就是所謂的 共識機制
。
講完上面這 5 項區塊鏈的 特性
以後,相信大家一定對區塊鏈更加的陌生了!(這很正常,專有名詞本來就是為了讓人更混淆的)
其實這些特性的背後,本質都是希望資料能夠安全,如果有一個中心化的機構來把持所有人的資源,那這個機構一但倒閉,或者有駭客竊取資料,甚至極端一點的情況是這個機構背叛了,那所有人的資料通通都會暴露在危險之中。所以區塊鏈的出現,本質就是希望能有一套系統,它不需要依賴中介機構,它是絕對安全的,而且可以匿名保護好自己的隱私。
而這套系統衍伸出來最合適的情境,就是 交易
以及 貨幣
,所以現今區塊鏈最主要的應用情境,就是大家常常會聽到的 虛擬貨幣
。
以上我們知道了區塊鏈具備的 特性
,以及這套系統發明背後所希望達成的 目的
以後,我們就可以開始來討論區塊鏈是如何運作,以及它透過什麼方式來確保資料的安全。
# 區塊鏈的原理
在準備進入區塊鏈的世界之前,先給大家一個情境:
現在假設我們回到了學生的時代,重拾鉛筆與橡皮擦,坐在書桌前,開始撰寫眼前的考券。
☞ 出題
現在我們手上有一張空白的考卷,我們要在考卷上面出題,出的題目只能是 單選題
,而選項從 0 ~ 9 (共 10 個) 、 A ~ Z(共 24 個)、ㄅ ~ ㄦ(共 37 個),全部加起來共要有 71 個選項,每一題都是如此。
意思是不管題目的難度是簡單或者困難,就算考題的內容是「1 加 1 等於多少?」這麼簡單的題目,一樣要給滿 71 個選項。所以每一題要猜對的機率就固定為 1 / 71。
除了上面的條件以外,我們再給出題規則加上一個限制:「只要題目被改變,答案就一定會變」。
所以我們 出題
就會有以下幾個特性:
- 每一題只對應一個答案
- 不管題目的長度多長,答案的長度都是固定的(1 個字母 or 1 個數字 or 1 個注音)
- 答案一定不可能回推題目的內容(我不可能因為知道答案是 A,就回推出題目的內容)
- 只要題目有改變,答案一定會變
上面幾點是出題的特性,我們假設所有的題目都一定會滿足這幾條規定,而且不會有例外。
而出題者,是你我在座每一個人,我們每一個人都有資格出題目,並且把我們手上的題目交由解題者進行解題。
☞ 解題
我們開始來說明 解題
的規則:
- 不限時間
- 只能考剛好 85 分
- 只採納最快的人的答案
解題開始時,會有無數位解題者同時進行解題,不論題目有多少,也不管是誰來解題。所有解題者在解自己的考卷時,都必須要剛好考 85 分才算通過(不能多也不能少)。
由於會有很多解題者同時解題,所以我們只採納最快考出 85 分的人的答案,這個最快的人,會得到獎勵。
只要一有人把考卷解完,其他人就要幫他檢查是不是剛好 85 分,檢查沒問題以後,這張考卷就是公認的考卷,並且被列印出來,每一個人手上都會發一張。而其他解題者全部停止作答。
接下來給每一位解題者發新的一張考卷,再次開始解題,一樣取最快考出 85 分的人,檢查是否通過,把考卷列印出來,發給每一個人,其他人停止作答,週而復始。
不是每個人都可以擔任解題者,解題者需要有解題的能力,而且如果無法成為最快考出 85 分的人,就永遠拿不到獎勵。
☞ 考卷
上面提到了出題以及解題的遊戲規則,在這邊我想補充一下關於考卷的細節。
雖然出題者是在座的每一個人,而且一張考卷的題目可能來自無數不同的出題者,但有一個 考卷
限制在於:
- 每一張考卷的第一題一定是問:上一張考卷的答案是多少?
- 這一題是規定是不可以答錯的
舉個例子:如果剛剛有一個最快的解題者將考卷考出剛好 85 分,而且經過其他人確認沒有問題,那張考卷的答案是 Cㄅ7DGㄨEㄠ3Eㄚㄎ
,下一張新的考卷,第一題的答案就一定要選擇答案是 Cㄅ7DGㄨEㄠ3Eㄚㄎ
的那個選項。
所以每一張考卷的第一題,都會記錄著前一張考卷的那組考出 85 分的答案,一張接著一張串連起來,形成一條 考卷鏈
。
考卷鏈
的架構就會像上圖一樣,每一張都是通過大家驗證,滿足條件的考卷。
由於每一次有考卷被解出來時,都會列印出來給每個人,大家手上都會發一張,所以每個人的手上都會有一模一樣的 考卷鏈
,大家拿到的考卷內容跟順序都是一樣的。
當我們想要驗證這條 考卷鏈
有沒有問題的時候,只需要透過幾個簡單的方式去檢查:
- 考卷是不是每一張都是 85 分?
- 考卷的第一題是不是都有對應前一張考卷的答案?
- 考卷的內容是不是跟別人手上的一樣?
只要我們能夠確定這幾個條件都有滿足,這條 考卷鏈
就一定是對的。
為什麼我敢保證滿足上面的條件,考卷鏈
一定是對的,我們下面直接來嘗試竄改看看,就能知道為什麼了。
☞ 竄改
假設我現在想嘗試 竄改
考卷上的資料,我們來看看竄改後會發生什麼事情。
我選擇了下面這張考卷的第三題,我想嘗試將原本的題目做竄改:
一但我試圖將第三題題目做竄改,由於 出題規則
有提到,只要題目有改變,答案一定會變
,所以第三題的答案不再是 7
了,原本選了 7
的答案現在對應同一題題目,就會從對的答案變成了錯的答案,也就是說,這張考卷將不再是 85 分
了!
既然我手上這張考卷它不在是 85 分,就代表它絕對不會是對的考卷。為了重新讓它滿足 85 分,我只好把考卷 重解
!
利用 重解
的方式,讓這張考卷再次滿足 85 分。
這張考卷滿足 85 分的條件以後,手上的考卷練就會變成下面這樣:
由於剛剛那張考卷被 重解
過,對於下一張考卷而言,第一題就不再是正確的,所以分數不再是 85 分!
大家有沒有發現,如果我想讓下一張考卷再次滿足 85 分,會導致它的再下一張考卷第一題答錯,不再滿足 85 分。
如果我試圖竄改考卷,就必須將該份考卷以及之後的每一張考卷通通
重解
,才有辦法再次讓整條考卷鏈
滿足 85 分的規則。
而且 重解
的速度,還要快過後面新的考卷產生的速度,否則大家會直接採納最快解出考卷的人的答案,不會去等到你重解完整條考卷鏈。
而且經過重解過的 考卷練
,最後一張考卷的內容一定會跟別人長的不一樣。每個人手上都會有一條 考卷鏈
,當所有人之中只有你一個人的 考卷鏈
長的跟別人不一樣,一看就知道這條考卷鏈有問題。
如此一來就能夠使 竄改
考卷變得很困難!尤其是越前面的考卷,被竄改的可能性就會越低。
由於 去中心化
的特性,我們不用擔心資料只存放在一個地方會不會遺失,會不會被攻擊。就算自己手上的資料不見了,我隨時複製別人手上的資料過來就好。
我們回顧一下整個 考卷鏈
系統,所有人都是 出題者
,出的題目都是單選題,而且滿足一但題目改變答案一定會改變的特性。
並且有無數個擁有解題能力的 解題者
,他們負責在拿到考卷時負責解題,需要滿足剛好 85 分的條件,由大家檢查通過以後,得到獎勵,該份考卷影印下來發給每個人。其他解題者停止作答,準備進入下一輪解題。而隨著考卷一張一張被解出來,每個人的手上就會有一條一模一樣的 考卷鏈
。且這條 考卷鏈
具備不容易被竄改的特性。
# 區塊鏈系統
如果上面的 考卷鏈
流程,能讓你在腦海中浮現一條 考卷鏈
形成的畫面,那就成功幫你建立起 區塊鏈
形成的基礎了。接下來我們從學生時期,重新回到區塊鏈的討論上面。藉由下面的區塊鏈系統說明,幫助大家補齊剩餘的重要觀念。
前面提到的 考卷
,概念就跟 區塊
很像
每一張 考卷
會紀錄著:
- 題目
- 答案
- 分數
- 上一張考卷的答案
而每一個 區塊
會紀錄著:
- 交易內容
- 亂數值 (Nonce)
- 雜湊值 (Hash)
- 上一個區塊的雜湊值 (Previous Hash)
因為現在區塊鏈主要的應用情境為虛擬貨幣,所以紀錄的資料就會以
交易內容
為主
☞ 雜湊
雜湊是透過演算法,將一段任意長度的資料,轉換為固定長度的結果。就如同 出題規則
中任意長度的題目,轉換為固定長度的答案。雜湊
的特性如下:
- 任意長度的輸入,會轉換為固定長度的輸出
- 同樣的輸入,會產生一樣的輸出結果
- 輸出的結果一定不可能回推出輸入值
- 輸入值有任何改變,輸出值一定會改變
所以當我們輸入值為: 西瓜、葡萄、2022、上班
它如果輸出的結果為: 4kjsdlfj3i2ojli
那我們把輸入值做一點點調整: 西瓜、葡萄、202、上班
輸出結果就會改變: dgfjkklj23f3245
你會發現,任何輸入值有一點點的改變都會使產出的 雜湊值
長的完全不同,所以我們可以透過這個特性對 雜湊值
定義一些規則。(例如:我希望最後雜湊值的結果,要滿足前四碼為 0000 開頭,像是 0000i3jfkn3l1if,就是滿足規則的雜湊值。)而這個規則待會我會提到他的用處!
☞ 容量
考卷的容量有限,當題目已經寫滿後,這張考卷就必須交給解題者進行解題。而區塊的容量也是有限制的,新的區塊會被新的交易紀錄一筆一筆填滿,一但區塊填滿,它就會準備進入挖礦的程序。所以不會是一筆交易就是一個區塊,每一個區塊只要容量還足夠,就可以繼續塞入交易資料。
☞ 挖礦挖礦
就像 解題
一樣,當交易一筆一筆產生時,新的區塊會被填滿,一但區塊滿了,就會交由 礦工
進行 挖礦
,挖礦
的過程就是,將這個區塊當中的 交易紀錄
、上一個區塊的雜湊值
、亂數值
這些資料一起進行 雜湊
。
並且看看取得的雜湊值是否滿足規定,如果產生的雜湊值不符合規定(假如規定是前四碼為 0000,那我產生的雜湊直如果為 4kjsdlfj3i2ojli,就沒有符合規定),就改變 亂數值
在做一次 雜湊
,再看看是否符合規定,如果還是不符合,就再改變 亂數值
,一直試一直試,直到找出可以滿足規定的 亂數值
。
例如:當我將 亂數值
改成 542343,產生的 雜湊值
為 0000d9c8e0j3l4j 符合規定,就代表我成功 出塊
(挖出區塊),其他人就會來驗證是否滿足 0000 開頭,驗證通過之後,我就可以將我挖出的區塊向所有人進行 廣播
。
所以挖礦,就是一群礦工在比誰可以最快找出滿足規定的 亂數值
,最快找到的人,就可以獲得獎勵。而挖到的區塊,就會 上鏈
(上到公認的主鏈),成為公認的區塊。當區塊一個一個被挖出來,就會一塊接著一塊,形成所謂的 區塊鏈
。
☞ 區塊鏈
由於每一個區塊會紀錄著前一個區塊的 雜湊值
,且每一個區塊的 雜湊值
都會滿足 0000 開頭這個條件,所以要驗證區塊是否符合規定,只需要去確認每個區塊的 雜湊值
是否都是為 0000 開頭,就可以確認區塊鏈是否是對的。
考卷只要有任何題目被改變,就會使該張考卷不再滿足 85 分。同樣的,區塊當中任何內容被竄改,不論是 交易紀錄
、亂數值
、上個區塊的雜湊值
,只要任何個數值有改變,會使這個區塊的 雜湊值
不再滿足 0000 開頭,這個區塊就不符合規定了。
考卷不滿足 85 分,就得重解該張考卷的題目。同樣的,區塊鏈的 雜湊值
不符合規定,就得重新挖礦找出 亂數值
,就算重算過後這個區塊的 雜湊值
對了,也會導致下一個區塊的 雜湊值
改變(因為對於下個區塊而言 前個區塊的雜湊值
改變了)。
你會發現,當區塊透過 雜湊值(Hash)
以及 亂數值(Nonce)
鏈起來以後,任何一個區塊要竄改,都需要把該區塊之後的所有區塊都重挖一次,而且計算速度還需要比其他所有礦工都快。這個機制能確保 區塊鏈
上資料不容易被竄改。
☞ 區塊鏈系統
理解了 區塊鏈
的原理以後,我們可以把 區塊鏈
的運作,用一個簡單的循環來進行描述:
- 用戶與用戶間進行交易,交易紀錄會先暫存在一個空間,等待被放入區塊
- 礦工會把暫存的交易移入自己的區塊,當區塊滿了以後,開始進行挖礦
- 當區塊被挖出來後,其他人會檢查是否符合規則,只要合格,該區塊就會上到公鏈,該名礦工就可以獲得獎勵
- 重複以上步驟,持續新的交易、持續挖礦
最基本的 區塊鏈架構
,就如同上面的循環,不論何種應用情境,都離不開這一個基礎。
如果在區塊上存放交易資訊,它可能就會是 虛擬貨幣
性質的區塊鏈。如果存放是別種資料,它可能就是別種用途的區塊鏈。
# 總結
這次的入門主題,透過考卷的出題、解題,讓大家了解 區塊
以及 鏈
的概念,實際模擬運作的流程,是如何從一筆一筆的資料,進行挖礦,再到出塊最後成功上鏈。
我們了解到用戶與區塊鏈之間的關係、礦工與區塊鏈之間的關係,只要交易不斷進行,就會有新的區塊不停的產生,只要上到區塊鏈的資料,就具備不可竄改的特性。
還有很多區塊鏈的細節,在這篇文章裡面沒有提到,可能你心中還存在許多疑問:
誰有資格進行挖礦?區塊的容量上限是多少?交易的手續費怎麼計算?加密的原理是什麼?雜湊值的規定會不會調整?多久時間能產生新的區塊?
或許這些疑問沒能在這篇文章獲得解答,但我相信閱讀完這篇文章,理解了基本概念以後,要再去搜尋這些問題的答案,其實就不再是這麼困難的事情了!
希望這篇文章,有成功帶給大家一些幫助,讓我們一起入門區塊鏈。
下一篇文章,會以程式的角度為大家說明,區塊鏈程式的運作具備哪一些要件?它如何運行與實作?
關於作者
作夢也在寫程式