比特币NFTs: Ordinals NFT 图片怎么从rawTransaction原始交易中解析

  • 石Tou
  • 更新于 2023-06-17 00:06
  • 阅读 2281

怎么从Ordinals NFT 铭文的原始交易数据解析出NFT图片?

首先非常感谢 团长 的文章《【超硬核】逐个字节分析Ordinal的铸造交易 》让我站在巨人的肩膀上学习了关于BTC Ordinals NFT 的铭文铸造的文本解析。另外推荐团长的Nation, 里面有更多关于Ordinals NFT的资料。

下面我站在巨人的肩膀上继续分析,团长的文章解决了铭文文本的分析,当我们要从原始交易hex中解析出图片,发现铭文图片的规律是和文本的规律是不一样的,下面👇来仔细分析。

我们随便在ordinalswallet的NFT交易市场上找到一个NFT,获取该NFT的hash,比如502b6af21e9a9018cb99a049cf8deb204b4005ea248c6289afb555b53ba563c6

获取到这个交易的rawtransaction(通过btc.com或其他比特币浏览器网站就可以获取到)是这样的

01000000000101e2bff279b8c5f2dda5784794ea2b31f0a878920ad9840a70aba48be76559fa4f0000000000fdffffff012202000000000000225120577ca45e419fc3cb0ae582a237c5b7169134b88ace788ad13abb8c8e81ce274a0340719d56c24c687368934022414f3f70aa9a02fc1c0f173bb774e85d91b1aefa54c05cad4a37461816199c0e82013ccdff0131802afbdcee64b7e2e8b1a4dbb4ecfd2102202b954d0d74972a22494197f89a84d8ad5de2c0e1aba7bcbb30be366dc781d751ac0063036f7264010109696d6167652f706e67004de80189504e470d0a1a0a0000000d4948445200000018000000180806000000e0773df800000006624b474400ff00ff00ffa0bda7930000019d494441544889ed95bd6ac25014c77f698a8a9b5b5f4110ba481fa07e40110a0e9241c8e020d44d7017f7b80a7550101c5a874ea26022cedd84822fe0e01394b610ec60efc5ab89a6a54eed1f2e49ce39f7fccf27d11e53e93527c4d9299dff13fc1182f3a086c6d491ef0fd7294526be7f44209c98560680483484511902506ee5363695a12f897668d1628ecd12481e0860052c8192a67992f86610736c38e21ce0e2885e12c41d9bd5d705115512b09a5922d1106faf1f7b97b7e52660d4267b594882452a2d4996c0ac99657624ba20d82b91a8a7b923ef56c700e8ba8eebba00dcdddfd2ad8ea5ac57d3f7089426c71d9b452a8d317594a90982b6cf24298bb6ebfc3b28b772caae08045e3481a7fab3a73cdfb8f2940726b87979a73c9803d02e5c2abaf260ee4bac9448a4d8ab4da44c8ce128119691e65bb63ca3445846efd503d96463ea50d0eb000cdc863430ad8cd2e87665886965e8d526f2e9e71c3c4a34701b9268934d43d1ef0e802031a6cef129da8e5ca0a875e43984a2d6f19c224920d8b7a3ff0df8fe7076b3e9af4bbefb615a19faeb92a7ee13fdad9d4f84103da00000000049454e44ae4260826821c12b954d0d74972a22494197f89a84d8ad5de2c0e1aba7bcbb30be366dc781d75100000000

下面我们就来分析一下这些数字都是什么意思。开始之前我们需要先介绍一些编程的基础概念:

  • 位(bit):计算机处理的最小二进制单位,即0或1
  • 字节(byte):每个字节由8个bit组成,0001 0001
  • 十六进制(hex):每数到16就往前进一位的计数方式。之所以用十六进制,是因为十六进制的f换成二进制刚好是1111,也就是说一个字节的内容可以用两个十六进制字符完整表示。

上面的rawtransaction中也是由许多个十六进制的数字表示的,其中每两个可见字符就是一个十六进制字节。

注意⚠️:NFT图片解析主要是研究witness taproot script数据的不同,前面字段的分析可以按照团长的文章对比看下,下面是前面字段分析的截图。

截屏2023-06-16 23.17.53.png

image.png

其中witness taproot script中就保存了我们铸造的图片铭文,我们来进一步分析图片类型的witness taproot script

