# 日拱一卒：铭文考古，从什么是操作码开始学习

By [Rick_li](https://paragraph.com/@rick-li) · 2023-12-10

---

引言：本系列文章是为了记录和整理“比特币生态”的整个学习过程，如果有对比特币生态同样感兴趣的朋友可以关注twitter：@RickLi\_crypto。

最近铭文概念很火热，准备从头开始系统的学习下比特币生态的发展历程。其实最早在比特币上尝试发行资产的是“染色币”，染色币利用的方案与铭文有类似之处，先看下什么是染色币？

从定义上看，染色币是指一组使用比特币系统来记录除比特币以外资产的创建、所有权和转让的类似技术，所谓染色，指的是对比特币UTXO中添加特定的信息，使其与其他比特币UTXO进行区分。通过染色币技术，发行的资产具备众多和比特币相同的特性，包括防止双花、隐私性、安全性、透明性与抗审查性，保证交易的可靠。

提到的很关键信息，染色币是在UTXO上进行添加信息的，如何做到的？怎么添加？

**一、首先UTXO 是什么：**

在比特币系统中，UTXO 是指还没有被用于新交易的输出。每一笔比特币交易都会消耗之前交易的输出作为新交易的输入，并生成新的输出。这些新的输出，如果还没被用作另一笔交易的输入，就称为 UTXO。

UTXO (unspent transaction output)数据集被矿工维护，以便能够快速验证交易合法性，防止双花现象。

接下来，如何在UTXO中添加信息来对比特币染色？这个问题的关键是在哪添加信息，添加什么信息？

我先回到染色币的定义上来看，染色币可以粗略的分为“基于OP\_RETURN”和“不基于OP\_RETURN”两种类型，以“基于OP\_RETURN”为例，来简洁的讲解下原理。既然是基于OP\_RETURN，说明染色币的发行信息、资产信息都存储在比特币UTXO的OP\_RETURN中。

**二、什么是OP\_RETURN？**

首先OP\_RETURN是一种比特币脚本操作码，我们先了解清楚什么是操作码？[https://en.bitcoin.it/wiki/Script#Opcodes](https://en.bitcoin.it/wiki/Script#Opcodes)

脚本操作码可以被理解为脚本、命令或函数，是一系列动作和数据依次执行的说明。脚本包含两类元素：

*   动作，定义操作是什么，称为**操作码**
    
*   数据，操作码操作的对象，称为**操作数**
    

比特币的交易脚本就是基于这种结构实现的，可以将比特币交易理解为以下脚本流程：

*   在交易的输出上，附上包含公钥或公钥哈希的**锁定脚本**，将输出与公钥关联
    
*   在交易的输入上，需要提供包含数字签名的**解锁脚本**，只有对应私钥的持有者，才能提供正确的签名
    

到这里就大概明白了操作码的作用。

OP\_RETURN作为一种特殊的操作码，它的作用是通过将自定义数据嵌入比特币历史中的每一笔交易来建立完整的数据表的存储跟踪。简单理解，就是开发中可以把自定义的数据（80个字节大小限制），存在OP\_RETURN，充当对交易永久备注的作用。并且不会被当成UTXO花掉。

`OP_RETURN [数据]`

这样我们也很容易理解，为什么说OP\_RETURN有潜力被当作一种可靠、安全的资产发行工具，数据一旦被添加到交易输出中，就不会被篡改和消失，相当于借用了比特币本身的安全性。

**三、那么如何查看OP\_RETURN？**

大部分区块浏览器都支持查看区块链的输出脚本，我们以oklink.com为例。搜索交易hash：[https://www.oklink.com/btc/tx/86d5b4471aa58818e9a93d95b38de877fbe542066aa7d57567c5f3e59787eb7a](https://www.oklink.com/btc/tx/86d5b4471aa58818e9a93d95b38de877fbe542066aa7d57567c5f3e59787eb7a)

![](https://storage.googleapis.com/papyrus_images/6d799956f0d1c16a59034292025dbfcfafe8cb171b1b93621dfd0a17eb523ecb.png)

点开输出脚本就可以看到

![](https://storage.googleapis.com/papyrus_images/26eb280a3587dc901b9a851fc21a27ccd418814fd0363c5b28a3b67768e97acf.png)

这里的格式为16进制，需要转换为字符串格式才可以看懂，我们复制这段16进制字符，随便找一个在线转换工具尝试下看看

![](https://storage.googleapis.com/papyrus_images/01f49d73ea7bbb5a153bfbccdd8b62b2d7313fd54618c430493d3670a9a6eaa5.png)

以上就是关于OP\_RETURN的学习。

---

*Originally published on [Rick_li](https://paragraph.com/@rick-li/L1GYL2qsWyjUeRmHR5di)*
