Solidity

[ solidity - 기본 형식 ]

algml0703 2022. 5. 20. 00:03
반응형

☃️ 솔리디티 기본 문법

1. 버전 명시  Pragma

솔리디티는 버전업이 매우 빠르기 때문에 솔리디티 코드 작성시 최상단에 컴파일러의 버전을 명시해준다.

// SPDX-License-Identifier: MIT  => 관련된 라이센스가 존재하는 경우 추가적으로 명시해준다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8;

2. 참조 import

다른 컨트랙트를 불러와 사용하는 경우 작성한다.

// SPDX-License-Identifier: MIT
pargma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

3. 컨트랙트 contract

// SPDC-License-Identifier: MIT
pragma solidity ^0.8.0;

// 참조하는 다른 컨트랙트 없음

contract Example {
	
}

3-1. 상태 변수

컨트랙트 스토리지에 영구적으로 저장되는 값이다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// 참조되는 컨트랙트 없음

contract Example {
	// 상태변수 위치
    // [타입] [접근성] [변수명];
    uint256 public num;
    string private secretKey = "secret";
}

 [ 상태 변수의 접근성 ]

상태변수 타입 바로 뒤에 위치한다.

uint public count;

상태변수는 외부에서 접근할 수 없다.

💥 internal  

  컨트랙트 자신과 자식 컨트랙트만의 접근을 허용한다. 상태변수의 기본값이다.

💥 public  

  모든 접근을 허용한다.

💥 private  

  컨트랙트 자신만 접근 가능하다.

3-2. 함수

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Example {
	string public owner = "ME";
    // function 함수명 (){}
    // function 함수명 ([타입] [인자]) 접근타입 returns (반환값 타입) {}
    
    function setOwner(string memory _newOwner) public {
    	// 함수 파라미터로 string 타입 사용시에는 반드시 그 뒤에 memory를 붙여 준다.
    	owner = _newOwner;
    }
}

 [ 함수의 접근성 ]

함수 인자 값 받는 괄호 뒤에 위치한다.

function test(uint _x) external pure returns (uint) {}

- external

   컨트랙트 외부에서 접근 가능, 내부에서 접근 불가. 컨트랙트 내에서 external 선언한 함수에 접근하기 위해서는 this를 사용해야 한다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ExternalEx {
    function test1 () external returns(uint) {
        return 2;
    }
    function test2 (uint _num) public returns(uint) {
        // uint test1Value = test1();
        // 위의 경우 에러가 난다.
        uint test1Value = this.test1();
        uint test2Value = test1Value + _num;
        return test1Value;
    }
}

 🔥 public

  컨트랙트 내외부 모두에서 접근 가능. 함수의 기본값은 public이다.

🔥 internal

   자기 자신과 자식 컨트랙트에서만 접근 가능.

🔥 private

   외부에서 접근할 수 없고 자신만 접근 가능하다.

 

[ view와 pure ]

 - view

   함수에 view 사용한 경우 컨트랙트 스토리지 내 변수 읽기만 가능, 수정 불가능

 - pure 

   함수에 pure 사용한 경우 컨트랙트 스토리지 내 변수 읽기 불가능, 수정 불가능

 

컨트랙트의 변수의 저장 공간은 storage와 memory이다.

storage는 블록체인 상에 영구적으로 저장되는 것이며,

memory는 임시적으로 저장되는 변수로 함수 실행 시 공간이 생성되며 함수 호출시 변수 저장 공간이 반환된다.

예를 들어 함수 외부의 멤버변수는 storage 공간에 위치하게 되며, 함수의 파라미터는 memory 공간에 생성된다.

 


 

더하기 마이너스 해주는 컨트랙트  ex)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Example {
    uint8 public num;

    function addOne() public returns (uint8) {
        num += 1;
        return num;
    }
    function addNum(uint8 _addNum) public returns (uint8) {
        num = num + _addNum;
        return num;
    } 
    function minusNum(uint8 _minusNum) public returns (uint) {
        num = num - _minusNum;
        return num;
    }
}

이름별 과목명 기록하는 컨트랙트 ex)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Class {
    string teacher;

    mapping ( string => bool ) public teachers;
    mapping ( string => string ) public subjects;

    function setSubject (string memory _teacher, string memory _subject) public {
        teachers[_teacher] = true;
        subjects[_teacher] = _subject;
    }
    function getSubjectByTeacher (string memory _teacher) public returns(string memory) {
        return subjects[_teacher];
    }
    function existTeacherChk(string memory _teacher) public view returns(bool) {
        if(!teachers[_teacher]) return false;
        return true;
    }
}

 

 

 

 

 

 

 

출처

https://intrepidgeeks.com/tutorial/basic-syntax-of-solidity#13

 

반응형