声明
这篇文章是基于我自己的理解整理的铭文调研。我对于比特币的了解还处在一个非常初级的阶段,对于区块链的认知更多在比特币生态上。如果你和我一样,几乎不了解比特币的技术原理和细节,那么就很适合阅读。
正文
在上一篇文章中简单地介绍了铭文:
但是这篇文章忽略了很多技术细节。这篇文章我将从一个实际的mint开始,深入理解铭文的实现细节。
首先我在unisat上发起mint(钱包地址:bc1ptkmzttnea75myw02gf298fua7srj3huj4xrnj2j93tmfzx6vl0fsywj9rg ):
在mempool上看到这笔交易:
可以看到7000 sats直接转给了bc1p7xphny3q96w50d4sfqvj6gzffxp0kpsdrky79zsn622rgxzrzcjqr96w0v 这个地址,这个地址。 先看第一笔交易的信息:
再来看7000sats转给了bc1p7xphny3q96w50d4sfqvj6gzffxp0kpsdrky79zsn622rgxzrzcjqr96w0v 这个地址之后发生了什么:
注意看这个地址的两笔交易中间隔了40多分钟,这是因为在第一笔交易收到转账再把这7000sats用于铭刻和支付服务费时,网络堵塞程度发生了变化,同样的gas fee确认时间变慢了。 可以这么理解:bc1p7xphny3q96w50d4sfqvj6gzffxp0kpsdrky79zsn622rgxzrzcjqr96w0v 这个地址实现了一个类似智能合约的东西(当然只是一个比喻,比特币没有智能合约),在收到7000sats之后,自动实现了:1.把546 sats(交易的最低额度)转给了mint的接收钱包,1904 sats支付给项目方作为服务费(这个类智能合约的地址是什么,我们后面再讲)。 f976dc6b6ad50583cc0d25b948d8ab48df3ca37a61de0208f3bceadf0c23e3a2 这笔交易也就是所谓的铭刻。我们可以看到这笔交易的输入数据明显比普通的交易数据多:
结合这篇文章来看,我们可以知道这个输入数据包含了铭文的信息。因此对于客户端来说,就可以通过识别这个钱包地址下的UTXO来识别这个地址拥有了哪些铭文。
用一张图可以很形象地描述这个过程:
我们再回到刚刚忽略的最重要的一个环节:bc1p7xphny3q96w50d4sfqvj6gzffxp0kpsdrky79zsn622rgxzrzcjqr96w0v 这个地址是什么?
给Ordinal绑定相应的内容,如图片、文字等的过程叫做Inscriptions。它主要基于2022年BTC Taproot升级之后引入的特性,可以在taproot脚本中存储任意数据(不超过4M),并且同样可以利用隔离见证的1/4手续费打折,非常便宜且NFT完全上链。 由于taproot脚本具有很好的隐蔽性,只有在花费该解锁脚本时才能揭示脚本的内容,因此mint过程分为两步:
commit: 创建一个taproot输出(该输出会提交到一个包含mint内容的解锁脚本,此时script本身还未上链,只是生成了一条taproot script路径), 并提交该交易;
reveal: 花费上述交易生成的UTXO,由于此时必须将包含mint内容的脚本作为输入来解锁上述UTXO,因此就在链上揭示了mint的内容。
关于commit和reveal的具体过程,可以参考这篇文章:
ARC-20
用wizz钱包来mint一个ARC-20代币就能很直观地理解了,在mint的时候,钱包贴心地标出了commit和reveal的费用。
并且,它在请求你签名的时候就已经把输入、输出都确定好了。你需要对这两个交易都进行签名。
第二笔交易:
进入mempool查看:
看到这里,你可能会有疑问。对于第一笔交易没有问题,因为是从我的钱包(地址)把钱转出去的,那么为什么我可以对第二笔交易进行操作?我并不拥有这个地址,我是又是如何做到“控制”这个地址,让它实现转账的?
这就涉及到了比特币的交易本质。对于中心化世界的开发者来说,可能会有一个惯性思维:一笔交易肯定是要提交到某个中心节点,经节点处理之后才形成全网唯一的id。但在加密世界中,交易id是交易内容的一个hash,它在交易内容确定的那一刻就被确定了,不需要经过节点的计算。
UTXO的本质就是一段包含了公钥的一段数据,谁拥有 UTXO 中公钥对应的私钥,谁就可以使用(即花费)这个 UTXO。 因此在比特币中,狭义上不存在“账户”这个概念。转账不是“我向某个地址转入了n个比特币”,而是我向全世界的人声明了,我这里有一笔交易,这笔交易里声明了比特币数量以及一个公钥,谁有这个公钥对应的私钥就能把这笔钱花掉。而所谓的“账户”实际上是这个公钥所关联的交易。
关于交易的全部细节,请查看这篇文章:
延伸阅读
震惊!交易id居然不是唯一的? https://blog.csdn.net/u014633283/article/details/104759834
比特币交易 https://segmentfault.com/a/1190000016757805
课后提问
另外一个问题是,为什么我不直接在一笔交易中就包含铭文的脚本,而是要分成commit和reveal两笔交易?