Mastering Bitcoin — CH2 How Bitcoin Works

徐粲邦
Taipei Ethereum Meetup
10 min readJan 31, 2017

--

Outline

本篇是 Mastering Bitcoin 這本書的第二章心得,如果沒看過第一章心得的話可以去這邊,如果你沒有這本書的話可以去這邊,書跟心得都不會講的太深入,我的目標是希望不懂寫程式的都能看得懂 (順便幫自己做筆記),希望這目標不會太困難。

第二章主要會從一個交易 (transaction) 的創建開始,介紹交易的架構會是什麼,然後順著這個交易被礦工 (miner) 收納進區塊 (block),介紹挖礦 (mining) 的意義,到最後新的區塊產生,發佈到比特幣網路上成為區塊鏈 (blockchain) 的一部分。所以本章的概覽會是

  1. 比特幣的概覽,什麼是區塊鏈、區塊、挖礦、交易?當一筆交易從產生到最後應該會經過什麼過程?
  2. 比特幣的交易到底長什麼樣子?交易主要分成 inputs 和 outputs 兩部份,但他們分別是什麼?
  3. 什麼是挖礦?他除了發行新的比特幣之外,又還有什麼其他意義?

Bitcoin Overview

由封面圖可以看出來,比特幣網路的節點可以在世界各地,不管你是用手機還是電腦,只要有自己跑一個比特幣客戶端,你就是這個大型分散式系統的一員。

當一個使用者要產生一筆新的交易,他需要指定從自己的哪一個地址 (address) 送錢去哪一個地址?如圖上半部可以看到使用者會擁有自己的錢包 (wallet),錢包是一個軟體裝有使用者的地址和相對應的密鑰 (private key),當然一個錢包也可以存放多組地址。

當交易創建之後就會發送到全網路上,圖的下半部可以看到有個礦工 (miner) 收集了一些尚未確認的交易,可能也包含了我們剛剛發送到網路的這筆交易,經過大量計算之後,也就是我們上一章所簡單提到的工作量證明 (PoW),礦工組成了一個新的區塊,然後發佈到比特幣網路上給其他節點驗證。

最後圖的左邊可以看到如果網路達成了共識 (consensus),新的區塊就接上區塊鏈了,數學競賽重新開始。

Bitcoin Transaction

比特幣的交易簡單來說就是告訴比特幣網路我是誰,且我要授權送多少錢給另一個使用者。架構上來說,交易主要會有兩個部分構成,分別是 inputs 和 outputs。

  • Transaction inputs:簡稱 TxIn,他的來源是這個 address 其他還沒花掉的 transaction outputs,例如我這個 address 之前分別收到且還沒花掉過 2 個比特幣、3 個比特幣跟 5 個比特幣,這三個曾經給我的 outputs 就是我 address 有的錢,這三個 outputs 就可以當我現在要創建的交易的 TxIn。而這三個 outputs 有個很潮的名字叫 UTXO (unspent transaction output)。
  • Transaction outputs:簡稱 TxOut,他的組成當然就是我要送錢給誰,還有包含找錢,例如剛剛的例子如果我只需要送出去 1 個比特幣,因此我就選用有 2 個比特幣的那個 output 來當我這個交易的 TxIn,但會多出來 1 個比特幣,因此就會有有一個找錢給自己的 TxOut。

值得注意的是比特幣交易裡 TxIn 和 TxOut 數量和的差會不一樣,TxIn 的值會多一些些,相減的差值就是交易手續費 (transaction fee),這個差值最後是給礦工拿走的,如下圖。

如剛剛所說,TxIn 上面的數字是不能隨便寫的,他是要拿存在過的 UTXO 的,這概念很像我手上現在有一張 100 元鈔票、兩枚 50 元硬幣,這張鈔票和這兩枚硬幣就是我的 UTXO,即便加起來是 200 元的價值,我也不能直接說我有一張 200 元的鈔票。對應到比特幣的交易裡面也是一樣,我在創建 TxIn 時我需要提供這個 UTXO 是在哪一個交易的第幾個 TxOut,所以比特幣的流動就是由一個 TxIn 轉移到一個 TxOut,然後這個 TxOut 又可以當下一個交易的 TxIn,這樣一直接著下去,如下圖。

所以其實有了 UTXO 就可以創建交易了,但我要怎麼拿到 UTXO,其實區塊鏈上面都有,如果你有跑一個比特幣節點可以直接透過他的 RPC (Remote Procedure Call) 拿到 address 的 UTXO,或是有一些第三方平台的 RESTful API 來拿到,例如:

$ curl https://blockchain.info/unspent?active=<your_address>
{
"unspent_outputs":[
{
"tx_hash": "...",
"tx_hash_big_endian":"...",
"tx_index":47854970,
"tx_output_n": 1,
"script":"...",
"value": 8450000,
"value_hex": "0080efd0",
"confirmations":173586
},
...
]
}

但這樣會有另一個問題,因為區塊鏈是公開透明的,大家都可以看到,如果其他人知道我的 address,去找了我的 UTXO 幫我創了一個交易惡意亂送錢怎麼辦?當然交易是任何人都可以創的,只是在交易創建送到網路上之前還有一個步驟沒做,就是簽名 (signature),用我們保護在錢包裡面的密鑰來對這個交易簽名,這個動作代表這筆交易是經過 TxIn 的 address 授權的,至於簽名的過程這一章不會提,或可以看我在另一篇的筆記。

