聊聊區塊鏈(Blockchain)

某天買菜的時候,看到包裝上面寫著XX家的肉品用區塊鏈做產銷履歷
心裡大驚
沒想到區塊鏈竟然已經潮到市場裡來了
連賣豬肉的阿榮都在用了
我彷彿一個山頂洞人一樣
連區塊鏈要鏈在豬肉哪裡都不知道
這樣叫我要如何在市場走跳
回家就決定來好好了解一下區塊鏈
看看怎麼樣可以買到更便宜的豬肉(誤)
(扶眼鏡)
下面是筆記

區塊鏈(blockchain) 是比特幣(bitcoin)的技術架構
近年來區塊鏈被廣泛的認為是比比特幣更有價值的發明
區塊鏈最重要的創新,是在零信任(Zero Trust)的環境建立信任
要解釋它為什麼這麼被看好,可以先看看我們現在的金融體系
在金融風暴的時候,美國政府舉債紓困了一些大到不能倒的銀行
為什麼銀行大到不能倒?
因為我們現在的經濟體系是Centralized network
大銀行或是各國央行就是那些network裡面的single point of failure
如果它倒了,你跟我就像是那些末端節點,我們就會被影響
區塊鏈則是一個distributed network
在這個網路裡,沒有single point of failure
network_types.png
要把貨幣做在distributed network上
有些關鍵問題需要解決:
  • 交易不能被竄改(Uncorrupted)
  • 一個比特幣不能被重覆花用 (No double spending)
  • 確認交易雙方的身分,確認交易被真正的付款人本人授權
  • 整個distributed network上的各個節點的帳本(ledger) 要維持一致,也就是拜占庭將軍問題
而確認交易雙方的身分
是我們目前經濟之所以需要一個central authority(也就是央行與銀行) 最主要的原因
A要匯款給B,A把錢拿給銀行,銀行確認A是A本人,銀行再確認B是B本人,然後把錢拿到B

拜占庭將軍問題

關於拜占庭將軍問題,畢業多年我早已還給老師,只好重新看一遍順便筆記
1982年,Leslie Lamport提出拜占庭將軍問題來描述distributed network的共識問題
在古老的拜占庭帝國幅員遼闊
派了很多個將軍戍守在廣大的國土邊界
各個將軍帶領的軍隊之間距離遙遠 (就是 Distributed Network)
當他們遭遇了某個強大敵人的時候將軍們要決定是否要去攻打
如果大家一起攻打
勝算就會很高
如果大家不一致就會失敗
但是各軍隊之間距離遙遠
傳令兵從一個軍隊到另一個軍隊之間需要數天的時間(async communication)
傳令兵也可能因為被攻擊死傷而無法抵達另一個軍隊傳遞消息 (Unreliable communication channel)
軍隊當中也可能有叛徒 (attacker)
傳遞錯誤的訊息(forge-able message) 造成所有軍隊錯誤行動
byzantine_generals_problem.png
拜占庭將軍問題就是distributed async network的縮影
早期對這個問題的解法
多半是假設訊息傳遞是同步的
或是假設傳令兵可以有效傳遞訊息
或是假設訊息可靠無法偽造
而區塊鏈滿足拜占庭將軍問題的那些前提
並讓所有軍隊得到共識

bitcoin的運作

