比特幣簽名交易系列——05構建交易並簽名

發送轉賬的人,要構建交易並對交易簽名。整個過程流程如下:

  1. 收集現有的UTXO,湊足足夠的金額;
  2. 編寫此次交易要產生的UTXO,規劃好金額的去向;
  3. 組裝好未簽名的交易數據;
  4. 用私鑰對未簽名的交易數據進行簽名;把簽名信息封裝成ScriptSig存入交易的Input字段。

首選說說收集UTXO,這個服務可以使用第三方服務,也可以自己管理UTXO。自己管理UTXO適合從全新的比特幣地址開始管理,每一筆UTXO都可以明明白白,老地址就更麻煩一些,需要回顧歷史,查找其UTXO。而第三方服務,在測試的時候比較方便。例如:

https://api.blockchair.com/bitcoin/testnet/dashboards/address/
後面接地址,就可以查詢到該地址的UTXO,非常方便,我寫的代碼就是用這個api接口。

規劃資金去向的時候,因爲比特幣有一個規則:一個UTXO只能用一次,用過一次就再也不能再用了。所以這一次使用肯定是把這個UTXO的所有資金都用上。這樣在資金規劃的時候,往往容易出現找零的情況。找零的時候就需要設置好找零地址。找零地址可以隨意設定成自己控制的任意錢包地址。在規劃資金去向的時候,不要忘了設置交易手續費。交易手續費= 所有的交易輸入金額 - 所有的UTXO金額。交易手續費的設置不容易,給高了,浪費,給低了,讓自己的交易排在交易隊列後面,遲遲不打包進區塊。所以設置交易手續費的難度也不低,需要根據當前比特幣網絡的擁堵情況給合理的手續費。因爲我測試的時候用的是測試網,所以交易手續費就不用太謹慎了。

組裝交易數據的時候,我就遇到很多坑,尤其是字節序的坑,有一些字段是要大端字節序的,如果不注意看文檔,很容易掉坑裏。其中有一張圖對我的幫助很大,如果要寫代碼實現,一定不要忽略這張圖。

還有一張圖,揭示了簽名交易過程中的關鍵點:

先把所有Vin長度設爲0,數據段設爲nil,。

然後把每一個Vin用用它對應的UTXO數據填充進來,用SHA256雙哈希對整個交易數據做橢圓曲線簽名,簽好名之後構建對應的ScriptSig數據到相應的交易區裏,一直到所有的Vin都簽好名。就像下面這張圖,顯示TxIn0由最初的pkScript填充,簽名,再換成ScriptSig,而TxIn1則還沒簽名,只有VI這個字段(表示ScriptSig字段的長度,單位字節),並且這個字段的值是0,而交易裏所有的TxOut數據都不變。

這裏就不貼代碼了,因爲真的太多了。

(全文完)

參考連接:

https://blog.csdn.net/mellymengyan/article/details/78125344?utm_source=blogxgwz4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章