术语表 /挖矿与共识
SHA-256
又称 SHA256。
- SHA-256是什么?
- SHA-256接受任意长度的输入,返回一个32字节的指纹,该指纹每次都完全相同,事先无法预测,也无法反向推出输入。
比特币几乎处处依赖这同一个函数:区块哈希、交易 ID、默克尔树、地址校验和,以及助记词中的校验和。其输出为256位,以64个十六进制字符表示,取自约1.2乘以10的77次方个取值构成的空间。正是这套算术,在您的比特币发往任何地方之前,就能发现输错的地址。
运作方式
SHA-256将输入切分为多个512位的数据块,并让每个数据块经过64轮移位、循环移位和加法运算的混合处理。
被混合的状态是八个32位的字,其初始值取自前八个素数平方根的小数部分,而64个轮常数则取自前64个素数的立方根。这样的来源正是关键所在:这些数字不可能出于某种隐藏的理由而被选定,设计者借此论证算法中没有后门。该算法由美国国家安全局设计,并由 NIST 于2001年发布,现行规范为 FIPS 180-4。
比特币真正用到的是三个特性。该函数是确定性的,因此任何地方的任何机器,对相同的字节都会得出相同的摘要。它具有雪崩效应,输入改变一个比特,输出中约一半的比特会随之改变,且两者之间没有任何规律可循。它还能抵御反向运算:目前没有人找到比暴力破解更快的方法,既无法从摘要恢复出输入,也无法构造出两个摘要相同的输入。SHA-1在2017年2月被实际碰撞攻破,研究人员为此耗费了大量计算,而这一结果完全没有延伸到 SHA-2。
比特币很少只调用一次。区块头、交易 ID、默克尔节点,以及点对点消息上的校验和,都使用双重哈希,即对摘要再做一次哈希。地址哈希则走另一条路径,即对 SHA-256摘要再应用 RIPEMD-160,传统地址的20字节载荷由此而来。Taproot 又一次打破了这一模式:BIP340 定义了带标签的哈希,只调用一次 SHA-256,并附带一个用于域分离的前缀,使某一用途的签名无法被重放用于另一用途。
在哪里会遇到它
区块浏览器中每一个64字符的十六进制字符串,都是 SHA-256的输出。其中包括您粘贴到支持工单中的交易 ID,以及以一长串零开头的区块哈希,后者正是满足目标值的区块头的样子。
持有比特币时,有两处与您直接相关。助记词带有用该函数生成的校验和:12个单词编码了128位随机数,外加取自该随机数 SHA-256摘要的4位校验位,因此有一个单词错误的助记词,约有15/16的概率会被拒绝,而不会悄无声息地打开一个空钱包。传统地址也有类似的防护,即经两次 SHA-256运算得到的4字节校验和,使随机输入错误恰好产生有效地址的概率约为43亿分之1。
挖矿硬件的用途仅限于此。ASIC 是只计算这一个函数的芯片,因此比特币矿机无法改作基于其他算法的区块链,而 SHA-256币这一说法指的是整个分叉家族。请注意这一切的局限:校验和能发现您输错的地址,却发现不了被恶意软件替换成另一个完全有效、但并不属于您的地址。