- 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.发行一项资产
a.目的
为了练习的目的,我将发行 BlockchainProgramming 币。
这些币的所有人将可以下载本书第 3 部分,只要他们把币发回给我就行。
不用担心,第三部分对任何人都是可读的,但是首先提供给 BlockchainProgramming 币的所有者。
我将发送币给支持我的人,名单在本书网站上列出来了: http://blockchainprogramming.azurewebsites.net/
你每给我 0.004BTC,我就给你 1 个 BlockchainProgramming 币,如果有良好建议的话,就加 1 个。
看看我是怎么编码实现这些特性的。
b.发行币
在开放式资产中,AssetID 是从发行方的 ScriptPubKey 中派生的。
如果你想发行一个颜色币,你需要证明这些 ScriptPubKey 的所有权。在区块链上的唯一方法就是支付一个属于这些 ScriptPubKey 的币。
在 NBitcoin 中,为了发行颜色币而支付的币就叫做 Issuance Coin (发行币)。
我准备从本书比特币地址上发行一项资产,本书比特币地址:1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB。
看了一下我的余额,我决定使用下列比特币来发行资产。
下面创建 issuance coin。
var coin = new Coin(
fromTxHash: new
uint256("eb49a599c749c82d824caf9dd69c4e359261d49bbb0b9d6dc18c59bc9214e43b"),
fromOutputIndex: 0,
amount: Money.Satoshis(2000000),
scriptPubKey: new
Script(Encoders.Hex.DecodeData("76a914c81e8e7b7ffca043b088a992795b15887c96159288ac
")));
var issuance = new IssuanceCoin(coin);
现在我需要在 TransactionBuilder 的帮助下创建并签名交易。
var nico = BitcoinAddress.Create("15sYbVpRh6dyWycZMwPdxJWD4xbfxReeHe");
var bookKey = new BitcoinSecret("???????");
TransactionBuilder builder = new TransactionBuilder();
var tx = builder
.AddKeys(bookKey)
.AddCoins(issuance)
.IssueAsset(nico, new Asset(issuance.AssetId, 10))
.SendFees(Money.Coins(0.0001m))
.SetChange(bookKey.GetAddress())
.BuildTransaction(true);
Console.WriteLine(tx);
{
…
"out": [
{
"value": "0.00000600",
"scriptPubKey": "OP_DUP OP_HASH160 356facdac5f5bcae995d13e667bb5864fd1e7d59
OP_EQUALVERIFY OP_CHECKSIG"
},
{
"value": "0.01989400",
"scriptPubKey": "OP_DUP OP_HASH160 c81e8e7b7ffca043b088a992795b15887c961592
OP_EQUALVERIFY OP_CHECKSIG"
},
{
"value": "0.00000000",
"scriptPubKey": "OP_RETURN 4f410100010a00"
}
]
}
你可以看到它包含一个 OP_RETURN 输出,实际上,这是颜色币信息所在的地方。
这是 OP_RETURN 中的数据格式。
我们的例子中,数量只有 10,这就是我发行资产的数量。
元数据是可变的数据。我们将看到可以推出一个指向 资产定义 的 url。
一个 资产定义 是描述资产是什么的文档。它是可选的,在我们的例子中不准备使用它。(后面谈到李嘉图合约时会回头讨论)
更多信息参照:OpenAssetSpecification.
交易已经准备好了,可以发送到网络上了:
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, tx.GetHash()));
//Send it
node.SendMessage(new TxPayload(tx));
Thread.Sleep(500); //Wait a bit
}
我的比特币钱包同时有本书的地址和 Nico 的地址。
你会发现,比特币核心仅仅显示我支付的 0.0001BTC 费用,忽略了 600 聪,这是由于垃圾邮件预防特性导致的。
这个经典的比特币钱包就只知道颜色币。
更加糟糕的是:如果一个经典比特币钱包付出一个颜色币,它将毁掉底层资产,仅仅传送 TxOut 的比特币价值(600 聪)
为了防止用户发送颜色币到一个不支持它的钱包,开放式资产拥有自己的地址格式,这种格式仅仅颜色币钱包能理解。
nico = BitcoinAddress.Create("15sYbVpRh6dyWycZMwPdxJWD4xbfxReeHe");
Console.WriteLine(nico.ToColoredAddress());
现在,你可以对比一下开放式资产兼容的钱包,比如 Coinprism,然后看看我正确检测到的资产:
我前面介绍说,AssetID 是从发行方的 ScriptPubKey 派生出来的,下面是对应的代码实现:
var book = BitcoinAddress.Create("1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB");
var assetId = new AssetId(book).GetWif(Network.Main);
Console.WriteLine(assetId);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论