[C#] 手把手來玩比特幣 (Bitcoin) - 把錢打出去(交易篇)

2019-02-08

上一篇文章,我們談到 查詢所有收入的紀錄 接下來,我們就是要把收到的錢,轉到另一個錢包 mshr22VWpq7XTTA3EhAoqoizPuqRAvZfvi 


我從網站測試鏈上面 得到收到的 Transation Id 為 d3425d5f912552a47358df8b6647330e914019b1745c88b89d376896d35864e5 並且序號為 0



這篇文章 目標就是將此 0.01 的比特幣轉到 mshr22VWpq7XTTA3EhAoqoizPuqRAvZfvi 

C# Code :

//還原主錢包 var walletA = NBitcoin.Key.Parse("6PYQBZhumqnrhETBXNvqW61XHpwYVefbTmZtM2BZcekPjunUbPgUPGe8H2", "your_pass_word", NBitcoin.Network.TestNet).GetWif(NBitcoin.Network.TestNet); //準備被接收端的錢包(目的地) var reveiveAddress = NBitcoin.BitcoinAddress.Create("mshr22VWpq7XTTA3EhAoqoizPuqRAvZfvi", NBitcoin.Network.TestNet); var tx = NBitcoin.Transaction.Create(NBitcoin.Network.TestNet); var input = new NBitcoin.TxIn(); // 帶入來源端的 Trasaction Id 還有 Index // Source from : https://no2don.blogspot.com/2019/02/c-bitcoin_96.html // https://live.blockcypher.com/btc-testnet/tx/d3425d5f912552a47358df8b6647330e914019b1745c88b89d376896d35864e5/ input.PrevOut = new NBitcoin.OutPoint(new NBitcoin.uint256("d3425d5f912552a47358df8b6647330e914019b1745c88b89d376896d35864e5"), 0); input.ScriptSig = walletA.GetAddress().ScriptPubKey; tx.Inputs.Add(input); var output = new NBitcoin.TxOut(); //這是 GAS Fee var gasFee = NBitcoin.Money.Coins(0.0001M); output.Value = NBitcoin.Money.Coins(0.01M) - gasFee; //設定轉出到指定的錢包至 Output output.ScriptPubKey = reveiveAddress.ScriptPubKey; tx.Outputs.Add(output); tx.Sign(walletA.PrivateKey, false); Console.WriteLine("========== TXINO ==========="); Console.WriteLine(tx.ToString()); var txBuilder = NBitcoin.Network.TestNet.CreateTransactionBuilder(); var res = txBuilder.Verify(tx); //對一個節點傳送交易 ,使其進行廣播 var node = NBitcoin.Protocol.Node.Connect(NBitcoin.Network.TestNet, "testnet-seed.bitcoin.jonasschnelli.ch"); node.VersionHandshake(); node.SendMessage(new NBitcoin.Protocol.InvPayload(tx)); node.SendMessage(new NBitcoin.Protocol.TxPayload(tx)); System.Threading.Thread.Sleep(2000); node.Disconnect(); Console.WriteLine("========== NODE TX ==========="); Console.WriteLine("TXID:" + tx.GetHash().ToString());

其中我把 TX 送給節點的資訊 印出來看看
{ "hash": "4855870423f470f8514052e86d04fabd89eac91430fbe193d68cdd5404d3c26a", "ver": 1, "vin_sz": 1, "vout_sz": 1, "lock_time": 0, "size": 191, "in": [ { "prev_out": { "hash": "d3425d5f912552a47358df8b6647330e914019b1745c88b89d376896d35864e5", "n": 0 }, "scriptSig": "304402203278ab4c3e680e019ae03af3f518b01880f0dd4a413723faa19f42e91b3a4fda02204f5ca7207e72e49c7f6dc2b300abaa654f54f7b890b9b541dc2f844e4763fd7801 0357ae7df6a954e68074d89f9e8e80d8e032e972b00b5977131bff5409bf6a4cdc" } ], "out": [ { "value": "0.00990000", "scriptPubKey": "OP_DUP OP_HASH160 85b0d883f657d39365af3457775497ce6925404f OP_EQUALVERIFY OP_CHECKSIG" } ] }

交易結果 ,你就可以看到發射端的錢包發出去 0.0099 BTC 到 mshr22VWpq7XTTA3EhAoqoizPuqRAvZfvi 你會很好奇其中的 0.0001 怎麼不見了,那就所謂的GAS 也就是給礦工的手續費,在真實世界裡面手續費會決定該筆 confim 的速度 


接收端也收到了該筆交易

在上述程式碼中你會看到 testnet-seed.bitcoin.jonasschnelli.ch 這網址,這是一台有對外公開的測試節點,當然這都可以上網去找,只是因為我測試時後發現他比較穩定,所以測試都是對他發送。

寫到這裡透過比特幣交易就到一段落,有些地方我是碰到很多壁才會知道怎麼做,而且關於C# 操控的文件也很少,可能也是我功力太弱,有點小心得就筆記一下畢竟我抱持者 不客觀,非教學,真體驗的想法在寫這一系列的文,希望有對後面碰壁者有些幫助 :)


當麻許的碎念筆記 2014 | Donma Hsu Design.