如何創建並簽署廣播交易
這是《使用Raspberry Pi Zero和Golang製作硬體比特幣錢包》教程的第三篇,我們已經講述了【項目目標】、【使用Go和多路復用器創建RESTful API】、【以安全的方式管理電子錢包和錢幣信息】、【在區塊鏈上創建並簽署廣播交易】四部分內容,文末點擊也可以查看。
作者:Nic Raboy
翻譯:Dean
排版:蘇一
以安全的方式管理電子錢包和錢幣信息
現在我們有幣和加密工作,我們可能需要一些半吸引人的幫助函數來使用每次我們希望用硬幣或錢包做某事時。
如果項目尚未打開,請打開項目的wallet.go文件,並在之前添加的加密代碼下方包含以下內容:
我們正在做一個可能為空的錢包,並將其用特定的密碼保存到磁碟中。 當涉及到Destroy功能時,我們可以做同樣簡單的事情:
創建和銷毀功能雖然有用,但不會像其他功能那麼充分使用。
在我們嘗試創建或檢索錢包數據之前,檢查我們使用的密碼是否有效可能是一個好主意。 在前端更重要,但在其他地方仍然有價值。
本質上,我們試圖解密一個錢包。 如果解密過程中存在錯誤,要麼么錢包不存在或者密碼不正確。 嘗試通過Angular應用程序登錄時,我們可以使用此功能。
假設我們已經在某處解密了我們的錢包,我們可以嘗試將幣導入它:
還記得我們添加到coin.go文件的內容嗎? 無論這是我們正在導入的硬幣還是我們正在創建的硬幣,它都將被導入到解密的錢包中,然後錢包將被加密並保存在磁碟上。
如果我們想要獲取錢包中的地址,我們可以調用GetAddresses函數:
我們正在做的是解密我們的錢包,但刪除所有的WIF信息。 我們不加密,所以我們的WIF信息是安全的,但我們沒有返回它。 請記住,如果您想要一個真正安全的硬體錢包,WIF信息絕不應該暴露或離開Raspberry Pi Zero。
去我剛剛說的一切,如果您真的想要檢索一切,您可以創建一個轉儲函數:
如果Dump函數存在,請小心使用它。 您不希望您的私鑰被意外暴露。
在區塊鏈上創建並簽署廣播交易
既然我們可以安全地與我們的錢包和幣進行交互,那麼我們可能會擔心創建和簽署交易,這些交易稍後可能會向區塊鏈廣播。雖然時間不長,但交易可能是本教程中最複雜的部分。
我之前在一篇題為「使用Golang創建和簽署比特幣交易」的教程中撰寫了關於此主題的文章,其中將包含比以下更深入的內容。我建議您查看更多信息。
以下是我們計劃在創建交易時執行的操作:
1、從我們的錢包中取出WIF字元串並將其作為私鑰載入。
2、為發件人和收件人生成公鑰腳本。
3、為代表正在發送的UTXO數據的發件人創建一個原始交易。
4、創建一個包含原始交易信息的兌換交易。
5、簽署兌換交易,以便可以真正轉移資金。
6、在廣播之前驗證已簽名的交易是否存在錯誤。
我們不打算從我們的硬體錢包中廣播交易。如果您希望廣播該交易,請複製並粘貼已簽名的輸出並將其帶到區塊鏈資源管理器進行廣播。例如,BitPay有比特幣的流行瀏覽器。
打開項目的transaction.go文件並包含以下內容:
我們不僅計劃創建一個交易,而且還需要一些東西來存儲它。這對於以格式化的方式將數據返回給客戶端非常有用,但它對於將來存儲在磁碟上也很有用。 對我們來說真正重要的是Transaction數據結構中的SignedTx屬性。
那麼讓我們來看看創建一個交易的過程。
給定WIF字元串,我們可以嘗試解碼並將其用作私鑰。 我們還計算給定私鑰的公鑰。
由於我們正在離線創建原始交易,因此我們無法訪問所有未使用的交易輸出(UTXO)信息,因此我們將創建自己的UTXO。
給定一個以前的區塊鏈交易,我們將其散列化並將其用作我們的發件人輸入。
使用源和目標公共地址,我們可以創建交易輸出。 我們發件人交易的輸出將使用發件人的公鑰腳本以及satoshi中可用於前一個交易散列(transaction hash)的金額。 通過之前的交易散列,金額以及發件人的公鑰腳本,我們可以確定我們將在兌換交易中使用的發送交易。
兌換交易將使用原始交易散列作為輸入,輸出將是我們希望發送給收件人的原始交易金額。
一旦我們擁有格式正確的兌換交易,我們可以使用發件人的私鑰對其進行簽名:
sigScript值將包含簽名以及發件人的公鑰。
假設到現在為止一切都很順利,您應該簽署一個交易。 我們可以驗證它將猜測工作排除在外:
如果驗證我們的兌換交易成功,我們可以存儲結果並將其退回。
關於我們已經實現的交易邏輯,還有幾點需要注意。 首先,我們使用單個輸入。 這意味著發送的值必須完全存在於特定的UTXO中,而不是鏈接多個UTXO輸入。 其次,我們尚未實施更改地址輸出,這意味著我們必須將所有內容都發送到我們的輸入中,否則其餘部分將用於挖礦費用。 第三,我們的投入金額和產出金額是相同的,這意味著零費用分配。 您可能想要添加一些邏輯來使用667 satoshi作為費用。
完整的CreateTransaction函數如下所示:
就像我之前所說的那樣,如果您想深入了解Golang的交易方式,請查看我之前關於此主題的文章。交易是棘手的,在我看來,這是加密貨幣最困難的部分。
明天的內容主要關於《使用Gorilla Mux開發和服務API端點》,感興趣的朋友請期待喲~
本篇論文篇幅長於5w字,為了便於大家觀看,便將文章拆分為8個部分。每晚8:24更新推送,每篇內容都由我們精心設計,望大家喜歡。
目錄:
2、《開發比特幣的私鑰和公約思路邏輯、使用AES密碼加密和解密電子錢包數據》
3、《以安全的方式管理電子錢包和錢幣信息、在區塊鏈上創建並簽署廣播交易》
4、《使用Gorilla Mux開發和服務API端點》
5、《用Angular,TypeScript和Bootstrap創建一個有吸引力的前端、在應用程序中的組件之間創建和導航》
6、《在應用程序中的組件之間創建和導航》
7、《使用角度依賴性配置Angular模塊》
8、《使用USB配置用於模擬乙太網的Raspberry Pi Zero》
來源:https://www.thepolyglotdeveloper.com/2018/03/create-bitcoin-hardware-wallet-golang-raspberry-pi-zero/
※新約全書逐節匯查-附:創世記10閃、含、雅弗的後代
※2018樂高星球大戰遊俠索羅外傳新品
TAG:全球大搜羅 |