前言
为了这个练习的目的,我们会发布一款区块链编程数字货币。您为我发送的每个0.004比特币获得一个区块链编程数字货币。
我们一起学习如何编写这样的功能
发行彩色币
在Open Asset中,资产ID来源于发行人的ScriptPubKey。
如果您想发行彩色币,则需要证明此类ScriptPubKey的所有权。 在Blockchain上做这件事的唯一方法就是花钱购买属于这种ScriptPubKey的硬币。
您将选择花钱发行彩色硬币的硬币在NBitcoin中被称为“发行硬币”。
我们发出一个比特币资产地址:1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB。
看看我的余额,我决定使用下面的硬币发行数字货币资产:
{
"transactionId":"eb49a599c749c82d824caf9dd69c4e359261d49bbb0b9d6dc18c59bc9214e43b",
"index":,
"value":2000000,
"scriptPubKey":"76a914c81e8e7b7ffca043b088a992795b15887c96159288ac",
"redeemScript":null
}
以下是如何创建我的发行币:
varcoin =newCoin(
fromTxHash:newuint256("eb49a599c749c82d824caf9dd69c4e359261d49bbb0b9d6dc18c59bc9214e43b"),
fromOutputIndex:,
amount: Money.Satoshis(2000000),
scriptPubKey:newScript(Encoders.Hex.DecodeData("76a914c81e8e7b7ffca043b088a992795b15887c96159288ac")));
varissuance =newIssuanceCoin(coin);
现在我需要在TransactionBuilder的帮助下构建事务并签署事务。
varnico = BitcoinAddress.Create("15sYbVpRh6dyWycZMwPdxJWD4xbfxReeHe");
varbookKey =newBitcoinSecret("???????");
TransactionBuilder builder =newTransactionBuilder();
vartx = builder
.AddKeys(bookKey)
.AddCoins(issuance)
.IssueAsset(nico,newAssetMoney(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
varclient =newQBitNinjaClient(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(varnode = Node.ConnectToLocal(Network.Main))//Connect to the node
{
node.VersionHandshake();//Say hello
//Advertize your transaction (send just the hash)
node.SendMessage(newInvPayload(InventoryType.MSG_TX, tx.GetHash()));
//Send it
node.SendMessage(newTxPayload(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派生的,下面是如何在代码中获取它:
varbook = BitcoinAddress.Create("1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB");
varassetId =newAssetId(book).GetWif(Network.Main);
Console.WriteLine(assetId);// AVAVfLSb1KZf9tJzrUVpktjxKUXGxUTD4e
领取专属 10元无门槛券
私享最新 技术干货