상세 컨텐츠

본문 제목

Geth 계정 생성과 채굴 (PoW버전의 geth)

Blockchain/Ethereum

by Yongari 2023. 2. 4. 17:26

본문

 

 

1. 로컬 테스트넷에서 Geth 실행하기

 

로컬 테스트넷에서 Geth를 실행하기 위해서 데이터 디렉토리와 genesis.json파일이 필요합니다.

 

데이터 디렉토리 : 송수신한 블록 데이터와 계정 정보를 저장함
genesis.json : 블록체인의 Genesis 블록(블록체인의 첫번째 블록)의  정보가 담긴 json 형태의 파일

 

 

1-1 먼저 docker에 다시 접속하겠습니다.

#docker가 다운되어 있을 경우

docker ps -a #docker 컨테이너 실행여부 확인


docker start con_ubnutu #도커 con_ubuntu를 실행하기


docker exec -it conubunt bash #도커 con_ubuntu로 접속하기

 

 

1-2 test_data와 genesis.json 만들기

mkdir -p /go-ethereum/test_data #test_data 만들기

touch /go-ethereum/test_data/genesis.json #genesis.json 만들기

 

 

1-3 geth를 실행하면 다음과 같은 로그가 출력됩니다. 

geth
INFO [02-04|10:49:44.058] Starting Geth on Ethereum mainnet... 
INFO [02-04|10:49:44.099] Bumping default cache on mainnet         provided=1024 updated=4096
INFO [02-04|10:49:44.102] Maximum peer count                       ETH=50 LES=0 total=50
INFO [02-04|10:49:44.104] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory"
INFO [02-04|10:49:44.163] Set global gas cap                       cap=50,000,000
INFO [02-04|10:49:44.166] Allocated trie memory caches             clean=614.00MiB dirty=1024.00MiB
INFO [02-04|10:49:44.166] Allocated cache and file handles         database=/root/.ethereum/geth/chaindata cache=2.00GiB handles=524,288
INFO [02-04|10:49:44.735] Opened ancient database                  database=/root/.ethereum/geth/chaindata/ancient/chain readonly=false
INFO [02-04|10:49:44.749]  
INFO [02-04|10:49:44.749] --------------------------------------------------------------------------------------------------------------------------------------------------------- 
INFO [02-04|10:49:44.749] Chain ID:  1 (mainnet) 
INFO [02-04|10:49:44.749] Consensus: Beacon (proof-of-stake), merged from Ethash (proof-of-work) 
INFO [02-04|10:49:44.749]  
INFO [02-04|10:49:44.749] Pre-Merge hard forks: 
INFO [02-04|10:49:44.750]  - Homestead:                   1150000  (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/homestead.md) 
INFO [02-04|10:49:44.750]  - DAO Fork:                    1920000  (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/dao-fork.md) 
INFO [02-04|10:49:44.750]  - Tangerine Whistle (EIP 150): 2463000  (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/tangerine-whistle.md) 
INFO [02-04|10:49:44.750]  - Spurious Dragon/1 (EIP 155): 2675000  (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/spurious-dragon.md) 
INFO [02-04|10:49:44.750]  - Spurious Dragon/2 (EIP 158): 2675000  (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/spurious-dragon.md) 
INFO [02-04|10:49:44.750]  - Byzantium:                   4370000  (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/byzantium.md) 
INFO [02-04|10:49:44.750]  - Constantinople:              7280000  (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/constantinople.md) 
INFO [02-04|10:49:44.750]  - Petersburg:                  7280000  (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/petersburg.md) 
INFO [02-04|10:49:44.750]  - Istanbul:                    9069000  (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/istanbul.md) 
INFO [02-04|10:49:44.750]  - Muir Glacier:                9200000  (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/muir-glacier.md) 
INFO [02-04|10:49:44.750]  - Berlin:                      12244000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/berlin.md) 
INFO [02-04|10:49:44.750]  - London:                      12965000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/london.md) 
INFO [02-04|10:49:44.750]  - Arrow Glacier:               13773000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/arrow-glacier.md) 
INFO [02-04|10:49:44.750]  - Gray Glacier:                15050000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/gray-glacier.md) 
INFO [02-04|10:49:44.750]  
INFO [02-04|10:49:44.750] Merge configured: 
INFO [02-04|10:49:44.750]  - Hard-fork specification:    https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/paris.md 
INFO [02-04|10:49:44.750]  - Network known to be merged: true 
INFO [02-04|10:49:44.750]  - Total terminal difficulty:  58750000000000000000000 
INFO [02-04|10:49:44.750]  - Merge netsplit block:       <nil> 
INFO [02-04|10:49:44.750] --------------------------------------------------------------------------------------------------------------------------------------------------------- 
INFO [02-04|10:49:44.750]  
INFO [02-04|10:49:44.751] Disk storage enabled for ethash caches   dir=/root/.ethereum/geth/ethash count=3
INFO [02-04|10:49:44.751] Disk storage enabled for ethash DAGs     dir=/root/.ethash               count=2
INFO [02-04|10:49:44.758] Initialising Ethereum protocol           network=1 dbversion=8
INFO [02-04|10:49:45.010] Loaded most recent local header          number=0 hash=d4e567..cb8fa3 td=17,179,869,184 age=53y10mo1w
INFO [02-04|10:49:45.028] Loaded most recent local full block      number=0 hash=d4e567..cb8fa3 td=17,179,869,184 age=53y10mo1w
INFO [02-04|10:49:45.028] Loaded most recent local fast block      number=0 hash=d4e567..cb8fa3 td=17,179,869,184 age=53y10mo1w
INFO [02-04|10:49:45.033] Loaded local transaction journal         transactions=0 dropped=0
INFO [02-04|10:49:45.033] Regenerated local transaction journal    transactions=0 accounts=0
INFO [02-04|10:49:45.046] Chain post-merge, sync via beacon client 
INFO [02-04|10:49:45.047] Gasprice oracle is ignoring threshold set threshold=2
WARN [02-04|10:49:45.047] Engine API enabled                       protocol=eth
INFO [02-04|10:49:45.055] Starting peer-to-peer node               instance=Geth/v1.10.26-stable-e5eb32ac/linux-amd64/go1.18.5
INFO [02-04|10:49:45.645] New local node record                    seq=1,674,811,378,579 id=293d0a3572605a69 ip=127.0.0.1 udp=30303 tcp=30303
INFO [02-04|10:49:45.647] IPC endpoint opened                      url=/root/.ethereum/geth.ipc
INFO [02-04|10:49:45.655] Started P2P networking                   self=enode://e120c0d6ac8996a085a2f1888923dee3ed5a4a5bca9394ce8e8de11633d1a8ba3aac831ba0b039be61a13944a896521e82eef6c9404ab73b168c3e23f81d2118@127.0.0.1:30303
INFO [02-04|10:49:45.647] Loaded JWT secret file                   path=/root/.ethereum/geth/jwtsecret crc32=0x9daa6731
INFO [02-04|10:49:45.687] WebSocket enabled                        url=ws://127.0.0.1:8551
INFO [02-04|10:49:45.687] HTTP server started                      endpoint=127.0.0.1:8551 auth=true prefix= cors=localhost vhosts=localhost
INFO [02-04|10:49:48.697] New local node record                    seq=1,674,811,378,580 id=293d0a3572605a69 ip=49.165.9.63 udp=30303 tcp=30303

 

 

