계약의 신뢰성 향상

사진 작성자NASAUnsplash

견고한 업그레이드 — 데이터 및 어플리케이션 계약


스마트 계약은 일단 배치되면 변경할 수 없다.그러나 배포 후 계약을 변경할 수 있는 충분한 이유가 있습니다.
  • 오류 발견, 수정 필요
  • 업무 규칙이 변경되어 계약 코드를 업데이트해야 함
  • 소유자의 개인 키에 대한 접근 분실 또는 유출
  • 휘발유비 증가, 최적화 코드 필요
  • 이 글에서 우리는 계약을 데이터 계약과 응용 계약으로 나누는 것을 토론할 것이다.데이터 구조를 변경할 필요가 없으면, 이 방법은 매우 효과적입니다.계약 마이그레이션, 애플리케이션/에이전트/데이터 및 영구 스토리지 등의 옵션도 있습니다.모든 해결 방안은 각자의 장단점이 있기 때문에 모든 용례에 적합한 해결 방안은 없다.

    단순 계약: Num


    Num.sol:
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity >= 0.8.0 < 0.9.0;
    
    contract Num {
        uint num;
    
        function set(uint n) external {
            num = n;
        }
    
        function get() external view returns (uint) {
            return num;
        }
    
    }
    
    우리는 실제 응용 프로그램이 아니라 분리하는 방법에 주목할 것이다
  • 애플리케이션 계약 작성
  • // SPDX-License-Identifier: GPL-3.0
    pragma solidity >= 0.8.0 < 0.9.0;
    
    contract NumApp {
    
    }
    
  • 데이터에서 계약의 논리적 이동으로 변경
  • // SPDX-License-Identifier: GPL-3.0
    pragma solidity >= 0.8.0 < 0.9.0;
    
    contract NumApp {
        function set(uint n) external {
            num = n;
        }
    
        function get() external view returns (uint) {
            return num;
        }
    
    }
    
  • 부족한 함수에 캐시 루트 만들기(함수 정의를 데이터에서 응용 계약으로 복사)
  • 여기서, 우리는 내부 집합 함수를 사용하는 공공 함수를 만들 것이다
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity >= 0.8.0 < 0.9.0;
    
    contract NumApp {
        function setNum(uint n) external {
            set(n);
        }
    
        function getNum() ex returns (uint) {
            return get();
        }
    
    }
    
  • 어플리케이션 계약에 사용된 내부/사유 기능을 데이터 계약 인터페이스로 이동하고 두 계약에서 외부로 변경
  • // SPDX-License-Identifier: GPL-3.0
    pragma solidity >= 0.8.0 < 0.9.0;
    
    contract NumApp {
        function setNum(uint n) external {
            set(n);
        }
    
        function getNum() external returns (uint) {
            return get();
        }
    
    }
    
    interface Num {
        set(uint n) external;
        get() external returns (uint);
    
    }
    
  • App contract에서 데이터 컨트롤 상태 변수를 만들고 구조 함수에서 초기화
  • // SPDX-License-Identifier: GPL-3.0
    pragma solidity >= 0.8.0 < 0.9.0;
    
    contract NumApp {
        Num dataContract;
    
        constructor(address dataContractAddress) {
            dataContract = Num(dataContractAddress);
        }
    
        function setNum(uint n) external {
            set(n);
        }
    
        function getNum() external returns (uint) {
            return get();
        }
    }
    
    interface Num {
        set(uint n) external;
        get() external returns (uint);
    
    }
    
  • 데이터 계약에 존재하는 응용 계약 기능을 데이터 계약으로 변경한다.애플리케이션 계약
  • // SPDX-License-Identifier: GPL-3.0
    pragma solidity >= 0.8.0 < 0.9.0;
    
    contract NumApp {
        Num dataContract;
    
    constructor(address dataContractAddress) {
            dataContract = Num(dataContractAddress);
        }
    
        function setNum(uint n) external {
            dataContract.set(n);
        }
    
        function getNum() external returns (uint) {
            return dataContract.get();
        }
    }
    
    interface Num {
        set(uint n) external;
        get() external returns (uint);
    
    }
    
  • 데이터 계약 호출자 제한
  • 데이터 계약:
  • 맵 만들기(주소=>bool) 개인 주소
  • 누락된 경우 추가:
  • address private contractOwner
    
    constructor() {
        contractOwner = msg.sender;
    }
    
    modifier requireContractOwner() {
        require(msg.sender == contractOwner, "Caller is not contract owner");
        _;
    }
    
  • 권한 수여를 추가하고 권한 수여 계약을 취소하는 방식:
  • function authorizeContract(address appContract) external requireContractOwner {
        authorizedContracts[appContract] = true;
    }
    
    function deauthorizeContract(address appContract) external requireContractOwner {
        delete authorizedContracts[appContract];
    }
    
  • 호출자가 권한을 부여받을 수 있도록 외부에서 호출될 함수에 수식자를 추가합니다
  • modifier isCallerAuthorized() {
        require(authorizedContracts[msg.sender] == true, "Caller is not authorized");
        _;
    }
    

    최종 데이터 계약


    // SPDX-License-Identifier: GPL-3.0
    pragma solidity >= 0.8.0 < 0.9.0;
    
    contract Num {
        uint num;
    
        address private contractOwner;
        mapping(address => bool) private authorizedContracts;
    
        constructor() {
            contractOwner = msg.sender;
        }
    
        modifier requireContractOwner() {
            require(msg.sender == contractOwner, "Caller is not contract owner");
            _;
        }
    
        modifier isCallerAuthorized() {
            require(authorizedContracts[msg.sender] == true, "Caller is not authorized");
            _;
        }
    
        function authorizeContract(address appContract) external requireContractOwner {
            authorizedContracts[appContract] = true;
        }
    
        function deauthorizeContract(address appContract) external requireContractOwner {
            delete authorizedContracts[appContract];
        }
    
        function set(uint n) external isCallerAuthorized {
            num = n;
        }
    
        function get() external view isCallerAuthorized returns (uint) {
            return num;
        }
    }
    

    최종 애플리케이션 계약


    // SPDX-License-Identifier: GPL-3.0
    pragma solidity >= 0.8.0 < 0.9.0;
    
    contract NumApp {
        Num dataContract;
    
        constructor(address dataContractAddress) {
            dataContract = Num(dataContractAddress);
        }
    
        function setNum(uint n) external {
            dataContract.set(n);
        }
    
        function getNum() external view returns (uint) {
            return dataContract.get();
        }
    }
    
    interface Num {
        function set(uint n) external;
        function get() external view returns (uint);
    }
    

    배포 및 테스트 방법

  • 이동 https://remix.ethereum.org
  • Num.sol 생성 및 데이터 계약서 붙여넣기
  • NumApp을 만듭니다.sol and paste 애플리케이션 계약
  • 컴파일러 버전은 최소 0.8.0
  • 이 필요합니다.
  • 확장 탭으로 이동(위에서 아래로 세 번째)
  • 배포 수
  • Num 주소를 복사하고 배치 버튼 옆에 있는 NumApp 계약서의 붙여넣기 주소를 선택한 다음 배치
  • 를 클릭한다.
  • NumApp 계약 주소를 복사하여 Num 계약을 열고 권한 수여 옆에 붙이고 버튼
  • 을 클릭한다.
    주의해야 할 점:
  • 무단
  • NumApp은 작동 불가
  • 응용 계약을 변경하고 새로운 응용 계약을 창설하며 같은 방식으로 배치하고 권한을 수여하며 이전의
  • 권한을 취소한다.
    의견과 건의를 환영합니다.

    Join Coinmonks Telegram group and learn about crypto trading and investing


    읽다


    무엇이 a입니까?
  • 최고Flash loan|Crypto Trading Bot

  • Grid Trading | 3Commas Review | Pionex Review

  • Coinrule review | AAX Exchange Review | Deribit Review
  • FTX Crypto Exchange Review

  • NGRAVE ZERO review | Bybit Exchange Review | Bityard Review
  • Interdax Review
  • 최적 비트코인3Commas vs Cryptohopper |Hardware wallet
  • BitBox02 Review

  • Ledger vs Ngrave | Crypto Copy Trading Platforms
  • Bityard copy trading

  • ledger nano s vs x | Vauld Review | YouHodler Review
  • 최고BlockFi Review|Crypto Tax Software
  • 최적CoinTracking Review
  • Crypto Lending Platforms

  • Ledger Nano S vs Trezor one vs Trezor T vs Ledger Nano X | BlockFi vs Celsius

  • Hodlnaut Review | Bitsgap review

  • Quadency Review | Ellipal Titan Review

  • SecuX Stone Review | 암호화 소프트웨어
  • 에서 최대 8.6%의 이익 얻기

  • BlockFi ReviewDEX Explorer

  • Blockchain APIs지침: 초보자는 어떻게 돈을 버는가
  • 최적Crypto arbitrage
  • 무엇이 Crypto Charting Tool입니까?
  • Get Best Software Deals Directly In Your Inbox


    best books to learn about Bitcoin

    좋은 웹페이지 즐겨찾기