쿠쿠더님의 블로그

솔리디티 스마트 컨트랙트 본문

카테고리 없음

솔리디티 스마트 컨트랙트

쿠쿠더 2025. 7. 31. 16:28
  1. 스마트 컨트랙트와 EVM
  2. EOA와 CA의 차이
  3. 솔리디티란 무엇인가
  4. 솔리디티 문법 기초
  5. 컨트랙트 배포 흐름
  6. 메타마스크와 니모닉
  7. RPC 통신과 공급자 구조
  8. Web3 라이브러리의 역할
  9. 간단한 카운트 컨트랙트 구현
  10. solc를 활용한 컴파일 방법

1. 스마트 컨트랙트와 EVM

스마트 컨트랙트는 조건이 충족되면 자동으로 실행되는 코드다.
우리는 이 코드를 Solidity라는 언어로 작성하고, **EVM(Ethereum Virtual Machine)**이 바이트코드로 실행한다.
작성된 코드는 블록체인에 기록되며, 영구 불변 상태로 관리된다.

 

2. EOA와 CA의 차이

  • EOA (Externally Owned Account)
    사용자 지갑에 해당하며, 트랜잭션 발생의 주체다. 개인키로 서명을 만들어 상태를 변경한다.
  • CA (Contract Account)
    배포된 컨트랙트의 주소다. 자체적으로 트랜잭션을 발생시킬 수는 없고, EOA에서 발생된 트랜잭션을 통해 동작한다.

 

3. 솔리디티란 무엇인가

Solidity는 이더리움 전용 스마트 컨트랙트 언어로, 2015년 메인넷 출시와 함께 대중화되었다.
Javascript와 문법이 유사하며, 절차지향적인 방식으로 코드를 작성한다.

// SPDX-License-Identifier: MIT
pragma solidity 0.8.30;

contract Counter {
    uint count = 0;

    function setValue(uint _count) public {
        count = _count;
    }

    function getValue() public view returns (uint) {
        return count;
    }
}

 

  • uint : 양의 정수
  • public : 외부 호출 가능한 함수
  • view : 읽기 전용, 가스비 없음

4. 솔리디티 문법 기초

  • 클래스 문법처럼 컨트랙트를 정의
  • constructor()는 한 번만 실행되는 초기화 함수
  • 상태 변수는 블록에 기록되는 데이터
  • 트랜잭션 함수(set)는 가스가 발생하며 블록체인에 기록
  • 읽기 함수(get)는 메시지 호출이며 가스 없음

 

5. 컨트랙트 배포 흐름

  1. 코드를 작성
  2. 컴파일 → ABI, ByteCode 생성
  3. EOA에서 ByteCode를 포함한 트랜잭션 전송
  4. EVM이 트랜잭션 수신 후 저장소에 기록
  5. 블록에 기록되면서 CA 주소가 생성
  6. CA 주소로 setValue 등 메서드를 호출할 수 있음

 

6. 메타마스크와 니모닉

  • 메타마스크는 로컬에 개인키를 보관하고 서명 역할을 대신해준다.
  • 여러 계정을 마스터키 기반으로 생성 가능하며, 이 마스터키는 니모닉이라는 시드 문장으로 복구 가능하다.

예: gadget arrive gym radar venture result ugly plastic system execute poet improve
BIP-39 표준 기반의 니모닉은 12/15/18/24단어로 구성된다.


7. RPC 통신과 공급자 구조

우리는 직접 노드를 운영하지 않고, RPC 제공자의 노드를 이용해 트랜잭션을 전달한다.
대표적인 공급자는 Infura, Alchemy, Ankr, Binance 등이 있다.
우리가 만든 서명된 트랜잭션을 RPC 서버가 대신 블록체인 네트워크에 전달하는 구조다.

 

8. Web3 라이브러리의 역할

Web3.js 또는 Ethers.js 같은 라이브러리는 다음을 도와준다.

  • EOA 생성 및 지갑 연동
  • 컨트랙트 함수 호출
  • 트랜잭션 생성 및 서명
  • 상태 읽기 및 이벤트 수신

 

9. 간단한 카운트 컨트랙트 구현

다음은 기본적인 카운트 컨트랙트다.

pragma solidity 0.8.30;

contract Counter {
    uint public count = 0;

    function increment() public {
        count += 1;
    }

    function get() public view returns (uint) {
        return count;
    }
}
increment() 호출 시 트랜잭션 발생

get() 호출 시 메시지로 조회 가능 (가스 없음)

 

 

10. solc를 활용한 컴파일 방법

Solidity 코드를 컴파일하기 위해 solc를 사용할 수 있다.

npm install -g solc
solc --bin --abi ./Counter.sol -o ./build
--bin : 바이트 코드 추출

--abi : 메타데이터 추출

-o : 출력 디렉토리 설정

이 결과물들을 이용해 Web3에서 컨트랙트를 배포하고 함수 호출이 가능하다.