abi.encodeLleno de muchos ceros

Según esta documentación

los tipos de menos de 32 bytes no se rellenan con ceros ni se extienden con signo y

Cuando uso abi.encodePacked(address, uint, uint, address) obtengo un resultado con muchos ceros. Por ejemplo:

address addr = "0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C";
uint x = 123;

abi.encodePacked(addr , x , x , addr)
0x14723a09acff6d2a60dcdf7aa4aff308fddc160c000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b14723a09acff6d2a60dcdf7aa4aff308fddc160c

¿No debería ser sin ceros?

Cambie uint a uint8 y vuelva a intentarlo

Respuestas (2)

uint es de 256 bits, por lo que todo está codificado correctamente:

first parameter:  14723a09acff6d2a60dcdf7aa4aff308fddc160c
second parameter: 000000000000000000000000000000000000000000000000000000000000007b
third parameter:  000000000000000000000000000000000000000000000000000000000000007b
fourth parameter: 14723a09acff6d2a60dcdf7aa4aff308fddc160c

no debe estar sin ceros, toma los 32 bytes completos.

Conozco su confusión, es posible que tenga algunos malentendidos sobre la función "abi.encodePacked (...)".

Como dice el documento, "los tipos de menos de 32 bytes no se rellenan con ceros", pero el tipo que usa es uint, que es exactamente un tipo de 32 bytes.

Solo prueba el siguiente código:

contract Test {

    function test() public pure returns (bytes memory, bytes memory) {
        int8 a = 1;
        uint16 b=2;
        return (abi.encode(a,b), abi.encodePacked(a,b));
    }
}

y el resultado sera:

0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002

y

0x010002

Tenga en cuenta que uso int8 y uint16 en este contrato, por lo que la diferencia es que "abi.encode" rellenará cada parámetro a 32 bytes, mientras que "abi.encodePacked" no lo hará.