閱讀對象 :《精通比特幣》主要面向程序員。本書將會告訴你加密貨幣的原理、使用方法,以及如何開發(fā)與之相關的軟件。
經(jīng)典必讀,隨著時間和參與深度的不同,每一次的閱讀都是認知的升級!
- 英文版本 https://github.com/bitcoinbook/bitcoinbook
- 中文版本 http://book.8btc.com/books/6/masterbitcoin2cn/_book/
一、大自然中的社群組織結(jié)構(gòu)
- “切葉蟻”,在蟻群中不存在中央集權體制或領導。
- 群落中數(shù)百萬成員所展現(xiàn)的高度智能且復雜的行為是社會網(wǎng)絡中的個體互動這一性質(zhì)的凸顯。
- 大自然向我們證明,去中心化體制具有彈性并能創(chuàng)造出意想不到的復雜性和難以想象的精妙,而不需要中央集權體制、 等級制度或復雜的組織結(jié)構(gòu)。
- 去中心化 ,可理解為去中介化。
比特幣網(wǎng)絡正是這樣一個高度復雜的去中心化的可信網(wǎng)絡,能夠支撐無數(shù)財務流程。
像蟻群一樣,比特幣的彈性網(wǎng)絡是一個由眾多遵循簡單準則的簡單節(jié)點所組成的彈性網(wǎng)絡,這些簡單的 節(jié)點準則聚合在一起可以完成驚人的事情,而不需要任何中樞協(xié)調(diào)。
二、基礎概念
比特幣
“比特幣”既可以指這種虛擬貨幣單位,也指比特幣網(wǎng)絡或者網(wǎng)絡節(jié)點使用的比特幣軟件。
區(qū)塊
一個區(qū)塊就是若干交易數(shù)據(jù)的集合,它會被標記上時間戳和之前一個區(qū)塊的獨特標記。區(qū)塊頭經(jīng)過哈希運算后會生成一份工作量證明,從而驗證區(qū)塊中的交易。有效的區(qū)塊經(jīng)過全網(wǎng)絡的共識后會被追加到主區(qū)塊鏈中。
確認
當一項交易被區(qū)塊收錄時,我們可以說它有一次確認。礦工們在此區(qū)塊之后每再產(chǎn)生一個區(qū)塊,此項交易的確認數(shù)就再 加一。當確認數(shù)達到六及以上時,通常認為這筆交易比較安全并難以逆轉(zhuǎn)。
難度
整個網(wǎng)絡會通過調(diào)整“難度”這個變量來控制生成工作量證明所需要的計算力。
礦工
礦工指通過不斷重復哈希運算來產(chǎn)生工作量證明的各網(wǎng)絡節(jié)點。
網(wǎng)絡
比特幣網(wǎng)絡是一個由若干節(jié)點組成的用以廣播交易信息和數(shù)據(jù)區(qū)塊的P2P網(wǎng)絡。
工作量證明
工作量證明指通過有效計算得到的一小塊數(shù)據(jù)。具體到比特幣,礦工必須要在滿足全網(wǎng)目標難度的情況下求解SHA256 算法。
獎勵
每一個新區(qū)塊中都有一定量新創(chuàng)造的比特幣用來獎勵算出工作量證明的礦工?,F(xiàn)階段每一區(qū)塊有25比特幣的獎勵。
特點
它具有快捷、安全、無國界的特性。
擁有密鑰是使用比特幣的唯一條件,這讓控制權完全掌握在每個人手中.
比特幣是一個分布式的點對點網(wǎng)絡系統(tǒng)。因此沒有“中央”服務器,也沒有中央發(fā)行機構(gòu)。
本質(zhì)上,挖礦把央行的貨幣發(fā)行和結(jié)算功能進行分布式,用全球化的算力競爭來取代對中央發(fā)行機構(gòu)的需求。
比特幣協(xié)議還規(guī)定,每四年新幣的開采量減半,從長期來看,比特幣是一種通貨緊縮貨幣。
作為一個開發(fā)者,我看比特幣之于貨幣就像看到當年的互聯(lián)網(wǎng),一個通過分布式計算來傳播價值和保障數(shù)字資產(chǎn)所有權的網(wǎng)絡
加密數(shù)字簽名能夠使一個用戶簽署一項能夠提供其資產(chǎn)所有權證明的 數(shù)字資產(chǎn)或數(shù)字交易
比特幣正是這樣的系統(tǒng),設計完全去中心化,不被任何中央政權或中央點控 制,這樣的貨幣系統(tǒng)是不會遭受攻擊,也不會變得腐敗。
比特幣錢包
比特幣錢包只包含私鑰而不是比特幣。每一個用戶有一個包含多個私鑰的錢包。錢包中包含成對的私鑰和公鑰。
用戶用這些私鑰來簽名交易,從而證明它們擁有交易的輸出(也就是其中的比特幣)。比特幣是以交易輸出的形式來儲存在區(qū)塊鏈中(通常記為vout或txout)。
數(shù)字密鑰
比特幣的所有權是通過數(shù)字密鑰、比特幣地址和數(shù)字簽名來確立的
只有有效的數(shù)字密鑰才能產(chǎn)生有效的數(shù)字簽名。
私鑰的格式:私鑰可以以許多不同的格式表示,所有這些都對應于相同的256位的數(shù)字。
素數(shù)冪和橢圓曲線乘法,這些數(shù)學函數(shù)都是不可逆的,就是說很容易向一個方向計算,但不可以向相反方向倒推。
比特幣正是使用橢圓曲線乘法作為其公鑰加密的基礎算法。
私鑰->橢圓曲線相乘->公鑰->哈希函數(shù)(單向)->比特幣地址。
E52CED330AC530EDCC32C8FFC6A526AEDD
比特幣私鑰空間的大小是2256,這是一個非常大的數(shù)字。用十進制表示的話,大約是1077,而可見宇宙被估計只含有1080個原子。橢圓曲線加密法是一種基于離散對數(shù)問題的非對稱(或公鑰)加密法,可以用對橢圓曲線上的點進行加法或乘法運算來表達。
比特幣地址
- 比特幣地址是一個由數(shù)字和字母組成的字符串,可以與任何想給你比特幣的人分享。由公鑰(一個同樣由數(shù)字和字母組成的字符串)生成的比特幣地址以數(shù)字“1”開頭。
- 比特幣地址可由公鑰經(jīng)過單向的加密哈希算法得到。哈希算法是一種單向函數(shù),接收任意長度的輸入產(chǎn)生指紋摘要。加密哈希函數(shù)在比特幣中被廣泛使用:比特幣地址、腳本地址以及在挖礦中的工作量證明算法。
- Base58Check格式的比特幣地址
助記碼詞匯
- 助記碼詞匯是英文單詞序列代表(編碼)用作種子對應所確定性錢包的隨機數(shù)。單詞的序列足以重新創(chuàng)建種子,并且從種子那里重新創(chuàng)造錢包以及所有私鑰。
- 確定性,或者“種子”錢包包含通過使用單項離散方程而可從公共的種子生成的私鑰。
三、比特幣代表數(shù)十年的密碼學和分布式系統(tǒng)的巔峰之作
匯集了四個關鍵的創(chuàng)新 點,比特幣由這些構(gòu)成:
- 一個去中心化的點對點網(wǎng)絡(比特幣協(xié)議)
- 一個公共的交易賬簿(區(qū)塊鏈)
- 一個去中心化的數(shù)學的和確定性的貨幣發(fā)行(分布式挖礦)
- 一個去中心化的交易驗證系統(tǒng)(交易腳本)
比特幣系統(tǒng)依賴于完全透明的數(shù)學原理它已經(jīng)蔓延到了分布式計算、經(jīng)濟學、計量經(jīng)濟學領域。
- 中本聰?shù)拇隧棸l(fā)明,對“拜占庭將軍”問題也是一個可行的解決方案,這是一個在分布式計算中未曾解決的問題
簡單來說,這個問題包括了試圖通過在一個不可靠、具有潛在威脅的網(wǎng)絡中,通過信息交流來達成一個行動協(xié)議 共識。中本聰?shù)慕鉀Q方案是使用工作量證明的概念在沒有中央信任機構(gòu)下達成共識,這代表了分布式計算的科學 突破,并已經(jīng)超越了貨幣廣泛的適用性。它可以用來達成去中心化的網(wǎng)絡共識來公正選舉、彩票、資產(chǎn)登記,以 及數(shù)字化公證等等。
四、比特幣挖礦
- 挖礦在比特幣系統(tǒng)中起著兩個作用:
- 挖礦在構(gòu)建區(qū)塊時會創(chuàng)造新的比特幣,和一個中央銀行印發(fā)新的紙幣很類似。每個區(qū)塊創(chuàng)造的比特幣數(shù)量是固定的,隨時間會漸漸減少。
- 挖礦創(chuàng)建信任。挖礦確保只有在包含交易的區(qū)塊上貢獻了足夠的計算量后,這些交易才被確認。區(qū)塊越多,花費的計算量越大,意味著更多的信任。
- 而比特幣中的 "謎題" 是基于哈希加密算法的,其展現(xiàn)了相似的特性:非對稱地,它解起來困難而驗證很容易,并且它的困難度可以調(diào)整。
區(qū)塊中的挖礦交易記錄
平均每10分鐘,礦工會將自上一個區(qū)塊以來發(fā)生的所有交易生成一個新的區(qū)塊。新交易不斷地從用戶錢包和應用流入比特幣網(wǎng)絡。
交易被加進新區(qū)塊時,以交易費用高的優(yōu)先以及其它的一些規(guī)則進行排序。
隨著時間變長,這個區(qū)塊鏈的高度也隨之增長,每個區(qū)塊和整個鏈的計算復雜度也隨之增加。
五、 比特幣交易簡介
比特幣客戶端的三種主要形式
- 完整客戶端
- 輕量級客戶端
- 在線客戶端
比特幣客戶端的選擇,取決于用戶想要管理資金的數(shù)目。
客戶端錢包
- 錢包是多個地址和解鎖資金密鑰的簡單集合
- 每筆交易你都可以使用不同的地址,這有利于提高 隱私的安全性。用戶可創(chuàng)建地址的數(shù)量幾乎不受限制。
- 出售某種產(chǎn)品或服務來換取比特幣。如果你是個程序員,可以出售你的編程技能
- 新創(chuàng)建的比特幣錢包地址,需要發(fā)生一筆交易,才能成為在眾多的比特幣地址之一。一旦該地址接受了一筆交易,就會變成全網(wǎng)所知的地址之一,然后就能查詢到可用余額了。
比特幣交易的理解
- 簡單來說,每一筆交易包含一個或多個“輸入”,輸入是針對一個比特幣賬號的負債。
- 這筆交易的另一面,有一個或多個“輸出”,被當成信用點數(shù)記入到比特幣賬戶中。這些輸入和輸出的總額(負債和信 用)不需要相等
- 交易是將錢從交易輸入移至輸出。輸入是指錢幣的來源,通常是之前一筆交易的輸出。交易的輸出則是通過關聯(lián) 一個密鑰的方式將錢賦予一個新的所有者。目的密鑰被稱為是安全鎖(Encumbrance)。這樣就給資金強加了一 個要求:有簽名才能在以后的交易中贖回資金。一筆交易的輸出可以被當做另一筆新交易的輸入,這樣隨著錢從 一個地址被移動到另一個地址的同時形成了一條所有權鏈。
常見的交易形式
- 最常見的交易形式是從一個地址到另一個地址的簡單支付,這種交易也常常包含給支付者的“找零”。一般交易有一個輸 入和兩個輸出。
- 集合多個輸入到一個輸出的模式。像這樣的交易有時由錢包應用產(chǎn)生來清理許多在支付過程收到的小數(shù)額的找零。
- 在比特幣賬簿中常見的交易形式是將一個輸入分配給多個輸出,這類交易有時被商業(yè)實體用作分配資金,例如給多個雇員發(fā)工資的情形。
交易的構(gòu)建
- 交易的建立和簽名可以離線操作,不用連接比特幣網(wǎng)絡。
- 交易的廣播才需要處于聯(lián)網(wǎng)狀態(tài),只有在執(zhí)行交易時才需要將交易發(fā)送到網(wǎng)絡。
獲取正確的輸入
- 大多數(shù)錢包應用維護著一個含有用錢包自己密鑰鎖定
的“未消費交易輸出”小型數(shù)據(jù)庫。 - 完整客戶端含有整個區(qū)塊鏈中所有交易的所有未消費輸出副本。
- 完整客戶端占太大的硬盤空間,所以大多數(shù)錢包使用輕量級的客戶端,只保存用戶自己的未消費輸出。
將交易放到總賬簿中
- 交易必須要被傳送到比特幣網(wǎng)絡中以成為分布式賬簿(區(qū)塊鏈)的一部分
交易的傳送
比特幣網(wǎng)絡是由參與的比特幣客戶端聯(lián)接幾個其他比特幣客戶端組成的P2P網(wǎng)絡。比特幣網(wǎng)絡的目的是將交易和區(qū)塊傳播給所有參與者
任何比特幣網(wǎng)絡節(jié)點(其它客戶端)收到一個之前沒見過的有效交易時會立刻將它轉(zhuǎn)發(fā)給聯(lián)接到自身的其它節(jié)點。
一個對比特幣交易的常見誤解是它們必須要等10分鐘后被確認加進一個新區(qū)塊,或等60分鐘以得到六次確認后才是有效的。雖然這些確認可以確保交易已被整個網(wǎng)絡接受,但對于像一杯咖啡這樣的小額商品來說就沒有必要等待那么長時間了。一個商家可以免確認來接受比特幣小額支付。
交易ID在交易確認之前并不權威。區(qū)塊鏈中找不到交易哈希值并不意味著此筆交易沒有進行。這被稱作“交易延展性”,因為交易哈希值在區(qū)塊確認之前是可以更改的。在確認之后txid是不變且權威的。
createrawtransaction 命令產(chǎn)生了一個原始十六進制字符串,其中編碼了這筆交易的諸多細節(jié)。decoderawtransaction 命令來解碼這個字符串。
六、比特幣交易詳解
比特幣交易是比特幣系統(tǒng)中最重要的部分。根據(jù)比特幣系統(tǒng)的設計原理,系統(tǒng)中任何其他的部分都是為了確保比特幣交易可以被生成、能在比特幣網(wǎng)絡中得以傳播和通過驗證,并最終添加入全球比特幣交易總賬簿(比特幣區(qū)塊鏈)。
比特幣交易的本質(zhì)是數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)中含有比特幣交易參與者價值轉(zhuǎn)移的相關信息。比特幣區(qū)塊鏈是全球復式記賬總賬簿,每個比特幣交易都是在比特幣區(qū)塊鏈上的一個公開記錄。在這一章,我們將會剖析比特幣交易的多種形式、所包含的信息、如何被創(chuàng)建、如何被驗證以及如何成為所有比特幣交易永久記錄的一部分。
三大過程:
- 交易創(chuàng)建
- 交易簽名
- 交易廣播提交
創(chuàng)建比特幣交易
- 比特幣交易可以被任何人在線上或線下創(chuàng)建,即便創(chuàng)建這筆交易的人不是這個賬戶的授權簽字人。
- 比如,一個負責應付賬款的柜員在處理應付票據(jù)時可能會需要CEO簽名。相似地,這個負責應付賬款的柜員可以創(chuàng)建比特幣交易,然后讓CEO對它進行數(shù)字簽名,從而使之有效。
- 是比特幣交易指定以往的一筆交易作為其資金來源,而不是一個特定賬戶。
廣播交易至比特幣網(wǎng)絡
比特幣網(wǎng)絡是一個點對點網(wǎng)絡,這意味著每一個比特幣節(jié)點都連接到一些其他的比特幣節(jié)點(這些其他的節(jié)點是在啟動點對點協(xié)議時被發(fā)現(xiàn)的)。整個比特幣網(wǎng)絡形成了一個松散地連接、且沒有固定拓撲或任何結(jié)構(gòu)的“蛛網(wǎng)”——這使得所有節(jié)點的地位都是同等的。
交易是經(jīng)過簽名且不含任何機密信息、私鑰或密碼
因為比特幣將金錢變成了一種數(shù)據(jù)結(jié)構(gòu),所以在本質(zhì)上是不可能阻止任何人創(chuàng)建并執(zhí)行比特幣交易的。
交易的輸出和輸入
-
比特幣交易的基本單位是未經(jīng)使用的一個交易輸出,簡稱UTXO
- UTXO是不能再分割、被所有者鎖住或記錄于區(qū)塊鏈中的并被整個網(wǎng)絡識別成貨幣單位的一定量的比特幣貨幣。
- 一個用戶的比特幣會被當作UTXO分散到數(shù)百個交易和數(shù)百個區(qū)塊中。實際上,并不存在儲存比特幣地址或賬戶余額的地點,只有被所有者鎖住的、分散的UTXO。
- “一個用戶的比特幣余額”,這個概念是一個通過比特幣錢包應用創(chuàng)建的派生之物。比特幣錢包通過掃描區(qū)塊鏈并聚合所有屬于該用戶的UTXO來計算該用戶的余額。
- 在比特幣的世界里既沒有賬戶,也沒有余額,只有分散到區(qū)塊鏈里的UTXO。
- Coinbase交易,每個區(qū)塊中的首個交易。
交易費
交易費可當作是為了包含(挖礦)一筆交易到下一個區(qū)塊中的一種鼓勵,也可當作是對于欺詐交易和任何種類的系統(tǒng)濫用,在每一筆交易上通過征收一筆小成本的稅而造成的一種妨礙。交易費被挖出這個區(qū)塊的礦工得到,并且記錄在這個交易的區(qū)塊鏈中。
交易費被作為輸入減輸出的余量,交易費 = 求和(所有輸入) - 求和(所有輸出)。
把交易費加到交易中
交易的數(shù)據(jù)結(jié)構(gòu)沒有交易費的字段。相反地,交易費通過所有輸入的總和,以及所有輸出的總和之間的差來表示。從所有輸入中扣掉所有輸出之后的多余的量會被礦工收集走。
舉例來說,如果你消耗了一個20比特幣的UTXO來完成1比特幣的付款,你必須包含一筆19比特幣的找零回到你的錢包。否則,那剩下的19比特幣會被當作交易費,并且會被挖出你的交易到一個區(qū)塊中的礦工收走。盡管你會受到高優(yōu)先級的處理,并且讓一個礦工喜出望外,但這很可能不是你想要的。
Eugenia的錢包應用會通過測量交易的大小,乘以每千字節(jié)需要的交易費,來計算適當?shù)慕灰踪M。 交易費高不是因爲交易金額大,而是因爲交易的字節(jié)數(shù)多。
交易鏈條和孤立交易
- 當一條交易鏈被整個網(wǎng)絡傳送時,他們并不能總是按照相同的順序到達目的地。
- 子交易在父交易之前到達
- 沒有父交易的交易池被稱作孤立交易池
- 一旦接收到了父交易,所有與這個父交易創(chuàng)建的UTXO有關的孤塊會從池中釋放出來,遞歸地重新驗證,然后整條交易鏈就會被交易池包括進去,并等待著被區(qū)塊所挖走
七、比特幣網(wǎng)絡
節(jié)點類型及分工
- 每個比特幣節(jié)點都是路由、區(qū)塊鏈數(shù)據(jù)庫、挖礦、錢包服務的功能集合。
- 一個全節(jié)點(full node)包含四個功能:錢包、礦工、完成區(qū)塊鏈、網(wǎng)絡路由節(jié)點。
- 1、SPV 簡易支付驗證節(jié)點(輕量級節(jié)點),沒有完整區(qū)塊鏈的拷貝。越來越多的用戶錢包是spv節(jié)點,尤其是運行于在智能手機等資源有限設備上的比特幣錢包應用上。
- 2、挖礦節(jié)點:運行在特殊硬件設備上的工作量證明(PROOF OF WORK) 算法,以相互競爭的方式創(chuàng)建新區(qū)塊。
- 3、核心客戶端 : 在比特幣P2P網(wǎng)絡中,包含錢包、礦工、完整區(qū)塊鏈數(shù)據(jù)庫、網(wǎng)絡路由節(jié)點。
- 4、完整區(qū)塊鏈節(jié)點:在比特幣p2p網(wǎng)絡中,包含完整區(qū)塊鏈以及網(wǎng)絡路由節(jié)點。
- 5、獨立礦工
網(wǎng)絡發(fā)現(xiàn)
- 當新的網(wǎng)絡節(jié)點啟動后,為了能夠參與協(xié)同運作,它必須發(fā)現(xiàn)網(wǎng)絡中的其他比特幣節(jié)點。新的網(wǎng)絡節(jié)點必須發(fā)現(xiàn)至少一個網(wǎng)絡中存在的節(jié)點并建立連接。
- 節(jié)點通常采用TCP協(xié)議、使用8333端口
- “種子節(jié)點(seed nodes)”:新節(jié)點是如何發(fā)現(xiàn)網(wǎng)絡中的對等節(jié)點的呢?雖然比特幣網(wǎng)絡中沒有特殊節(jié)點,但是客戶端會維持一個列表,那里列出了那些長期穩(wěn)定運行的節(jié)點。
- 新節(jié)點并不一定需要與種子節(jié)點建立連接,
但連接到種子節(jié)點的好處是可以通過種子節(jié)點來快速發(fā)現(xiàn)網(wǎng)絡中的其他節(jié)點。
-新接入的節(jié)點可以向它的相鄰節(jié)點發(fā)送getaddr消息,要求它們返回其已知對等節(jié)點的IP地址列表,通過這種方式,節(jié)點可以找到需連接到
的對等節(jié)點,并向網(wǎng)絡發(fā)布它的消息以便其他節(jié)點查找。
交換“庫存清單”
- 同步區(qū)塊鏈的過程從發(fā)送version消息開始,這是因為該消息中含有的BestHeight字段標示了一個節(jié)點當前的區(qū)塊鏈高度(區(qū)塊數(shù)量
- 從發(fā)送 getblocks消息開始,收到一個inv響應,接著開始下載缺失的區(qū)塊庫存清單和區(qū)塊廣播協(xié)議。
簡易支付驗證 (SPV)節(jié)點
SPV節(jié)點只需下載區(qū)塊頭,而不用下載包含在每個區(qū)塊中的交易信息
簡易支付驗證是通過參考交易在區(qū)塊鏈中的深度,而不是高度,來驗證它們
一個擁有完整區(qū)塊鏈的節(jié)點會構(gòu)造一條驗證鏈,這條鏈是由沿著區(qū)塊鏈按時間倒序一直追溯到創(chuàng)世區(qū)塊的數(shù)千區(qū)塊及交易組成
一個SPV節(jié)點會驗證所有區(qū)塊的鏈(但不是所有的交易),并且把區(qū)塊鏈和有關交易鏈接起來