로컬 테스트넷에서 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-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-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-1 제네시스 블록을 생성 및 초기화
geth --datadir test_data init test_data/genesis.json
출력값에 "Successfully wrote genesis state"문구가 보이면 성공
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 )
이더리움에는 두 가지 종료의 계정이 있음
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-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 단위로 변환해서 표시해줍니다.
EVM (Ethereum Virtual Machine) (0) | 2023.02.06 |
---|---|
Ethereum(이더리움) (0) | 2023.02.06 |
로컬에서 두개의 노드 연결 (PoW 버전 geth) (0) | 2023.02.04 |
Geth 트랜잭션 생성과 채굴 (PoW 버전 geth) (0) | 2023.02.04 |
Docker로 우분투 실행하고 Geth 설치하기 (0) | 2023.01.30 |