重要概念
- 地址
- 交易
- 區(qū)塊
- 網(wǎng)絡(luò)
比特幣用地址來標(biāo)識(shí)一筆交易的支出方和接收方。所有的交易被記到統(tǒng)一的賬本上,而這個(gè)賬本是通過區(qū)塊確認(rèn)并完成的。每一個(gè)新區(qū)塊的產(chǎn)生,都會(huì)被打上時(shí)間戳,最終生成按照時(shí)間前后排列并加以記錄的電子交易證明。每個(gè)獨(dú)立節(jié)點(diǎn)之間又通過比特幣網(wǎng)絡(luò)來建立聯(lián)系,這樣就組成了一個(gè)去中心化、分布式的電子交易記錄時(shí)間戳服務(wù)器系統(tǒng)。
1.地址
主要用到橢圓曲線簽名算法
私鑰由 32 字節(jié)隨機(jī)數(shù)組成,通過私鑰可以算出公鑰,公鑰經(jīng)過一系列哈希算法及編碼算法就得到了比特幣中的地址。因此地址其實(shí)是公鑰的另一種表現(xiàn)形式,可以理解為公鑰的摘要。
具體步驟見知乎鏈接
2.交易
比特幣是一個(gè)鏈?zhǔn)降臄?shù)字簽名串。
前一個(gè)交易和下一位所有者的公鑰簽署一個(gè)數(shù)字簽名,并將這個(gè)簽名附加在交易的末尾。收款人通過驗(yàn)證簽名,就可以驗(yàn)證電子貨幣的所有者鏈條。
2.1 交易結(jié)構(gòu)
比特幣的交易指轉(zhuǎn)賬,為了使價(jià)值易于組合和分割,轉(zhuǎn)賬通常有多個(gè)輸入和輸出。
(從生成到在網(wǎng)絡(luò)中傳播,再到通過工作量證明、整個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)驗(yàn)證,最終記錄到比特幣的區(qū)塊鏈,這就是交易的整個(gè)生命周期。)
- 輸入標(biāo)識(shí)著交易的發(fā)送方
- 輸出標(biāo)識(shí)著交易的接收方及對(duì)發(fā)送方的找零
- 交易的手續(xù)費(fèi)是輸入的總和與輸出的總和之差。
- 所有的交易輸入必然是前面某筆交易的輸出
- 所以交易最核心的字段是交易的輸出。

2.2 UTXO 結(jié)構(gòu)
Unspent Transaction Outputs 是未花費(fèi)的交易輸出
交易構(gòu)成的鏈?zhǔn)浇Y(jié)構(gòu),所有合法的比特幣交易都可以追溯到前一個(gè)或多個(gè)交易的輸出,鏈條的源頭都是挖礦獎(jiǎng)勵(lì),末尾則是當(dāng)前未花費(fèi)的交易輸出。所有的未花費(fèi)的輸出即為整個(gè)比特幣網(wǎng)絡(luò)的 UTXO。
比特幣規(guī)定每一筆新交易的輸入必須是某筆交易未花費(fèi)的輸出,每一筆輸入同時(shí)也需要上一筆輸出所對(duì)應(yīng)的私鑰進(jìn)行簽名,并且每個(gè)比特幣的節(jié)點(diǎn)都會(huì)存儲(chǔ)當(dāng)前整個(gè)區(qū)塊鏈上的 UTXO,整個(gè)網(wǎng)絡(luò)上的節(jié)點(diǎn)通過 UTXO 及簽名算法來驗(yàn)證新交易的合法性。
比特幣的交易輸入通常有3種,分別是標(biāo)準(zhǔn)輸入(Standard TxIn)、花費(fèi)挖礦獎(jiǎng)勵(lì)(Spend Coinbase TxOut)、產(chǎn)生挖礦獎(jiǎng)勵(lì)(Coinbase/Generation)


比特幣的交易輸出有兩種,分別是標(biāo)準(zhǔn)交易輸出(Standard TxOut)、挖礦獎(jiǎng)勵(lì)輸出(Coinbase TxOut)


