精通比特幣
作者:Andreas M Antonopoulos
Andreas M. Antonopoulos 是一位著名的技術(shù)專家和連續(xù)創(chuàng)業(yè)企業(yè)家,比特幣界最著名和倍受尊敬的?人物之一。著名的的公共演說家、教師和作家,他善于把復(fù)雜的問題變得簡單和易于理解。
封面故事
1、群落中的每一只螞蟻個(gè)體僅僅遵循一些社會互動和化學(xué)氣味交換的簡單規(guī)則就變現(xiàn)出了高度復(fù)雜行為,形成了地球上僅次于人類的最為龐大且復(fù)雜的動物社會。
2、蟻群里不存在中央集權(quán)體制或領(lǐng)導(dǎo)人,大自然向我們證明去中心化體制具有彈性并且能創(chuàng)造出意想不到的復(fù)雜性和難以想象的精妙。
3、比特幣就是這樣一個(gè)高度復(fù)雜的去中心化的可信網(wǎng)絡(luò),真正意義上的世界銀行。
術(shù)語解釋
BIP?
比特幣改進(jìn)協(xié)議(Bitcoin Improvement proposals 的縮寫),指比特幣社區(qū)成員所提交的一系列改進(jìn)比特幣的提議。
第一章 介紹
1.1 什么是比特幣?
比特幣是由一系列概念和技術(shù)作為基礎(chǔ)構(gòu)建的數(shù)字貨幣生態(tài)系統(tǒng)。狹義的“比特幣”代表系統(tǒng)中的貨幣單位,用于存儲和傳輸價(jià)值。是一個(gè)通過分布式計(jì)算來傳播價(jià)值和保障數(shù)字資產(chǎn)所有權(quán)的網(wǎng)絡(luò)。
比特幣可以做傳統(tǒng)貨幣能做的所有事,在一定意義上,比特幣才是互聯(lián)網(wǎng)貨幣的完美形態(tài),具有快捷、安全、無國界的特性。
比特幣隱含在收發(fā)幣的轉(zhuǎn)賬記錄中。用戶只要有證明其控制權(quán)的密鑰,用密鑰解鎖,就可以發(fā)送比特幣,擁有密鑰是使用比特幣的唯一條件,控制權(quán)完全掌握在每個(gè)人說中。(這可能是人類歷史上第一次通過數(shù)學(xué)的方式保護(hù)私有財(cái)產(chǎn)不可侵犯)
比特幣是一個(gè)分布式的點(diǎn)對點(diǎn)(peer to peer)網(wǎng)絡(luò)系統(tǒng)。沒有中央服務(wù)器,也沒有中央發(fā)行機(jī)構(gòu)。是通過“挖礦”產(chǎn)生的,挖礦就是驗(yàn)證比特幣交易的同時(shí)參與競爭來解決一個(gè)數(shù)學(xué)問題。任何一個(gè)節(jié)點(diǎn)都可以參與做礦工。平均每10分鐘就有人能驗(yàn)證過去10分鐘發(fā)生的交易,獲得新幣作為工作回報(bào)。本質(zhì)上,挖礦把央行的貨幣發(fā)行和結(jié)算功能進(jìn)行分布式,用全球化的算力來取代了中央發(fā)行機(jī)構(gòu)。
比特幣系統(tǒng)包含調(diào)節(jié)挖礦難度的協(xié)議,保證挖礦的難度是動態(tài)調(diào)整的,不管多少礦工參與挖礦,平均10分鐘只有一個(gè)成功。并且,每四年開采量減半,最終總量為2100萬。預(yù)計(jì)在2140年達(dá)到上限。
比特幣代表了數(shù)十年的密碼學(xué)和分布式系統(tǒng)的巔峰之作,這是一個(gè)獨(dú)特而強(qiáng)大的組合,匯集了四個(gè)關(guān)鍵的創(chuàng)新點(diǎn)。
比特幣由這些構(gòu)成:
? 一個(gè)去中心化的點(diǎn)對點(diǎn)網(wǎng)絡(luò)(比特幣協(xié)議)
? 一個(gè)公共的交易賬簿(區(qū)塊鏈)
? 一個(gè)去中心化的數(shù)學(xué)的和確定性的貨幣發(fā)行(分布式挖礦)
? 一個(gè)去中心化的交易驗(yàn)證系統(tǒng)(交易腳本)
1.2 比特幣的產(chǎn)生
2008年,中本聰發(fā)表一篇《比特幣:一個(gè)點(diǎn)對點(diǎn)的電子現(xiàn)金系統(tǒng)》論文,宣告比特幣產(chǎn)生。從此,人類進(jìn)入一個(gè)新的世界。
1.3 入門
三種比特幣客戶端
完整客戶端(全節(jié)點(diǎn))包含比特幣交易的整個(gè)歷史,類似于一個(gè)獨(dú)立的email服務(wù)器。
輕量級客戶端?
在線客戶端
?第二章 比特幣的原理
在本章中,我們將通過追蹤在網(wǎng)絡(luò)上傳輸?shù)囊还P交易,從整個(gè)比特幣系統(tǒng)的的視?檢視各個(gè)部分之間的交互。

