abi.encode() vs abi.encodePacked()

프동프동·2023년 8월 18일
0

Blockchain

목록 보기
10/12
post-thumbnail

차이점 1. Padding

function testEncoding_padding() public pure returns (bytes memory, bytes memory) {
    uint8 a = 0x12;
    uint16 b = 0x3456;
    bytes memory standardABI = abi.encode(a, b);
    bytes memory packed = abi.encodePacked(a, b);
    return (standardABI, packed);
}
  • abi.encode: ABI 표준에 따라, 각 인자는 32 바이트 단위로 패딩된다.
    • a = 0x12
    • b = 0x3456
    • 결과
      • 0x000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000003456
  • abi.encodePacked(): 패딩 없이 연속적으로 인코딩된다.
    • a = 0x12
    • b = 0x3456
    • 결과
      • 0x123456

차이점 2 .데이터 타입 정렬

function testEncoding_alignment() public pure returns (bytes memory, bytes memory) {
    uint8 a = 65; // 'A'의 ASCII 코드 값
    address b = 0x1234567890123456789012345678901234567890;
    bytes memory standardABI = abi.encode(a, b);
    bytes memory packed = abi.encodePacked(a, b);
    return (standardABI, packed);
}
  • abi.encode: ABI 표준에 따라 다양한 데이터 타입이 정렬된다. uint와 address를 인코딩하면 각각 32 바이트로 정렬되어 인코딩된다.
    • uint8 a = 65
    • uint16 b = 0x1234567890123456789012345678901234567890
    • 결과
      • 0x00000000000000000000000000000000000000000000000000000000000000410000000000000000000000001234567890123456789012345678901234567890
  • abi.encodePacked: 연속적인 바이트 문자열이된다.
    • uint8 a = 65
    • uint16 b = 0x1234567890123456789012345678901234567890
    • 결과
      • 0x411234567890123456789012345678901234567890

정리

abi.endoePacked()는 더 적은 공간을 사용하므로 가스 비용이 절약되며, 특정한 바이트 조작이 필요한 경우 유용하게 사용된다. 이 방식은 Ethereum의 표준 ABI 인코딩과 다르므로, 다른 컨트랙트와의 상호작용에서 주의가 필요하다.


profile
좋은 개발자가 되고싶은

0개의 댓글