2.3 腳本
每一筆交易的每一項(xiàng)輸出,并不是指向一個(gè)地址,而是指向一個(gè)腳本。腳本是一套規(guī)則,它約束著接收方怎樣才能花掉這個(gè)輸出上鎖定的資產(chǎn)。
有兩類腳本:
- 鎖定腳本
- 解鎖腳本
鎖定腳本是基于可變的模式,通過一段腳本語(yǔ)言來實(shí)現(xiàn),位于交易的輸出。
解鎖腳本與鎖定腳本相對(duì)應(yīng),只有按鎖定腳本的規(guī)則去解,才能花掉這個(gè)腳本上對(duì)應(yīng)的資產(chǎn),位于交易的輸入。
腳本語(yǔ)言可以表達(dá)出無(wú)數(shù)的條件變種。所以比特幣是“可編程的貨幣”。
目前常用的比特幣腳本主要分為兩種:
一種是普通的 P2PKH 類型(Pay-to-Public-Key-Hash),即支付給公鑰的哈希值是地址,接收方只需要使用地址對(duì)應(yīng)的私鑰對(duì)該輸出進(jìn)行簽名,即可花掉該輸出。
另一種是P2SH(Pay-to-Script-Hash),支付腳本的哈希值。拿多重簽名來舉例,它要求該輸出要有 N 把私鑰中的 M 把私鑰(M≤N)同時(shí)簽名才能花掉該資產(chǎn),它類似于現(xiàn)實(shí)生活中需要多把鑰匙才能同時(shí)打開的保險(xiǎn)柜,只是更加靈活。
3. 區(qū)塊
每個(gè)節(jié)點(diǎn)都基于已存在的最新區(qū)塊生成下一個(gè)區(qū)塊,同時(shí)將網(wǎng)絡(luò)中未確認(rèn)的合法交易包含進(jìn)去。
這個(gè)過程就是將所有的交易打上時(shí)間戳標(biāo)記的過程。
3.1 區(qū)塊結(jié)構(gòu)
交易會(huì)被打包成一個(gè)區(qū)塊,包含到比特幣的公開賬本(區(qū)塊鏈)里。 區(qū)塊由包含元數(shù)據(jù)的區(qū)塊頭和緊跟其后的交易列表組成。區(qū)塊數(shù)據(jù)結(jié)構(gòu)如下表所示[插圖]


區(qū)塊頭的大小為 80 字節(jié),由 4 字節(jié)的版本、32 字節(jié)的上一個(gè)區(qū)塊的哈希值、32 字節(jié)的 Merkle Root Hash、4 字節(jié)的時(shí)間戳(當(dāng)前時(shí)間)、4 字節(jié)的當(dāng)前難度值、4 字節(jié)的隨機(jī)數(shù)等組成。
區(qū)塊所包含的交易列表則附加在區(qū)塊頭后面。比特幣網(wǎng)絡(luò)約定每個(gè)區(qū)塊的第一筆交易是coinbase 交易,這是一筆為了讓礦工獲得獎(jiǎng)勵(lì)及手續(xù)費(fèi)的特殊交易。
3.2 Merkle Tree
區(qū)塊包含的所有交易首先都會(huì)通過 Merkle Tree 算法生成 Merkle Root Hash 并存儲(chǔ)至區(qū)塊頭的數(shù)據(jù)結(jié)構(gòu)里。Merkle Tree 算法是用來同步數(shù)據(jù)一致性的算法,它基于一組哈希值列表構(gòu)建成一個(gè)樹,樹的根哈希值作為原始數(shù)據(jù)列表的摘要。
Merkle Tree 具有以下特點(diǎn):
1)數(shù)據(jù)結(jié)構(gòu)是一個(gè)樹,可以是二叉樹,也可以是多叉樹。
2)Merkle Tree的葉子節(jié)點(diǎn)的值是數(shù)據(jù)集合的單元數(shù)據(jù)或者單元數(shù)據(jù)的哈希值。
3)Merkle Tree的非葉子節(jié)點(diǎn)的值是所有葉子節(jié)點(diǎn)值的哈希值。
區(qū)塊中所使用的Merkle Tree算法的原理如下圖所示。

3.3 時(shí)間戳服務(wù)器
時(shí)間戳服務(wù)器對(duì)以區(qū)塊形式存在的一組數(shù)據(jù)實(shí)施隨機(jī)哈希處理,加上時(shí)間戳,并將該隨機(jī)哈希值進(jìn)行廣播。
該時(shí)間戳能夠證實(shí)特定數(shù)據(jù)于某特定時(shí)間是的確存在的,因?yàn)橹挥性谠摃r(shí)刻存在了,才能獲取相應(yīng)的隨機(jī)哈希值。
每個(gè)時(shí)間戳應(yīng)當(dāng)將前一個(gè)時(shí)間戳納入其隨機(jī)哈希值中,每一個(gè)隨后的時(shí)間戳都對(duì)之前的一個(gè)時(shí)間戳進(jìn)行增強(qiáng)(Reinforcing),這樣就形成了一個(gè)鏈條(Chain)。

