GETH 를 활용한 Chain Setup
Geth (Go Ethereum)는 Ethereum 네트워크의 주요 클라이언트 중 하나로, Go 언어로 작성되었습니다. Geth는 이더리움 노드를 실행하는 소프트웨어로, 이를 통해 이더리움 네트워크와 상호작용할 수 있습니다. Geth를 사용하면 블록체인 데이터를 동기화하고, 트랜잭션을 전송하고, 스마트 계약을 배포 및 실행할 수 있습니다.
Geth의 주요 구성 요소
- 이더리움 프로토콜 구현
- 이더리움 블록체인의 모든 프로토콜 규칙을 구현하여 네트워크 참여, 블록 검증 및 트랜잭션 처리를 가능하게 합니다.
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