怎么从Ordinals NFT 铭文的原始交易数据解析出NFT图片?
首先非常感谢 团长 的文章《【超硬核】逐个字节分析Ordinal的铸造交易 》让我站在巨人的肩膀上学习了关于BTC Ordinals NFT 的铭文铸造的文本解析。另外推荐团长的Nation, 里面有更多关于Ordinals NFT的资料。
下面我站在巨人的肩膀上继续分析,团长的文章解决了铭文文本的分析,当我们要从原始交易hex中解析出图片,发现铭文图片的规律是和文本的规律是不一样的,下面👇来仔细分析。
我们随便在ordinalswallet的NFT交易市场上找到一个NFT,获取该NFT的hash,比如502b6af21e9a9018cb99a049cf8deb204b4005ea248c6289afb555b53ba563c6
。
获取到这个交易的rawtransaction(通过btc.com或其他比特币浏览器网站就可以获取到)是这样的
01000000000101e2bff279b8c5f2dda5784794ea2b31f0a878920ad9840a70aba48be76559fa4f0000000000fdffffff012202000000000000225120577ca45e419fc3cb0ae582a237c5b7169134b88ace788ad13abb8c8e81ce274a0340719d56c24c687368934022414f3f70aa9a02fc1c0f173bb774e85d91b1aefa54c05cad4a37461816199c0e82013ccdff0131802afbdcee64b7e2e8b1a4dbb4ecfd2102202b954d0d74972a22494197f89a84d8ad5de2c0e1aba7bcbb30be366dc781d751ac0063036f7264010109696d6167652f706e67004de80189504e470d0a1a0a0000000d4948445200000018000000180806000000e0773df800000006624b474400ff00ff00ffa0bda7930000019d494441544889ed95bd6ac25014c77f698a8a9b5b5f4110ba481fa07e40110a0e9241c8e020d44d7017f7b80a7550101c5a874ea26022cedd84822fe0e01394b610ec60efc5ab89a6a54eed1f2e49ce39f7fccf27d11e53e93527c4d9299dff13fc1182f3a086c6d491ef0fd7294526be7f44209c98560680483484511902506ee5363695a12f897668d1628ecd12481e0860052c8192a67992f86610736c38e21ce0e2885e12c41d9bd5d705115512b09a5922d1106faf1f7b97b7e52660d4267b594882452a2d4996c0ac99657624ba20d82b91a8a7b923ef56c700e8ba8eebba00dcdddfd2ad8ea5ac57d3f7089426c71d9b452a8d317594a90982b6cf24298bb6ebfc3b28b772caae08045e3481a7fab3a73cdfb8f2940726b87979a73c9803d02e5c2abaf260ee4bac9448a4d8ab4da44c8ce128119691e65bb63ca3445846efd503d96463ea50d0eb000cdc863430ad8cd2e87665886965e8d526f2e9e71c3c4a34701b9268934d43d1ef0e802031a6cef129da8e5ca0a875e43984a2d6f19c224920d8b7a3ff0df8fe7076b3e9af4bbefb615a19faeb92a7ee13fdad9d4f84103da00000000049454e44ae4260826821c12b954d0d74972a22494197f89a84d8ad5de2c0e1aba7bcbb30be366dc781d75100000000
下面我们就来分析一下这些数字都是什么意思。开始之前我们需要先介绍一些编程的基础概念:
上面的rawtransaction中也是由许多个十六进制的数字表示的,其中每两个可见字符就是一个十六进制字节。
注意⚠️:NFT图片解析主要是研究witness taproot script数据的不同,前面字段的分析可以按照团长的文章对比看下,下面是前面字段分析的截图。
其中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
图片的铭文的具体数据,初步拿到这个数据,就知道代表的是图片的十六进制格式,但是根据图片类型来转化的时候就直接保存。
在线十六进制数据转化为图片的网站:
具体原因如下: hex原始交易存储图片数据的时候会切分数据块,在切分好的数据块后,在数据块之前加上切割的标志位,然后通过标志位拼接切分好的数据块来做为原始数据,最终的NFT图片数据是要从raw transaction交易中的hex来删除图片的标志位,然后拼接成原始的图片数据, 简单理解也就是铭文图片铸造上链的图片数据是添加了标志位打包数据上链的,如果从链上拿到原始数据来解析NFT 图片,那么需要删除图片的标志位才,才能解析出真正的图片,下面就主要是寻找图片标志位的规律。
图片数据块切分规律: 1.当图片数据整体长度小于76 2=152时,图片数据块前面的标志位也就是等于图片的长度,只占1个字节,也就是数据的长度。 2.当图片数据整体长度小于255 2=510时,图片数据块前面的标志位硬编码是“4c”+数据长度的LittleEndian小端序数据, 字面意思也就是数据块的标志位=4d+1字节, 上面图片的标志位为4d+0xXX.
原理: 图片数据的填充规则是BTC底层源码中超过一定量的数据进行切分填充标志位,所以上面的参数76,255,520对应底层硬编码为“OP_PUSHDATA1”, “0xff”,“0xffff”。
上面样例数据分析结果:image inscription 数据长度小于1040,所以数据的标志位为"4de801", 解析出图片为:
总结: 1.搞清楚原始交易中nft图片拼接规则,然后反解析出图片的原始数据,最后把数据转化为图片。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!