---
# System prepended metadata

title: 藉由比特幣從零開始了解區塊鏈
tags: [分散式系統, 比特幣, Bitcoin, 加密貨幣, Blockchain, 區塊鏈]

---

## 前言
由於網路中的資訊以及資料非常地零散，讀者必須花時間搜尋、整理、融會貫通各式的資料才能讀懂區塊鏈，因此讀者很可能會浪費時間於閱讀重複的資料。

本人也是位區塊鏈新手，當初閱讀了非常多的書籍，並且在整理過後我才有辦法進入狀況，因此我十分清楚--新手在進入情況前會對區塊鏈中的哪個部分感到疑惑。

因此這篇HackMD筆記是新手友善的，我盡我最大的努力將區塊鏈內非常多的知識整理成一篇連貫的文章，希望新手從頭看到尾就能夠完全進入狀況。

若是區塊鏈老手們發現這篇文章有哪裡寫得不盡理想，歡迎利用HackMD的留言功能賜教！我會非常感激您的。

## 區塊鏈簡介

#### *區塊鏈定義？*
「區塊鏈 (Blockchain)」就是將資料儲存在「區塊 (Block)」中，且每個區塊都以鏈狀結構與前一個區塊連接。一個用戶只能新增 (附加) 新區塊至區塊鏈，無法(正確來說是非常難)更動先前已經被驗證的區塊。[^1]

