# 深入理解铭文（一）

By [大白话web3](https://paragraph.com/@daniel-ng) · 2024-01-28

---

**声明**

这篇文章是基于我自己的理解整理的铭文调研。我对于比特币的了解还处在一个非常初级的阶段，对于区块链的认知更多在比特币生态上。如果你和我一样，几乎不了解比特币的技术原理和细节，那么就很适合阅读。

**正文**

在上一篇文章中简单地介绍了铭文：

[https://mirror.xyz/daniel-ng.eth/RmS4HNgi-C3pwWgn9V73vd2xSSKzlYjD8ZYA5f-JtiQ](https://mirror.xyz/daniel-ng.eth/RmS4HNgi-C3pwWgn9V73vd2xSSKzlYjD8ZYA5f-JtiQ)

但是这篇文章忽略了很多技术细节。这篇文章我将从一个实际的mint开始，深入理解铭文的实现细节。

首先我在unisat上发起mint（钱包地址：bc1ptkmzttnea75myw02gf298fua7srj3huj4xrnj2j93tmfzx6vl0fsywj9rg ）：

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

在mempool上看到这笔交易：

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

可以看到7000 sats直接转给了bc1p7xphny3q96w50d4sfqvj6gzffxp0kpsdrky79zsn622rgxzrzcjqr96w0v 这个地址，这个地址。 先看第一笔交易的信息：

![](https://storage.googleapis.com/papyrus_images/608ef0eb44ff0931816f24f68c7ddf94a9288d6d1b11da4ca95cf88121be7c99.png)

再来看7000sats转给了bc1p7xphny3q96w50d4sfqvj6gzffxp0kpsdrky79zsn622rgxzrzcjqr96w0v 这个地址之后发生了什么：

![](https://storage.googleapis.com/papyrus_images/0d5d2591e4473b0dfc43e682113c8052012a6bd259246dd71139f7c7239c2735.png)

注意看这个地址的两笔交易中间隔了40多分钟，这是因为在第一笔交易收到转账再把这7000sats用于铭刻和支付服务费时，网络堵塞程度发生了变化，同样的gas fee确认时间变慢了。 可以这么理解：bc1p7xphny3q96w50d4sfqvj6gzffxp0kpsdrky79zsn622rgxzrzcjqr96w0v 这个地址实现了一个类似智能合约的东西（当然只是一个比喻，比特币没有智能合约），在收到7000sats之后，自动实现了：1.把546 sats（交易的最低额度）转给了mint的接收钱包，1904 sats支付给项目方作为服务费（这个类智能合约的地址是什么，我们后面再讲）。 f976dc6b6ad50583cc0d25b948d8ab48df3ca37a61de0208f3bceadf0c23e3a2 这笔交易也就是所谓的铭刻。我们可以看到这笔交易的输入数据明显比普通的交易数据多：

![](https://storage.googleapis.com/papyrus_images/47fe8db81111cffb690e170fba1efabccb733360980118dbc51e43c09d9a06ea.png)

结合[这篇文章](https://medium.com/@quentangle/%E8%B6%85%E7%A1%AC%E6%A0%B8-%E9%80%90%E4%B8%AA%E5%AD%97%E8%8A%82%E5%88%86%E6%9E%90ordinal%E7%9A%84%E9%93%B8%E9%80%A0%E4%BA%A4%E6%98%93-2e1e122ba18d)来看，我们可以知道这个输入数据包含了铭文的信息。因此对于客户端来说，就可以通过识别这个钱包地址下的UTXO来识别这个地址拥有了哪些铭文。

用一张图可以很形象地描述这个过程：

![](https://storage.googleapis.com/papyrus_images/2832bec2d0534ee6a38d39fd3f59a9915e9ad9f11fab23c3135da13346600169.png)

我们再回到刚刚忽略的最重要的一个环节：bc1p7xphny3q96w50d4sfqvj6gzffxp0kpsdrky79zsn622rgxzrzcjqr96w0v 这个地址是什么？

给Ordinal绑定相应的内容，如图片、文字等的过程叫做Inscriptions。它主要基于2022年BTC Taproot升级之后引入的特性，可以在taproot脚本中存储任意数据(不超过4M)，并且同样可以利用隔离见证的1/4手续费打折，非常便宜且NFT完全上链。 由于taproot脚本具有很好的隐蔽性，只有在花费该解锁脚本时才能揭示脚本的内容，因此mint过程分为两步:

*   commit: 创建一个taproot输出(该输出会提交到一个包含mint内容的解锁脚本，此时script本身还未上链，只是生成了一条taproot script路径), 并提交该交易;
    
*   reveal: 花费上述交易生成的UTXO，由于此时必须将包含mint内容的脚本作为输入来解锁上述UTXO，因此就在链上揭示了mint的内容。
    

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

关于commit和reveal的具体过程，可以参考这篇文章：

[https://en.foresightnews.pro/unveiling-the-mysteries-of-ordinal-inscriptions-a-comprehensive-and-in-depth-popular-science-interpretation/](https://en.foresightnews.pro/unveiling-the-mysteries-of-ordinal-inscriptions-a-comprehensive-and-in-depth-popular-science-interpretation/)

**ARC-20**

用wizz钱包来mint一个ARC-20代币就能很直观地理解了，在mint的时候，钱包贴心地标出了commit和reveal的费用。

![](https://storage.googleapis.com/papyrus_images/387baed08124efe44862bd33ac3bbd72dd534aa232c07fad8c4d8542cef28333.png)

并且，它在请求你签名的时候就已经把输入、输出都确定好了。你需要对这两个交易都进行签名。

![](https://storage.googleapis.com/papyrus_images/0222984f42602ac9c966322a15779d8c662fb59eeb3924580afc7d338ea301ee.png)

第二笔交易：

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

进入mempool查看：

![](https://storage.googleapis.com/papyrus_images/9f427076f64853e907e211867ee7b916ceac2d14b941dfe17113b570aa3448c9.png)

看到这里，你可能会有疑问。对于第一笔交易没有问题，因为是从我的钱包（地址）把钱转出去的，那么为什么我可以对第二笔交易进行操作？我并不拥有这个地址，我是又是如何做到“控制”这个地址，让它实现转账的？

这就涉及到了比特币的交易本质。对于中心化世界的开发者来说，可能会有一个惯性思维：一笔交易肯定是要提交到某个中心节点，经节点处理之后才形成全网唯一的id。但在加密世界中，交易id是交易内容的一个hash，它在交易内容确定的那一刻就被确定了，不需要经过节点的计算。

UTXO的本质就是一段包含了公钥的一段数据，谁拥有 UTXO 中公钥对应的私钥，谁就可以使用（即花费）这个 UTXO。 因此在比特币中，狭义上不存在“账户”这个概念。转账不是“我向某个地址转入了n个比特币”，而是我向全世界的人声明了，我这里有一笔交易，这笔交易里声明了比特币数量以及一个公钥，谁有这个公钥对应的私钥就能把这笔钱花掉。而所谓的“账户”实际上是这个公钥所关联的交易。

关于交易的全部细节，请查看这篇文章：

[https://aandds.com/blog/bitcoin-tx.html](https://aandds.com/blog/bitcoin-tx.html)

**延伸阅读**

震惊！交易id居然不是唯一的？ [https://blog.csdn.net/u014633283/article/details/104759834](https://blog.csdn.net/u014633283/article/details/104759834)

比特币交易 [https://segmentfault.com/a/1190000016757805](https://segmentfault.com/a/1190000016757805)

**课后提问**

另外一个问题是，为什么我不直接在一笔交易中就包含铭文的脚本，而是要分成commit和reveal两笔交易？

---

*Originally published on [大白话web3](https://paragraph.com/@daniel-ng/NIYq12LyNtLo2zkhXapu)*
