内联汇编调用问题

小弟是个内联汇编新手,在学习的时候,偶尔想通过内联汇编的方式,去获取token的balance 但是代码在有的时候会被revert 实在找不出原因 求助各位大佬

合约两个方法的区别,仅仅是一个_user变量 一个是从bytes参数中mload出来的,一个是hardcode写死的 通过require可以判断两个值是想等的

但是使用mload出来的变量,合约执行会revert,写死的可以执行通过

求助各位大大帮忙解惑

image.png

请先 登录 后评论

最佳答案 2022-11-24 15:19

我已经找到原因了,不是这个问题

我通过

address _user = mload(add(data,21));

类似这样的方法,从bytes中取出一个地址的时候

读取的不是一个20个字节的地址类型,而是一个32字节的数据段,赋值给address类型,只是把前面的12个字节的内容『隐藏』了,而不是『清除』了

所以require在把_user当做address进行判断的时候,是没有出错的

但是其实user的前面的12个字节是有值的

通过mstore写入的时候,会把前面的值带入进去到memory中, 所以会在staticcall的时候出错

请先 登录 后评论

其它 1 个回答

影无双
请先 登录 后评论
  • 1 关注
  • 0 收藏,1789 浏览
  • 王虎 提出于 2022-11-24 13:48