前言
为了这个练习的目的,我们会发布一款区块链编程数字货币。您为我发送的每个0.004比特币获得一个区块链编程数字货币。
我们一起学习如何编写这样的功能。
发行彩色币
在Open Asset中,资产ID来源于发行人的ScriptPubKey。
如果您想发行彩色币,则需要证明此类ScriptPubKey的所有权。 在Blockchain上做这件事的唯一方法就是花钱购买属于这种ScriptPubKey的硬币。
您将选择花钱发行彩色硬币的硬币在NBitcoin中被称为“发行硬币”。
我们发出一个比特币资产地址:1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB。
看看我的余额,我决定使用下面的硬币发行数字货币资产:
{
“transactionId”: “eb49a599c749c82d824caf9dd69c4e359261d49bbb0b9d6dc18c59bc9214e43b”,
“index”: 0,
“value”: 2000000,
“scriptPubKey”: “76a914c81e8e7b7ffca043b088a992795b15887c96159288ac”,
“redeemScript”: null
}
以下是如何创建我的发行币:
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 AssetMoney(issuance.AssetId, quantity: 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个,这是我发给nico的资产数量。 元数据是任意数据。 我们会看到我们可以放置一个指向“资产定义”的网址。
资产定义是描述资产的文档。 这是可选的,我们没有在我们的案例中使用它。
欲了解更多信息,请查阅Open Asset Specification。
交易验证后,它已准备好发送到网络。
Console.WriteLine(builder.Verify(tx));
QBitNinja
var client = new QBitNinjaClient(Network.Main);
BroadcastResponse broadcastResponse = client.Broadcast(tx).Result;
if (!broadcastResponse.Success) {
Console.WriteLine(“ErrorCode: ” + broadcastResponse.Error.ErrorCode);
Console.WriteLine(“Error message: ” + broadcastResponse.Error.Reason);
}
else{
Console.WriteLine(“Success!”);
}
本地比特币核心代码
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.0001 BTC的费用,并且由于防止垃圾邮件功能而忽略600 Satoshi硬币。
这款经典的比特币钱包对彩色硬币一无所知。
更糟糕的是:如果一个传统的比特币钱包花了一个彩色硬币,它将破坏标的资产并仅转移TxOut的比特币值(600 satoshi)。
为了防止用户将彩色硬币发送到不支持彩色钱币的钱包,Open Asset具有自己的地址格式,只有彩色硬币钱包才能知道。
nico = BitcoinAddress.Create(“15sYbVpRh6dyWycZMwPdxJWD4xbfxReeHe”);
Console.WriteLine(nico.ToColoredAddress());
akFqRqfdmAaXfPDmvQZVpcAQnQZmqrx4gcZ
现在,您可以查看像Coinprism这样的Open Asset兼容钱包,并查看我的资产是否正确检测到:
正如我之前告诉过你的,资产ID是从发行者的ScriptPubKey派生的,下面是如何在代码中获取它:
var book = BitcoinAddress.Create(“1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB”);
var assetId = new AssetId(book).GetWif(Network.Main);
Console.WriteLine(assetId); // AVAVfLSb1KZf9tJzrUVpktjxKUXGxUTD4e
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。