Solidity에서 null이 없음

6710 단어 web3soliditynull
가장 이상한 Solidity 프로그래밍 언어의 단점 중 하나는 null이 없다는 것입니다. null 허용 여부가 핵심 빌딩 블록 중 하나인 Swift에서 왔기 때문에 낯설게 느껴졌습니다. 처음에는 이렇게 유용한 기능 없이 코딩하는 방법을 이해하지 못했습니다. 이 게시물은 스마트 계약을 구축할 때 Solidity에서 이를 우회하는 방법을 찾는 방법에 대해 자세히 설명합니다.

정의되지 않은 개념


undefined , null , nil , None 등의 개념은 JavaScript, Java, Python, Swift 등과 같은 언어에 존재합니다. 그러나 Solidity에는 존재하지 않습니다.

Solidity에서는 대신 0 또는 기본 값 개념이라고 부를 수 있습니다. 각 값이 생성되면 메모리에 슬롯이 생기고 무언가를 포함해야 하기 때문입니다.

기본값



기본값에 대해 이야기하려면 Solidity 유형을 두 블록으로 분할해야 합니다.
  • string , bytes 및 배열과 같은 동적으로 크기가 조정된 유형;
  • int , booladdress 와 같이 동적으로 크기가 지정되지 않은 유형.

  • 동적 크기가 아닌 유형



    동적 크기가 아닌 유형을 사용하면 게임이 매우 간단합니다. 이에 대한 기본값은 다음과 같습니다.
  • int 또는 uint256 기본값은 00입니다.
  • boolfalse이다;
  • address 유형 기본값은 제로 주소0x0000000000000000000000000000000000000000입니다.
  • struct 를 생성하려는 경우 기본값은 모든 구성원의 기본값의 튜플입니다.
    enum의 경우 기본값은 첫 번째 경우입니다. 이것은 매우 생소한 접근 방식일 수 있지만 배후의 모든 enum 사례가 uint8 정수의 배열이기 때문입니다.

    동적으로 크기가 조정된 유형



    동적으로 크기가 조정되는 유형의 경우 이야기가 다릅니다.
  • string의 기본값은 비어 있습니다string.
  • 배열의 기본값은 빈 배열입니다.
  • bytes 기본값은 비어 있거나 바이트가 없습니다.

  • 따라 코드



    코드의 기본값을 설명하기 위해 struct enum 가 있는 Employee EmployeeType 를 생성해 보겠습니다.

    enum EmployeeType {
      Employee,
      Contractor,
      PartTime
    }
    
    struct Person {
      EmployeeType employeeType;
      bool deleted;
      string name;
      uint256 yearOfBirth;
      address walletAddress;
      uint256[] doorAccess;
    }
    


    이제 Employee struct 의 새 인스턴스를 초기화할 수 있습니다. 멤버 값을 제공할 필요는 없지만 메모리에 할당해야 합니다.

    Person person;
    

    person 값을 출력하면 각 Person struct 멤버에 대한 기본값 튜플을 얻게 됩니다.

    tuple(uint8,bool,string,uint256,address,uint256[]): 0,false,,0,0x0000000000000000000000000000000000000000,
    


    null 가능성 확인



    이제 우리는 기본값을 알았으므로 무언가가 "null"인지 또는 정확히 말하면 기본값이 있는지 확인할 수 있습니다.

    function check() external view {
      console.log(person.deleted == false);
      console.log(bytes(person.name).length == 0);
      console.log(person.yearOfBirth == 0);
      console.log(person.walletAddress == address(0));
      console.log(person.employeeType == EmployeeType.Employee);
      console.log(person.doorAccess.length == 0);
    }
    


    이 기능을 실행하면 모든 검사에 대해 true를 얻습니다. 이것이 정의된 값이 없다는 것을 이해할 수 있는 방법입니다.

     Deleted true
     Name true
     Year of birth true
     Wallet address true
     Employee type true
     Door access true
    


    언급할 가치가 있는 것은 '문자열' 유형에 대해 bytes로 변환하고 길이를 확인했다는 것입니다. 이를 달성하는 또 다른 방법이 있지만 향후 게시물 중 하나에서 이에 대해 이야기할 것입니다.

    TL;DR



    Solidity 프로그래밍 언어에는 Swift 및 JavaScript와 같은 많은 언어에서 흔히 볼 수 있는 null 허용 여부 기능이 없습니다. 대신 유형에는 0 에 대한 0uint 과 같은 기본값이 있습니다. 무언가가 정의되어 있는지 여부를 확인하려는 경우 유용하기 때문에 기본값을 아는 것이 중요합니다.

    연결


  • Sample code
  • Official Documentation - Types
  • Scoping and Declarations
  • StackOverflow discussion
  • 좋은 웹페이지 즐겨찾기