- 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.保护你的私钥
2.交易
在开始前,记住要创建一个新章节的类。
交易是比特币的传输。一个交易可能没有接受者,或者有好几个。发送者也一样。在区块链上,发送者和接受者总是被抽象为 ScriptPubKey,就像我们在第 10 章演示的一样。假设你已经学习完了第 4 课以及相关的练习,我们继续向前。如果你没有完成练习,继续前请向先前你生成的地址汇款。
如果你使用 Bitcoin Core,你的交易标签页将如下显示交易信息:
现在我们关注一下交易 ID。这里它就是:f13dc48fb035bbf0a6e989a26b3ecb57b84f85e0836e777d6edf60d87a4a2d94
交易 ID 由 SHA256 定义。
不要使用交易 ID 处理未经确认的交易。在正式确认前交易 ID 是可以被更改的,叫做 交易可塑性
你可以在类似 Blockchain.info 这样网站上检查交易,但是作为一个开发人员,你将需要一个易于查询分析的服务。截止本文时,我们发现 Blockr.io 是一个不错的服务。
如果你上 http://btc.blockr.io/api/v1/tx/raw/f13dc48fb035bbf0a6e989a26b3ecb57b84f85e0836e777d6edf60d
87a4a2d94 看看,就可以看到交易的原始字节。
NBitcoin 查询 blockr,为你分析信息,所以你就不需要手工来做了。
public void Lesson1()
{
var blockr = new BlockrTransactionRepository();
Transaction transaction =
blockr.Get("4ebf7f7ca0a5dafd10b9bd74d8cb93a6eb0831bcb637fec8e8aabf8
42f1c2688");
Console.WriteLine(transaction.ToString());
}
"hash": "4ebf7f7ca0a5dafd10b9bd74d8cb93a6eb0831bcb637fec8e8aabf842f1c2688",
"ver": 1,
"vin_sz": 1,
"vout_sz": 2,
"lock_time": 0,
"size": 225,
"in": [
{
"prev_out": {
"hash": "bf7d91ac70917f98b497927e1b07267507652b206df14ecdba2e9390b9bffc65",
"n": 0
},
"scriptSig":
"3044022069b6b0f1a8d453bdb89e3ad475232b8e01d2851e7b53acab3f830f40e80b3b5102203c049
867975360020293c735d48b4a2dda003aa781c1d8ccd2c7af290dcd11de01
02e3538427350039e67ea99e935cefb740badf3d09ebc301b0bc9d1bb0301a3417"
}
],
"out": [
{
"value": "0.08990000",
"scriptPubKey": "OP_DUP OP_HASH160 5b1d720daf0e95e37d0eaedd282b6ed9a40bab71
OP_EQUALVERIFY OP_CHECKSIG"
},
{
"value": "0.01000000",
"scriptPubKey": "OP_DUP OP_HASH160 71049fd47ba2107db70d53b127cae4ff0a37b4ab
OP_EQUALVERIFY OP_CHECKSIG"
}
]
现在相关部分包括 in 和 out。你可以看到 0.0899 比特币被发送给 ScriptPubKey,0.01 比特币被发送到另外一个地方。(练习:验证 ScriptPubKey 中的公钥是否与你付款地址相关联的一样)
如果你注意一下 in,你就发现 prev_out(先前的 out)被引用了。每一个 in 都告诉你先前的哪一个 out 被使用了,这样就可以为交易付款。术语 TxOut 和 Output 对 Out 是匿名的。
总的来说,TxOut 代表一定数量的比特币和一个 ScriptPubKey。(接收端)
每一个 out 都有一个由交易 ID 和索引定义的地址,叫做 Outpoint。比如,在我的这次交易中 0.01 比特币的 out 对应的 Outpoint 就是(71049fd47ba2107db70d53b127cae4ff0a37b4ab, 1).
现在让我们看看交易中的 in(也叫 TxIn、Inputs)
TxIn 包含正在花出去的 prev_out 的出口、以及同时被叫做 所有权证明 的 ScriptSig。在我的例子里,prev_out 的出口是(7def8a69a7a2c14948f3c4b9033b7b30f230308b, 0)
我们代换第一课代码中的交易 ID,就可以检查交易相关的信息。我们可以继续按此方法追踪这个交易 ID 到比特币的 coinbase,也就是他们被挖出来时所在的区块。
在我们的例子里,prev_out 总使用量为 0.1BTC。在这次交易中,0.0899BTC 和 0.01BTC 都被发出去了。意味着还有 0.0001BTC 没有下落。发送和收到之间的差额被称之为交易费用或者挖矿费用。矿工将指定的交易包含在区块里面,因此需要收费。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论