본문 바로가기
Blockchain

[Blockchain] 이더리움 스마트 컨트랙트 배포하기(Remix)

by 개발자 염상진 2022. 7. 12.

이더리움 블록체인 네트워크에 스마트 컨트랙트를 작성하여 배포할 수 있습니다. 이를 위해서는 먼저 솔리디티 언어로 스마트 컨트랙트를 작성한 후 solc로 컴파일한 후 abi와 bytecode를 배포합니다. 

 

 

 

Soldity 컴파일러 solc 설치

 

우선 저장소에 ethereum을 추가한 후 solc를 설치합니다.

$ sudo add-apt-repository ppa:ethereum/ethereum
$ sudo apt update
$ sudo apt install solc

 

설치가 완료되면 version을 확인하여 정상적으로 설치 여부를 확인합니다.

$ solc --version

solc, the solidity compiler commandline interface
Version: 0.8.15+commit.e14f2714.Linux.g++

 

스마트 컨트랙트 작성

 

간단한 예제를 작성합니다. tempData에 string 값을 할당하고, 출력해오는 컨트랙트입니다. 

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 < 0.9.0;

contract SimpleContract{
	string tempData;
    
    function set(string memory str) public{
    	tempData = str;
    }
    
    function get() public view returns(string memory outStr){
    	outStr = tempData;
    }
}

 

 

 

 

컴파일 하는 방법

 

① bytecode 생성하기

솔리디티로 작성된 스마트 컨트랙트를 컴파일 하기 위해서는 solc 컴파일러를 사용합니다. 

  • optimize : 컴파일 전 솔리디티 코드를 약 200번 정도 실행한다고 가정했을 때 코드를 최적화 합니다.
  • solc --bin : 솔리디티로 작성된 코드를 이진 형식으로 컴파일합니다. 
$ solc --optimize --bin simpleContract.sol

 

컴파일을 완료하면 Binary 형식의 bytecode가 출력됩니다. 

 

 

② ABI(Application Binary Interface) 생성하기

ABI는 우리가 작성한 스마트 컨트랙트 코드에 대한 discription을 담은 JSON 형식의 파일입니다. 이더리움 블록체인 네트워크의 노드들은 지갑을 통해 상호작용하게 되고, 이 때 JSON-RPC 형식의 데이터를 사용합니다. 이 때 필요한 데이터가 ABI 데이터 입니다.

이더리움 블록체인에 올라간 스마트 컨트랙트는 바이트코드 형태로 존재하므로, 어떤 함수를 어떤 인자를 보내 실행해야 하는지 노드들은 알 수 없습니다. 설명을 위해 ABI를 참조하여 적절한 방법으로 입력 데이터와 반환 데이터를 유추할 수 있습니다. 

ABI 파일을 생성하기 위해서는 solc --abi 명령어를 사용합니다.

$ solc --abi SimpleContract.sol

 

컴파일이 완료되면 JSON 형식의 배열이 출력됩니다.

 

 

 

스마트 컨트랙트 배포하기

 

이더리움 블록체인에서 스마트 컨트랙를 배포는 크게 4단계를 거칩니다.

  1. bytecode와 ABI를 solc컴파일러로 생성합니다. 이 후 이를 통해 블록체인에 컨트랙트를 배포할 때 사용할 컨트랙트 객체를 생성합니다. 
  2. 계정, GAS LIMIT, 컨트랙트 객체 등을 담은 배포 트랜잭션을 생성합니다. 
  3. 트랜잭션을 블록체인 네트워크에 올립니다.
  4. 채굴 노드가 블록을 생성하고 트랜잭션을 검증하는 과정을 마친 후 브로드캐스팅 하게 되면 우리가 작성한 스마트 컨트랙트의 계정(CA, Contract Account)가 생성됩니다.

 

 

 

 