2. Geth 콘솔을 사용하여 계정 생성



2-1 다음 명령어를 입력해서 계정을 생성합니다.

cd /go-ethereum
geth --datadir test_data account new

 

2-2 비밀번호는 편한걸로 입력해주시고 그러면 다음과 같은 로그가 출력됩니다.

여기서 "0xD7970Ee529e0780e79BB4a5f4EdfEfE621c4EF6c"은 genesis.json파일에서 사용하기 때문에 꼭 기억해야합니다. 

/go-ethereum# geth --datadir test_data account new
INFO [02-04|10:50:52.419] Maximum peer count                       ETH=50 LES=0 total=50
INFO [02-04|10:50:52.419] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory"
Your new account is locked with a password. Please give a password. Do not forget this password.
Password: 
Repeat password: 

Your new key was generated

Public address of the key:   0xD7970Ee529e0780e79BB4a5f4EdfEfE621c4EF6c
Path of the secret key file: test_data/keystore/UTC--2023-02-04T01-50-54.223602729Z--d7970ee529e0780e79bb4a5f4edfefe621c4ef6c

- You can share your public address with anyone. Others need it to interact with you.
- You must NEVER share the secret key with anyone! The key controls access to your funds!
- You must BACKUP your key file! Without the key, it's impossible to access account funds!
- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!

 

