先來理論概念上的簡單總結
交易准備:
- 我的地址A(公鑰)和配對的私鑰(保存在錢包)
- 對方的地址B(公鑰)
交易過程:
- 兩個賬戶轉賬時,比如我(A)給對方(B)轉賬,我發送一條信息“A給B轉賬10個BTC”
- 先用B公開的公鑰加密,再用我的私鑰加密(兩層加密)
- 然后把雙層加密信息廣播到比特幣網絡節點,所有節點收到后他們會用我的公鑰(A)來校驗是不是我(第一層加密,確認是我的身份的東西后會進行記錄
- 因為我做了兩層加密,所以里面的數據只有B用他的私鑰能解開,B也一樣先檢驗第一層我的公鑰確認是我,再用自己的私鑰匙來解密第二層從而拿到數據
- B收到錢后也會類似我發數據的方式進行全網廣播
done!!
下面詳細記錄流程
首先我作為發送方,我擁有:
- 付款地址(公鑰):“1FKDZ3s2H787sa”
- 私鑰:“2SYFs2SU89H8YH”
Hash ( Hash ( func ( 私鑰“2SY...” ) ) ) -> 付款地址"1FKDZ..." (第一次哈希)
公鑰和私鑰是一對非對稱關系,可以理解為用戶名和密碼的關系。
比特幣交易流程
比特幣的賬戶是用地址來表示,賬本上不顯示個人信息,轉賬是把比特幣從一個地址轉移到另一個地址。
例如一段交易信息記錄:
{
"付款地址":"1FKDZ3s2H787sa"
"收款地址":"3SKC9CBa239aFcc"
"金額":"0.5btc"
}
只有擁有該付款地址的私鑰的我才能支付該筆交易。
對交易信息簽名
1.對交易信息哈系(第二次哈系)
hash('
{
"付款地址":"1FKDZ3s2H787sa"
"收款地址":"3SKC9CBa239aFcc"
"金額":"0.5btc"
}') -> 摘要信息(Hash值):4ZYzha97zhya8
2.簽名
sign("摘要信息4ZY...",“私鑰2SY...”) -> “簽名“:5QMy6gF567F
驗證
廣播付款地址和簽名后,驗證返回交易摘要
verify("簽名5QM...",”付款地址1FKDZ...”) -> "摘要信息"4ZY...
這是一次逆向算出交易信息的運算,把得出的摘要信息結果和第一次哈希的結果對比,獲得驗證結果:
if(verify("3cdferdadgadg", "2A39CBa2390FDe") ==
hash('{
"付款地址":"2A39CBa2390FDe",
"收款地址":"AAC9CBa239aFcc",
"金額":"0.2btc"}')) :
# 寫入賬本
# 廣播
else:
# 不干活
補充:
- 比特幣加密算法:SHA256
- 比特幣系統使用了橢圓曲線簽名算法(ECC),算法的私鑰由32個字節隨機數組成,通過私鑰可以計算出公鑰,公鑰經過一序列哈希算法和編碼算法得到比特幣地址,地址也可以理解為公鑰的摘要