順帶一提,這邊提醒一個很重要的非技術重點,一定要保管好密鑰,如果搞丟了那個 address 的錢就等於丟到水裡了!

上圖還有個小細節會發現,比特幣不一定要是整數來做交易的,其實比特幣最小的單位是 Satoshi,他是 1/10,000,000 bitcoin (bitcoin 也可以當價值的單位,1 bitcoin 就是 1 個比特幣的意思),而我們交易裡面都是用 Satoshi 來當單位。

最後,我們完成交易的創建之後,當然也要簽過名,就是時候把這個交易發佈到網路上了,比特幣是個 P2P (peer-to-peer) 的系統,因為交易裡面已經提供了所有驗證需要的資訊,所以我們先送給哪個節點是無所謂的,當一個節點收到一個他沒看過的合法交易,他就會把他再度傳出去給其他與他連結的節點,不用幾秒的時間,這筆交易就會散佈到絕大多數的比特幣節點了,等待各位礦工把它收納進新的區塊。

以比特幣或其他類似的加密貨幣來說,有個常見的誤解就是要等 10 分鐘等到交易上區塊鏈了,或是要等到 6 個確認,也就是一小時後才說已經安全了,但其實在一般情況下,只要交易是合法的,且金額量不大的話零確認 (zero confirmed) 就是可接受的了,因為它遲早都會被收納進區塊的。

另外,如果想知道交易的 hash 解碼之後長什麼樣子,也可以看我之前的心得,不過我那篇不是用比特幣的交易,而是 Gcoin 的交易,但只要把欄位 typecolor 忽略不看應該就一樣了。

Bitcoin Mining

當交易散佈到網路上後,需要透過挖礦的機制才能變成共享帳本的一部分,也就是被收到那區塊裡且進入到區塊鏈,而挖礦在比特幣的世界裡面有兩層意義:

  1. 像中央銀行一樣發行新的比特幣,每產生新的一個區塊,新的比特幣也會一起被產生出來當作獎賞 (mining reward) 給礦工。
  2. 透過大量的運算量來證明 (PoW) 這個區塊,以及這區塊內的所含交易是可被信任的。

當一個節點收集到新的交易時,他們都會各自維護一個 pool,裡面裝著尚未驗證過的交易們,當礦工發現新的區塊已經出現了,代表他們已經輸了上一回合,就會趕快開始組建下一個新的區塊,從 pool 取出交易來放入新的區塊中,然後透過 PoW 也就是我們上一章一直提到的十分鐘數學競賽來創造新的區塊,而取交易的順序會依照每個交易的手續費多寡。

礦工挖礦基本上會收到兩種獎賞,一個是 mining reward,這個獎賞大約每四年會減半,這個獎賞其實只是早期吸引礦工的一個誘因而已,同時也控制了全世界比特幣的總數量 (最終大約 2100,0000 顆),另一個是這個區塊裡面的交易手續費們,隨著時間發展,比特幣的交易會越來越多,礦工可以收到的手續費漸漸也會超越 mining reward,成為參與挖礦的主要誘因。

而剛剛提到的數學競賽,特性上就好比一個數獨題目,當你要解數獨時往往需要花費很多的時間才能解出來,然而當我們給好一張完整的數獨,驗證其正確性所花的時間就相對很短,而隨著數獨尺寸的擴大,計算數獨也越來越困難,但是驗證仍然可以很快速的完成。而挖礦就是類似這種的概念,他重複計算著 SHA256 的演算法來求得某一個答案,得到答案的同時新的區塊也就產生了,這種方法就是 PoW,其詳細的過程會在第八章才提到。

而新的區塊要產生除了用到裡面的交易以外,還會用到前一個區塊,所以每增加一個新的區塊,對下面的區塊來說是多了一次確認,因為又再度經過一次數學競賽的考驗了。因此如左圖我們的交易已經被納入在編號 277316 的區塊裡面,而現在當前的區塊已經到達 277318 了,所以我們就可以說我們的交易有 2 次的確認 (confirmation) 了。一般來說,當一個區塊已經到達 6 次確認時,我們就可以說他是不可被竄改的了,因為要證明有錯且重新計算這六個區塊,會需要耗費超乎想像的計算量。

最後當這筆交易進到了區塊,也接上了區塊鏈之後,全比特幣網路的節點也都會知道新的區塊產生了,大家都可以查得到這個區塊,以及這個區塊裡面的所有交易,而礦工也會馬上開始新的一輪比賽,另外這筆交易的接收者,也可以用它來當作新的 UTXO 創建新的交易了,所以比特幣就會像這樣從一個交易流通到下一個交易。

Conclusion

這章主要是在講比特幣、或是區塊鏈的藍圖,簡單來說區塊鏈就是一堆區塊接在一起,而區塊裡面就是裝滿著很多的交易,所以交易才是最根本的,他記載著比特幣的流通,而交易詳細的細節以及他的五種型態,第五章會在做更深入的探討,另外挖礦牽涉到一些密碼學的概念,也會在第八章時有更詳細的介紹。

如果有還是不懂的或是講不清楚的地方歡迎來找我討論~如果有講錯的也請見諒並歡迎大力的更正我 Orz

雖然文章都只是一些我的閱讀心得,但如果你覺得我寫的文章有幫助到你踏入比特幣的世界,也歡迎透過比特幣贊助我 :D 1FwXwuNBA25fuJNBQ1L2iXnx23VHQBch3m

Reference

  1. Mastering Bitcoin

--

--