跳转到正文
buybitcoinsmart

术语表 /开发者参考

RPC 字节序

RPC 字节序是什么?
RPC 字节序是比特币软件显示32字节哈希时采用的反转方式,也是您从钱包或区块浏览器复制的每个交易 ID 所采用的形式。

您的钱包称为交易 ID 的64个字符的字符串,其字节顺序与这些字节在其他任何地方的顺序并不相同。Bitcoin Core 将哈希保存在一种以最高有效字节在前的方式打印的类型中,所有区块浏览器都沿用了这一习惯,这一约定如今已成定局。把标识符粘贴到搜索框时,它无伤大雅;把它粘贴到代码中时,代价却很高。

运作方式

RPC 字节序是节点输出时应用的一种显示转换,并不是另一种哈希。

摘要从 SHA-256输出时是32个字节,本身没有固有的方向。Bitcoin Core 把它存放在一个容器中,该容器将这些字节视为一个极大的数字,而打印数字时最高有效部分在左,这就使字节数组发生了反转。每个指代区块或交易的 JSON 字段都以这种方式输出:getblockhash 返回的 hash、getrawtransaction 返回的 txid、getblock 返回的 merkleroot,以及将区块与其父区块相连的 previousblockhash。

每个区块浏览器的首页上都能看到一个后果。工作量证明产生的摘要,在这种打印方向上以一长串零开头。这些零位于原始字节的另一端。挖矿目标在打印形式下更容易推理,这也是这一约定得以保留、而没有被整理修正的部分原因。

这种反转仅适用于哈希。公钥、签名、脚本和见证项都按其真实顺序打印,因此可以将 decodescript 得到的脚本直接与原始交易比对,而 txid 则不能。混淆这两条规则,正是可正常运行的代码通常出错的地方。

同一个响应中甚至可以同时包含两种约定。以详细输出请求一笔交易时,txid 字段是反转的,而紧挨着它的 hex 字段是未经改动的序列化数据,其中包含的是顺序相反的同一个哈希。

在哪里会遇到它

对大多数人而言,RPC 字节序是他们接触到的唯一一种哈希形式。

交易所在提币确认邮件中写的是它,区块浏览器的网址中要求的是它,客服人员请您发送的是它,bitcoin-cli 打印的也是它。用 getblockhash 0向节点请求第一个区块,返回000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f,把这个字符串粘贴到任何区块浏览器中,都会指向2009年1月3日挖出的区块。

这种失败情形范围很窄,表现也很一致。有人自行计算交易标识符,对序列化数据做两次 SHA-256哈希,再与区块浏览器比对,发现两者毫无相似之处。两个字符串是同样的32个字节,其中一个需要反转。当脚本从原始输入中提取 txid,并在从 API 收集的标识符表中查找它时,同样的修正方法也适用。

有一个只需两秒的习惯值得养成。如果别人发给您的哈希无法查到任何结果,在断定该交易不存在之前,请先把它反过来试一试。支持类的讨论帖中充斥着从原始数据而非钱包中复制的哈希,它们看上去完全有效,直到被反转为止。

请勿混淆

常见问题

我的交易所给我的交易 ID 是 RPC 字节序吗?

是。所有钱包、交易所和区块浏览器都以这种反转的显示顺序给出哈希,因此您拿到的字符串可以不经任何转换,直接粘贴到区块浏览器中。

我计算出的 txid 与区块浏览器显示的不一致。是哪里出了问题?

几乎可以肯定,除字节序之外没有别的问题。对序列化后的交易做两次 SHA-256哈希,得到的是内部顺序的摘要,与节点或区块浏览器打印的任何内容比较之前,必须先将这32个字节反转。

相关术语

开发者参考中的更多术语

阅读本页英文版