交易記錄
交易記錄就是這個樣子的
{
"S-wallet-address":"..." #轉賬源錢包地址
"D-wallet-address":"..." #轉賬目的錢包地址
"count":"1 btc" #金額
}
賬本(區塊)
賬本可以理解為一組交易記錄,一個下列結構稱之為一個區塊
hash值-賬本的摘要,序號、記賬時間 |
---|
交易記錄1 |
交易記錄2 |
... |
指向下一個區塊的指標 |
賬本的驗證憑據(資料摘要的計算)
第一個區塊
hash(賬本) = hash值
後續區塊
hash(前一個賬本的hash值, 新賬本) = 新的hash值
#產生新的一個區塊
區塊鏈
區塊使用連結串列連線起來
賬本的驗證
一個參與交易記錄的節點計算出一個新的區塊後,會廣播給相鄰的計算儲存節點。在不同計算儲存節點核對資訊時候,只需要核對最後一個區塊的的hash值即可
賬戶所有權問題
一個計算節點有兩個關鍵的賬戶憑證,就是錢包地址(公鑰)和私鑰,
{
"wallet-address":"asdfghjk"#public-key
"private-key":"gaiskdjkljgsclahsdjkhasld..."
}
支付過程:一條交易記錄
deal =
{
"S-wallet-address":"..." #轉賬源錢包地址
"D-wallet-address":"..." #轉賬目的錢包地址
"count":"1 btc" #金額
}
**對賬戶進行簽名,不能洩露私鑰##
signature = sign(hash(deal), private-key)
驗證簽名,驗證方會獲取交易記錄和簽名
if (hash(deal) == verify(signature, s-address)#s-address就是public-key
說白了這裡就是一個非對稱加密機制用於簽名的應用。錢包地址是公鑰、簽名過程用的是私鑰對交易記錄的hash值進行簽名,驗證方可以獲得公鑰和簽名,從而解出來交易記錄的hash值,比對成功即可驗證簽名方的確是其所聲稱的賬戶
記賬
記賬規則
- 一段時間內只有一個人或者賬戶可以記賬成功(比特幣是10分鐘左右)
- 其他節點複製記賬成功的結果
- 記賬有獎勵,記賬成功一次有獎勵(比特幣是12.5btc獎勵,每四年減半)
如何保證一段時間只有一個記賬成功
- 解決密碼學難題(工作量證明)
#真實記賬
hash(last_hash, deal, random) == 000..000xxsjadhkasdfgkjadsd
#要求引入隨機數,使得對交易記錄的hash要滿足結果開頭為N個0
#備註:這裡面的交易記錄集,是系統收集的網路上還沒有被記賬的交易行為,然後驗證交易記錄的有效性(驗證餘額和簽名),並新增一筆給自己轉賬的交易(BTC目前轉給自己12.5BTC),如果OK的話。自己也會獲得12.5BTC。
- 首先記賬成功的就會廣播,其他節點複製
共識機制
如果有兩個節點同時記賬成功怎麼辦,按照最長鏈為標準
#chain-A
1->2->3->4A
#chain-B
1->2->3->4B
#一般一個節點收到一個鏈,收到兩個鏈的則會選擇其一,一個為備用。
#不同的節點會在不同的鏈上繼續工作-挖礦。
#先收到下一個記賬成功的就達成共識了。
#例如
1->2->3->4B->5B #那麼B就獲得了記賬權
#如果先收到收到了5B,但是沒有收到4B,則5B會作為一個孤塊留存