以下從bitcoin的交易運作來解釋區塊鏈
bitcoin network是一個P2P的網路
網路的每個node上都有一份完整帳本的copy
bitcoin_ledgers_across_network.png
當交易(transaction)發生的時候
例如Alice從bitcoin wallet中轉出5BTC給Bob
這個交易會被廣播到整個network
各個node會檢驗Alice是不是授權了這個交易
各個node也會檢驗這轉出的5BTC是不是真的歸Alice所有,並且還沒有被花掉
檢驗Alice是不是授權這個交易,用的是Public Key cryptography
每個bitcoin wallet 是由一對public key跟private key組成
public key可以想像是銀行帳戶
對整個bitcoin network公開
private key可以想像是銀行帳戶密碼
只有擁有者自己知道
每筆transaction會有一個以ECDSA演算法產生digital signature
由Alice的private key 加密transaction message後產生了一個digest就是digital signature
把digest跟transaction message一起傳送到bitcoin network上
node用Alice的public key 解密digital signature來驗證這個交易的確是由Alice授權的
因為每筆transaction的message都不一樣
所以每個transaction的digital signature也不一樣
transaction_chain_2.png
為了檢查Alice轉給Bob的BTC沒有被重複用掉
node會檢查這個bitcoin的前一個transaction,確保它們屬於Alice且沒被用掉
因此,transaction形成了一個transaction chain
Alice的bitcoin帳戶餘額則是這個transaction chain裡面所有在Alice名下且沒被花掉的bitcoin
查詢的過程可能很耗時
所以有一個unspent coin index來加速查詢
bitcoin用timestmap server來確保交易的先後順序
一個或多個transaction會被打包在一個block裡面
每個block記錄前一個block的ID
因此形成一個blockchain
這個chain是單鏈的
不允許分岔
在同一個block裡面的transaction被視為同時間發生
blockchain_mempool.png
剛剛說每個bitcoin transaction發起的時候
都會被廣播到整個bitcoin network上
成為unconfirmed transaction
這些unconfirmed transaction會被放到mempool
裡面有所有待確認的交易
每個node上也都有一份mempool
各個node各自挑選一些unconfirmed transaction組合一個新的block
並且開始驗證這個block裡面所有的交易
成功驗證完這個新的block時就可以把它廣播到bitcoin network裡面
接上blockchain的尾巴
當這個新的block被整個網路裡面超過一半以上的node確認OK並且接受的時候
它就成為有效的block
因為各個node同時進行自己的block驗證
為了讓整個bitcoin network維持整個chain的一致性,達成共識
bitcoin採用Proof of Work (POW) 共識演算法
POW要求發起者要完成一定的工作量
才能認可這個request
POW常常被用在阻擋spam或是DDoS攻擊
在bitcoin 的POW 是每個block都有一個random number
這個random number跟整個block message的hash結果必須在某個特定值以下
block.png
因為hash是不可逆的
所有的node要解開這個math puzzle就必須猜random number的值
最快猜到符合的random number的值的就是第一個成功解開謎題的人
他就會可以把自己完成的block接上blockchain的尾端
為了保護完成的transaction不被更改
node也會在新生成的block上蓋上timestamp
其它的node收到這個新的block之後會確認這個新的block是否正確
如果正確,他們手上正在驗證的其他block都會失效
下一輪的新的block驗證過程就會重新開始
所有node會繼續在那個新的block下組出一個更新的block
並且開始驗證那個更新的block
整條blockchain則維持最長的chain才是合法的block
換句話說,bitcoin利用POW 來阻擋被attacker攻擊的可能
如果一個attacker想要從某個block開始
偽造出一條更長的鏈把大家都誤導到這個新的chain上面
他必須算得比整個網路上的任何節點都還要快非常多才可能
所以實際上很難發生
bitcoin也使用POW來達成所有node的共識
也因為bitcoin的POW有意控制math puzzle的難度
控制每個block被mine出來的速度
維持在10分鐘mine出一個block
所以一來blockchain產生分岔的可能性被大大降低
二來,即使真的發生了不同的block同時間被掛到chain的尾巴
各個node可以根據他收到的第一個block做新的block
一旦下個POW完成
又會有一個最長的chain產生
之前的其它分岔的block都會失效
所有node都會切到這個新的chain上
很快的,所有node又歸於共識
而那些失效的block,裡面的transaction會回到mempool裡面,等待再次被驗證
產生新的block的過程叫做挖礦 (mining)
礦工(miner)就是那些node
礦工提供自己的computing power 驗證transaction的正確性,當成功完成一個新的block的時候,礦工會得到transaction fee(交易手續費)
並且得到系統新產生的25 bitcoins當做獎勵
這個獎勵會隨著每25000新產生的blocks而減半
最後系統會產生bitcoin預計的發行上限2100萬個 bitcoins
這個獎勵就歸零
礦工提供的運算能力,也保護了bitcoin network免於被攻擊

總結一下

從bitcoin的機制,我們可以知道blockchain是decentralized P2P network並且透過POW維持整個網路的共識以及transaction無法被竄改
但是bitcoin並不代表區塊鏈
區塊鏈可以依實作上的不同,分成:
  •  private 跟 public (如 bitcoin)
  • 匿名制 (如 bitcoin) 跟實名制(如台大的GCoin)
bitcoin的匿名制是以bitcoin wallet ID的複雜組合做到了公開的匿名性
所有人都可以看到哪個bitcoin流到哪個wallet
但是wallet id的字母組合非常多
沒有人知道哪個wallet是誰的
除了bitcoin之外,其他以blockchain實做出來的加密貨幣也有很多:
例如Litecoin, GCoin, Ethereum,Peercoin 等等

區塊鏈的應用

最近看到很多公司風風火火的拿區塊鏈做了很多應用
那斯達克用區塊鏈做了Linq,Linq用以處理私募股權的交易
Onename這家公司用區塊鏈做身分驗證
微軟,英特爾,富邦,摩根大通等公司也組成了一個EEA聯盟要拿區塊鏈賺錢做點事
也有人拿它做數位投票
連賣肉的阿榮都用區塊鏈做生產履歷了
換句話說
許多以前需要一個central authority的事,都可以透過區塊鏈的機制變成到distributed network上

其他參考

  • 比特幣統計資料 https://blockchain.info/
  • 比特幣論文  https://bitcoin.org/bitcoin.pdf
  • 比特幣Git project  https://github.com/bitcoin-core/
  • 區塊鏈的open source solution Hyperledger https://www.hyperledger.org/

寫完筆記隨便聊聊

有人說乙太幣(ethereum)是bitcoin 2.0
智慧合約(smart contract) 是未來發展的重點
那些見仁見智大家慢慢看囉

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s