4. 網(wǎng)絡(luò)
比特幣采用了基于 P2P(Peer to Peer)的網(wǎng)絡(luò)架構(gòu)。
P2P 是指位于同一網(wǎng)絡(luò)中的每臺(tái)計(jì)算機(jī)都是彼此公平、對(duì)等的,各個(gè)節(jié)點(diǎn)共同提供網(wǎng)絡(luò)服務(wù),不存在任何“特殊”(中心)節(jié)點(diǎn)。
P2P 網(wǎng)絡(luò)通信在比特幣之前就已經(jīng)被應(yīng)用于文件共享領(lǐng)域了。
比特幣被設(shè)計(jì)成一個(gè)點(diǎn)對(duì)點(diǎn)的數(shù)字現(xiàn)金系統(tǒng),而 P2P 正好是這個(gè)理念的核心特征的反映,也是該特征的基石。
運(yùn)行在每一臺(tái)機(jī)器上的比特幣核心程序就是比特幣 P2P 網(wǎng)絡(luò)中的一個(gè)節(jié)點(diǎn)。
比特幣網(wǎng)絡(luò)的相關(guān)功能如下:
- 新交易廣播到全網(wǎng)的節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)會(huì)收到交易消息。
- 每個(gè)(挖礦)節(jié)點(diǎn)將新交易收集到節(jié)點(diǎn)的內(nèi)存,并組裝成區(qū)塊。
- 每個(gè)(挖礦)節(jié)點(diǎn)都嘗試在自己的區(qū)塊中找到一個(gè)具有足夠難度的工作量證明。
- (挖礦)節(jié)點(diǎn)找到一個(gè)工作量證明,把有效的區(qū)塊數(shù)據(jù)向全網(wǎng)進(jìn)行廣播。
- 當(dāng)且僅當(dāng)包含在該區(qū)塊中的交易都是有效的,并驗(yàn)證其完成了工作量證明,其他節(jié)點(diǎn)才認(rèn)同該區(qū)塊的有效性。
- 其他(挖礦)節(jié)點(diǎn)表示接受該區(qū)塊,并在該區(qū)塊的末尾制造新的區(qū)塊以延長(zhǎng)整個(gè)區(qū)塊的鏈條。
在比特幣網(wǎng)絡(luò)中,交易和區(qū)塊信息的傳播是通過洪水算法(Flooding Algorithm)進(jìn)行的。
簡(jiǎn)單地說,就是每一個(gè)收到信息的節(jié)點(diǎn),向與它相連的所有節(jié)點(diǎn)推送該信息。下一個(gè)收到信息的節(jié)點(diǎn)繼續(xù)這個(gè)過程。通常在一兩秒內(nèi),交易或者區(qū)塊的信息就可以傳遍全網(wǎng)。

節(jié)點(diǎn)始終都將最長(zhǎng)的鏈條作為正確的鏈條,在它的基礎(chǔ)上持續(xù)工作并延長(zhǎng)它。
如果有兩個(gè)節(jié)點(diǎn)同時(shí)廣播不同的基于上一個(gè)區(qū)塊的新區(qū)塊,那么其他節(jié)點(diǎn)在接收到該區(qū)塊的時(shí)間先后上將存在差別。在此情形下,它們將在率先收到的區(qū)塊基礎(chǔ)上進(jìn)行工作,但也會(huì)保留另外一個(gè)鏈條,以防后者變成最長(zhǎng)的鏈條。該僵局的打破要等到下一個(gè)區(qū)塊(工作量證明)被發(fā)現(xiàn),當(dāng)其中的一條鏈條被證實(shí)為是較長(zhǎng)的一條時(shí),在另一條分支鏈條上工作的(挖礦)節(jié)點(diǎn)將轉(zhuǎn)換陣營(yíng),開始在較長(zhǎng)的鏈條上工作。
所謂“新交易的廣播”,實(shí)際上不需要抵達(dá)網(wǎng)絡(luò)中的全部節(jié)點(diǎn),只要交易信息能夠抵達(dá)足夠多的節(jié)點(diǎn),它們將很快被整合進(jìn)一個(gè)新的區(qū)塊中。而區(qū)塊的廣播對(duì)被丟棄的信息進(jìn)行容錯(cuò)處理。
容錯(cuò)處理:如果一個(gè)節(jié)點(diǎn)沒有收到某特定區(qū)塊,那么該節(jié)點(diǎn)將會(huì)發(fā)現(xiàn)自己缺失了該區(qū)塊,就會(huì)向較長(zhǎng)鏈的節(jié)點(diǎn)發(fā)出下載該缺失區(qū)塊的請(qǐng)求。
比特幣網(wǎng)絡(luò)中的礦工們不停地在最新的區(qū)塊基礎(chǔ)上構(gòu)造下一個(gè)區(qū)塊,通過算力競(jìng)爭(zhēng)來爭(zhēng)取記賬權(quán)(將新區(qū)塊寫到比特幣的區(qū)塊鏈的機(jī)會(huì)),確認(rèn)網(wǎng)絡(luò)的轉(zhuǎn)賬交易,同時(shí)獲取區(qū)塊獎(jiǎng)勵(lì)。
由于每一個(gè)區(qū)塊都包含上一個(gè)區(qū)塊的哈希值,通過這個(gè)前向的哈希值,區(qū)塊以鏈條的形式進(jìn)行相連,最終形成了由各個(gè)區(qū)塊組成的記賬系統(tǒng)——區(qū)塊鏈。