继 WEB3.php bytes[] 类型 编码结果错误的后续

  • Orange
  • 更新于 2023-03-09 10:08
  • 阅读 953

最近在项目中需要和智能合约进行交互,使用了web3p/web3.php进行编码和解码,但是发现与remixd的结果有些差异。

最近在项目中需要和智能合约进行交互,使用了 web3p/web3.php 进行编码和解码,但是发现与 remixd 的结果有些差异。参考了本站上的相关问题的解答,但并未完全解决问题。

针对这个问题,可以修改 SolidityType.php 中的 encod 方法。具体修改如下:

public function encode($value, $name)
    {

        if ($this->isDynamicArray($name)) {
            $length = count($value);

            $nestedName = $this->nestedName($name);
            $result = [];
            $result[] = IntegerFormatter::format($length);
            //解决 encode

            if ($this->isDynamicType($nestedName)){
                $start = 0;
                foreach ($value as $k => $val) {
                    if ($start == 0){
                        $l = $length * 32;
                    }else{
                        //FIXME: 修改这行即可
                        //$v_1 = Utils::toHex($value[$k-1]);
                        $v_1 = $this->inputFormat($value[$k-1], $nestedName);
                        $l = (floor((mb_strlen($v_1) + 63) / 64)+1)==2?((floor((mb_strlen($v_1) + 63) / 64)+1) * 32):((floor((mb_strlen($v_1) + 63) / 64)) * 32);

                    }

                    $start += $l;

                    $result[] = IntegerFormatter::format($start);
                }
            }

            foreach ($value as $val) {
                $result[] = $this->encode($val, $nestedName);
            }
            return $result;
        } elseif ($this->isStaticArray($name)) {
            $length = $this->staticArrayLength($name);
            $nestedName = $this->nestedName($name);
            $result = [];

            foreach ($value as $val) {
                $result[] = $this->encode($val, $nestedName);
            }
            return $result;
        }
        return $this->inputFormat($value, $name);
    }

Bytes[]数组属于变长类型的数据,编码规则如下:

(数组元素个数) (Value1 开始位置)(Value2 开始的位置)……  (Value1 的长度 + Value1) (Value2 的长度 + Value2) ……

这里点赞翻译小组的逆向EVM系列的文章,深受启发,有兴趣的可以看下逆向 EVM - 解析原始Calldata数据

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Orange
Orange
一个初涉web3领域的程序员