我们将讨论的第一个区块链应用是染色币。

染色币是指利用比特币交易来记录除比特币之外的外部资产的创建,所有权和转让的这类技术。 所谓“外部资产”我们是指这些资产不直接存储在比特币区块上,而不是指比特币本身,因为比特币是本身就是这个区块链的固有资产。

染色币用于跟踪第三方持有的数字资产和实物资产,并通过染色币所有权证书来进行交易。 数字资产染色币可以代表无形资产,如股票证书,许可证,虚拟财产(游戏装备)或大多数任何形式的许可知识产权(商标,版权等)。 有形资产染色币可以代表商品(黄金,白银,石油),土地所有权,汽车,船只,飞机等所有权。

该术语源于“着色”或标记某名义金额的比特币的想法,例如,1聪,用来表示比特币价值本身以外的东西。打个比方,我们给一美元的钞票标上一行信息说:“这是ACME的股票证书”,或者“这张钞票可以兑换1盎司的银”,然后使用这个1美元钞票与作为其他资产权益证明来进行交易。染色币的第一次实施,名为“基于增强填充订单的着色”或“EPOBC”,将外部资产标记于1聪输出上。这样,因为每个资产作为1聪的属性(颜色)被添加了,它就成了一个真正的“染色币”。

染色币的最新实施使用OP_RETURN脚本操作码将交易中的元数据与将元数据与特定资产相关联的外部数据存储结合在一起。

今天染色币的两个最突出的实现是 Open Assets和Colu的染色币。这两个系统使用不同的方法来染色,并不兼容。在一个系统中创建的染色币在其他系统中无法看到或被使用。

12.4.1使用染色币

染色币被创建,转移,并且通常用特殊的可以理解含有染色币协议元数据的比特币交易的钱包来查看。 必须特别注意避免在常规的比特币钱包中使用染色币相关的密钥,因为常规钱包可能会破坏元数据。 同样地,染色币也不应该被发送到由常规钱包管理的地址,而只能发送到由染色币能够识别的钱包管理的地址。Colu和Open Assets这两个系统都使用特殊的染色币地址来减轻这种风险,并确保染色币不会发送到不能识别的钱包。

染色币对大多数通用的区块链浏览器也是不可见的。 相反,您必须使用染色币浏览器来阐释染色币交易的元数据。

Open Assets兼容的钱包应用程序和区块链浏览器可以在coinprism查找。

Colu染色币兼容的钱包应用程序和区块链探索器可以在Blockchain Explorer中找到。

Copay钱包插件可以在Colored Coins Copay Addon中找到。

12.4.2发行染色币

每个染色币的实现都通过不同的方法创造染色币,但它们都提供类似的功能。创造染色币资产的过程称为发行。作为初始交易,发行交易将资产登记在比特币区块链上,并创建用于引用资产的资产ID。一旦发行,资产可以使用转账交易在地址之间传递。

作为染色币发行的资产可以有多种属性。它们可以是可分割的或不可分割的,这意味着转账中的资产量可以是整数(比如5)或具有十进制细分(比如4.321)。资产也可以固定发行,意思是一定数量的资产只可以发行一次,或者可以被再次发行,后者意味着原始发行人在初始发行后可以发行新资产单位。

最后,一些染色币启用分红,即允许按照拥有权成比例分配比特币付款给染色币资产的所有者。

12.4.3染色币交易

给染色币交易提供意义的元数据通常使用OP_RETURN操作码存储在其中一个输出中。不同颜色的硬币协议对OP_RETURN数据的内容使用不同的编码。包含OP_RETURN的输出称为标记输出。

输出的顺序和标记输出的位置在染色币协议中可能具有特殊含义。例如,在Open Assets中,标记输出之前的任何输出都代表资产发行。标记输出后的任何输出表示资产转账。通过参考各个输出在转账中的顺序标记输出将特定值和颜色分配给其他输出。

在Colored Coins (Colu)中,通过比较,标记输出编码一个定义元数据该如何被理解的操作码。操作码0x01至0x0F表示发行交易。发行操作码通常后面是资产ID或可用于从外部来源(例如bittorrent)取得资产信息的其他标识符。操作码0x10到0x1F表示转账交易。转账交易元数据包含简单的脚本,通过参考输入输出的索引(顺序),将特定数量的资产从输入转账到输出。因此,输入和输出的排序对脚本的解释很重要。

