ABI Coder v2가 기본적으로 활성화되어 있습니다.

ABI는 Application Binary Interface의 약자입니다.

soliditylang.org - abi-coder-pragma

  • ABI coder v2는 기본적으로 활성화되어 있습니다.
  • pragma abicoder v1; 키워드를 사용하여 이전 버전처럼 동작하도록 선택할 수 있습니다.
  • 이전 버전에서는 ABI coder v2를 활성화하기 위해 pragma experimantal ABIEncoderV2; 를 사용했지만 더 이상 사용되지 않으며 효과가 없습니다. 명시적으로 사용하려면 pragma abicoder v2;를 대신 사용하세요
  • ABI coder v2는 v1보다 더 많은 데이터 Type을 지원하며 입력에 대해 더 많은 유효성 검사를 수행합니다. 이로 인해 코드가 더 안전해질 수 있습니다.
  • 하지만 ABI coder v2는 일부 함수 호출을 더 비싸게 만들며, 매개변수 유형에 맞지 않는 데이터가 포함된 경우 ABI coder v1에서 revert되지 않았던 컨트랙트 호출을 되돌릴 수도 있습니다. v2가 더 엄격하게 유효성을 검사하기 때문입니다.

ABI Coder v1

  • 사용 방법:

    • v0.8.0 부터는 명시적으로 pragma abicoder v1; 키워드를 입력해야합니다.
    • 0.7.0은 기본 값으로 설정되어 있습니다.
  • 특징:

    • 초기 버전 ABI coder로, 제한된 데이터 유형만 지원합니다.
    • 구조체와 배열을 external function에서 사용할 수 없습니다.
    • v2 대비 더 단순하고, 덜 엄격한 유효성 검사를 수행합니다.
  • Sample Code

      // SPDX-License-Identifier: MIT
      pragma solidity ^0.7.0;
    
      contract ABICoderV1Example {
        struct Person {
          string name;
          uint age;
        }
    
        Person[] public people;
    
        function addPerson(string memory name, uint age) public {
          people.push(Person({name: name, age: age}));
        }
    
        function getPerson(
        uint index
        ) public view returns (string memory name, uint age) {
          require(index < people.length, "Index out of bounds");
          name = people[index].name;
          age = people[index].age;
        }
    
        // 이 함수는 외부에서 호출할 수 없습니다. 왜냐하면 ABI coder v1에서는 External 함수에서 구조체를 반환할 수 없기 때문입니다.
        // function getPersonStruct(uint index) external view returns (Person memory) {
        //     require(index < people.length, "Index out of bounds");
        //     return people[index];
        // }
      }

ABI Coder v2

  • 사용 방법:

    • 0.8.0 부터 기본 값으로 설정되어 있습니다.
    • 명시적으로 사용하려면 pragma abicoder v2;키워드를 입력해야합니다.
  • 특징

    • 더 많은 데이터 유형을 지원하며, 구조체와 배열을 External 함수에서 사용할 수 있습니다.
    • v1 대비 더 엄격한 유효성 검사를 수행하여, 데이터가 매개변수 Type에 부합하지 않을 경우 함수 호출을 Revert 할 수 있습니다.
      • v1
      • v2
    • 더 복잡한 데이터 Type을 처리할 수 있으며, 더 안전한 코드를 작성할 수 있게 합니다.
    • ABI coder v2가 v1 대비해서 더 많은 Type을 지원하고 더 많은 유효성 검사를 수행하기 때문에 일부 함수에서는 추가적인 가스비용이 늘어날 수 있습니다.
  • Sample Code

      // SPDX-License-Identifier: MIT
      pragma solidity ^0.8.0;
    
      contract ABICoderV2Example {
          struct Person {
              string name;
              uint age;
          }
    
          Person[] public people;
    
          function addPerson(string memory name, uint age) public {
              people.push(Person({name: name, age: age}));
          }
    
          function getPerson(uint index) public view returns (Person memory) {
              require(index < people.length, "Index out of bounds");
              return people[index];
          }
      }
profile
좋은 개발자가 되고싶은

0개의 댓글