Etherme의 프레임 경량화

9424 단어 SolidityEthereumtech
이더리움의 구성 크기는 24.576KB 이하로 제한됩니다.도스 공격을 피하기 위해 2016년EIP-170에 추가된 규칙이다.
길거리에서 굴러다니는 간단한 코드라면 이 사이즈 제한에 끌리지 않을 것 같지만, 어느 정도 크기의 패키지를 만들려면 비교적 간단하게 제한에 도달할 수 있을 것 같다.나는 제작이더머의 올체인 트위터 스타일의 물건입니다.을 준비할 때 이 제한을 만났다.
이 제한을 피하기 위해 우리는 각양각색의 구조 경량화 기술을 조사하여 총결하였다.

측량하다


경량화하기 전에 먼저 측정하지 못하면 개선할 수 없다.나는 hardhat-contract-sizer로 구조기의 사이즈를 측정한다.이것을 설치하고 명령을 두드리면 다음과 같은 설정 크기가 표시됩니다.사이즈 기준치 초과와 워닝을 조심스럽게 내주기 때문에 문제가 생기면 바로 알아차릴 거예요.
 $ npx hardhat compile && yarn hardhat size-contracts
  ·······················|··············
  |  TwitterV1           ·     24.962  │
  ·----------------------|-------------·
 Warning: 1 contracts exceed the size limit for mainnet deployment.

테스트


팩스를 보내기 전에 최소한의 테스트를 썼는지 확인하는 것이 좋다.팩스로 무게를 줄일 수 있지만 행동 자체가 의도하지 않게 움직이면 아이가 아예 없다.

팩시밀리


준비해서 팩스로 보내드릴게요.기본적
  • 개선
  • npx hardhat compile && yarn hardhat size-contracts 두드리기 측정
  • 실행 테스트
  • 반복하여 진행하다.2), 3) 위에서 말한 바와 같이 나머지 1)의 개선 사항을 적는다.

    프레임 분할


    프레임이 크면 분할할 수 있고 경량화할 수 있다.하나의 틀일 필요는 없다. 그러면 따로 하자.

    library 만들기


    정리 처리 후library 외출 가능 여부를 검토한다.internal에서 정의하면 컴파일할 때 내연화되는 것은 의미가 없기 때문에 public로 정의합니다.그나저나 간단한 for문이라면 library가 되면 반대로 비용이 많이 들고 사이즈도 커지잖아요. 복잡한 외출처리를 library로 바꾸는 게 좋아요.

    필요 없는 라이브러리 사용 중지


    예를 들어 NFC 사양을 실현하려고 할 때는 의도 없이 사용ERC721Enumerable할 때도 있지만, 실제로는 사용totalSupply만 하는 등 필요 없을 때도 있다.increament id만 있으면 된다면 계수기를 간단하게 설치하면 됩니다.이렇게 하면 ERC721Enumerable 대신ERC721으로 좋아지고 사이즈도 많이 줄어들 수 있어요.

    DELEGATECALL 사용


    외부 설정을 실행할 수 있는 함수DELEGATECALL를 사용합니다.이것을 이용하면 구조기 안의 함수를 벗어날 수 있기 때문에 구조기의 사이즈가 줄어든다.하지만 쉽게 사용하면 어떤 구조기로 어떤 상태를 가지고 놀지 못해 복잡성이 증가할 수 있으므로 너무 많이 사용하지 않는 것이 좋다.

    쓸모없는 함수 제거


    주석과 변수명을 줄이는 것도 의미가 없지만, function을 줄이는 것은 큰 충격을 줄 수 있다.읽을 수 있도록 함수를 잘라내는 처리는 삽입식이 가장 좋다.

    잘못된 변수 선언 취소


    쓸데없는 선언을 극력 줄이다.예를 들어 변수의 초기화가 필요 없는 경우가 많다.각 유형마다 초기 값이 있습니다.null이 되지 않기 때문에 초기값이 좋으면 바로 사용하는 것이 좋습니다.
    Hoge hoge = new Hoge(); // これは無駄なことが多い
    Hoge hoge; // これで十分
    
    bool flag = false; // これは無駄
    bool flag; // これで十分
    for (uint i = 0; i < length; i++) {
      if (i % 17 == 0) {
        flag = true;
      }
    }
    return flag;
    

    리퀘어 댓글 줄이기

    require(condition, error_message)의 error메시지 부분을 짧게 자르거나 필요하지 않으면 삭제한다.그것만으로도 상황에 따라 수십 바이트가 줄어든다.

    매개 변수의 struct 납품 정지


    // 無駄なstruct渡し。isHoldedしか使ってない。
    function hoge(Token _token) returns (bool) {
      return _token.isHolded;
    }
    hoge(token);
    
    // これで十分
    function hoge(bool _isHolded) returns (bool) {
      return _isHolded;
    }
    hoge(token.isHolded);
    

    공공이 필요하지 않으면 privete나 인터넷을 사용하십시오


    privete와 인터넷의 함수는public보다 친환경적이다.

    데이터 유형 방법


    string byte보다는 bool보다는 Uint8이 가벼운 경우가 많다.조금만 신경 써도 사이즈가 제한된 상황에서 효과적입니다.

    프로그램 설계


    디버깅 시 solcoptimizer를 유효하게 만들면 수 KB 단위로 줄일 수 있다.hardhat.config.js의 경우 다음과 같은 기술만 추가한다.runs는 구조기에서 여러 번function을 호출하는 것을 가리킨다.작은 값을 지정하면 호출하는 가스비는 인코딩 사이즈를 높이고 큰 값을 지정하면 호출하는 가스비는 낮아지지만 코드 사이즈는 증가한다.저울질하다.
    {
      solidity: {
        version: "0.8.4",
        settings: {
          optimizer: {
            enabled: true,
            runs: 200,
          },
        },
      }
    }
    

    잡담


    DelegateCallEIP-2535: Diamonds, Multi-Facet Proxy을 사용한 Proxy 모드의 진화판도 있다.자신은 안 써봤지만 동작과 동작을 분리해서 부르는 것 같아.이 해설은 읽기 쉽다.
    https://zenn.dev/hkiridera/articles/8fbe39a4e859b7
    그리고 실제로 자신이 전체 체인의 트위터 like dapp를 썼을 때의 코드도 있다.runs:200의 설정은 22.5KB입니다.나는 원이 26KB를 초과했기 때문에 상당히 줄일 수 있을 것이라고 생각한다.참고로 제공하다.

    참조 링크


    https://soliditydeveloper.com/max-contract-size
    https://blog.polymath.network/solidity-tips-and-tricks-to-save-gas-and-reduce-bytecode-size-c44580b218e6

    기타


  • 좋은 웹페이지 즐겨찾기