GETH 를 활용한 Chain Setup

Geth 에 대해

birdgang
13 min readJul 21, 2024

Geth (Go Ethereum)는 Ethereum 네트워크의 주요 클라이언트 중 하나로, Go 언어로 작성되었습니다. Geth는 이더리움 노드를 실행하는 소프트웨어로, 이를 통해 이더리움 네트워크와 상호작용할 수 있습니다. Geth를 사용하면 블록체인 데이터를 동기화하고, 트랜잭션을 전송하고, 스마트 계약을 배포 및 실행할 수 있습니다.

Geth의 주요 구성 요소

  1. 이더리움 프로토콜 구현
  • 이더리움 블록체인의 모든 프로토콜 규칙을 구현하여 네트워크 참여, 블록 검증 및 트랜잭션 처리를 가능하게 합니다.

2. P2P 네트워킹

  • 이더리움 노드 간의 통신을 관리하는 피어 투 피어 네트워크 프로토콜을 구현 합니다.
  • 노드 디스커버리, 데이터 전파 및 네트워크 유지 기능을 포함합니다.

3. RPC 서버

  • JSON-RPC 및 IPC (Inter-Process Communication) 인터페이스를 제공하여 외부 애플리케이션이 Geth와 상호작용할 수 있게 합니다.
  • 이를 통해 스마트 계약 배포, 계정 관리 및 트랜잭션 전송 등이 가능합니다.

4. 계정 관리

  • 사용자 계정을 생성, 관리 및 보안 유지 기능을 제공합니다.
  • 계정 정보는 키스토어 파일에 암호화되어 저장됩니다.

5. EVM (Ethereum Virtual Machine)

  • 스마트 계약을 실행하는 가상 머신입니다.
  • 이더리움 블록체인 상에서 코드 실행을 담당합니다.

6. 데이터베이스

  • 블록체인 데이터, 상태 데이터 및 트랜잭션 로그를 저장합니다.
  • 레벨DB 또는 다른 데이터베이스를 사용할 수 있습니다.

Geth 로 Mainnet 설정하는 방법

Geth를 통해 이더리움 메인넷 노드를 설정하는 과정은 다음과 같습니다.

1. Geth 설치

macOS:

brew tap ethereum/ethereum
brew install ethereum

Ubuntu:

sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

2. 데이터 디렉토리 생성

Geth는 블록체인 데이터를 저장할 디렉토리를 필요로 합니다. 기본 디렉토리는 `~/.ethereum` (macOS/Linux) 또는 `%APPDATA%\Ethereum` (Windows)입니다. 필요에 따라 다른 디렉토리를 지정할 수 있습니다.

geth - datadir /path/to/your/data/directory

3. Geth 실행 및 동기화 시작

Geth를 실행하여 이더리움 메인넷과 동기화를 시작합니다. 여러 동기화 모드가 있지만, 가장 많이 사용하는 것은 ‘fast’ 모드입니다.

geth - syncmode "fast" - datadir /path/to/your/data/directory

이 명령어를 실행하면 Geth가 최신 블록까지 빠르게 동기화합니다. 이 과정은 몇 시간에서 며칠이 걸릴 수 있습니다.

4. Geth 콘솔에 접속

Geth를 실행하는 동안 다른 터미널을 열어 Geth 콘솔에 접속할 수 있습니다.

geth attach /path/to/your/data/directory/geth.ipc

이 명령어를 사용하면 Geth 콘솔에 접속할 수 있으며, JavaScript 명령을 사용하여 이더리움 노드와 상호작용할 수 있습니다.

5. Geth 콘솔 명령어 사용 예시

  • 계정 생성:
// 계정 생성
personal.newAccount("비밀번호")

// 잔액 확인
web3.eth.getBalance("계정주소")

// 트랜잭션 전송
web3.eth.sendTransaction({from: "발신자주소", to: "수신자주소", value: web3.toWei(1, "ether")})

6. Geth를 백그라운드에서 실행

서버에서 Geth 를 실행하는 경우 백그라운드에서 실행하는 것이 좋습니다. 이를 위해 `nohup` 명령어를 사용할 수 있습니다.

nohup geth - syncmode "fast" - datadir /path/to/your/data/directory > geth.log &

7. 로그 확인

Geth의 동기화 상태나 오류 메시지를 확인하려면 로그 파일을 확인할 수 있습니다.

tail -f geth.log

이 과정을 통해 Geth를 설치하고 이더리움 메인넷 노드를 설정할 수 있습니다. Geth를 통해 네트워크와 상호작용하고 트랜잭션을 관리하며 스마트 계약을 실행할 수 있습니다.

`genesis.json` 파일은 Ethereum 블록체인의 초기 상태를 정의하는 설정 파일입니다. 이 파일은 새로운 이더리움 네트워크를 시작할 때 필수적이며, 블록체인의 첫 번째 블록(Genesis Block)의 내용을 지정합니다. 아래에서 `genesis.json`의 주요 필드와 그 역할에 대해 설명하고, 예시 파일을 제공하겠습니다.

