当前位置:   article > 正文

Solidity中哈希函数的编码与解码_哈希解码

哈希解码

起因

写这篇文章的起因,是我在前端调试合约的时候,发现合约报错了,点开命令行报错,发现返回的是合约的 callData,我直接表演一个眼前一黑,我怎么直接的知道是调用哪个方法的时候报错呢? 于是有了这篇文章的探索

  • 目标: 如何根据 callData 解析出调用函数

  • 内容:从合约小白的角度,从哈希函数的前世今生开始讲起。如果你已经很了解这部分内容,可以直接划到底。
    -用到的库: ethers \ foundry

在这里插入图片描述

哈希函数的前世今生

这一个部分直接引用 WTF 课程里对哈希函数的描述,讲解的很详细。 感谢社区的力量 github.com/AmazingAng/WTFSolidity


哈希函数(hash function)是一个密码学概念,它可以将任意长度的消息转换为一个固定长度的值,这个值也称作哈希(hash)。这一讲,我们简单介绍一下哈希函数及在solidity的应用

一个好的哈希函数应该具有以下几个特性

  • 单向性:从输入的消息到它的哈希的正向运算简单且唯一确定,而反过来非常难,只能靠暴力枚举。
  • 灵敏性:输入的消息改变一点对它的哈希改变很大。
  • 高效性:从输入的消息到哈希的运算高效。
  • 均一性:每个哈希值被取到的概率应该基本相等。
  • 抗碰撞性:
    • 弱抗碰撞性:给定一个消息x,找到另一个消息x'使得hash(x) = hash(x')是困难的。
    • 强抗碰撞性:找到任意xx',使得hash(x) = hash(x')是困难的。

Hash的应用

  • 生成数据唯一标识
  • 加密签名
  • 安全加密

Keccak256

Keccak256函数是solidity中最常用的哈希函数,用法非常简单:

哈希 = keccak256(数据);
  • 1

Keccak256和sha3

这是一个很有趣的事情:

  1. sha3由keccak标准化而来,在很多场合下Keccak和SHA3是同义词,但在2015年8月SHA3最终完成标准化时,NIST调整了填充算法。所以SHA3就和keccak计算的结果不一样,这点在实际开发中要注意。
  2. 以太坊在开发的时候sha3还在标准化中,所以采用了keccak,所以Ethereum和Solidity智能合约代码中的SHA3是指Keccak256,而不是标准的NIST-SHA3,为了避免混淆,直接在合约代码中写成Keccak256是最清晰的。

生成函数哈希

介绍完定义,我们回归到文章主题,第一步,如何把 balanceOf(address) => 0x70a08231

  • ethers库里提供了两种方式
  1. ethers.utils.id('balanceOf(address)') 可以看到输入一个 text, 会返回一个 KECCAK256 的哈希
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6OiB8Te-1683731069929)(Img/img_2.png)]

  2. 先将 String 转换成 Utf8Bytes 的格式,然后再用 keccak256 哈希加密. 这里要注意不能直接 ethers.utils.keccak256(balanceOf(address)) 这种方式会报错,keccak256 只支持 DataHexstring 格式的转换

    在这里插入图片描述

const textToUtf8Bytes = ethers.utils.toUtf8Bytes('balanceOf(address)')
const hashResult = ethers.utils.keccak256(textToUtf8Bytes)
  • 1
  • 2
  1. 补充上面 textToUtf8Bytes 可以用 ethers.utils.toUtf8String 反解出 String

输出如下,除开 0x 的前四个bytes 70a08231 为我们要的目标函数的哈希:

在这里插入图片描述

反解哈希函数

上面我们获得了函数的哈希,那么现在到第二步,如何把 0x70a08231 => balanceOf(address)

  • 反解也是两种方式 (可能不全,我目前只知道这两个办法)
  • 第一种: bytes4_signature 可以理解为一个巨大的 Text Signature
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/277569
推荐阅读
相关标签