- 1.前言
- 2.为什么是区块链编程而不是比特币编程?
- 3.为什么是 C#?
- 4.预备条件
- 5.本书众筹
- 6.补充阅读
- 7.图标
- 8.许可: CC (ASA 3U)
- 9.项目设置
- 1.比特币地址
- 2.交易
- 3.区块链
- 4. 区块链不仅仅是比特币
- 5.支付比特币
- 6.作为真实性验证方法的所有权证明
- 1.足够随机了吗?
- 2.秘钥加密
- 3.秘钥的生成
- 1.P2PK[H] (向公钥付款 [Hash])
- 2.多重签名
- 3.P2SH ( 向脚本哈希付款)
- 4.灵活机动性
- 5.使用 TransactionBuilder
- 1.颜色币
- 2.发行一项资产
- 3.传输资产
- 4.单元测试
- 5.李嘉图合约
- 6.流动的民主
- 7.烧钱和声誉证明
- 8.存在性证明
- 1.比特币发展的挑战
- 2.如何证明一个币存在于区块链上
- 3.如何证明一个颜色币存在于区块链上
- 4.断开与第三方 API 的信任关系
- 5.防止延展性攻击
- 6.保护你的私钥
5.支付比特币
你现在已经了解什么是比特币地址、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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论