跳转到正文
buybitcoinsmart

术语表 /开发者参考

OP_HASH160

OP_HASH160是什么?
OP_HASH160 对栈顶元素先执行 SHA-256,再对结果执行 RIPEMD-160,得到20字节的摘要,也就是以1或3开头的每个地址中所含的同一指纹。

一个字节0xa9,代表密码学中研究最为充分的两种哈希函数。这种组合把32字节的输出缩短为20字节,并防范任一算法出现弱点,代价是碰撞抗性约为80位,而不是128位。正因如此,比特币地址才短到可以在电话里念出来。

运作方式

OP_HASH160 弹出任意长度的一个元素,并压入恰好20字节,相同的输入始终产生相同的摘要。

这两种函数来自互不相关的设计谱系。RIPEMD-160由一个欧洲学术团队于1996年公开发布;SHA-256出自 NSA,由 NIST 于2001年标准化。把两者串联是一种保守的选择。即使其中一个出现结构性破解,攻击者要伪造出有用的结果,仍要面对另一个函数,而三十年来,两者都没有被破解到威胁这一构造的程度。

缩短长度并非只是装饰。当目标是让一个永久的全球账本保持精简时,每个输出节省十二字节意义重大,这也是经典锁定脚本长为25字节而不是37字节的原因。

二十字节确实有上限。找到两个具有相同160位摘要的输入,大约需要2的80次方次运算,而不是2的128次方次;当只有您自己选择被哈希的密钥时,这是可以接受的,而当对手方参与选择所承诺的脚本时,就远没有那么令人放心了。这一理由正是隔离见证在 P2WSH 中把脚本承诺改为单个32字节 SHA-256,同时保留较短形式用于单密钥输出的原因。

在哪里会遇到它

OP_HASH160 存在于两种脚本模板中,而它的输出存在于您复制过的几乎每个地址之中。

传统输出对公钥执行它。支付到脚本哈希的输出对赎回脚本执行它。两种情形下,您看到的地址都是这个20字节的摘要,前面加一个版本字节(以1开头的地址为0x00,以3开头的地址为0x05),再包上 Base58Check 校验和。原生隔离见证的单密钥输出带有相同的20字节,但完全不出现操作码,因为这种输出类型的规则内置于验证器中,而不是写成脚本。

Taproot 打破了这一惯例。bc1p 输出直接承诺一个32字节的公钥,中间没有哈希步骤,因此 Taproot 地址中任何位置都不含 hash160。

这也是在硬件钱包屏幕上核对地址行之有效的实际原因。两个地址只要有任何不同,就会产生两个互不相关的摘要,所以被替换的地址不可能看起来几乎正确;把设备上地址的开头和结尾几个字符与电脑显示的内容比对,就足以发现剪贴板恶意软件。

OP_HASH160 vs SHA-256

SHA-256是一种哈希函数;OP_HASH160 是一条恰好调用它一次的指令。这个函数在比特币中到处出现,并不涉及任何脚本:工作量证明用它对区块头哈希两次,交易标识符是对它的两次连续应用,默克尔树也由它构建。该操作码只存在于 Bitcoin Script 之中,只在花费输出时运行,并且始终产生20字节,而不是32字节。它所执行的组合,即对 SHA-256的结果再做 RIPEMD-160,在钱包代码中十分常见,甚至有自己的名称 hash160,浏览某个库的函数列表时值得认出它。

请勿混淆

常见问题

为什么比特币要用两种不同的算法哈希两次?

有两个原因。第二次哈希把摘要从32字节缩短为20字节,从而缩短每个地址和每个输出脚本;使用两种互不相关的设计,意味着仅攻破其中一种算法并不足以伪造出匹配的结果。

20字节的哈希仍然安全吗?

对于普通的单密钥地址,是安全的。较弱的情形是脚本中有部分被哈希的内容由他人选定,因此隔离见证改为用完整的32字节 SHA-256来承诺脚本。

接着阅读

相关术语

开发者参考中的更多术语

阅读本页英文版