solidity grammar

솔리디티는 EVM(Ethereum Vitual Machine) 에서 실행되는 스마트 컨트랙트 개발을 위해 설계된 정적 타입의 중괄호를 사용하는 프로그래밍 언어입니다.

스마트컨트랙트란, 블록체인 기반으로 체결하는 계약을 말합니다.

 

SPDX License Identifier

저작권 문제, 스마트 컨트랙트 신뢰의 문제를 해소하기 위해서 SPDX License 문제를 해결

// SPDX-License-Identifier: MIT

 

Pragma

pragma 키워드는 특정 컴파일러의 버전을 표기할 때 사용


// 0.8.7 버전 사용
pragma solidity 0.8.7;

// 0.8.7 이상의 버전을 사용
pragma solidity ^0.8.7

 

import

파일을 임포트 하는 방식은 자바스크립트와 비슷하다.

import "file_path"

// alias 설정
import "file_path" as symbolName;

// 파일의 일부만 import
import {symbol1 as alias symbol2} from "file_path"

 

컨트랙트 구조

컨트랙트에는 변수(State Varliable), 함수(Functions Modifiers), 에러(Errors), 상속(ingeritance)
, 열거형(Enum Type) 등으로 구성합니다.

 

상태 변수(State Valirable)

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

pragma solidity ^0.8.7;

contract SimpleStorage {
    uint storedData; // 상태 변수 선언
    uint storedData = 20; // 상태 변수와 초기값 선언
}

값형 데이터 타입

값형 데이터 타입에는, bool, int, byte1~byte32, adress가 있습니다.

// bool
bool isOpen = true;
bool isSold = false;

// int, uint
int8 seoulTemp = -20
uint myAge = 30

// byte
byte3 alphabets = 'abc'
alphabets[0]
alphabets[1]
alphabets[2]

// adress

address MyAddress = 0x10abb5efEcdc01234f7b2384912398798E089Ab2;

// 스마트 컨트랙트에서 특정 주소값으로 송금을하기 위해선,
// **address payable** 형식을 사용

address addr1;
address payable p_addr1 = payable(addr1);

constan로 상수로 선언을 할 수 있습니다.

 

참조형 데이터 타입

참조형 변수(reference type)은 배열과 같이, 데이터를 저장하는 영역에 연속되어
저장되어 있는 값의 첫번째 메모리의 주소를 값으로 가지는 변수 타입

  1. 메모리란?

프로그램이 동작하는 동안에만 값을 기억, 종료되면 값을 잃는 데이터 영역

  1. 스토리지?

블록체인에 기록되어 영구적으로 값이 유지되는 데이터영역

function f() {
    // 5개의 int32 형태의 메모리를 저장하는 ixedSlots를 선언
    int32[5] memory fixedSlots;
    fixedSlots[0] = 13;
}

참조형 변수의 유형

  1. 배열
  2. 문자열
  3. 구조체
  4. 매핑
// array
uint[] {array_name}
uint[4] {array_name}


// string
string name = 'kimcoding'


// struct
contract exampleC {
    struct UserInfo {
        address account
        string lastName;
        string firstName;
    }
    function createUser(address createAddress, string createLastName, string createFirstName) {
        UserInfo memory newUser = UserInfo({account: createUser, createLastName, firstName: createLastName})
    }
}

// mapping
// mapping은 스토리지 데이터 영역에 키-값 구조로 데이터를 저장할 떄 사용하는 참조형

mapping(address => int) public userAdress

 

글로벌 변수

글로벌 변수는 solidity 언어에 내장되어 있는 변수

  1. block

block는 블록에 대한 정보

  1. msg

msg는 컨트랙트를 시작한 트랜잭션 콜이나 메시지 콜에 대한 정보

  1. tx

tx는 트랜잭션 데이터

  1. This

This는 현재 컨트랙트를 참조

 

함수


function functionName(pram1, pram2, pram3) {...}

// 함수 변경자
// 함수 선언에 modifier를 추가하여 함수에 변경자를 적용할 수 있습니다.
// changeNum 변경자 시작 -> 본 함수 시작
int public num = 0;
modifier changeNum {
    num++;
    _;
    num--;
}

function func() public changeNum {
    if (num == 1){
        // do something
    }
}

 

상속

솔리디티의 contract 객체는 상속을 지원합니다. 상속을 통해 컨트랙트에 기능들을 추가, 확장


// 상속
contract ChildContract is Parentcontract {

}

// 다중 상속
contract ChildContract is Parentcontract1, Parentcontract2, Parentcontract3 {

}

 

에러 핸들링

솔리디티에서는 에러를 처리할 때는 assert, require, revert 함수를 사용

  1. revert

해당 함수를 종료하고 에러를 리턴

  1. require, assert

설정한 조건이 참인지 확인하고, 조건이 거짓이면 에러를 리턴

 

열거형

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


enum EvelLevel {Bad, Soso, Great}

// 열거형 변수 선언
EvelLevel valName = EvelLevel.Bad

// 집합의 데이터 순서에 따라 0부터 1씩 증가
int16 valName = int16(kimcoding)

 

이벤트

이벤트는 어떤 결과가 발생했을 때 해당 컨트랙트에서 dApp
클라이언트, 또는 다른 컨트랙트에서 전달

contract coinTransfer {
// event eventName(param1Type pram1, param2Type pram2, uint256 value)
event Transfer(address from, address to, uint256)
function transfer(address to, address amount){
    // ...
    // emit eventName(pram1, pram2 ...)
    emit Transfer(msg.sender, to, amount)
}
}