區塊鏈演算法

斑林鴿的程式碼世界發表於2020-06-03

交易記錄

交易記錄就是這個樣子的

{
    "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會作為一個孤塊留存

相關文章