// genesis.json
{
"config": {
"chainId": 1234,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0
},
"nonce": "0x0000000000000042",
"timestamp": "0x0",
"extraData": "0x",
"gasLimit": "0x8000000",
"difficulty": "0x400",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
"0xYourEthereumAddress1": {
"balance": "0x1bc16d674ec80000" // 2 ETH in wei
},
"0xYourEthereumAddress2": {
"balance": "0x1bc16d674ec80000" // 2 ETH in wei
}
},
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
  • config : 이더리움 네트워크의 주요 프로토콜 업그레이드 시점을 정의합니다. `chainId`는 네트워크의 고유 식별자입니다.
  • nonce : 특정 값을 고정합니다.
  • timestamp : Genesis 블록의 생성 시점을 정의합니다.
  • extraData : 추가 데이터 필드로 일반적으로 비워 둡니다.
  • gasLimit : Genesis 블록의 가스 한도를 설정합니다.
  • difficulty : 블록의 채굴 난이도를 정의합니다.
  • mixHash : 고정된 해시 값입니다.
  • coinbase : 채굴 보상 주소로, Genesis 블록에서는 일반적으로 비워 둡니다.
  • alloc : 초기 이더리움 잔액을 특정 주소에 할당합니다.
  • number : Genesis 블록 번호로 항상 0입니다.
  • gasUsed : Genesis 블록에서 사용된 가스를 정의합니다.
  • parentHash : 부모 블록의 해시로, Genesis 블록에서는 0입니다.

Geth 코드 분석 및 Chain 구성 방법

Geth(Go Ethereum)는 Ethereum 블록체인을 구현한 Go 언어 기반 클라이언트입니다. Geth를 사용하면 Ethereum 네트워크에 참여하고, 스마트 계약을 배포하고, 트랜잭션을 보낼 수 있습니다. 아래는 Geth 코드 분석과 함께 Ethereum 블록체인을 구성하는 방법에 대한 자세한 설명 입니다.

1. Geth 코드 구조 분석

Geth의 코드는 여러 패키지로 구성되어 있으며, 주요 패키지와 그 역할은 다음과 같습니다.

  • cmd/geth : Geth의 메인 실행 파일로, 커맨드라인 인터페이스(CLI) 명령어를 정의 합니다.
  • eth : Ethereum 프로토콜의 구현을 포함 합니다.
  • core : 블록체인 데이터 구조 및 상태 전환 로직을 포함합니다.
  • p2p : 피어 투 피어 네트워킹을 담당합니다.
  • rpc : JSON-RPC 서버를 구현하여 외부 애플리케이션과의 상호작용을 지원합니다.
  • accounts : 계정 관리 및 키스토어 관련 기능을 제공 합니다.

2. Geth 설치 및 설정

Geth를 설치하고 초기 설정을 수행하는 방법은 다음과 같습니다.

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

개인 네트워크 설정

# 초기화 제네시스 블록 구성
cat << EOF > genesis.json
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "200",
"gasLimit": "2100000",
"alloc": {}
}
EOF

# 블록체인 초기화
geth init genesis.json --datadir ./myDataDir

3. Geth를 사용한 네트워크 시작

Geth를 사용하여 Ethereum 네트워크를 시작하는 단계는 다음과 같습니다.

네트워크 시작

# 개인 네트워크 시작
geth --datadir ./myDataDir --networkid 15 console

4. 예시: 스마트 계약 배포 (Hardhat 사용)

이제 Hardhat을 사용하여 스마트 계약을 배포하고 상호작용하는 방법을 알아보겠습니다. 먼저, Hardhat 프로젝트를 설정합니다.

# 프로젝트 디렉터리 생성 및 이동
mkdir hardhat-project
cd hardhat-project

# Hardhat 설치
npm install --save-dev hardhat

# Hardhat 프로젝트 초기화
npx hardhat

스마트 계약 (SimpleStorage.sol)

pragma solidity ^0.4.17;

contract SimpleStorage {
uint public storedData;

function set(uint x) public {
storedData = x;
}

function get() public view returns (uint) {
return storedData;
}
}

스마트 계약 배포 스크립트

// scripts/deploy.js
async function main() {
const SimpleStorage = await ethers.getContractFactory("SimpleStorage");
const simpleStorage = await SimpleStorage.deploy();

await simpleStorage.deployed();
console.log("SimpleStorage deployed to:", simpleStorage.address);
}

main()
.then(() => process.exit(0))
.catch(error => {
console.error(error);
process.exit(1);
});

배포 스크립트 실행

# 배포 스크립트 실행
npx hardhat run scripts/deploy.js --network localhost

5. 스마트 계약과 상호작용

Hardhat 콘솔을 통해 스마트 계약과 상호작용하는 방법은 다음과 같습니다.

// scripts/interact.js
async function main() {
const [deployer] = await ethers.getSigners();
const SimpleStorage = await ethers.getContractFactory("SimpleStorage");
const simpleStorage = await SimpleStorage.attach("배포된 계약 주소");

// 데이터 설정
await simpleStorage.set(42);
console.log("Data set to 42");

// 데이터 가져오기
const value = await simpleStorage.get();
console.log("Stored data is:", value.toString());
}

main()
.then(() => process.exit(0))
.catch(error => {
console.error(error);
process.exit(1);
});

상호작용 스크립트 실행

# 상호작용 스크립트 실행
npx hardhat run scripts/interact.js --network localhost

--

--