首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何发布属于自己基于比特币的彩色币

前言

为了这个练习的目的,我们会发布一款区块链编程数字货币。您为我发送的每个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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180602A07VUT00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券