본문 바로가기
IT/이더리움 Ethereum

solidity 0.5.16 프로그램 기초 배우기 . 스마트 계약(Smart Contract)

by SidePower 2022. 9. 21.

 

스마트 계약(Smart Contract)이란

이더리움 블록체인에서 동작하는 응용 프로그램입니다.

 

쓰지 않는 중고 물품을 공유하는 응용 프로그램을 만들어

블록체인에 배포하면

블록체인 참가자들이 다양한 클라이언트나 브라우저를 이용해서

중고 물품 리스트를 확인하거나 등록해서 공유할 수 있습니다.

 

이더리움 스마트 계약 개발에 사용되는 프로그래밍 언어로는

solidity , serpent , LLL 등이 있는데요. 

아시겠지만 많이 사용되는 solidity 대세입니다.

 

Solidity는 

코딩해서 컴파일 과정을 거쳐 바이트코드를 만들어 배포하는 정적 언어로써

대규모의 프로그래밍도 가능하고 안정적입니다.

객제지향 언어이며 Class가 있는 C++ , Java와 매우 흡사합니다.

solidity만의 고유의 문법이 있어 차이가 있지만

전체적인 프로그램 구조는 같다고 보시면 될거에요.

 

 Solidity 기본 문법

아래가 기본 구조이며 클래스와 동일한 구조인 거 같죠.

pragma solidity ^0.5.16;

import "./contracts/funcfactory.sol"

contract UsedShare {
    //상태 변수 선언
    string public name;
    uint public count;
    address public user;

    //이벤트
    event userdHit(address _user, unit number);

    //생성자
    constructor() public {
        user = msg.sender;
    }

    //함수 선언
    function getUser() public view returns(address) {
        return user;
    }

    function set(uint x) public {
        count = x; 
    }
    function get() public view returns (uint) {
        return count;
    }
}

● pragma solidity는 컴파일러인 solc 버전 정보

그동안 solc 버전이 자주 바꾸면서 이제는 버전 정보를 꼭 기록해야 되네요.

버전 차이로 인해 오작동을 방어하기 위한 조치인 거 같아요.

● import문은 외부 또는 다른 sol파일들 참조할 수 있게 합니다.

 

● contract 계약 선언

contract를 영어 해석하면 계약이란 뜻이며 스마트 계약의 단위입니다.

contract를 class라고 생각하시면 될 거예요.

객체지향 언어와 동일하게 다른 contract 상속받을 수 있습니다.

is 키워드를 쓰고 뒤에 상속받을 contract명을 쓰면 됩니다.

contract Child is Parents

 

● event는 쉽게 말해 로깅입니다.

event문으로 이벤트를 선언하고 emit문으로 이벤트를 호출합니다.

이벤트가 호출될 때마다 트랜젝션 로그에 함께 기록됩니다.

그리고 블록체인 네트워크에서 web3.js를 이용해서

contract에서 발생한 이벤트 데이터를 읽을 수 있습니다.

 

● 가시성(visibility)은 자바의 접근제어자와 동일하며

public private external internal이 있습니다.

 public

외부 다른 contract에서도 호출 가능

 private

지정된 contract내에서만 호출 가능 . 상속한 contract에서도 접근 불가능

 external

contract 외부에서만 호출 가능

 internal

상속한 contract에서만 접근 가능

 

● 변수

상태 변수(State Variable)와 지역 변수(local Variable)가 있으며

상태 변수는 contract 선언문 바로 아래 선언된 변수이고

블록체인에서 영구적으로 저장되는 값들입니다.

지역 번수는 function 내에 선언된 변수입니다.

자료형 가시성 변수명;
자료형 가시성 변수명 = 값;

 정수형

int : 정수 타입 . 기본값 0으로 일반적인 숫자

      int8 int16 int32 int64 int128 int256

uint : 부호 없는 정수 타입 . unsigned int . 기본값 0으로        

      uint8 uint16 uint32 uint64 uint128 uint256

 

 Boolean

true 와 false

 

 string

UTF-8 인코딩의 임의의 길이 문자열

 

 bytes

임의의 길이의 byte 데이터 . 원시 데이터를 만들 때 사용

 

 array . 배열

자료형[개수] 배열명;

uint[10] scores;

uint[] scores; 배열 개수 지정 없이 동적 선언도 가능.

인덱스는 0부터 시작하며

데이터 삽입시 배열명.push(값)으로 함.

 

 struct . 구조체

여러 개의 자료형을 모두 새로운 유형의 자료형을 정의하는 것을 struct라고 합니다.

struct _phone {
   string phone_num;
   string name;
   uint age;
   address user;
}

 

 mapping

자바에서 hash 또는 map 자료형과 동일하며

key와 value으로 이뤄진 자료형입니다.

mapping(string => uint) 변수명;

앞에 string 형의 key값이고 뒤에 uint 형의 value값을 나타내는 매핑입니다.

 

 address

이더리움의 계정(지갑) 주소를 나타낼 때 address를 사용합니다.

주소값은 20byte 길이로 byte20 자료형으로 변환할 수도 있습니다.

 

 

● 형변환(casting)

 자료형(값)으로 형변환할수 있습니다.

string score = "123";
uint(score)

 uint64 자료형을 uint32로 casting하려면 uint32(uint64 변수명)으로 합니다.

 

● function . 함수

스마트 계약의 다양한 기능을 구현하는 곳입니다.

function 함수명() 가시성 상태제어자 returns (인자값들..)

function set(uint x) public {
    count = x;
}
function get() public view returns (uint) {
    return count;
}

▩ 상태제어자

함수의 역할을 제어하며 view , pure가 있습니다.

view는 상태 변수 접근 가능하지만 변경 불가능하며

pure는 상태 변수 접근과 변경 둘 다 불가능합니다.

 

 

● function modifier . 함수 제어

contract에 정의된 함수들이 호출 전 . 후 호출되는 함수입니다.

함수에 접근할 수 있는 제한 사항을 두거나

함수 호출 전,후 공통적인 기능을 넣을 때 사용됩니다.

modifier 정의하고 마지막 줄에 반드시 _; (언더바 세미콜론) 넣어야 됩니다.

함수의 가시성(public,private...) 뒤에 함수명을 기입하면 됩니다.

contract SimpleStorage {
    uint storedData;
    address change_user;
   
    modifier check_Owner {
        require(msg.sender == change_user, "호출 계정(주소)이 같아야 합니다.");
        _;
    }
   
    function set(uint x) public check_Owner {
        storedData = x;
    }
...
...

 

● payable

가상화폐를 접근할 수 있는 키워드입니다.

이더를 주고받는 함수에는 반드시 있어야 되며

없을 경우에는 트랜잭션 거부 에러가 발생합니다.

 

● fallback function . 폴백함수

이름 없는 함수이며 contract 마다 한 개씩 가질 수 있습니다.

어떤 함수를 호출하지 않고 contract만 호출할 경우에 자동으로 호출됩니다.

인자도 없고 리턴도 없습니다.

가시성은 반드시 external이어야 합니다.

payable 키워드가 사용되면 가상화폐(이더)를 송금하거나 수신받을 수 있습니다.

function() external {
    ...
}

function() external payable {
    ...
}

 

감사합니다.

반응형

댓글