返回介绍

2.发行一项资产

发布于 2024-12-29 22:37:18 字数 4001 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文