返回介绍

5.支付比特币

发布于 2024-12-29 22:37:17 字数 3922 浏览 0 评论 0 收藏 0

你现在已经了解什么是比特币地址、ScriptPubKey、私钥和矿工了,可以手动完成第一个交易了。创建一个新类 Chapter14 以及一个方法 Lesson1。在你阅读本章节的时候,你需要按照书中所述逐行添加代码创建方法,这个方法将为本书留一个 Twitter 消息风格的反馈。

我们先看看这个交易,它包含了你需要支付的 TxOut,就好像我们在第 11 章做的那样。

var blockr = new BlockrTransactionRepository();
Transaction fundingTransaction =
blockr.Get("0b948b0674a3dbd229b2a0b436e0fce8aa84e6de28b088c610d110c2bf54acb4");

在我们的例子里,我们需要使用第二次 output:

为了完成支付,你需要在交易里面提到这个 output。可以如下创建一个交易:

Transaction payment = new Transaction();
payment.Inputs.Add(new TxIn()
{
    PrevOut = new OutPoint(fundingTransaction.GetHash(), 1)
});

现在我们注意一下 Output。你需要发送 0.004BTC,而你支付了 0.04BTC,所以需要找给你 0.006BTC。同时也需要给矿工一些费用,这样他们好把这次交易添加到他们的下一个区块里面去。

因此,你将拿回来 0.0059BTC。

本书的捐献地址:1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB

var programmingBlockchain =
new BitcoinAddress("1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB");
payment.Outputs.Add(new TxOut()
{
    Value = Money.Coins(0.004m),
    ScriptPubKey = programmingBlockchain.ScriptPubKey
});
payment.Outputs.Add(new TxOut()
{
    Value = Money.Coins(0.0059m),
    ScriptPubKey = paymentAddress.ScriptPubKey
});

现在可以添加你的反馈了。必须少于 40 字节,不然它就崩溃了。
//Feedback !
var message = "Thanks ! :)";
var bytes = Encoding.UTF8.GetBytes(message);
payment.Outputs.Add(new TxOut()
{
    Value = Money.Zero,
    ScriptPubKey = TxNullDataTemplate.Instance.GenerateScriptPubKey(bytes)
});
Console.WriteLine(payment);
{
    "hash": "258ed68ac5a813fe95a6366d94701314f59af1446dda2360cf6f8e505e3fd1b6",
    "ver": 1,
    "vin_sz": 1,
    "vout_sz": 3,
    "lock_time": 0,
    "size": 166,
    "in": [
    {
        "prev_out": {
            "hash": "4ebf7f7ca0a5dafd10b9bd74d8cb93a6eb0831bcb637fec8e8aabf842f1c2688",
            "n": 1
        },
        "scriptSig": ""
    }
    ],
    "out": [
    {
        "value": "0.00400000",
        "scriptPubKey": "OP_DUP OP_HASH160 c81e8e7b7ffca043b088a992795b15887c961592
        OP_EQUALVERIFY OP_CHECKSIG"
    },
    {
        "value": "0.00590000",
        "scriptPubKey": "OP_DUP OP_HASH160 71049fd47ba2107db70d53b127cae4ff0a37b4ab
        OP_EQUALVERIFY OP_CHECKSIG"
    },
    {
        "value": "0.00000000",
        "scriptPubKey": "OP_RETURN
        42696c6c20537472616974206973207570646174696e672073637265656e73686f74732e"
    }
    ]
}

现在我们就完成创建交易了,我们需要对它签名。换句话来说,你需要证明拥有在 input 里面提到的 TxOut。

签名比较复杂,细节可以参考:

https://en.bitcoin.it/w/images/en/7/70/Bitcoin_OpCheckSig_InDetail.png。

但是我们可以简单一些。

首先在 scriptSig 中插入 ScriptPubKey。

ScriptPubKey 无非就是 paymentAddress.ScriptPubKey,很简单。

payment.Inputs[0].ScriptSig = paymentAddress.ScriptPubKey;
  //also OK:
  //payment.Inputs[0].ScriptSig =
  //fundingTransaction.Outputs[1].ScriptPubKey;
payment.Sign(paymentSecret, false);
Console.WriteLine(payment);

恭喜,你可以在第一个交易上完成签名了。你的交易已经准备好了。剩下的就是发布到网上去让矿工们可以看得到。

保证比特币核心正在运行,然后:

using (var node = Node.ConnectToLocal(Network.Main)) //Connect to the node
{
    node.VersionHandshake(); //Say hello
    //Advertize your transaction (send just the hash)
    node.SendMessage(new InvPayload(InventoryType.MSG_TX, payment.GetHash()));
    //Send it
    node.SendMessage(new TxPayload(payment));
    Thread.Sleep(500); //Wait a bit
}

using 代码段将负责断开与节点的链接。以上就是全部!

你可以直接连到比特币网络

但是,我建议你连接到自己的可信节点(更快更便捷)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文