Bitcoin簡介
[ 前言 ]
2008年Satoshi Nakamoto(中本聰)在一篇論文《Bitcoin: A Peer-to-Peer Electronic Cash System》中提出了一套支付系統架構的概念,之後在2009被實作出來。關於中本聰到底誰至今仍然是個謎:被別人說是中本聰的,當事人都不承認;而自己說自己是的,公眾都不承認。目前公認決定性的證據是比特幣第一筆交易地址的擁有權,也就是說,誰能表演從那邊發錢出來到特定地址,基本就能被確認是中本聰本人。
區塊鏈(Blockchain)是一種技術,屬於實現分散式帳本技術(Distributed Ledger Technology, DLT)的一種,而對人們真正有價值的產物是「一個具有去中心化特性的分散式帳本(Distributed Ledger)」。當然,我們可以拿區塊鏈這項技術來去中心化任何型態的資料,如果你有追前面幾篇文章的話,應該會對其原理有大致的概念。
打個比方,就像機器學習是為了達成人工智能,但人工智能還有其他不同的實現方式,只是機器學習剛好是當今的主流。Blockchain是為了達成DLT,DLT還有其他不同的實現方式,只是Blockchain是當今的主流,而Bitcoin這條鏈是Blockchain的先驅。在習慣上,我們會用Bitcoin來指稱那條區塊鏈,而用bitcoin來指稱在區塊鏈上的代幣,也就是BTC。
[ 簡介 ]
在Bitcoin架構下,大約每十分鐘打包出礦一次,首先算出符合條件Nonce(某個亂數)的那一個礦工,能獲得50BTC的區塊補貼獎勵,這獎勵大約每四年減半。符合條件的意思是讓hash function的輸出前n位是零,可以透過調整n的大小,來保持大約平均每10分鐘出一個Block。忘記這概念的可以往前找《如何防止一個帳本被篡改》那篇文章。
大家說BTC總量有2100w顆是這樣來的:礦工每十分鐘可以挖出50顆BTC,這獎勵每四年減半,然後每年有365246個十分鐘,通通加起來,我們能得到總量就是:
這邊多說一句,上面算的這個數字,是在PoW機制之下給的區塊補貼。對礦工來說,他還能拿到區塊內的手續費(別人交易要交手續費的)。採礦池的意思是你的算力跟別人的混合在一起,拿到獎勵大家再依比例分。單位上,Satoshi是比特幣的最小單位;1 Satoshi =10 E-8 BTC;1 BTC = 100M Satoshi。
[ 帳本設計-UTXO ]
既然是一個公開的帳本,就會有很多難題需要被解決,人性本善這一套不適合行走江湖。分別來說:需要有一個好的帳本架構、再確保此帳本不會被篡改、要處理雙花問題、最後還要讓所有節點對此帳本有一個共識。有關不被篡改與共識問題,我們之前的文章有提到過,這邊讓我們專注來說帳本設計,以及這些元素是如何湊在一起,組成一個之後被稱爲「中本聰共識」的簡潔優雅架構的。
首先,在帳本架構的設計上,Bitcoin採用了UTXO (Unspend Transaction Output) 架構。先想像在Bitcoin上面運作的錢(BTC)都是一張張的支票,每張支票會備註未使用 (Unspend) 跟已使用。當我們去查看一個UTXO的帳戶地址時,並不會直接看到帳戶餘額,而是需要去追蹤每一張發送給這帳戶的支票,扣掉已使用的過後,才是一個帳戶現在有的餘額。
此外,支票還有一個不能部分兌現的特性:我想轉5 BTC給A,但我手上只有一張8 BTC的支票,實際轉帳的時候,是會開一張5 BTC的支票給A,再開一張3 BTC的給我自己。
衍伸下來,因為會紀錄誰擁有每一張支票的使用權,所以UTXO天生能處理雙花攻擊。首先是已被使用過的支票不能用,接著是如果有人想拿一張未使用的支票同時付給兩個人,節點只會認比較早發出交易請求的。再如果真的很不湊巧兩筆交易時間很近,剛好又被兩個不同的節點同時接受並出塊了,這樣最後一道防線就是,用最長鏈法則來決定哪一個節點說的算。
UTXO架構的優點是可以平行處理多筆交易,原因是認支票而不認帳戶,一個帳戶之下有五張支票,他就可以同時把五張支票都花掉,不需要在帳戶層面去確認餘額。另個有點是天生隱私性高,讓你查詢一個帳戶時,是無法直接看到有關這個帳戶地址的所有金流的。
相對的,UTXO的缺點是很不直覺。另外,要支援智能合約時也比較麻煩,因為智能合約很常需要直接跟一個帳戶互動,但UTXO天生就沒有這種「帳戶」的概念,所以比較新的鏈基本都不採用這架構了。當然,也有人搞出一個UTXO Pool的優化方案:先掃過從創世到現在的所有交易紀錄,把每一個地址上現在有的餘額記錄在一個資料庫中,讓使用者不用傻傻的把整條區塊鏈從頭看過一次。
[中本聰共識]
中本聰共識是一套包含多個元素的解決方案,其中包含了:PoW、最長鏈規則、遞減的區塊補貼獎勵。
首先,PoW大家都很熟悉了:帳本要有一個全局共識,也就需要指派出一個人,讓他暫時有獨裁的權力,讓其他節點以他為準,而PoW就是一個用算數學題隨機產出獨裁者的機制。
緊接著,為了避免獨裁者作惡,會搭配最長鏈原則使用:只要惡意的算力不超過全網路的50%,多期博弈的結果,最終會收斂於擁有最大共識的那條鏈。當然,如果有人可以篡改了之前的帳本,並且算力強大到可以獨自的,不斷把那條鏈變成最長鏈,那就會產生所謂的「51%算力攻擊」。
最後,中本聰設計了一個激勵制度,讓礦工提供算力,保護網路安全的同時,能獲得BTC作為獎賞,這是個看似簡單,但深刻無比的制度。在設計之初,2008金融危機的時代背景下,中本聰認為任何能夠無中生有的貨幣,從歷史上來看,都不會是一個好的「貨幣」型態,由國家信用所背書的法定貨幣,只是會貨幣歷史中的一個過渡。
既然Bitcoin的目標是要成為世界貨幣的終極型態,那首先是需要限制總發行量來規避通膨的風險,再來是讓貨幣的取得是有成本的,不能無中生有,而比特幣的成本就是算力。就像黃金與鑽石在地球的存量是很多的,但由於有開採成本,它們就能產生價值。另外,由於獎勵遞減的機制,讓最初玩家有更高的報酬,更有機會突破最開始雞生蛋蛋生雞的困局,加上PoW的隨機性,讓後續代幣的產生,與當下代幣的持有型態能夠是獨立的。
以上,這一套精巧又簡單的系統,是中本聰對人類最大的貢獻。
[ 節點&交易]
最後讓我們用列點的形式,講講一些關於比特幣,極為重要,但叉出去前因後果的講又過於花時間的知識點:
- 一個比特幣節點大概涵蓋三部分:UTXO Pool、Tx Pool、Blockchain。第一個是每個帳戶的餘額,第二個是別人發送進來的還沒被打包出塊的交易請求,第三個是已經被打包出塊的那一條鏈。
- 比特幣節點又可以簡單的分為兩種:全檔案節點是完整儲存所有資料的節點,現在大概250GB左右。輕節點是下載了區塊頭的節點,不能運行驗證,但能檢查一些資訊。
- 所以總合來看,一筆比特幣的交易過程會如下:我先用我的私鑰,把我的想做的交易上一個Signature,把這含有Signature的交易請求傳給節點們,節點中的UTXO Pool先確定我有足夠的錢,確定後會把交易放到Tx Pool中,Tx Pool會依照手續費高低排序,再由礦工打包出塊到Blockchain上。最後,成功出塊的礦工會把自己出的這個新Block廣播給其他節點。
- Omni Layer是一個能在BTC交易上做備註的地方,主要是看到Ethereum的那一套智能合約玩的風生水起想要模仿。但因為性能考量,Bitcoin限制了這個備註的大小,基本把玩智能合約的可能性打死。
- 有關BTC,存在一個有趣議題是:每一顆BTC到底有沒有同質性?因為歷史上,有過「污點的BTC」被拒收的案例,有污點就是那些被大家查到金流是從一些違法性質活動流出的BTC。
- 與「污點BTC」相關,有服務商專門提供代幣混合的服務,也就是幫你把傳過去的錢洗過一圈,再回傳給你與之前沒有關連的錢。當然,這需要支付一點手續費。
比特幣與世界貨幣還有許多有趣的主題可以聊,但這一篇先在這邊打住,之後有機會再談。Be Happy & Stay Tuned,我們下次見!