ApeWorX / ApeWorX/eth-abi

encodePacked appears to have different behavior from solidity for complex types

Open
#149 2 comments 0 reactions 0 assignees View on GitHub
Needs Review p3
Dominant language
Python
Stars
256
Forks
117
Avg merge
4m
Merged PRs (30d)
1

Description

For arrays, encodePacked appears to fall back to standard encoding.

https://github.com/ethereum/eth-abi/blob/decaadcdf7a33020846aafd9ba36859c1ab82909/eth_abi/encoding.py#L666
->
https://github.com/ethereum/eth-abi/blob/decaadcdf7a33020846aafd9ba36859c1ab82909/eth_abi/encoding.py#L615-L631

However, solidity skips the length and pads dynamic array elements with zeros:
https://docs.soliditylang.org/en/v0.8.6/abi-spec.html#non-standard-packed-mode
> The encoding of an array is the concatenation of the encoding of its elements **with** padding.

cf. https://github.com/ethereum/solidity/issues/8441 for an example of the current padding scheme.

Additionally, and please correct me if I'm wrong here, eth-abi appears to encode bytestrings in tuples without padding as in the tests here

https://github.com/ethereum/eth-abi/blob/decaadcdf7a33020846aafd9ba36859c1ab82909/tests/common/unit.py#L166-L171

However my cursory reading of solc output says that they are in fact padded. (solidity disallows structs in abi.encodePacked, but it uses the packed encoding code path to calculate event indexes).
[event.ir.txt](https://github.com/ethereum/eth-abi/files/6912947/event.ir.txt)
[event.sol.txt](https://github.com/ethereum/eth-abi/files/6912948/event.sol.txt)

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.