2-3 계정이 잘 생성되었는지 확인합니다.

geth -datadir test_data account list
INFO [02-04|10:53:28.680] Maximum peer count                       ETH=50 LES=0 total=50
INFO [02-04|10:53:28.680] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory"
INFO [02-04|10:53:28.681] Set global gas cap                       cap=50,000,000
Account #0: {d7970ee529e0780e79bb4a5f4edfefe621c4ef6c} keystore:///go-ethereum/test_data/keystore/UTC--2023-02-04T01-50-54.223602729Z--d7970ee529e0780e79bb4a5f4edfefe621c4ef6c

 

 

 

3. GenesisBlock 만들기

 

3-1. genesis.json 파일을 편집하기 

vim /go-ethereum/test_data/genesis.json

 

3-2. 파일에 다음 내용을 붙여넣기 

{
 "config" : {
     "chainId" : 8484,
     "homesteadBlock": 0,
     "eip150Block":0,
     "eip155Block":0,
     "eip158Block":0
 },
 "difficulty":"20",
 "gasLimit":"2100000",
 "alloc":{
 "0x99e75dEf2b565D7f462cd92B4718516C68939F4A" : {"balance":"300000"}
 }
}

 

3-3 genesis.json 속성값

 

config : 이더리움 관련 설정

config.chainId : chainid는 현재 chain을 구별하는 값이고 replay  attack로부터 보호해주는 역할
(replay attack은 유효한 데이터 전송을 악의적으로 반복시키거나 지연시키는 공격의 일종)

config.homesteadBlock : 이더리움의 4단계 로드맵 중 두 번째 메이저 단계 속성이 0이면 true

config.eip155Block: EIP는 Ethereum Improvement Proposal의  약자로 개발자들이 이더리움을 업그레이드하기 위해 제안된 아이디어 이것도 chainId와 마찬가지로 replay attack을 막기위한 설정

config.eip150Block: IO가 많은 작업에 대한 가스 변경비용을 위한 설정

config.eip158Block: EIP158은 계정의 상태가 변경되고 변경된 결과값으로 인해 계정의 nonce와 balance 값이 0이 되고 code와 storage가 빈 값이 되는 경우 해당 계정을 삭제함

 

4가지 설정 ( config.homesteadBlock, config.eip155Block, config.eip150Block, config.eip158Block)은 사설 블록체인을 만들 때 기본적으로 동일한 설정

 

difficulty : 채굴 난이도

gasLimit : 블록당 담을 수 있는 가스(수수료)의 한도를 설정함 하나의 블록 안에 담을 트랜잭션 개수를 결정하는 데 사용하는 옵션
alloc : 제네시스 블록이 생성됨과 동시에 alloc에 등록된 주소로 이더를 전송합니다. (alloc에 있는 금액의 단위는 wei입니다.)

parentHash : 부모 블록의 해시값을 넣는다. 제네시스는 부모블록이 없어서 사용안함

coinbase: 제네시스 블록 채굴시 주어지는 보상

nonce, mixhash : nonce와 mixhash는 블록이 올바르게 채굴되었는지 증명함 블록체인 작업증명을 위해서 가장 최근에 추가된 블록의 해시값과 블록 헤더의 다양한 값, 임의의 값 nonce의 조합으로 특정범위에 있는 수를 찾습니다. 
mixhash는 nonce를 찾기위한 중간 값입니다. nonce와 mixhash는 "블록을 제대로 만들었는지 증명하는 용도"입니다.
timestamp : 해당블록이 취득된 시점을 의미하는 값으로 유닉스 타임스탬프가 들어감

 

 

Fatal : Failed to write genesis block 에러가 발생할 경우 geth 서버 데이터가 이미 존재해서 발생하는 에러로 geth 서버 데이터를 전부 삭제하고 새로 생성하면 에러를 해결할 수 있음

 

 

4. Genesis Block을 생성 및 초기화 

4-1 제네시스 블록을 생성 및 초기화

geth --datadir test_data init test_data/genesis.json

출력값에 "Successfully wrote genesis state"문구가 보이면 성공

 

 

5. Geth 실행

1. 다음 명령어로 geth를 실행합니다.

geth --networkid 8484 --nodiscover --datadir test_data -allow-insecure-unlock --http --http.port 8545 --http.corsdomain "*" --http.api="db,eth,net,web3,personal,web3,miner,admin" --miner.threads 1 console 2>> test_data/geth.log

 