2.1 比特幣交易
Alice 用比特幣支付買了一杯咖啡,咖啡店老板Bob收到比特幣。
每一筆交易包含一個(gè)或多個(gè)輸入,輸入是針對一個(gè)比特幣賬號的負(fù)債。同時(shí),有一個(gè)或多個(gè)輸出,被當(dāng)成信用點(diǎn)計(jì)入到比特幣賬戶中。
2.2 常見的交易形式:
一般交易:一個(gè)輸入和兩個(gè)輸出
從一個(gè)地址到另一個(gè)地址的簡單支付,一般是一個(gè)輸入和兩個(gè)輸出(包含找零)
集合型交易:多個(gè)輸入,一個(gè)輸出
一般由錢包應(yīng)用產(chǎn)生來清理許多在支付過程中的小數(shù)額的找零。
分散型交易:一個(gè)輸出,多個(gè)輸出
商業(yè)實(shí)體用作分配資金,例如給多個(gè)雇員發(fā)工資。
2.3 交易的構(gòu)建
錢包知道如何選取合適的輸入和輸出以建立交易。我們只需要指定目標(biāo)地址和金額,其他操作錢包會在后臺自動完成,甚至可以在完全離線的情況下建立交易。只有在執(zhí)行交易的時(shí)候才需要將交易發(fā)送到網(wǎng)絡(luò)。
交易的輸出會被創(chuàng)建成為一個(gè)包含這筆數(shù)額的腳本的形式,只能被引入這個(gè)腳本的一個(gè)解答后才能兌換。簡單點(diǎn)說就是,Alice的交易輸出會包含?個(gè)腳本,這個(gè)腳本說 “這個(gè)輸出誰能拿出一個(gè)簽名和Bob的公開地址匹配上,就支付給誰”。因此,Alice會用Bob 的簽名來包裝一個(gè)輸出。
第二個(gè)輸出就是找零,給自己的輸出。
交易的大小是如何測算的?

這個(gè)交易包含處理所需的所有信息,錢包將新的交易給任意一個(gè)已連接到互聯(lián)網(wǎng)的比特幣客戶端,節(jié)點(diǎn)就會立刻將它轉(zhuǎn)發(fā)給連接到自身的其他節(jié)點(diǎn)、迅速傳播,幾秒鐘就能到達(dá)大多數(shù)節(jié)點(diǎn)。
這個(gè)交易在比特幣網(wǎng)絡(luò)上傳播開來,但必須要經(jīng)過挖礦驗(yàn)證且加到一個(gè)區(qū)塊之中,這個(gè)交易才會成為區(qū)塊鏈的一部分。該系統(tǒng)的信任是建立在計(jì)算的基礎(chǔ)上的。交易被抱在一起放進(jìn)區(qū)塊需要極大的計(jì)算量來證明,但是只需要少量計(jì)算就能驗(yàn)證它們已被i證明。(一個(gè)很棒的類比就是 多人數(shù)獨(dú)游戲,做出來很難,判斷做對了沒有卻很簡單,我很喜歡這個(gè)類比)
挖礦有兩個(gè)作用:(1)發(fā)行貨幣,每個(gè)區(qū)塊創(chuàng)造的區(qū)塊是固定的,慢慢減少。
(2)結(jié)算系統(tǒng),創(chuàng)建信任。區(qū)塊越多,花費(fèi)的計(jì)算量越大,以為著更多的信任。
挖礦做的計(jì)算稱為工作量證明,指的是用SHA256加密算法不斷對區(qū)塊頭和一個(gè)隨機(jī)數(shù)字進(jìn)行哈希計(jì)算,直到出現(xiàn)一個(gè)和預(yù)設(shè)值相匹配的解。第一個(gè)找到這個(gè)解的礦工會贏得這局競賽并將這個(gè)區(qū)塊發(fā)布到區(qū)塊鏈上。
新的交易被加入新區(qū)快時(shí),以交易費(fèi)高的優(yōu)先以及其他的一些規(guī)則進(jìn)行排序。新的一輪競爭開始的時(shí)候,會立刻將一些交易和這個(gè)新區(qū)快的數(shù)字指紋放在一起開始構(gòu)建一個(gè)新區(qū)塊,并開始給它計(jì)算工作量證明。每個(gè)礦工會在他的區(qū)塊包含一個(gè)特殊的交易,自己挖礦所得的12.5個(gè)到自己的地址里。

