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

上一篇文章,我們談到 查詢所有收入的紀錄 接下來,我們就是要把收到的錢,轉到另一個錢包 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://blog.no2don.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# 操控的文件也很少,可能也是我功力太弱,有點小心得就筆記一下畢竟我抱持者 不客觀,非教學,真體驗的想法在寫這一系列的文,希望有對後面碰壁者有些幫助 :)

---

 

請你暫時把你的勇氣給我 在夢想快消失的時候 讓我的 Code 用力的穿過天空 為愛我的人做一秒英雄 如果這篇文章有幫助到您,簡單留個言,或是幫我按個讚,讓我有寫下去的動力...