다음과 같이 커맨드에 ">" 표시가 보이면 성공적으로 geth 콘솔이 실행된 것입니다. 

 

 

 

geth 커맨드에서 각 옵션은 다음을 의미합니다.

 

-datadir test_data 데이터 디렉토리로 "test_data"를 지정합니다.

networkid 8484 : 네트워크 식별자

http : 이전에는 rpc였으나 지금은 http

http.addr "ip" : 현재 사용중인 ip 입력

http.port : "port" 원하는 포트 입력

http.corsdomain "*" : 접속할 수 있는 rpc 클라이언트 url을 지정하는 것인데 "*" 별표는 전체 허용이라는 뜻입니다.

-nodiscover : 생성자 노드를 다른 노드에서 검색할 수 없게 하는 옵션, 같은 제네시스 블록과 네트워크 ID에 있는 블록들이 연결되는 것을 방지함

http.api "db,eth,net,web3,personal" : rpc에 의해 접근할 수 있는 api 

-maxpeers 0 : 생성자의 노드에 연결할 수 있는 노드의 수를 지정 0을 지정하면 다른 노드와 연결하지 않음

console : 대화형 자바스크립트 콘솔을 기동함

2>>test_data/geth.log : 파일의 출력을 test_data/geth.log 경로의 파일로 쌓으라는 뜻입니다. 
">" 이것은 단발성 출력이고 ">>"이 것은 계속해서 파일의 출력을 기록하는 커맨드입니다.
(리눅스 표준출력을 참고하시면 됩니다. / https://webdir.tistory.com/256 )

6. Etherbase 설정하기 

 

이더리움에는 두 가지 종료의 계정이 있음

1. EOA(Externally Owned Account) : 일반 사용자가 사용하는 계정으로 비밀키로 관리됨, Ether를 송금하거나 계약을 실행할 수 있음 

2. CA(Contract Account) : Contract 계정은 컨트랙트를 블록체인에 배포할 때 만들어지는 계정으로 블록체인에 존재함

 

 

1. 처음에 만든 계정이 잘 있는지 확인

 

2. 새로운 계정을 추가함 

 

 

2-1 "eth.accounts"로 새 계정이 잘 생성됐는지 확인해보기

 

 

 

3. 채굴시 보상받을 계정을 생성하기

 

이더리움을 채굴하고 보상받는 계정을 Etherbase라고 함 Etherbase는 eth.coinbase 변수에 저장되지만 기본적으로 eth.accounts[0]이 설정됨

 

새로 만든 계정을 다음과 같은 커맨드로 Etherbase로 설정해보겠습니다.

 

 

 

 

"eth.coinbase" 커맨드를 이용해 새 계정 주소로 Etherbase가 변경된 것을 확인할 수 있음 

 

 

 

 

 

 

 

4. 각 계정의 Lock을 풀고 Mining을 한 뒤 잔고를 확인합니다.

 

4-1 먼저 블록체인의 블록 수와 블록 정보를 다음 커맨드로 확인합니다.

 

eth.blockNumber //생성된 블록 수 조회

eth.getBlock(0) //0번째 블록의 정보 출력

 

 

 

 

4-2 계정의 상태를 확인하고 Lock 상태를 풉니다.

 

 

 

4-3 계정의 상태를 unlock하는 커맨드는 다음과 같습니다.

personal.unlockAccount("eth.accounts의 주소", "비밀번호", 유효기간)

 

 

 

 

1. miner.start(n) n은 스레드의 개수로 채굴을 시작하는 커맨드입니다.

 

2. eth.mining을 통해 현재 마이닝이 진행중인지 알 수 있습니다. 진행중이면 true / 진행중이지 않으면 false입니다.

 

 

3. "eth.blockNumber" 명령어를 통해 최근 추가된 블록의 숫자를 확인할 수 있습니다.

 

 

4. miner.stop()으로 채굴을 종료합니다.
왜 결과값이 null로 나올까요? 잘 돌아가서 저는 그냥 넘어갔습니다.

5. 다음과 같이 커맨드를 이용해서 잔액의 잔고를 확인할 수 있습니다.

 

web.fromWei 커맨드는 wei 단위를 ether 단위로 변환해서 표시해줍니다.

 

관련글 더보기