---
# System prepended metadata

title: 프라이빗 블록체인 기반 ERC20 토큰 개발기

---

---
title: 프라이빗 블록체인 기반 ERC20 토큰 개발기
image: https://i.imgur.com/Q9nUKfF.png
---

# 프라이빗 블록체인 기반 ERC20 토큰 개발기
![](https://i.imgur.com/Q9nUKfF.png)
- 기존에 있는 퍼블릭 블록체인이 아닌 별도의 **프라이빗 블록체인**을 구축해보았다. 기존의 이더리움 생태계에 들어가기 위해서는 당연히 퍼블릭 블록체인을 사용해야 하지만, 이더리움의 네트워크 동작 원리를 이해하기 위해서는 새로운 네트워크를 직접 구성해보는 것이 좋다고 판단했다. 그리고 프라이빗 네트워크를 구축하면 노드들 간에 발생하는 많은 상황들을 직접 제어할 수 있고 시뮬레이션 할 수 있는 점이 편리했다. 외부 네트워크를 사용하면 내가 원하는 상황을 만들기 어렵기 때문이다.
- **ERC20 기반의 토큰**을 개발하는 것은 간단하다. 외부에 잘 만들어진 ERC20 표준 라이브러리를 상속해서 만들면 되기 때문이다. 하지만, **폐쇄된 네트워크와 프라이빗 네트워크 환경에서 ERC20 기반 토큰을 개발하는 것**은 개발부터 배포까지 간단치 않기 때문에 많은 우여곡절 끝에 완료할 수 있었다.

## 들어가기 전에... 
- 먼저, 일반적인 내용들부터 다뤄보자.

### 네트워크 구성
- Geth는 Go 언어로 개발된 이더리움 노드 프로그램이다. 노드의 역할로는 검증과 채굴이 있는데, **검증 노드**는 transaction(tx)가 정상인지 검증을 하고, peer 노드에게 전파하는 역할을 한다. **채굴 노드**는 block을 생성할 수 있는 수학적 문제를 해결하고, 다른 노드들보다 그 문제를 해결하면 block을 생성할 수 있는 역할을 부여받게 된다. 이러한 방식을 Proof of Work (PoW)라고 부른다. Geth 는 검증과 채굴, 두 가지 모드의 노드를 모두 제공하고 있다.
- 이렇게 Geth를 통해서 노드를 구성하면 그 노드는 **Web Provider**의 역할을 하게 된다. Web Provider는 Smart Contract를 배포하는 역할을 한다고 생각하면 된다. 서버 개발에서는 서버 프로그램을 배포 서버에서 배포하는데, 그 배포 서버 역할을 하는 것이 블록체인에서는 Web Provider이다. 
- Geth 에서는 또한 **지갑**의 역할을 하는 주소도 부여한다. 초기에 노드를 활성화할 때, 비밀번호를 입력하도록 해서 신규 계정과 private key를 생성하는데, 이렇게 생성된 주소는 지갑 역할을 하여 ETH를 전송하고 받을 수 있도록 한다.
- 정리하자면, 블록체인 네트워크를 구성하기 위해서는 일반적으로 다음과 같은 구성 요소가 필요하고, Geth 노드를 수행함으로써 모두 사용 가능하다. 
    - **검증 노드**
    - **채굴 노드**
    - **Web Provider**
    - **지갑**

### 개발 및 배포 환경
- Smart Contract를 개발하고 배포하는 환경은 깔끔하게 되어 있다. 유용한 툴들이 있는데 각각에 대해서 간단히 소개해보면 아래와 같다.
    - **Remix**: Remix는 대표적인 IDE(Integrated Development Environment)로 Editor, Solidity 컴파일러 그리고 배포 기능까지 모두 사용 가능하다. 심지어 온라인 Editor이기 때문에 개발과 배포에 굉장히 편리하다.
    - **Truffle / Hardhat**: Remix를 사용한 온라인 환경이 아니라 로컬 환경에서 개발을 할 때 사용하는 Smart contract 개발 프레임워크이다. 개발자가 굳이 컴파일 환경, 테스트 환경, 배포 환경을 위한 디렉토리 구조나 파일을 생성할 필요없이 자동으로 설정을 해주고, 설정된 환경을 기반으로 편리하게 개발할 수 있다.
    - **Infura**: Infura 는 오픈 Web Provider이다. Web Provider라 함은 내가 개발한 Smart Contract를 배포할 때 사용하는 노드라고 생각하면 된다. 이 Web Provider 를 내가 직접 노드를 띄워서 사용할 수 있지만, 노드를 띄우지 않고도 Infura 와 같은 서비스를 사용하면 간편하게 배포할 수 있다.
    - **web3.js / web3.py**: ETH를 전송하고, Smart Contract를 배포하고, 온체인 데이터를 불러오는 등 블록체인 네트워크와의 인터페이스를 제공하는 프레임워크다. 둘 다 동일한 기능을 제공하기 때문에 본인에게 편리한 언어나 개발 목적에 따라 선택하면 된다. 예를 들어, 웹 프론트 엔드를 개발한다고 하면 주로 Javascript를 사용하기 때문에 web3.js를 채택해서 개발할 수 있다. 

프라이빗 블록체인은 다른가?
---
- 프라이빗 블록체인을 구성하고 Smart Contract를 개발하는 것은 위에서 나온 내용들과 다른 것은 없다. 하지만, 내가 개발하는 환경에는 **외부로 통하는 네트워크가 차단된 폐쇄적인 환경**이었고, 유용한 개발/배포 툴을 설치하는 것도 녹록치 않았다. 설치하는데 시간과 에너지가 매우 오래 소모될 듯하여 정말 필요한 것만 설치하여 단순한 환경을 만들었고, 그 환경은 아래와 같다.
    - **Geth (1.10.16)**: Linux용 Geth binary 파일을 설치했다. 
    - **web3.py (5.29.1 ?)**: Python 환경은 잘 갖춰져 있었고, 내가 익숙한 환경이기 때문에 web3.py를 선택했다. 
    - **solc (v0.8)**: Soldity 컴파일러 또한 빌드할 필요없는 binary 형태로 되어있는 것을 사용했다.
- 이러한 환경을 구축할 때까지 시행착오가 굉장히 많았다. `truffle`이나 `remix` 등을 설치하려고 했던 것은 물론이고, 정 안되겠어서 Python 기반의 Smart Contract 프레임워크인 `brownie`도 사용하려고 했다. 하지만 `brownie` 역시 온라인 환경을 통하는 부분이 있어서 오프라인에서 사용하도록 설정하고 해결하는 것이 큰 노력이 필요할 것 같았다. 원리를 이해하면 위의 최소한의 구성요소를 갖고 개발할 수 있지 않을까 했다. 

## 그 다음은?
- [1. Geth로 프라이빗 네트워크 구축하기](/OEOijqBDTJCH8m3pTfZ5ow)
- [2. ERC20 토큰 개발 및 배포하기 (web3.py)](/Gg6oOnYxSyWE3vKQgcrx9Q)
