{"content":{"title":"【超硬核】逐个字节分析Ordinal的铸造交易","body":"作者：团长 [@quentangle_](https://twitter.com/quentangle_)\r\n\r\n---\r\n\r\n通过本文我们可以清楚的知道自己的的铭文在哪里，以及它是以什么样的形式构建的。\r\n\r\n我们随便在Ordinals的浏览器上找到一个Inscription交易，比如`2c69dcbfed33a02154e45285db2494aa3a9083ff39f31e90edeecd4791731c32`。\r\n\r\n获取到这个交易的rawtransaction（通过btc.com或其他比特币浏览器网站就可以获取到）是这样的\r\n\r\n```\r\n0200000000010132e88b831542e2ef752725db3bc12f1985f58a8973216ecb8358a39b51542d890900000000fdffffff01220200000000000016001429905f39cb0ce73cc04316e9a6d6cf043df853730340d9e4a42ba1cde3ee8e6166ad3bb314944ece41bb132ae0908283af67bd23e6b9a70cd6d75205ed964bb1d16701b1d2163133cdc873fe9b509ed81362aba746bb8820117f692257b2331233b5705ce9c682be8719ff1b2b64cbca290bd6faeb54423eac062a34852d8801750063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003a7b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2273617473222c22616d74223a22313030303030303030227d6821c0117f692257b2331233b5705ce9c682be8719ff1b2b64cbca290bd6faeb54423e00000000\r\n```\r\n\r\n下面我们就来分析一下这些数字都是什么意思。开始之前我们需要先介绍一些编程的基础概念：\r\n\r\n- 位（bit）：计算机处理的最小二进制单位，即0或1\r\n- 字节（byte）：每个字节由8个bit组成，0001 0001\r\n- 十六进制（hex）：每数到16就往前进一位的计数方式，1~9的数字和十进制一样，10~15的标记分别用abcdef标识，比如3a换成十进制就是3*16+10=58。之所以用十六进制，是因为十六进制的f换成二进制刚好是1111，也就是说一个字节的内容可以用两个十六进制字符完整表示。\r\n\r\n上面的rawtransaction中也是由许多个十六进制的数字表示的，其中每两个可见字符就是一个十六进制字节。\r\n\r\n| 字段名 | 说明 | 字段十进制长度（byte） | 内容 |\r\n| --- | --- | --- | --- |\r\n| version | 交易版本号 | 4 | 02000000 |\r\n| maker |  | 1 | 00 |\r\n| flag | witness标志位 | 1 | 01 |\r\n| input count | 输入的数量 | 1 | 01 |\r\n| previous output txid | 输入的前一个交易哈希 | 32 | 32e88b831542e2ef752725db3bc12f1985f58a8973216ecb8358a39b51542d89 |\r\n| previous output index | 输入的前一个交易索引 | 4 | 09000000 |\r\n| sequence | 序列号 | 4 | fdffffff |\r\n| output count | 输出数量 | 1 | 01 |\r\n| value | 输出的比特币数量 | 8 | 2202000000000000 |\r\n| pkscript len | 公钥脚本长度 | 1 | 16 |\r\n| pkscript | 公钥脚本 | 22 | 001429905f39cb0ce73cc04316e9a6d6cf043df85373 |\r\n| witness item count | witness数量 | 1 | 03 |\r\n| witness signature len | witness签名长度 | 1 | 40 |\r\n| witness signature | witness签名 | 64 | d9e4a42ba1cde3ee8e6166ad3bb314944ece41bb132ae0908283af67bd23e6b9a70cd6d75205ed964bb1d16701b1d2163133cdc873fe9b509ed81362aba746bb |\r\n| witness taproot script len | taproot脚本长度 | 1 | 88 |\r\n| witness taproot script (ordinal) | taproot脚本 | 136 | 20117f692257b2331233b5705ce9c682be8719ff1b2b64cbca290bd6faeb54423eac062a34852d8801750063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003a7b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2273617473222c22616d74223a22313030303030303030227d68 |\r\n| witness control block  len | witness 控制块长度 | 1 | 21 |\r\n| witness control block | witness 控制块 | 33 | c0117f692257b2331233b5705ce9c682be8719ff1b2b64cbca290bd6faeb54423e |\r\n| timelock | 时间锁 | 4 | 00000000 |\r\n\r\n其中witness taproot script中就保存了我们铸造的铭文，我们来进一步分析\r\n\r\n| 字段名 | 长度 | 内容 | 可读内容 |\r\n| --- | --- | --- | --- |\r\n| pubkey len | 1 | 20 |  |\r\n| pubkey | 32 | 117f692257b2331233b5705ce9c682be8719ff1b2b64cbca290bd6faeb54423e |  |\r\n| OP_CHECKSIG | 1 | ac |  |\r\n| taproot hash | 8 | 062a34852d880175 |  |\r\n| OP_FALSE | 1 | 00 |  |\r\n| OP_IF | 1 | 63 |  |\r\n| protocol name len | 1 | 03 |  |\r\n| protocol name | 3 | 6f7264 | ord |\r\n| OP_1 | 1 | 01 |  |\r\n| OP_1 | 1 | 01 |  |\r\n| content type len | 1 | 18 |  |\r\n| content type  | 24 | 746578742f706c61696e3b636861727365743d7574662d38 | text/plain;charset=utf-8 |\r\n| OP_0 | 1 | 00 |  |\r\n| inscription len | 1 | 3a |  |\r\n| inscription  | 58 | 7b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2273617473222c22616d74223a22313030303030303030227d | {\"p\":\"brc-20\",\"op\":\"mint\",\"tick\":\"sats\",\"amt\":\"100000000\"} |\r\n| OP_ENDIF | 1 | 68 |  |\r\n\r\n我们可以看到中`OP_FALSE`开始就完全是Ordinals协议定义的内容了，这里面就存储了铭文的知己内容。这里的内容是纯文本，如果是图片的话，Inscription字段就会很长。\r\n\r\n好了，现在任何一个Ordinals的交易你也会分析了，可以不用浏览器也知道铭文的内容了，虽然你并不想自己去解析。🤣"},"author":{"user":"https://learnblockchain.cn/people/320","address":null},"history":"QmZorL6ZsNzYSKZoUod8JoGCwDhCC7sRYQVdMsAHHMfNuX","timestamp":1684457211,"version":1}