2008年10月31日,中本聰(Satoshi)發(fā)表了《比特幣——一種點對點電子現(xiàn)金系統(tǒng)》白皮書,這是革命性貨幣體系的組成部分,也是比特幣的規(guī)范協(xié)議。
2009年1月3日,隨著Satoshi發(fā)表了第一個實現(xiàn)該論文的Block# 0 Genesis Block,該白皮書開始生效。這些代碼大部分是用c++編寫的,并且是開源的,可以在github上找到。
比特幣是什么?
比特幣建立在區(qū)塊鏈系統(tǒng)之上,純粹的點對點電子現(xiàn)金系統(tǒng)將允許直接從一方發(fā)送到另一方的在線支付,而無需經(jīng)過金融機構(gòu)。
為什么是點對點?
節(jié)點是運行比特幣軟件(比特幣客戶機)的計算機。節(jié)點連接到其他計算機以創(chuàng)建網(wǎng)絡(luò)。每個節(jié)點都相互連接,所以形成了一個網(wǎng)絡(luò),每個節(jié)點都是對等的。節(jié)點之間相互通信,傳遞關(guān)于n/w其他部分的信息。
所以現(xiàn)在我們有了一組運行比特幣軟件的節(jié)點,這些節(jié)點連接在一起形成一個比特幣n/w。讓我們舉個例子。Alice想通過Bob的比特幣錢包發(fā)送5比特幣,這個錢包創(chuàng)建了一個交易,并將其插入比特幣的n/w節(jié)點。網(wǎng)絡(luò)上的每個節(jié)點執(zhí)行3個功能:
1. 遵循一套用比特幣客戶端軟件編寫的規(guī)則。如:檢查這個人是否有足夠的余額來消費,如果是,則接受該交易,如果沒有拒絕,則將其傳遞給其他節(jié)點。因此,只有有效的交易才會被代理。
2. 擅自進行交易。有兩種類型的交易是主動的—最近進入網(wǎng)絡(luò)的新交易,已確認的交易,這些交易以塊的形式共享,而不是單獨的
3. 將已確認的交易追加到其區(qū)塊鏈。
什么是區(qū)塊鏈?
區(qū)塊鏈可以看作是可以存儲為一個平面文件或一個簡單的數(shù)據(jù)庫塊鏈。例如,比特幣的核心客戶將區(qū)塊鏈存儲在谷歌的一級數(shù)據(jù)庫。區(qū)塊鏈的特性:
1. 區(qū)塊鏈是一個鏈表數(shù)據(jù)結(jié)構(gòu)。每個節(jié)點都有數(shù)據(jù)(塊,稍后我們將看到每個塊是什么)和指向前一個塊哈希的鏈接。因此,每個節(jié)點都與之前的節(jié)點進行了隱式鏈接,使得每個節(jié)點不可變,篡改會破壞鏈。
2. 去中心化。區(qū)塊鏈的副本存在于網(wǎng)絡(luò)中的所有節(jié)點上,就像公共分類賬一樣。區(qū)塊鏈就像比特幣對點網(wǎng)絡(luò)上的BitTorrent文件一樣可以共享。
挖礦目的
n/w上的每個節(jié)點都有一個內(nèi)存池,一個臨時存儲緩沖區(qū)。每個節(jié)點還有一個本地存儲到節(jié)點的區(qū)塊鏈。當節(jié)點從其他節(jié)點接收到交易時,它將驗證該交易并將其添加到內(nèi)存池中。最終目標是創(chuàng)建一個包含這些交易的塊,驗證它們并將其添加到區(qū)塊鏈上。一旦交易被添加到區(qū)塊鏈中,它們就會被“確認”,這就允許比特幣的新主人使用他們在這些交易中收到的比特幣。
誰創(chuàng)建了塊,誰將交易添加到塊中——“礦工”。比特幣n/w中的任何節(jié)點都可以成為礦工。
1. 挖礦用于確保不使用欺詐性交易。例如雙重支出問題。
2. 挖礦會產(chǎn)生新的比特幣,如果有新的區(qū)塊,就會產(chǎn)生新的比特幣,就像央行印新錢一樣。比特幣的數(shù)量是固定的,并隨著時間的推移而遞減。(這是用比特幣協(xié)議寫的)。礦工提供比特幣n/w的處理能力,作為回報。
添加到內(nèi)存池中的交易將等待挖掘程序拾取。礦工創(chuàng)建一個新塊,將內(nèi)存池中的部分或全部交易(基于優(yōu)先級)添加到這個新的候選塊中,并與其他礦工競爭,以解決一個基于加密哈希算法的數(shù)學(xué)難題。這個“工作量證明”問題的解決方案包含在塊中,它可以作為采礦者花費了大量計算工作的證明。第一個解決該問題的礦工將獲得獎勵,驗證塊將被添加到區(qū)塊鏈中。采礦者可以從采礦中獲得兩種獎勵——創(chuàng)造新代幣并給予采礦者交易費。
新代幣的產(chǎn)生是固定的,并在不斷減少,2009年開始是50比特幣,2012年減半至25比特幣,2016年減半至12.5比特幣,大約每四年減少一次。預(yù)計每10分鐘開采一個新區(qū)塊。比特幣軟件對比特幣總量有一個最高限額,即2100萬比特幣。所以到2140年左右,所有的比特幣都將發(fā)行,之后不會再發(fā)行新的比特幣。礦工只能從交易費中獲利。
比特幣區(qū)塊鏈中的塊是什么?
礦工創(chuàng)建的每個新塊都有一個頭塊和一個主塊。所有選定的交易都添加到主塊中。
1. 上一個塊哈希。
2. 時間戳,創(chuàng)建此塊的日期/時間。
3. 難度目標,為使塊生成時間保持在10分鐘以內(nèi),難度目標是一個可以自行調(diào)整的動態(tài)值。
4. Nonce,一個初始化為0的計數(shù)器(稍后我們將看到它是什么)
5. Merkle root hash, Merkle tree是一種數(shù)據(jù)結(jié)構(gòu),用于有效地總結(jié)塊中的所有交易。(我們將在接下來的博客中看到merkle樹是什么以及它是如何構(gòu)建的)。
挖礦過程
它使用SHA-256哈希函數(shù)。
挖掘的是塊頭的哈希,反復(fù)更改一個參數(shù)(nonce),直到得到的哈希小于或等于一個特定的目標。
什么是難度目標?
為了使塊生成時間保持在10分鐘,難度會相應(yīng)地進行調(diào)整。如果n/w查找塊的速度超過10分鐘,則難度增加,如果塊的查找速度較慢,則難度降低。您可以在power .cpp中的github上的reference erence實現(xiàn)中找到設(shè)置當前難度的代碼。
工作量證明算法如何工作?
挖掘器負責(zé)構(gòu)造一個充滿交易的候選塊,哈希塊頭以查看它是否小于或等于當前目標,如果不是,則修改nonce(通常遞增1),然后重試,直到找到解決方案。挖掘需要大量的計算能力,因此現(xiàn)在節(jié)點使用ASIC硬件,其中100 -1000秒的集成電路并行運行SHA-256 algo。一旦找到一個解決方案,用于解決這個問題的nonce就被插入到塊中的nonce字段中,節(jié)點立即將這個塊傳輸給它的所有對等節(jié)點。它們接收、驗證(驗證規(guī)則可以在CheckBlock和checkblockheader文件中找到)并生成新塊。當節(jié)點在網(wǎng)絡(luò)周圍波動時,每個節(jié)點將其添加到自己的區(qū)塊鏈中,并將其擴展到一個新的高度。
因此挖掘就是在這個塊上創(chuàng)建新的塊,聚集和添加的新交易,在這個塊之上運行算法的證明可以找到這個問題的答案,通過投資計算能力和預(yù)期回報(新生成的比特幣和交易費用)宣傳這一塊。
為什么使用工作量證明算法?
工作量證明基本上確保了礦工不作弊,他們負責(zé)比特幣的生成和創(chuàng)建新的區(qū)塊添加到區(qū)塊鏈。
我們無法相信網(wǎng)絡(luò)中的每個人都是誠實的,因此,我們?nèi)绾未_保礦工不會通過在區(qū)塊中添加交易、給自己帶來比特幣,來創(chuàng)建對自己有利的區(qū)塊。它的工作原理是,你讓一群人都試著猜這道數(shù)學(xué)題的答案,沒有人知道誰會先得到正確的答案。首先得到正確答案的人將獲得獎勵,但前提是所有其他礦工同意接受該交易記錄(如果某個礦工明顯在創(chuàng)建欺詐性交易,那么其他礦工可以集體拒絕接受他們的貢獻)。這就是為什么創(chuàng)建一個新塊的過程被設(shè)計成能源密集型的原因,因此,創(chuàng)建每個新塊都有相關(guān)的成本。這就阻止了礦工們簡單地創(chuàng)造出一大堆新的欺詐性區(qū)塊,并寄希望于這些區(qū)塊可能會被接受,因為這樣做的成本抵消了潛在的回報。如果要求每臺計算機在發(fā)送每封郵件之前花一分鐘處理PoW問題,那么只有真正有消息的人才會同意花時間?;ㄙM一分鐘的電腦時間對一個人來說是非常低的成本,但是一個正在發(fā)送1000萬封垃圾郵件的人卻等不起1000萬分鐘。所以回到比特幣上來看,每一個礦工解決每一個區(qū)塊的機會是非常小的,因為解決這些區(qū)塊需要花費大量的努力,他們不能只是用解決方案向網(wǎng)絡(luò)發(fā)送垃圾郵件。這意味著只有當他們的貢獻被網(wǎng)絡(luò)接受時,他們才會被激勵去付出努力。