字段名 长度 内容 可读内容
pubkey len 1 20
pubkey 32 2b954d0d74972a22494197f89a84d8ad5de2c0e1aba7bcbb30be366dc781d751
OP_CHECKSIG 1 ac
OP_FALSE 1 00
OP_IF 1 63
protocol name len 1 03
protocol name 3 6f7264 ord
OP_1 1 01
OP_1 1 01
content type len 1 09
content type 18 696d6167652f706e67 image/png
OP_0 1 00
image inscription 4de80189504e470d0a1a0a0000000d4948445200000018000000180806000000e0773df800000006624b474400ff00ff00ffa0bda7930000019d494441544889ed95bd6ac25014c77f698a8a9b5b5f4110ba481fa07e40110a0e9241c8e020d44d7017f7b80a7550101c5a874ea26022cedd84822fe0e01394b610ec60efc5ab89a6a54eed1f2e49ce39f7fccf27d11e53e93527c4d9299dff13fc1182f3a086c6d491ef0fd7294526be7f44209c98560680483484511902506ee5363695a12f897668d1628ecd12481e0860052c8192a67992f86610736c38e21ce0e2885e12c41d9bd5d705115512b09a5922d1106faf1f7b97b7e52660d4267b594882452a2d4996c0ac99657624ba20d82b91a8a7b923ef56c700e8ba8eebba00dcdddfd2ad8ea5ac57d3f7089426c71d9b452a8d317594a90982b6cf24298bb6ebfc3b28b772caae08045e3481a7fab3a73cdfb8f2940726b87979a73c9803d02e5c2abaf260ee4bac9448a4d8ab4da44c8ce128119691e65bb63ca3445846efd503d96463ea50d0eb000cdc863430ad8cd2e87665886965e8d526f2e9e71c3c4a34701b9268934d43d1ef0e802031a6cef129da8e5ca0a875e43984a2d6f19c224920d8b7a3ff0df8fe7076b3e9af4bbefb615a19faeb92a7ee13fdad9d4f84103da00000000049454e44ae426082 png图片的原始数据
OP_ENDIF 1 68

我们可以看到中image inscription 图片的铭文的具体数据,初步拿到这个数据,就知道代表的是图片的十六进制格式,但是根据图片类型来转化的时候就直接保存。 在线十六进制数据转化为图片的网站

截屏2023-06-16 23.35.24.png

具体原因如下: hex原始交易存储图片数据的时候会切分数据块,在切分好的数据块后,在数据块之前加上切割的标志位,然后通过标志位拼接切分好的数据块来做为原始数据,最终的NFT图片数据是要从raw transaction交易中的hex来删除图片的标志位,然后拼接成原始的图片数据, 简单理解也就是铭文图片铸造上链的图片数据是添加了标志位打包数据上链的,如果从链上拿到原始数据来解析NFT 图片,那么需要删除图片的标志位才,才能解析出真正的图片,下面就主要是寻找图片标志位的规律。

图片数据块切分规律: 1.当图片数据整体长度小于76 2=152时,图片数据块前面的标志位也就是等于图片的长度,只占1个字节,也就是数据的长度。 2.当图片数据整体长度小于255 2=510时,图片数据块前面的标志位硬编码是“4c”+数据长度的LittleEndian小端序数据, 字面意思也就是数据块的标志位=4d+1字节, 上面图片的标志位为4d+0xXX.

  1. 当图片数据整体长度小于520 2=1040时,图片数据块前面的标志位硬编码是“4d”+数据长度的LittleEndian*小端序数据, 字面意思也就是数据块的标志位=4d+2字节, 上面图片的标志位为4de801

原理: 图片数据的填充规则是BTC底层源码中超过一定量的数据进行切分填充标志位,所以上面的参数76,255,520对应底层硬编码为“OP_PUSHDATA1”, “0xff”,“0xffff”。

上面样例数据分析结果:image inscription 数据长度小于1040,所以数据的标志位为"4de801", 解析出图片为:

截屏2023-06-16 23.54.37.png

总结: 1.搞清楚原始交易中nft图片拼接规则,然后反解析出图片的原始数据,最后把数据转化为图片。

点赞 5
收藏 4
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
石Tou
石Tou
江湖只有他的大名,没有他的介绍。