赞
踩
写这篇文章的起因,是我在前端调试合约的时候,发现合约报错了,点开命令行报错,发现返回的是合约的 callData
,我直接表演一个眼前一黑,我怎么直接的知道是调用哪个方法的时候报错呢? 于是有了这篇文章的探索
目标: 如何根据 callData
解析出调用函数
内容:从合约小白的角度,从哈希函数的前世今生开始讲起。如果你已经很了解这部分内容,可以直接划到底。
-用到的库: ethers \ foundry
这一个部分直接引用 WTF 课程里对哈希函数的描述,讲解的很详细。 感谢社区的力量 github.com/AmazingAng/WTFSolidity
哈希函数(hash function)是一个密码学概念,它可以将任意长度的消息转换为一个固定长度的值,这个值也称作哈希(hash)。这一讲,我们简单介绍一下哈希函数及在solidity
的应用
一个好的哈希函数应该具有以下几个特性:
x
,找到另一个消息x'
使得hash(x) = hash(x')
是困难的。x
和x'
,使得hash(x) = hash(x')
是困难的。Keccak256
函数是solidity
中最常用的哈希函数,用法非常简单:
哈希 = keccak256(数据);
这是一个很有趣的事情:
介绍完定义,我们回归到文章主题,第一步,如何把 balanceOf(address) => 0x70a08231
ethers.utils.id('balanceOf(address)')
可以看到输入一个 text
, 会返回一个 KECCAK256
的哈希
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6OiB8Te-1683731069929)(Img/img_2.png)]
先将 String
转换成 Utf8Bytes
的格式,然后再用 keccak256
哈希加密. 这里要注意不能直接 ethers.utils.keccak256(
balanceOf(address))
这种方式会报错,keccak256
只支持 DataHexstring
格式的转换
const textToUtf8Bytes = ethers.utils.toUtf8Bytes('balanceOf(address)')
const hashResult = ethers.utils.keccak256(textToUtf8Bytes)
textToUtf8Bytes
可以用 ethers.utils.toUtf8String
反解出 String
输出如下,除开 0x 的前四个bytes 70a08231
为我们要的目标函数的哈希:
上面我们获得了函数的哈希,那么现在到第二步,如何把 0x70a08231 => balanceOf(address)
Text Signature
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。