如果元数据太长而不能放入OP_RETURN,则染色币协议可能会使用其他“技巧”在交易中存储元数据。示例包括将元数据放在兑换脚本中,紧接着OP_DROP操作码,以确保脚本忽略元数据。另一种被使用的机制是1-N 多重签名脚本,其中只有第一个公钥是可以花费输出的真实公钥,随后的“密钥”则用被编码的元数据替代。

为了正确解释染色币交易中的元数据,您必须使用兼容的钱包或块资源浏览器。否则,该交易会看起来像一个具有OP_RETURN输出的“正常”比特币交易。

例如,我使用染色币创建并发行了MasterBTC资产。 “MasterBTC”代表了可以获取本书免费拷贝的兑换券。这些兑换券可以使用染色币兼容的钱包进行转让,交易和兑换。

对于这个特定的例子,我使用了https://coinprism.info的钱包和浏览器,它使用了Open Assets染色币协议。

下图12-1在coinprism.info上查看的发行交易 显示使用Coinprism块浏览器的发行交易:[(https://www.coinprism.info/tx/10d7c4e022f35288779be6713471151ede967caaa39eecd35296aa36d9c109ec)]

12.4_染色币 - 图1
图12-1. 在coinprism.info上查看的发行交易

正如你所看到的那样,coinprism显示了发行的20个“精通比特币的免费拷贝”,简称为MasterBTC的资产,发给了一个特殊的彩色币地址:

akTnsDt5uzpioRST76VFRQM8q8sBFnQiwcx

警告 发送到该地址的任何资金或染色币将永远丢失。 不要发送到这个示例地址!

发行交易的交易ID是“正常”比特币交易ID。下图12-2不对染色币进行解码的区块链浏览器中看到的发行交易 显示同一笔交易(和12.1同一笔)在不会对区块链解码的区块浏览器中的样子。 我们将使用blockchain.info:https://blockchain.info/tx/10d7c4e022f35288779be6713471151ede967caaa39eecd35296aa36d9c109ec

12.4_染色币 - 图2
图12-2. 不对染色币进行解码的区块链浏览器中看到的发行交易

正如你所看到的,blockchain.info不认为这是一个染色币交易。 事实上,它以红色字母表示第二个输出“无法解码输出地址”。

如果您在该屏幕上选择“显示脚本和coinbase”,可以看到有关交易的更多详细信息(下图12-3 发行交易的脚本).
12.4_染色币 - 图3
图12-3. 发行交易的脚本

再次,blockchain.info并不能理解第二个输出。 它以红色字母表示“奇怪”。 但是,我们可以看到,标记输出中的一些元数据是可读的:

OP\_RETURN 4f41010001141b753d68747470733a2f2f6370722e736d2f466f796b777248365559\(decoded\) "OAu=[https://cpr.sm/FoykwrH6UY](https://cpr.sm/FoykwrH6UY)

让我们使用bitcoin-cli检索交易:

$ bitcoin-cli decoderawtransaction`bitcoin-cli getrawtransaction 10d7c4e022f35288779be6713471151ede967caaa39eecd35296aa36d9c109ec

剥离其余的交易,第二个输出如下所示:

{
    "value": 0.00000000,
    "n": 1,
    "scriptPubKey": "OP\_RETURN 4f41010001141b753d68747470733a2f2f6370722e736d2f466f796b777248365559"
}

前缀4F41表示字母“OA”,代表“Open Assets”,并帮助我们确定以下元数据是由Open Assets协议定义的紧接着的ASCII编码的字符串是指向资产定义的链接:

u=[https://cpr.sm/FoykwrH6UY](https://cpr.sm/FoykwrH6UY)

如果我们检索此URL,我们将获得JSON编码的资产定义,如下所示:

{
    "asset\_ids": \[
    "AcuRVsoa81hoLHmVTNXrRD8KpTqUXeqwgH"
    \],
    "contract\_url": null,
    "name\_short": "MasterBTC",
    "name": "Free copy of \"Mastering Bitcoin\"",
    "issuer": "Andreas M. Antonopoulos",
    "description": "This token is redeemable for a free copy of the book \"Mastering Bitcoin\"",
    "description\_mime": "text/x-markdown; charset=UTF-8",
    "type": "Other",
    "divisibility": 0,
    "link\_to\_website": false,
    "icon\_url": null,
    "image\_url": null,
    "version": "1.0"
}