{"content":{"title":"继 WEB3.php bytes[] 类型 编码结果错误的后续","body":"最近在项目中需要和智能合约进行交互，使用了 web3p/web3.php 进行编码和解码，但是发现与 remixd 的结果有些差异。参考了本站上的[相关问题的解答](https://learnblockchain.cn/question/3369)，但并未完全解决问题。\r\n\r\n针对这个问题，可以修改 SolidityType.php 中的 encod 方法。具体修改如下：\r\n\r\n```\r\npublic function encode($value, $name)\r\n    {\r\n\r\n        if ($this->isDynamicArray($name)) {\r\n            $length = count($value);\r\n\r\n            $nestedName = $this->nestedName($name);\r\n            $result = [];\r\n            $result[] = IntegerFormatter::format($length);\r\n            //解决 encode\r\n\r\n            if ($this->isDynamicType($nestedName)){\r\n                $start = 0;\r\n                foreach ($value as $k => $val) {\r\n                    if ($start == 0){\r\n                        $l = $length * 32;\r\n                    }else{\r\n                        //FIXME: 修改这行即可\r\n                        //$v_1 = Utils::toHex($value[$k-1]);\r\n                        $v_1 = $this->inputFormat($value[$k-1], $nestedName);\r\n                        $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);\r\n\r\n                    }\r\n\r\n                    $start += $l;\r\n\r\n                    $result[] = IntegerFormatter::format($start);\r\n                }\r\n            }\r\n\r\n            foreach ($value as $val) {\r\n                $result[] = $this->encode($val, $nestedName);\r\n            }\r\n            return $result;\r\n        } elseif ($this->isStaticArray($name)) {\r\n            $length = $this->staticArrayLength($name);\r\n            $nestedName = $this->nestedName($name);\r\n            $result = [];\r\n\r\n            foreach ($value as $val) {\r\n                $result[] = $this->encode($val, $nestedName);\r\n            }\r\n            return $result;\r\n        }\r\n        return $this->inputFormat($value, $name);\r\n    }\r\n```\r\nBytes[]数组属于变长类型的数据,编码规则如下：\r\n```\r\n(数组元素个数) （Value1 开始位置）(Value2 开始的位置)……  (Value1 的长度 + Value1) (Value2 的长度 + Value2) ……\r\n```\r\n\r\n这里点赞[翻译小组](https://learnblockchain.cn/people/412)的逆向EVM系列的文章，深受启发，有兴趣的可以看下[逆向 EVM - 解析原始Calldata数据](https://learnblockchain.cn/article/5244)。"},"author":{"user":"https://learnblockchain.cn/people/5520","address":null},"history":"QmNtwajeiBNfxEsBrETG82LXVK1qyj1dG1ntBqU1xN7pMM","timestamp":1678327731,"version":1}