Solidity - 기본 문법

김도영·2022년 7월 12일
0

SPDX License Identifier

스마트 컨트랙트 코드에 대한 라이센스를 코드 최상단에 주석 형식으로 표기한다.

// SPDX-License-Identifier: MIT

Pragma

특정 컴파일러의 버전을 표기한다.

pragma solidity ^0.8.7;

상태 변수(State Variables)

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

{데이터 타입} {변수명} = {초기화할 값}; // 선언 및 초기화
  • 값형 데이터 타입
    • 불(bool)
    • 정수(int, uint)
    • 고정 바이트 배열 (ex. bytes8)
    • 주소 (address)
  • 참조형 데이터 타입
    • 배열(ex. uint[])
    • 문자열(bytes)
    • 구조체(struct)
    • 매핑(mapping)
  • 글로벌 변수
    • block: 블록에 대한 정보
    • msg: 컨트랙트를 시작한 트랜잭션이나 메시지 콜에 대한 정보
    • tx: 트랜잭션 데이터
    • this: 현재 컨트랙트
  • 상태 변수 접근 수준
    • public: 컨트랙트 내에서 직접 접근 가능하다. 컴파일러가 퍼블릭 상태변수에 getter 함수를 생성하고, 외부 컨트랙트나 클라이언트 코드에서 getter 함수를 통해 접근 가능하다.
    • internal: 변수 선언시 디폴트 값, 컨트랙트 및 상속 컨트랙트에서만 접근 가능하다.
    • private: 동일한 컨트랙트 멤버만 프라이빗 상태 변수에 접근 가능
  • costant
    • 상태 변수를 상수로 선언

함수

function 함수이름(파라미터형식1 파라미터1, 파라미터형식2 파라미터2, ...) {...}
  • 함수 접근 수준

    • external: 외부 컨트랙트나 클라이언트 코드에서 호출할 수는 있으나, 내부에서는 호출이 불가능하다.
    • public: 디폴트 값, 컨트랙트 내부, 외부 컨트랙트, 클라이언트 코드에서 사용 가능하다.
    • internal: 컨트랙트 멤버와 상속 컨트랙트에서만 사용 가능하다.
    • 컨트랙트 멤버만 사용 가능하다.
  • view, pure

    • 상태를 변경하지 않는 읽기 전용 함수에는 view 키워드를 사용한다.
    • 스토리지에서 변수를 읽거나 쓰지 않는 함수는 pure 키워드를 사용한다.
  • payable

    • 함수에서 이더를 받는 경우 payable 키워드를 사용한다.
  • constructor, selfdestructor

    • constructor는 생성자 함수로, 컨트랙트의 상태를 초기화 한다.
    • selfdestructor(컨트랙트 생성자의 주소) 함수를 실행하면 컨트랙트르 소멸할 수 있다.

함수 변경자(modifer)

특정 함수를 실행하기 전, 요구 조건을 만족하는지 확인하는 유사 함수이다.

modifier onlyOwner {
	require(msg.sender == owner);
    _;
}

fucntion destroy() public onlyOwner {
	selfdestruct(owner);
}

상속

contract 객체를 상속할 수 있다. 상속을 통해 컨트랙트에 기능을 추가하거나 확장할 수 있다.

contract ChildContract is ParentContract {
	// ...
}

에러 핸들링

  • revert: 해당 할수를 종료하고 에러를 리턴한다.
  • require, assert: 설정한 조건이 참인지 확인하고, 조건이 거짓이면 에러를 리턴한다.
function buy(uint amount) public payable {
	require(
    	amount <= msg.value / 2 etherm // 주어진 조건이 참이면 넘어가고, 거짓이면 에러를 리턴
        "Not enough Ether provided." // 에러 메시지 지정 가능
    );
    // 송금 진행
}

열거형(enum)

열거(enum)는 특정 값들로 집합을 지정하고, 집합에 있는 데이터만을 값으로 가진다.

enum EvalLevel { Apple, Banana, Ice}

EvalLevel kimdo = EvalLevel.Apple // enum형 변수 선언 및 초기화

int16 kimdoValue = int16(kimdo); // kimdo 열거형 값 0을 정수형으로 변환

이벤트

이벤트는 어떤 결과가 발생했을 때 해당 컨트랙트에서 dApp클라이언트 또는 다른 컨트랙트에 전달한다. 컨트랙트는 event 키워드를 사용해 이벤트를 설정하고, 경우에 따라 emit 키워드를 사용해 이벤트를 실행한다. 이벤트가 실행된 경우에는 트랜잭션에 기록된다.

contract coinTransfer {
	// evnet 이벤트명(파라미터유형1 파라미터1, ...);
    event Transfer(address from, address to, uint256 value);
    
    function transfer(address to, address amout) {
    // ...
    // emit 이벤트명(인자1, 인자2, ...)
    emit Transfer(msg.sender, to, amount);
    {
}
profile
Blockchain Developer

0개의 댓글