우호적인 초보자의 튼튼한 안내서 (두 번째 부분)

이것은 우리의 계속이다.우리는 이더리움, Solidity, 이더리움 가상기와 스마트 계약 등 관건적인 주제를 연구한 다음에Solidity를 깊이 있게 연구했다.
본문에서 우리는 더욱 선진적인 견고성 개념을 탐구할 것이다.

기능


우리는 첫 번째 부분에서 함수를 소개했지만, 우리는 그것에 대해 더욱 깊이 있게 연구할 것이다.
실체에는 각양각색의 기능이 있는데, 그것들은
  • 공공 기능
  • 개인 기능
  • 내부 기능
  • 외부 기능
  • 공통 함수 - 이 함수들은 어떠한 계약에서도 호출할 수 있습니다. 이것은 바람직하지 않습니다. 특히 함수를 호출한 후에 값을 변경할 수 있는 경우에 공개됩니다.그것은 너의 계약을 공격에 노출시킬 것이다.public 키워드는 함수 매개 변수 다음에 추가됩니다.
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract HelloWorld {
        struct Car { 
            uint amout; 
            string name; 
        }
    
       function createCar(uint _amount, string memory _name) public pure returns (Car memory _car) {    
            Car memory newCar = Car(_amount,_name);
            return newCar;     
        }
    }
    
    
    solidity에서, 우리는 함수가 되돌아오는 데이터의 되돌아오는 데이터 형식을 지정해야 한다. 위의 함수와 같다.
    사유 함수 - 이 함수들은 계약서에서만 호출할 수 있습니다.외부 기능에 액세스할 수 없습니다.좋은 경험법은 기본적으로 계약을 비밀로 하는 것이다.
    private 키워드는 함수 매개 변수 다음에 추가됩니다.
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract HelloWorld {
        struct Car { 
            uint amout; 
            string name; 
        }
    
       function createCar(uint _amount, string memory _name) private pure returns (Car memory _car) {   
            Car memory newCar = Car(_amount,_name);
            return newCar;     
        }
    }
    
    
    내부 함수 - 이것은 개인 함수이지만, 계약에서 계승된 계약에 접근할 수 있습니다.
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract HelloWorld {
        struct Car { 
            uint amout; 
            string name; 
        }
    
       function createCar(uint _amount, string memory _name) internal pure returns (Car memory _car) {  
            Car memory newCar = Car(_amount,_name);
            return newCar;     
        }
    }
    
    
    외부 기능 - 이 기능들은 계약 외에만 접근할 수 있습니다. 만약 일반인에게 하나의 기능을 공개해야 한다면 외부 기능은 좋은 생각입니다.
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract HelloWorld {
        struct Car { 
            uint amout; 
            string name; 
        }
    
       function createCar(uint _amount, string memory _name) external pure returns (Car memory _car) {  
            Car memory newCar = Car(_amount,_name);
            return newCar;     
        }
    }
    
    

    여러 값 반환


    대부분의 경우, 함수가 값을 되돌려주고, 되돌아오는 값은 하나가 될 수 있으며, 이것은 함수가 무엇을 실현하려고 하는지에 달려 있다.앞의 예시에서 우리는 하나의 값을 어떻게 되돌려 주는지 보았고, 여러 개의 값을 어떻게 되돌려 주는지 예시도 보았다.우리가 하나 이상의 값을 되돌릴 때, 모든 되돌림 값의 데이터 형식을 지정해야 한다
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract HelloWorld {
        struct Car { 
            uint amout; 
            string name; 
        }
    
    function createCar(uint _amount, string memory _name) external pure returns (uint amount, string memory name, Car memory _car) {   
            Car memory newCar = Car(_amount,_name);
            return (_amount, _name, newCar );   
        }
    }
    
    
    

    조건문 및 주기


    If 문
    만약 문장이 진짜인지 가짜인지 확인하는 조건문이라면, 그 문장의 안정성은 다른 언어 (예: 자바스크립트) 와 유사하다
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract HelloWorld {
        struct Car { 
            uint amout; 
            string name; 
        }
    
       uint newAmount = 1000;
    
       function createCar(uint _amount, string memory _name) external returns (Car memory _car) {  
             if (_amount > 1000){
                 newAmount = _amount;
             }
            Car memory newCar = Car(newAmount,_name);
            return newCar;   
        }
    }
    
    
    위의 논리적 체크 amount가 1000보다 큰지, true일 경우 new Amount 변수를 함수에 전달되는 금액으로 변경하고, false일 경우 new Amount 변수에 할당된 기본값을 사용합니다.
    For 루프
    For 주기에서는 조건에 따라 문을 여러 번 실행할 수 있습니다.For 순환은 다른 언어와 유사합니다. 예를 들어 자바스크립트
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract HelloWorld {
    
        struct Car { 
            uint amout; 
            string name; 
        }    
    
        string[] carNamesList = ["BMW","Toyota","Honda"];
        uint[]  carAmountList = [1000,2000,2000];
        Car[] allCars;
    
        function loopCars() public {
            for (uint i = 0; i < carNamesList.length; i += 1) { 
            Car memory newCar = Car(carAmountList[i], carNamesList[i]);
            allCars.push(newCar);
            }
        }
    
    
    
    }
    
    
    우리는 자동차 이름과 자동차 수량의 목록을 포함하는 카네임 리스트와 카암 리스트를 만들었습니다. 그리고 for를 사용하여 이 그룹을 반복해서 훑어보고 새 자동차를 만들고, 이를 all Cars 그룹에 추가했습니다.
    요구 사항
    Require는 if문과 유사합니다. 문장이 진짜인지 가짜인지 계산합니다. 만약 이 문장이 진짜라면 Require문 아래의 줄을 계산하고 가짜라면 오류를 던집니다.
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract HelloWorld {
        struct Car { 
            uint amout; 
            string name; 
        }
    
       uint newAmount = 1000;
    
       function createCar(uint _amount, string memory _name) external view returns (Car memory _car) {  
            require(_amount > newAmount);
            Car memory newCar = Car(newAmount,_name);
            return newCar;   
        }
    }
    
    
    
    위의 로지컬 체크 amount가 new Amount 변수에 설정된 금액보다 큰지 확인하고, 진짜일 경우 아래 줄을 실행하고, 가짜일 경우 오류가 발생합니다.

    무작위 생성


    랜덤수를 만들려면keccak256이라는 이더리움 해시 함수가 필요합니다. 이것은 SHA3의 버전입니다.이 해시 함수는 256자리 16진수를 되돌려줍니다. 해시 함수는 바이트 형식의 인자가 필요합니다.
    그것을 사용하기 위해서, 우리는 함수에 전달된 문자열을 인코딩하기 위해abi를 사용해야 한다.encodePacked, 이 함수는 문자열을 바이트 형식으로 변환합니다.
    그것의 실제 행동을 보여 주시오.
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract HelloWorld {
    
     bytes32 variable = keccak256(abi.encodePacked("aaaab"));
    //6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
    
    }
    
    

    수입하다


    다른 파일에 계약이 있고 다른 파일에서 사용하려고 할 때 가져오는 것을 사용합니다.
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    // NFT contract to inherit from.
    import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
    
    contract MyNFT is ERC721 {
    
    }
    
    
    코드가 더 적은 NFT 영패를 만들 수 있는 계약서를 가져왔습니다.
    OpenZeppelin은 Solidity로 작성된 오픈소스 OpenZeppelin 계약을 제공하여 안전한 스마트 계약을 구축하는 데 사용한다.OpenZeppelin Contracts는 이더리움 기반 토큰에 대해 ERC 표준을 사용하는데 이런 토큰은 다양한 유형의 프로젝트에 사용할 수 있다.OpenZeppelin 계약은 이더리움이나 다른 블록체인에 보안 스마트 계약을 구축하는 것과 관련된 네트워크 리스크를 최소화하기 위해 감사와 테스트를 지속해서 받게 된다.

    상속권


    이것은 대상 프로그래밍에서 유행하는 개념으로 그 중의 한 클래스가 다른 클래스의 속성을 계승한다.실제로 계약은 다른 계약을 계승할 수 있다.
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract Hello {
      function HelloWorld() public pure returns (string memory) {
        return "Hello World";
      }
    }
    
    contract HelloWord is Hello {
      function AnotherHelloWorld() public pure returns (string memory) {
        return "Another Hello World";
      }
    }
    
    
    
    첫 번째 계약은 HelloWorld 함수만 접근할 수 있고, 두 번째 계약은 HelloWorld 함수와 다른 HelloWorld 함수만 접근할 수 있다.
    는 상속 키워드입니다.

    이벤트


    이벤트는 우리가 응용 프로그램의 클라이언트나 전방에 블록체인에서 발생하는 일을 전달하는 매개체이다.블록체인에서 언제 변경되는지 프런트엔드에서 알 수 있도록 하는 것을 이벤트라고 합니다.
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract HelloWorld {
        struct Car { 
            uint amout; 
            string name; 
        }
    
        event CarCreated(uint _amount, string  _name, Car _car); 
    
        function createCar(uint _amount, string memory _name) internal returns (Car memory) {  
             Car memory newCar = Car(_amount,_name);
             emit CarCreated(_amount,_name, newCar);
             return newCar;     
      }
    
    
    }
    
    
    }
    
    
    *event* 키워드를 사용하여 CarCreated 이벤트를 만듭니다.
    createCar 함수에서 CarCreated 이벤트를 보냅니다.클라이언트가 이벤트를 가져와 처리합니다.
    // The frontend implementation
    YourContract.CarCreated(function(error, result) {
       // do something when car is created
    }) 
    

    소재지


    이더리움 블록체인은 계좌로 구성되는데 이런 계좌의 업무 방식은 은행 계좌와 유사하다.하나의 계정에 이더리움 잔액(이태방 블록체인에서 사용하는 화폐)이 있어서 당신은 다른 계정에 이더리움 지불을 보내고 받을 수 있습니다.
    계좌마다 주소가 하나씩 있는데, 너는 그것을 하나의 은행 계좌로 상상할 수 있다.이 계정은 다음과 같이 계정에 대한 고유한 식별자입니다.
    0x1443498EF86DF975D8A2B0B6A315FB9F4997998 (이것은 제 주소입니다. 당신은 이태리를 보낼 수 있습니다.)미리 고마워요.
    주소는 블록체인(이태방 블록체인)의 사용자 신분입니다.

    비추다


    주소는 우리가 데이터를 이더리움 블록체인에 비추는 가장 중요한 것 중 하나이다. 우리는 계정 잔액(이태), NFT, 사용자 ID와 블록체인에 속하는 다른 것을 우리의 주소에 비출 수 있다.
    예를 들어, 우리의 주소와 계좌 잔액이 일치하도록 하기 위해서, 우리는 이렇게 할 수 있다
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract HelloWorld {
    
        mapping(address => uint) public accountBalance;
    
    }
    
    
    위에서 만든 맵의 이름은 계정 Balance입니다.마핑 키워드를 사용하여address를 uint에 비추었습니다.address는 uint와 같은 데이터 형식입니다.

    조미료발신인


    주소를 방문하려면 메시지를 방문해야 합니다.모든 함수, msg에 사용할 수 있는 전역 변수입니다.송신자가 사용자의 주소를 출력합니다.
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract HelloWorld {
        uint amount = 5000;
        mapping(address => uint256) public accountBalance;
    
    
        accountBalance(msg.sender) = amount;
        // mapping is done, now we can access the account balance 
        // from the accountBalance mapping when we need it
    
    }
    
    
    우리는 금액을 우리의 주소로 분배할 것입니다. 우리는 msg에서 우리의 주소를 얻었습니다.발신인.

    건설자


    그것은 계약과 동명인 선택할 수 있는 특수 함수이다.계약이 처음 만들어졌을 때, 그것은 단지 한 번만 실행될 것이다.
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract HelloWorld {
       constructor(
            string[] memory carList,
        )
    
      //Do other things
    
    }
    
    
    carList 배열은 계약을 처음 작성할 때만 작성됩니다.

    함수 수정자


    그것들은 다른 함수를 수정하는 데 사용되는 반함수로, 주로 함수를 실행하기 전에 일부 수요를 검사하는 데 사용된다.
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract HelloWorld {
       address private  _owner;
       constructor(
             _owner = msg.sender;
        )
    
       // modifier function
       modifier onlyOwner() {
        require(msg.sender == _owner);
        _;
      }
    
      function doSomething() public onlyOwner {
          // This function only runs when the onlyOwner 
          //  modifier question evaluates as true
      }
    
    }
    
    
    owner라는 개인 변수를 만들었습니다. 주소 데이터 형식이 있습니다. 구조 함수에서 하나만 실행하는 변수에 주소를 분배합니다. 이것은 계약 소유자의 주소를 저장하고 있음을 의미합니다.
    modifier 키워드를 사용하여 only Owner라는 수식자 함수를 만들었습니다.수식자 함수에서, 우리는 주소가 최초로 저장된 주소와 일치하는지, 즉 계약 소유자의 주소와 일치하는지 검사합니다.
    modifier 함수를doSomething 함수에 지정합니다. 이것은 그것을 방문하려는 사람이 계약의 소유자일 때만 이 함수가 실행된다는 것을 의미합니다.
    본고의 세 번째 부분에서 우리는 이 모든 개념을 사용하여 NFT 계약과 전방 응용 프로그램을 구축할 것이다.
    나는 네가 이 강좌가 매우 유용하다고 생각하기를 바란다.
    읽어주셔서 감사합니다.
    #추천자
  • Solidity Docs
  • Crypto Zombies
  • Tutorial Point
  • 좋은 웹페이지 즐겨찾기