如果是將區塊鏈應用到記帳上，你可以將它想像成是一種分散式儲存資料(記帳)的技術，在現代社會已經成為一種趨勢，帶來更大的商業價值。我認為[區塊鏈技術指南](https://poweichen.gitbook.io/blockchain-guide-zh)這本書的這段話說得很好:
> 從記賬科技數千年的演化角度來看，區塊鏈實際上是記賬問題發展到分佈式場景下的天然結果。[^2]

#### *區塊鏈發明的動機？*
自古以來，記帳方式不停地在演化，我們可以看看下方的[演進圖](https://poweichen.gitbook.io/blockchain-guide-zh/born/ledger_history): [^2]
![image](https://hackmd.io/_uploads/S1ocr8i70.png)

> 15世紀人類開始用「複式記帳法」來記帳，讓銀行裡的數字能夠被全世界的人信任，催生全球貿易、以及近代的資本主義。每個人的交易紀錄都存在銀行等中介機構，是中心化的體系。
> 
> 區塊鏈透過加密技術，用分散式帳本跳過中介銀行(省仲介手續費)，讓所有參與者的電腦一起記帳、確認，成為去中心化的交易系統。[^3]

如上述文字，為了避免中心化的問題(壟斷/手續費)，區塊鏈提倡的是"去中心化"的精神，使交易帳本分散在每個人手中，不需中心儲存、認證，且帳本分散儲存，會比中心化的儲存來的更安全、難以竄改。
> 若設有中央管理人，最後可能會演變為由管理人來決定貨幣供給量、新增或停用部分功能等等，導致喪失國際間的公平性。[^4]

但是，這種"分散式"的記帳模式，該如何確保沒有參與方惡意竄改或攻擊帳本?又該怎麼決定由誰將交易紀錄寫入帳本呢？區塊鏈的誕生正是結合了密碼學以及分散式系統，以此來解決這兩大問題。

#### *區塊裡裝的是甚麼？*
區塊鏈(其實不只一條鏈)裡裝了非常多的「區塊 (Block)」。世界上有非常多種區塊鏈的應用，所以在此我拿區塊鏈最初的應用：「比特幣 (Bitcoin)」作為舉例。區塊裡裝的內容可以分為以下兩種：
* 「區塊體 (Block Body)」，其包含了這個區塊所有的的「交易紀錄 (Transaction)」
* 「區塊頭 (Block Header)」，其包含了"元資料 (Metadata)"
    - 「版本號 (Version)」
    - 「時間戳 (Timestamp)」
    - 「目標難度 (Difficulty Target)」
    - 「隨機數 (Nonce)」
    - 前一個區塊的區塊頭的哈希值 (Hash of previous block header)資料
    - 當前區塊中的所有交易紀錄經由「默克爾樹 (Merkle Tree)」演算法所算出的「默克爾樹根 (Merkle Tree Root)」的哈希值，可以把這個哈希值理解為記載著這個區塊的所有交易紀錄

剛剛所提到的"隨機數 (Nonce)"是一組數字，用於PoW的共識機制；"目標難度 (Difficulty Target)"也是一組數字，用於PoW的共識機制；哈希值(hash)你可以把它想像成是一筆加密後的數字。這三項讀者先不用理解沒關係，我們稍後會提到。

下面這張是「區塊頭 (Block Header)」內容的示意圖[^5]
![image](https://hackmd.io/_uploads/Bkspg6x4C.png)


整體而言，區塊鏈以及區塊的示意圖如下，我們可以看到區塊鏈是由一串的區塊組成：[^6]
![image](https://hackmd.io/_uploads/ry8wdsxE0.png)

讀者若未能了解區塊的內容沒關係，在看了比特幣的PoW章節後，會更容易理解。

#### *交易帳本由誰紀錄？*
區塊鏈的交易系統上有兩種人：
* 交易者，他不太需要處理技術上的問題
* 「礦工 (Miner)」，也就是提供電腦硬體運算能力的人

記載著交易紀錄的帳本，會經過兩個步驟：
1. 第一步是由特定「礦工 (Miner)」運算後加密，也就是記帳
2. 第二步是經所有區塊鏈上的人確認後上鏈

此外，在剛剛所提到的第一步中，哪個礦工能成功獲選，取得記帳並將記錄接到區塊鏈上的權力？這將是待會我們在PoW處即將討論的。

#### *段落小結*
看到這裡，我們可以先看一下接下來這段影片:[What is a Blockchain?](https://youtu.be/kHybf1aC-jE?si=dkTUwm8O9n0B-r8y)來簡單了解一下區塊鏈的流程。[^7]

---

## 分散式系統必須解決的問題(共識問題)
這一個章節雖然比較理論一點，但讀完這些之後，讀者比較能理解比特幣採用的共識方式：PoW的動機為何。

#### *什麼是共識？*
在分散式系統中，「共識 (Consensus)」是這個領域的經典難題。
然而，「共識 (Consensus)」是甚麼意思呢？我用這本[區塊鏈技術指南](https://poweichen.gitbook.io/blockchain-guide-zh/distribute_system/consensus)的定義來說明：
> 共識，則特指在分佈式系統中多個節點之間對某個事情（例如多個事務請求，先執行誰？）達成一致看法的過程。[^2]

為什麼很難呢？這本[區塊鏈技術指南](https://poweichen.gitbook.io/blockchain-guide-zh/overview/challenge)的這一句話說得非常精確：
> 問題的核心在於確保某個變更在分佈式網絡中得到一致的執行結果，是被參與多方都承認的，同時這個信息是不可推翻的。[^2]

而且在現實生活中，由於節點之間的通訊必然存在延遲，且節點也可能產生故障，甚至還可能存在惡意節點傳遞偽造的信息，因此節點之間的通信網絡是非常不可靠的。還有一個非常棘手的情況是："當節點A一直未收到節點B的訊息，節點A無法判斷是通訊延遲造成，還是節點B已經故障。"
很顯然，上述這些情況會導致我們無法確保實現共識。

那如果在理想情況下："節點之間幾乎無延遲，可以大概率保證消息正確送達的網絡"是不是一定能獲得共識呢？

很抱歉，根據「[FLP不可能原理](https://hackmd.io/@5Fpo6M2ORqmaQlrLXGViDg/rkfrrcdXC)」，這個答案沒有通用解。

#### *分散式系統如何解決共識的問題？*
共識的問題可以根據節點故障類型的不同而分為兩類：
1. 「拜占庭錯誤 (Byzantine Fault)」
2. 「非拜占庭錯誤 (Non-Byzantine Fault)」或稱作「Crash Fault」

然而礙於篇幅的關係，我將它們的定義寫在另一篇筆記：[名詞解釋](https://hackmd.io/@5Fpo6M2ORqmaQlrLXGViDg/rkfrrcdXC)

根據解決的問題屬於拜占庭錯誤與否，共識的演算法分別分為下列兩種：
1. 「Byzantine Fault Tolerance (BFT)」
2. 「Crash Fault Tolerance (CFT)」

對於BFT以及CFT的實踐方法，我將各舉兩個例子：
1. BFT
    - 「實用拜占庭容錯 (Practical Byzantine Fault Tolerance)(PBFT)」
    - 「工作量證明(Proof of Work)(PoW)」
2. CFT
    - Paxos
    - Raft

請注意，此處所說的PoW，是1997年由密碼學家Adam Back所提出的"Hashcash"技術引進的PoW，與現今大家常聽到的，也就是中本聰在2008年所提出比特幣的PoW並非完全相同的事情，但可說是相承一脈。此外，中本聰也有在他的[白皮書](https://bitcoin.org/bitcoin.pdf)引用到"Hashcash"的PoW。

Hashcash所要解決的問題是防止垃圾郵件的問題，如何讓一個壞人付出一定的成本(時間成本或是金錢成本)做為發垃圾郵件的代價，並且同時讓一個正常的使用者可以依然自由的發郵件？

PoW大致上的概念就是：讓一台電腦(節點)在發出"一封"郵件之前，必須先證明自己的合法性，也就是付出一定的時間成本去計算一個複雜數學問題的解(具體來說，這個解能產生一個Hash值，且此值符合題目的要求)。當某台電腦(節點)付出了時間(其實只需要幾秒鐘)在計算這個解，那麼便可以證明，他是真心地想寄出這封郵件，因此比較能證明他是一般的使用者，而非惡意的使用者。(畢竟惡意使用者在寄垃圾郵件時，是廣發非常多封信件的，因此這對他們來說成本非常高)

> 產生一個20-位元的戳記只需要幾秒鐘的時間。當您一天中只發送幾十封電子郵件時，這個代價並不大。但是，對於那些想要發送數百萬訊息的垃圾郵件製造者來說，不能容忍每個訊息使用額外幾秒鐘的CPU時間。一天之中只有86,400秒。[^8]

若想要更詳細地了解Hashcash中PoW的運作方式，可以參考[這篇文章](https://benpaodewoniu.github.io/2020/04/26/blockchain6/)。

看到這裡想必讀者已經累了，不妨看一個小故事來了解為何拜占庭錯誤會稱作"拜占庭"錯誤：
> 拜占庭將軍問題在1982年被認為是一個邏輯上的困境，它說明了一群拜占庭將軍在試圖同意下一步行動時可能會遇到溝通問題。
> 
> 困境假設每個將軍都有自己的軍隊，每支軍隊都位於他們打算攻擊的城市周圍不同位置。將軍需要就攻擊或撤退達成一致。只要所有將軍達成共識，即協調後決定共同執行，無論是攻擊還是撤退都無關緊要。
> 
> 因此，我們可以考慮以下目標：
> 
> * 每個將軍必須作出決定：攻擊或撤退（是或否）；
> * 一旦做出決定後無法改變；
> * 所有將軍都必須就同一決定達成一致，並以同步方式執行。
> 
> 上述通信問題涉及這樣一個事實，即一個將軍只能通過信使發送的信息與另一個人進行通信。因此，拜占庭將軍問題的核心挑戰是信息可能以某種方式被延遲，破壞或丟失。
> 
> 此外，即使消息成功傳遞，一個或多個將軍也可以選擇（出於任何原因）惡意行動並發送欺詐性消息以混淆其他將軍，導致行動的完全失敗[^9]

這時候回過頭來想，將拜占庭錯誤的困境套用在區塊鏈上的話，每個將軍就好像是一個網路節點，某個時間點區塊上的每個節點就必須依照當前區塊鏈系統的狀態對某個提案達成共識，換句話說便是，每個節點必須同意並且執行相同的操作以避免失敗。

#### *共識的問題一定能成功解決嗎？*
上個段落提到了「實用拜占庭容錯 (Practical Byzantine Fault Tolerance)(PBFT)」，就用其舉例吧。

計算機領域的科學家Leslie Lamport在論文[Reaching Agreement in the Presence of Faults](https://lamport.azurewebsites.net/pubs/reaching.pdf)中證明：

[^10]
$$
n \geq 3m+1
$$ 

其中，n代表的是總節點數量；m代表的是有問題或是惡意的節點 

這意味著：
> 只要系統中有問題的節點不超過1/3時，不管這些節點如何廣播有問題的信息，可信節點之間都一定能達到共識。[^11]

若是讀者想要更了解PBFT、上述公式在將軍例子上的應用，可以參考這篇[網路文章](https://www.samsonhoi.com/570/blockchain-pbft)

所以，在PBFT類型的分散式系統中，要達成共識的唯一方法是至少擁有2/3以上的誠實節點。
因此，如果過半數的節點打算進行惡意行為，則系統就會受到攻擊，例如區塊鏈中的「[51％攻擊 (51% Attack)](https://hackmd.io/@5Fpo6M2ORqmaQlrLXGViDg/rkfrrcdXC)」。

此外，我覺得[區塊鏈技術指南](https://poweichen.gitbook.io/blockchain-guide-zh/bitcoin/consensus)這句話說得非常好，「51％攻擊 (51% Attack)」並不是"竄改區塊中的交易紀錄"而是"控制區塊鏈的走向"。
> 誰的算力多，誰最先解決問題的概率就越大。當掌握超過全網一半算力時，從概率上就能控制網絡中鏈的走向。這也是所謂 51% 攻擊的由來[^2]


---

## 區塊鏈如何解決共識問題

區塊鏈，身為一個分散式系統，必定會發生上一個章節所述的共識問題。
> 區塊鏈就像是一個高度民主化的小型社會，要想讓它正常運作，我們就必須設立一套運行規則讓所有參與區塊鏈的礦工們遵守，以此保證區塊鏈系統的公平與一致性，這就是「共識機制」。[^12]

還記得剛剛有提到PBFT、PoW、Paxos、Raft嗎？這四個都是區塊鏈解決共識問題的方法，然而不止這四種方法，還要根據區塊鏈的應用為何來決定使用哪一種方法。

#### *加密貨幣使用哪些共識機制來解決共識問題？*
加密貨幣是其中一種區塊鏈的應用，在此我只拿加密貨幣做舉例。
現行所有加密貨幣中，最廣泛使用的兩種共識機制為：
* 「工作量證明 (Proof of Work) (PoW)」，代表加密貨幣為「比特幣（Bitcoin）」
* 「持有量證明 (Proof of Stake) (PoS)」，代表加密貨幣為「以太幣（ETH）」

由於本篇文章目的是讓讀者藉由比特幣理解區塊鏈的應用，因此在此我只拿「比特幣（Bitcoin）」所採取的共識機制：PoW做說明。

先前已經有提到Hashcash的PoW概念，然而中本聰在他的[白皮書](https://bitcoin.org/bitcoin.pdf)所提出的PoW只是對其做了一些改進，現在就讓我們看看比特幣所使用的PoW是什麼吧！

#### *以比特幣舉例何謂 PoW*
先前有提到「礦工 (Miner)」是提供電腦硬體運算能力的人，他們負責記帳並且將其加到區塊鏈上。然而世界上總共有無數個礦工，若所有礦工都能將帳本寫入到區塊鏈上，豈不是世界大亂了！因此，整個區塊鏈系統每一段時間只能選一個礦工負責記帳(例如：比特幣平均每十分鐘會記一次帳)。

先用白話文說一下流程：區塊鏈系統會出一道數學題給所有礦工，每個礦工都有權力解這道問題，然而這個數學問題必須透過暴力法慢慢地嘗試才能找到答案，當某位礦工找到答案之後，他會將若干筆交易紀錄以及這個答案打包在一個區塊中，此區塊稱作「候選區塊 (Block Candidates)」，然後這個「候選區塊 (Block Candidates)」就會被廣播到區塊鏈上，等到其他的礦工檢查這個答案是否正確，只有在答案被確認無誤後，「候選區塊 (Block Candidates)」才會被添加到區塊鏈的末端，成為正式區塊。此時該區塊所包含的若干筆交易紀錄才算是真正地被記錄下來(畢竟經過了一次的「確認(Confirmation)」)。此時，下一道不同的數學題又會產生了。

你可以想像成，礦工們利用各自的電腦資源競爭完成這道數學問題的速度，第一位找到答案的礦工將有權利編寫下一個新區塊，從而獲得比特幣獎勵，因此每一道數學問題就會促進一個區塊的生成。

每位記帳員需要不斷付出自己的電力和計算資源，競爭誰先解出數學問題，這個概念其實很像是在挖礦，因此這也是為何記帳員也被稱作「礦工 （Miner）」。

當區塊鏈尾端增加了一個新的正式區塊時，其餘的節點就會從"競爭"改為接受新的區塊並"同步"新區塊的帳本訊息，大家都同步完成後才開始競爭新的數學問題。

讀完上面這些，不妨休息一下看一個動畫解說[何謂PoW](https://youtu.be/XLcWy1uV8YM?si=ja81U2pI0x2AJdmF)，此外我認為影片中這一句話說得非常好：

> "You have to prove that you spend a long time trying to find the password that works." [^13]

對於一個礦工而言，他必須證明他真的有付出時間或金錢成本在解數學問題，他才有資格將提案，也就是他自己打包的「候選區塊 (Block Candidates)」，廣播到區塊鏈上；否則若是任何人都有資格將提案廣播的話，會非常難以達成共識。

#### *PoW 中的數學問題是什麼？*
麻煩讀者先回過頭複習"區塊裡裝的是甚麼？"這個小章節。

剛剛所提到的數學問題，我們可以簡單的用下面公式表示：

[^14]
$$
SHA256 ( Block Data + Nonce) < Difficulty Target 
$$

接下來我們將一一地解釋：

* SHA256()

    SHA256的SHA是Secure Hash Algorithm的縮寫，你可以把他想像成是一種「哈西希數 （Hash Function）」，可以輸入一串文字，然後輸出成另一串加密的文字，而256指的是加密後的文字長度固定是256個bit。
    
    不知道「哈西希數 （Hash Function）」是什麼的讀者，可以參考動畫解說[何謂Hash](https://youtu.be/gTfNtop9vzM?si=BJMEetucnIejWmM2)[^15]，總而言之，Hash可以保證另一個人非常難由輸出文字反推回原始的輸入文字。
    
* Block Data

    此處的Block Data指的是"前一個區塊的區塊頭的哈希值 (Hash of previous block header)"
    
* Difficulty Target 

    這是一個256bit的數字，為了讀者方便閱讀，我用16進位表示，例如：
    `000006d3f1c492030ec4b2d8909041ea8c0bd224b7cfa6c03d202fc7682eb93d`
    
    前面有五個前導0對吧？
    
    代表礦工要找的答案(也就是Nonce)必須使不等式的左半邊有"至少五個前導的0"，白話點地說就是不等式的左半邊算出的Hash值必須得小於右半邊的值。
    
    比如說，如果不等式的左半邊算出來是：
   `0000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
    
    共有七個前導的0，就算是一個解了。
    
* Nonce
    
    這是一個32bit的數字，礦工只能透過暴力法，利用Try and Error的方式慢慢地尋找一個Nonce來符合不等式(有很多個可能的解，但找到一個即可)。
    
    先前的[何謂Hash](https://youtu.be/gTfNtop9vzM?si=BJMEetucnIejWmM2)中有提到，Hash的輸入只要改變一點點，甚至是只改變一個bit，輸出就會改變非常多。因此，礦工通常不會跳來跳去地找Nonce，而是每一次嘗試都將Nonce值加1，慢慢地尋找出符合不等式的Nonce值。所以說，Nonce有時也會被人們稱作是：PoW的計數器。

總結來說，我認為[區塊鏈技術指南](https://poweichen.gitbook.io/blockchain-guide-zh/bitcoin/consensus)的這一句話說得非常精確：
> 工作量證明，通過計算來猜測一個數值（Nonce），使得拼湊上交易數據後內容的Hash 值滿足規定的上限（來源於Hashcash）。由於Hash難題在目前計算模型下需要大量的計算，這就保證在一段時間內，系統中只能出現少數合法提案。反過來，能夠提出合法提案，也證明提案者確實已經付出了一定的工作量。[^2]

#### *節點如何驗證某位礦工提出的 PoW 的解是正確的？*
先前有提到，在第一位礦工找到符合不等式的Nonce值後，他就有權力將他的「候選區塊 (Block Candidates)」廣播到區塊鏈上，等待其他的礦工"檢查"這個答案是否正確。

這個"檢查"的動作，其實非常簡單。先前有提到一個區塊內包含區塊體和區塊頭，而區塊頭又包含Difficulty Target和Nonce以及Hash of previous block header，因此拿這三者做運算就能夠驗證該位礦工所提出的Nonce是否符合不等式了。

另外一件事情是，該位礦工無法在提出他找到的Nonce後，竄改「候選區塊 (Block Candidates)」內的交易紀錄，因為這樣做會導致無法通過其他節點的"檢查"。

#### *如果同時有兩個礦工找到 PoW 的解，該怎麼辦？*
如果有兩個礦工(A與B)找到PoW的解，並且他們幾乎同時將這兩個區塊提交到區塊鏈上時，就會發生「分叉(Fork)」。

具體來說是，其他節點可能無法立即確定該接受哪個區塊，但為了要同步交易紀錄，所以這時一部分節點可能會選擇同步A挖到的區塊，而另一部分節點則可能會選擇同步B挖到的區塊，這時就會出現「分叉(Fork)」。
> 有時會發生兩個礦工同時推播一個有效區塊的情況，而網路會出現兩個競爭區塊。然後，礦工們根據最先收到的區塊挖礦下一個區塊。這將導致網路暫時分裂為兩個不同版本的區塊鏈。[^16]

這個問題要如何解決呢？

這種情況下，節點會等待區塊鏈上挖出更多的區塊，以此來確定哪個分支是長期有效的。通常，當某一個分支(鏈)上的區塊數量超過其他分支(鏈)時，這個分支就會被視為主要分支，其他分支則會被丟棄，這一過程確保了區塊鏈的一致性。

換句話說，「最長鏈 (The longest Chain)」會被視為主要的分支，而其他的鏈會被視為不重要的分支，之後會被丟棄。

那為何"最長"就會被視為"最主要"呢？

因為「最長鏈 (The longest Chain)」其實就是運算資源投入最多的鏈，讀者可以想像成：這是一條最多人支持的鏈，因為大家支持，所以大家願意投入他們的運算資源在這條鏈上。

我認為[區塊鏈技術指南](https://poweichen.gitbook.io/blockchain-guide-zh/bitcoin/consensus)比喻得非常好：
>假定超市只有一個出口，付款時需要排成一隊，可能有人不守規矩要插隊。超市管理員會檢查隊伍，認為最長的一條隊伍是合法的，並讓不合法的分叉隊伍重新排隊。新到來的人只要足夠理智，就會自覺選擇最長的隊伍進行排隊。這是因為，看到多條鏈的參與者往往認為目前越長的鏈具備越大的勝出可能性，從而更傾向於選擇長的鏈。[^2]

那麼參與的不是最長鏈的礦工們該怎麼辦？

對於參與非最長鏈挖礦的礦工來說，如果他們發現自己所挖到的區塊在其他節點中不是最長鏈，通常會放棄這個分支，並轉而參與挖掘最長鏈。

如果他們仍舊選擇繼續挖掘這個非最長鏈，那麼這個非最長鏈的區塊的區塊可能會導致他們的工作被拋棄，因為其他節點不會接受這些區塊作為有效的，所以說這其實會導致他們浪費計算資源。
> 被放棄的區塊稱為孤兒區塊或陳腐區塊，導致選擇此區塊的所有礦工都將返回有機會獲勝的區塊鏈挖礦。[^16]

---

## 區塊鏈的共識如何防止攻擊

#### *攻擊的種類*

區塊鏈中我們常聽到的攻擊有兩種：

* 「[51％攻擊 (51% Attack)](https://hackmd.io/@5Fpo6M2ORqmaQlrLXGViDg/rkfrrcdXC)」
* 「[雙重支付 (Double Spending)](https://hackmd.io/@5Fpo6M2ORqmaQlrLXGViDg/rkfrrcdXC)」

針對這兩項攻擊的防護機制，上述的連結內都有進行說明了，且PoW本身的設計就能夠一定程度地防止這兩項攻擊，相信看到這裡的讀者應該能自行參透。

然而，這樣的攻擊還是有可能會發生，這裡就只拿「雙重支付 (Double Spending)」做舉例：
> 有些雙重支付攻擊的目標是接受未確認交易的相關方。例如，對於金額較小的購物，商家可能不願等待交易加入區塊中。忙碌的速食餐廳可能沒辦法守在網路邊處理每一單購買。因此，如果一家企業啟用「即時」支付，他們可能就會面臨雙重支付的情況。有人可能會點一份漢堡，付完款，再立即將相同金額的資金轉到他們自己的地址。[^17]

注意，上述提到的"不願等待交易加入區塊中"是因為：

比特幣系統中，挖到一個區塊平均時間是十分鐘，所以一筆新產生的交易紀錄平均要等到十分鐘後才會被礦工記帳，也就是十分鐘後這筆帳才會被寫入帳本。

#### *單一惡意節點能進行竄改嗎？*

一個惡意節點若想要竄改某一筆交易紀錄，他可能會想要竄改的是這兩種的其中一種：

* 已經被加到區塊鏈上的區塊中的某一筆交易紀錄，也就是已經被所有節點確認過的交易紀錄
* 尚未被加到區塊鏈上的區塊，也就是該惡意節點自己的「候選區塊 (Block Candidates)」的某一筆交易紀錄

針對第一種，其實非常地難：

假如他想要竄改的交易紀錄位於區塊鏈末端往回數來的第三個區塊，他竄改之前必須重新算出該區塊的Nonce值。

然而，由於區塊鏈是一個連續的、鏈式結構，每個區塊的哈希值都依賴於前一個區塊的哈希值。這意味著一旦攻擊者修改了某個區塊的內容，它就會導致該區塊之後所有的區塊的哈希值都發生變化。

因此，該惡意節點還得去重新算後面兩個區塊的Nonce值。

正是因為這個原因，人們往往會認為越長的鏈是更值得相信的，畢竟它越難被竄改。

針對第二種，其實成本非常高：

竄改「候選區塊 (Block Candidates)」的某一筆交易紀錄，對區塊鏈上的其他節點完全沒有影響。這是因為這個區塊尚未被廣播出去，所以其他節點並不知道這筆交易的存在，也不會將其納入他們自己的區塊中做同步。

然而，若惡意節點想將他竄改過的「候選區塊 (Block Candidates)」廣播到區塊鏈上，他就得進行挖礦，也就是必須得找出Nounce值。

我認為[區塊鏈技術指南](https://poweichen.gitbook.io/blockchain-guide-zh/bitcoin/design)寫得非常精確：
> 比特幣網絡中所有試圖參與者(礦工)都首先要付出挖礦的代價，進行算力消耗，越想拿到新區塊的決定權，意味著抵押的算力越多。一旦失敗，這些算力都會被沒收掉，成為沉沒成本。當網絡中存在眾多參與者時，個體試圖拿到新區塊決定權要付出的算力成本是巨大的，意味著進行一次作惡付出的代價已經超過可能帶來的好處。[^2]

[區塊鏈技術指南](https://poweichen.gitbook.io/blockchain-guide-zh/bitcoin/mining)也給出了一個相當精確的結論：
> 如果有人掌握了強大的計算力，計算出所有的新區塊，並且拒不承認他人的交易內容，那是不是就能破壞掉比特幣網絡。確實如此，基本上個體達到 1/3 的計算力，比特幣網絡就存在被破壞的風險了；達到 1/2 的算力，從概率上就掌控整個網絡了。但是要實現這麼大的算力，將需要付出巨大的經濟成本。[^2]

#### *結論*

比特幣的PoW共識演算法，除了一定程度地預防竄改與攻擊外，也解決了分散式系統中最重要的議題：共識問題。

由於區塊鏈系統中可能存在惡意節點偽造訊息，因此區塊鏈的共識問題屬於「拜占庭錯誤 (Byzantine Fault)」，而比特幣的PoW藉由以下兩個方法解決拜占庭錯誤：

* 限制一段時間內整個網絡中出現的提案個數（通過工作量證明來增加提案成本）
* 約定好始終沿著已知最長的鏈進行拓展，藉此可以捨棄掉一部分已經確認的提案

---

## 比特幣挖礦相關的疑問

#### *挖礦獎勵有哪些？*

比特幣獎勵分為兩種：
* 「區塊獎勵 (Block Reward)」
    
    第一位解出數學問題的礦工，就有權力將自己的候選區塊接到區塊鏈尾端。由於該礦工成功地讓區塊鏈新增了一個區塊，因此他能獲得一個區塊獎勵。
    
    比特幣誕生的來源只有這一種方式，意即除了區塊獎勵外，沒有其他方式可以生成比特幣。
    
* 「手續費獎勵 (Transaction Fee)」

    第一位解出數學問題的礦工，就有權力將自己的候選區塊接到區塊鏈尾端。由於該礦工將該區塊內的所有交易紀錄成功記帳了，因此他能獲得該區塊內的所有交易紀錄的交易手續費。
    
    交易手續費具體為多少，可以參考稍後的"虛擬貨幣交易如何發生？"這個小章節。
    
#### *獎勵永遠都有嗎？*
「區塊獎勵 (Block Reward)」會隨著時間慢慢減少，每四年會「減半 (Halving)」一次，最終到了2140年，市場上比特幣被開採出來的總發行量會達到上限2100萬枚(固定發行量是為了避免通膨)。

因此2140年時，當礦工挖出了新的區塊，就不會再得到「區塊獎勵 (Block Reward)」，而是只能賺取「手續費獎勵 (Transaction Fee)」作為唯一的報酬。

目前，「區塊獎勵 (Block Reward)」是3.125枚比特幣，歷史的「區塊獎勵 (Block Reward)」可以參考下方的圖片：
![image](https://hackmd.io/_uploads/BySz42FVR.png)[^18]

#### *數學問題的難度會調整嗎？*
為了維持區塊產生的速度大約每十分鐘一個，比特幣系統會根據目前的網路計算能力（取決於所有礦工所貢獻的算力）調整目標哈希的難度。

區塊鏈中每生成2016個區塊(大約是兩週)，所有節點都會按統一的公式自動調整難度值：

> 新難度值 = 當前(舊)難度值 * (實際2016個區塊生成花費時間 / 理論上2016個區塊生成花費時間，也就是兩週)[^14]

#### *能使用個人電腦挖礦嗎？*
隨著比特幣網路的發展，越來越多的礦工參與競爭，所以比特幣挖礦的難度屢創新高。因此挖礦的算力要求也越來越嚴格，需要更多的計算能力才能獲得比特幣區塊獎勵。而且提升算力需要更大的硬體升級以及電費考量，因此，個人礦工和小礦場(非常多硬體組合而成)其實很難取得優勢。

---

## 虛擬貨幣相關的疑問

#### *虛擬貨幣餘額保存的方式*

在當前的區塊鏈項目中，主要有兩種餘額保存方式，一種是UTXO模型，一種是帳戶/餘額模型。

UTXO全名為「未花費交易輸出 (Unspent Transaction Outputs)」，礙於篇幅關係，定義在[這裡](https://hackmd.io/@5Fpo6M2ORqmaQlrLXGViDg/rkfrrcdXC)。

看完UTXO的定義，相信讀者應該隱約能感覺得出UTXO的優點以及缺點了吧！
![image](https://hackmd.io/_uploads/Byg1pDmV0.png)[^19]

| 特性 | UTXO模型 | 帳戶/餘額模型 |
| -------- | -------- | -------- |
| 狀態查詢和變更| 需要回朔歷史統計     | 支持直接訪問     |
| 存儲空間     | 所需較大     | 所需較小     |
| 易用性     | 較難理解     | 易於理解     |
| 可追溯性    | 支持回溯歷史     | 不支持回溯歷史     |

比特幣採用的就是UTXO模型，以太坊則採用的是帳戶/餘額模型。

#### *虛擬貨幣交易如何發生？*
首先先提一下一個比特幣帳戶的地址是從何而來：
比特幣的賬戶地址其實就是用戶公鑰經過兩次Hash的組合(SHA256和RIPEMD160)後生成的160bit的字符串。

比特幣的一筆「交易(Transaction)」中，帶有下列這幾項內容：
* 付款人地址：必須是一個合法的比特幣帳戶地址
* 付款人對這筆交易的簽字確認：用以確保交易內容沒有被篡改
* 付款人的資金來源是來自哪一筆交易的輸出：從哪筆交易的"輸出(Output)"作為本次交易的輸入
* 交易的金額：也就是"輸入(Input)"，指的是這筆交易是多少比特幣。此外，輸入與輸出的差額就是交易的服務費/手續費(fee)
* 收款人地址：必須是一個合法的比特幣帳戶地址
* 時間戳：交易何時能生效

網絡中節點收到交易信息後，將進行如下檢查：
* 交易是否已經處理過?
* 交易是否合法?此處包括：
    - 付款人及收款人地址是否合法?
    - 發起交易者是否是輸入地址的合法擁有者?
    - (以比特幣為例)輸入與輸出的形式是否是UTXO?
* 交易的輸入之和是否大於輸出之和?

這個檢查動作稱為「驗證 (Validation)」，若通過驗證，則將交易標記為合法的"尚未確認的交易(Unconfirmed Transaction)"，加入到「內存池 (Mempool)」當中，並在網絡內進行廣播，礦工可能就會從這個池中優先挑選「手續費 (Transaction Fee)」高的交易去做「確認 (Confirmation)」，以此來獲得報酬；相反地，若這幾項檢查未通過，那麼代表該筆交易的有些項目填錯了，這筆交易會變成"無效的交易(Invalid Transaction)"。

那「確認 (Confirmation)」是甚麼意思呢?

當「礦工 (Miner)」將一筆"尚未確認的交易"寫入到自己的「候選區塊 (Block Candidates)」當中，若該礦工成功挖到礦了接著就會將該「候選區塊 (Block Candidates)」加到鏈上的最末端，這個動作就算是"確認"了，因此該筆"尚未確認的交易"會變成"確認的交易"。簡單來說就是，若一筆交易被寫入到鏈上的區塊中，那就是經過「確認(Confirmation)」了。

用戶可以從[blockchain.com](https://www.blockchain.com/explorer)查看實時的交易信息以及目前挖到哪一個區塊，下面這張圖是我在2024/05/26截取的某一筆「交易 (Transaction)」例子。
![image](https://hackmd.io/_uploads/ByAMA31V0.png)

我們可以注意到，除了記載著一筆交易必須包含的項目(例如：收/付款人地址、交易金額、付款人的資金來源)以外，還會告訴你這筆交易是否被「確認(Confirmation)」了(見圖片左邊綠色字體)，以及這筆交易寫入的區塊編號(Block 845,123)。

此外還會告訴你"確認的次數"，以圖片中為例，"6 Confirmations"表示目前區塊鏈已經挖到第845,128個Block了，也就是說這筆交易寫入的區塊，其後還有6-1=5個區塊串在一起。

畢竟我們難以更動先前的區塊的值，且更久之前的區塊越難更動，因此確認次數越多表示這筆交易越值得信任，通常來說，人們會認為"6 Confirmations"就足以信任了。

#### *虛擬貨幣究竟放在哪裡？*
若讀者起初有這樣的問題：「我的虛擬貨幣存放在區塊鏈的哪裡？」相信讀者在看完上面兩個小章節後，應該就能理解這個問題難以回答了。

如果以比特幣為例，比特幣軟體會幫你生成一個私鑰，私鑰可以再生成一個公鑰，公鑰可以在生成一個地址，這個地址就是別人可以轉比特幣給你的地方，這個觀念是剛剛我才提到的。

每一筆交易是收款人/付款人的地址被記錄在區塊鏈上面，當別人轉一個比特幣到這個地址時，網路的記帳本就會記錄這一筆交易，也就是說這個地址目前有一個比特幣的餘額。此時，唯一能夠再去轉移這個地址的比特幣的，就是這個地址的私鑰持有者。

以使用UTXO模型的比特幣而言，「[全節點 (Full Node)](https://hackmd.io/@5Fpo6M2ORqmaQlrLXGViDg/rkfrrcdXC)」會維護並且更新一個「UTXO集合 (UTXO Set)」，該集合包含區塊鏈上"所有"未花費的交易輸出：
* 將區塊中所有交易的輸入從UTXO集合中移除，因為這些輸入已經被花費。
* 將區塊中所有交易的輸出添加到UTXO集合中，因為這些輸出是新的未花費輸出。

所以說呢，每個人的UTXO並不是以傳統意義上的"存放"方式存在的，而是分佈在整個區塊鏈中：
* 每一個UTXO都是一筆已被確認的交易輸出，這個輸出由區塊鏈上的區塊和交易數據負責紀錄。
* UTXO Set包含區塊鏈上"所有人的UTXO"，由「全節點 (Full Node)」負責儲存。

比特幣全節點的數量通常在數千到一萬之間。根據最新的統計數據，這個數字可能在7000到11000之間，並且數量會隨著用戶設置或關閉節點而有所波動。然而，這些節點分佈在全球各地，因此比特幣的擁有者可以認為，他的虛擬貨幣是置放於世界上的任一處所。

#### *虛擬貨幣與銀行交易的差異？*
> 虛擬貨幣的交易資訊則是所有電腦都會一模一樣。與銀行線上系統的關鍵差異，在於是否能夠在自己的電腦上自由讀取這些資訊。[^20]

由於虛擬貨幣的交易資訊在區塊鏈上是公開可查的，因此所有電腦都會知道從哪個帳戶轉了多少錢至哪個帳戶，而且所有參與區塊鏈網絡的節點都會擁有相同的交易資訊副本。這是區塊鏈技術的一個關鍵特性，與傳統銀行的線上系統有著重要的差異。

剛剛有提到，想要花費帳戶上的虛擬貨幣，使用者就必須持有私鑰，假如今天不小心把私鑰弄丟了，那麼那個地址的比特幣也拿不回來了，這也是加密貨幣的缺點，因為沒有中心化的第三方，所以沒有客服人員可以幫你找回私鑰。

當然，將私鑰存放在交易所的帳戶中是另一種管理加密貨幣資產的方式，這種方法讓用戶可以透過交易所的平台的帳號密碼來進行資產管理和交易，而不必自己負責私鑰的安全保存。但是，這種方式也存在一些風險和缺點，例如違法的交易所可能會把你的資產挪用，例如：2022年的FTX交易所。

---

## 除了虛擬貨幣外，區塊鏈的其他應用

時至今日，區塊鏈已經應用在了非常多的地方，以下我舉一個對大眾來說最容易接觸的例子:Airbnb
Airbnb最大的問題就是"如何加強用戶對屋主的信任"，然而Airbnb在引進區塊鏈技術後，由於區塊鏈技術具備永久的交易紀錄，所以這樣的分散式儲存技術成功地解決了信任問題，也加強了使用者的信任管理。
> For sites like Airbnb, Blockchain is very useful. This is because it is capable of storing people’s online identities. This enables people to easily check if you are a trusted host by checking the ID number associated with your account. Unlike sites such as Facebook, it is impossible to delete your account and re-register if you get a bad reputation. This is because records on the blockchain cannot be changed. Reputation is the key for both hosts and guests on Airbnb and the fact they can’t change is useful for both parties.[^21]

此外，Goldman Sachs(高盛)公司也在[Blockchain: Putting Theory into Practice](https://github.com/bellaj/Blockchain/blob/master/Goldman-Sachs-report-Blockchain-Putting-Theory-into-Practice.pdf)報告中提到:
> Building trust between counterparties in the Sharing Economy: P2P lodging sites like Airbnb have already begun to transform the lodging industry by making a public market in private housing. However, adoption may be limited by concerns about safety and security (guests) and property damage (hosts). By enabling a secure, tamper-proof system for managing digital credentials and reputation, we believe blockchain could help accelerate the adoption of P2P lodging and generate $3 - $9 billion in incremental revenue opportunity through 2020. [^22]
> ![image](https://hackmd.io/_uploads/rJw_Hs2XC.png)

---

## Reference

[^1]: https://www.oracle.com/tw/blockchain/what-is-blockchain/
[^2]: https://poweichen.gitbook.io/blockchain-guide-zh
[^3]: http://ows.takming.edu.tw/Article/View/IK002?language=en-US
[^4]: https://www.oanda.com/bvi-ft/lab-education/cryptocurrency/blockchain-basics/
[^5]: https://medium.com/change-or-die/%E5%9C%96%E8%A7%A3%E5%8D%80%E5%A1%8A%E9%8F%88-%E5%8E%9F%E7%90%86%E7%AF%87-%E4%B8%AD-part-1-1d063b3a0437
[^6]: https://www.pluralsight.com/resources/blog/cloud/blockchain-and-serverless-processing-similarities-differences-and-how-they-fit-together
[^7]: https://youtu.be/kHybf1aC-jE?si=dkTUwm8O9n0B-r8y
[^8]: https://benpaodewoniu.github.io/2020/04/26/blockchain6/
[^9]: https://academy.binance.com/zt/articles/byzantine-fault-tolerance-explained
[^10]: https://lamport.azurewebsites.net/pubs/reaching.pdf
[^11]: https://www.samsonhoi.com/570/blockchain-pbft
[^12]: https://chainee.io/what-is-blockchain/
[^13]: https://youtu.be/XLcWy1uV8YM?si=ja81U2pI0x2AJdmF
[^14]: https://weicheng-hsieh.medium.com/%E5%8D%80%E5%A1%8A%E9%8F%88%E5%85%B1%E8%AD%98%E6%A9%9F%E5%88%B6-pow-%E5%B7%A5%E4%BD%9C%E9%87%8F%E8%AD%89%E6%98%8E-proof-of-work-c9f63fd5ab97
[^15]: https://youtu.be/gTfNtop9vzM?si=zgib79y6BQQIu_5X
[^16]: https://academy.binance.com/zt/articles/what-is-crypto-mining-and-how-does-it-work
[^17]: https://academy.binance.com/zt/articles/double-spending-explained
[^18]: https://chainee.io/bitcoin-mining/
[^19]: https://kordan.medium.com/%E7%82%BA%E4%BB%80%E9%BA%BC%E4%B8%AD%E6%9C%AC%E8%81%B0%E8%A8%AD%E8%A8%88%E6%AF%94%E7%89%B9%E5%B9%A3%E5%8F%8D%E7%9B%B4%E8%A6%BA%E5%9C%B0%E9%81%B8%E6%93%87-utxo-%E6%A8%A1%E5%9E%8B-002efb5a59d8
[^20]: https://www.oanda.com/bvi-ft/lab-education/cryptocurrency/basic-cryptocurrency-blockchain/
[^21]: https://www.thegentlemansjournal.com/article/5-practical-uses-blockchain-airbnb-stockmarkets/
[^22]: https://github.com/bellaj/Blockchain/blob/master/Goldman-Sachs-report-Blockchain-Putting-Theory-into-Practice.pdf