스마트 컨트랙트가 배포되면 스마트 컨트랙트 주소를 활용해 스마트 컨트랙트 함수를 사용할 수 있게 됩니다. 즉 이더리움 블록체인의 정보를 변경하거나 조회할 수 있게 됩니다. 정보를 변경하는 작업은 함수를 실행한다는 메시지를 트랜잭션에 담아 보내야 합니다.

단순히 정보를 조회만 하는 경우에는 가스비가 들지 않기 때문에 자신의 노드에 동기화된 블록 데이터를 읽기 위한 트랜잭션 call을 합니다. 이더리움 블록체인 메인넷에서는 모든 트랜잭션 생성에 가스비가 들기 때문에 신중하게 작업해야 함은 물론입니다.

 

① Remix IDE 사용하기

Remix는 Solidity 개발를 위한 IDE(Intergrated Development Environment)입니다. 자체적으로 컴파일, 배포, 테스트, 디버깅 기능을 가지고 있고, 웹에서 작동하기 때문에 사용성이 높습니다. 위에서 작성한 간단한 예제를 Remix에서 작성합니다. 

Remix 메인 페이지

 

코드 작성을 마치고 ctrl + s 하면 컴파일 진행됩니다. 동일한 디렉토리에 artifacts 폴더 내부를 보면 SimpleContract.json 파일이 생성되어 있습니다. 

 

② Remix 테스트넷 배포하기

좌측 메뉴바에서 "Deploy & Run Transactions"을 클릭합니다. 

 

  • 환경(Environment) : 컨트랙트를 배포할 네트워크를 선택합니다. JavaScript VM(London)은 Remix가 제공하는 가상 네트워크 입니다. 지갑과 연동해 배포하기 위해서는 Injected Web3 네트워크를 선택하면 되고, Geth에 접속한 네트워크에 배포하기 위해서는 Web3 Provider을 선택합니다.
  • 계정(Account) : 컨트랙트를 배포할 계정입니다. Remix에서 제공하는 네트워크에서 컨트랙트를 배포할 계정은 이미 정해져 있습니다. 
  • Gas Limit : 컨트랙트를 실행할 때 사용되는 가스의 한도입니다.
  • Value : 전송할 이더(ETH)의 양입니다.
  • Contract : 트랜잭션에 보낼 컨트랙트입니다. 우리가 작성/컴파일 했던 SimpleContract.sol을 선택합니다. 

 

다른 조건 값들은 딱히 변경할게 없어 바로 "Deploy"합니다. 배포가 완료되면 우측 터미널에 완료 안내메세지가 출력됩니다.

 

우측 "Deployed Contract"에서는 우리가 배포한 스마트 컨트랙트를 실제로 실행해볼 수 있습니다. 

 

 

set() 함수를 실행해서 특정 값을 입력하고 다시 값을 읽어오는 작업이 일어날 때 마다 트랜잭션이 발생합니다. 

 

 

 

 

 

[Blockchain] 블록체인 오라클(Oracle) 문제란?

블록체인에 올라간 스마트 컨트랙트는 수동적인 존재입니다. 즉, EOA를 통해서만 작동하게 됩니다. 즉, 스마트 컨트랙트는 주어진 데이터에 따라 계약을 이행하기만 하기 때문에 외부 데이터가

about-tech.tistory.com

 

 

[Blockchain] 이더리움 EVM 작동 구조 원리

상태 머신이란 입력을 읽어서 새로운 상태로 전환하는 것입니다. 이더리움은 거래에 기반을 둔 상태 머신(Transaction-Based State Machine)입니다. 이더리움의 상태머신의 시작은 Genesis Block입니다. 이

about-tech.tistory.com

 

 

[Blockchain] 이더리움 프라이빗 네트워크 구축 방법

실제 이더리움 블록체인에서는 여러 노드들이 연결됩니다. 프라이빗 네트워크 환경에서 멀티 노드를 구성한 후 실제 이더리움 처럼 작동하는 방법을 알아봅니다. 이더리움 프라이빗 네트워크

about-tech.tistory.com

 

댓글