第四章 密鑰、地址、錢包
4.1 簡介
比特幣的所有權(quán)通過數(shù)字密鑰、比特幣地址和數(shù)字簽名來確定。數(shù)字密鑰放在橋暴利,獨(dú)立于比特幣協(xié)議,無需區(qū)塊鏈和網(wǎng)絡(luò)連接。在交易環(huán)節(jié),收件人的公鑰是通過數(shù)字指紋表示的,稱為比特幣地址(一般用公鑰生成并對應(yīng)于這個(gè)公鑰,腳本也可以表示地址)
4.1.1 公鑰加密和加密貨幣
在比特幣系統(tǒng)中,我們?公鑰加密創(chuàng)建一個(gè)密鑰對,用于控制比特幣的獲取。密鑰對包括一個(gè)私鑰,和由其衍生出的唯一的公鑰。公鑰用于接收?特幣,而私鑰用于比特幣支付時(shí)的交易簽名。
公鑰和私鑰之間的數(shù)學(xué)關(guān)系,使得私鑰可用于生成特定消息的簽名。此簽名可以在不泄露私鑰的同時(shí)對公鑰進(jìn)行驗(yàn)證。

私鑰
本質(zhì)上就是一個(gè)隨機(jī)選擇的數(shù)字。是比特幣的控制權(quán)和所有權(quán)憑證。所以,必須要注意備份,保持機(jī)密。
如何生成私鑰:找到足夠的熵源,即隨機(jī)性來源。可以是1和n-1之間的任何數(shù)字,其中n是一個(gè)常數(shù)(n=1.158*10的77次方),并由比特幣所使用的橢圓曲線的階所定義。
在編程的角度來看,一般是通過一個(gè)密碼學(xué)安全的隨機(jī)源中取出一長串隨機(jī)字節(jié),對其進(jìn)行SHA256哈希算法進(jìn)行計(jì)算。這樣就產(chǎn)生了一位256位的數(shù)字。如果運(yùn)算結(jié)果小于n-1,就可以了,如果不行再來一次。
公鑰
通過橢圓算法可以從私鑰計(jì)算得到公鑰,不可逆的過程
?K = k * G
其中 k 是私鑰, G 是被稱為生成點(diǎn)的常數(shù)點(diǎn), K 是所得公鑰。
而反向運(yùn)算,即給定公鑰k 求私鑰K的過程稱為“尋找離散對數(shù)”,非常困難,只能用窮盡的辦法暴力搜索。
橢圓曲線密碼學(xué)解釋
橢圓曲線加密法是一種基于離散對數(shù)問題的非對稱(或公鑰)加密法,可以用對橢圓曲線上的點(diǎn)進(jìn)行加法或乘法運(yùn)算來表達(dá)。
橢圓曲線上的點(diǎn)的加法或減法。給定橢圓曲線上的兩個(gè)點(diǎn)P1和P2,則橢圓曲線必定有第三點(diǎn) P3 = P1 + P2。幾何圖形中,該第三點(diǎn)P3可以在P1和P2之間畫?條線來確定。這條直線恰好與橢圓曲線上的一點(diǎn)相交。此點(diǎn)記為 P3'=(x,y)。然后,在x軸做映射獲得 P3=(x,-y)。
至此,我們已經(jīng)定義了橢圓加法,為擴(kuò)展加法下?我們對乘法進(jìn)?標(biāo)準(zhǔn)定義。給定橢圓曲線上的點(diǎn)P,如果k是整數(shù),則 kP =P + P + P + …+ P(k次)。注意,k被有時(shí)被混淆而稱為“指數(shù)”。
如何生成公鑰
以一個(gè)隨機(jī)生成的私鑰k為起點(diǎn),我們將其與曲線上已定義的 ?成點(diǎn)G相乘以獲得曲線上的另一點(diǎn),也就是相應(yīng)的公鑰K。生成點(diǎn)是secp256k1標(biāo)準(zhǔn)的一部分,比特幣密鑰的生成點(diǎn)都是相同的:
{K = k * G}
其中k是私鑰,G是?成點(diǎn),在該曲線上所得的點(diǎn)K是公鑰。
因?yàn)樗斜忍貛庞脩舻纳牲c(diǎn)是相同的,一個(gè)私鑰k乘以G將得到相同的公鑰K。k和K之間的關(guān)系是固定的,但只能單向運(yùn)算,即從k得到K。這就是可以把比特幣地址(K的衍生)與任何人共享而不會泄露私鑰(k)的原因。
比特幣地址
比特幣地址是由一個(gè)數(shù)字和字母組成的字符串,可以與任何想給你比特幣的人分享。由公鑰生成的比特幣地址以數(shù)字“1”開頭。
比特幣地址可以由公鑰經(jīng)過單向的加密哈希算法得到,哈希算法是一種單向函數(shù),接受任意長度的輸入產(chǎn)生指紋摘要。由公鑰生成比特幣地址時(shí)使用的算法是Secure Hash Algorithm (SHA)和the RACE Integrity Primitives Evaluation Message Digest (RIPEMD),特別是SHA256和RIPEMD160。
A = RIPEMD160(SHA256(K))
其中 K 為公鑰,A 為比特幣地址
通常見到的地址是經(jīng)過Base58Check 編碼的,這種編碼使用了58個(gè)字符和校驗(yàn)碼,提高了可讀性、避免歧義并有效防止了在地址轉(zhuǎn)錄和輸入中產(chǎn)生的錯(cuò)誤。簡而言之,Base58就是由不包括(0,O,l,I)的大小寫字母和數(shù)字組成。Base58Check是一種常用在比特幣中的Base58編碼格式,增加了錯(cuò)誤校驗(yàn)碼來檢查數(shù)據(jù)在轉(zhuǎn)錄中出現(xiàn)的錯(cuò)誤。校驗(yàn)碼長4個(gè)字節(jié),添加到需要編碼的數(shù)據(jù)之后。校驗(yàn)碼是從需要編碼的數(shù)據(jù)的哈希值中得到的,所以可以用來檢測并避免轉(zhuǎn)錄和輸入中產(chǎn)生的錯(cuò)誤。


密鑰的格式
公鑰和私鑰的都可以有多種編碼格式。一個(gè)密鑰被不同的格式編碼后,雖然結(jié)果看起來可能不同,但是密鑰所編碼數(shù)字并沒有改變。這些不同的編碼格式主要是用來方便人們無誤地使用和識別密鑰。


公鑰的格式:分為非壓縮和壓縮格式兩種。前綴04是用來區(qū)分非壓縮格式公鑰,壓縮格式公鑰是以02或者03開頭。引入壓縮格式公鑰是為了減少比特幣交易的字節(jié)數(shù),節(jié)省空間。
壓縮式公鑰漸漸成為了各種不同的比特幣客戶端的默認(rèn)格式,大大減少交易所需的字節(jié)數(shù),也讓區(qū)塊鏈所需的磁盤空間變小。
比特幣錢包
錢包是私鑰的容器,通常通過有序文件或者簡單的數(shù)據(jù)庫實(shí)現(xiàn)。