실제 이더리움 블록체인에서는 여러 노드들이 연결됩니다. 프라이빗 네트워크 환경에서 멀티 노드를 구성한 후 실제 이더리움 처럼 작동하는 방법을 알아봅니다. 이더리움 프라이빗 네트워크를 사용하는 OS 는 Docker에서 ubuntu 이미지를 가져와 사용합니다. 아래 글들을 참고하시면 싱글 노드를 위한 제네시스 블록 생성, 채굴, 트랜잭션 생성 방법 등을 확인하실 수 있습니다.
멀티 터미널 구성
우선 두개의 터미널에 각각 생성한 컨테이너에 접속합니다.
// 모든 컨테이너 목록 조회
$ sudo docker ps -a
// 컨테이너 시작
$ sudo docker start container
// 컨테이너 연결
$ sudo docker exec -it container bash
컨테이너에 접속 후 HOME 디렉토리로 이동하여 go-ethereum 디렉토리 내 test_node1, test_node2 두개의 디텍토리를 생성합니다.
mkdir test_node1 test_node2
생성된 디렉토리 내에 genesis.json 파일을 생성한 후 다음과 같이 입력합니다.
vim ./test_node1/genesis.json
vim ./test_node2/genesis.json
{
"config": {
"chainId": 1007,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "0x20000",
"gasLimit": "0x2fefd8",
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"extraData": "",
"nonce": "0x0000000000000000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
genesis block 생성
각각의 터미널에서 test_node1, test_node2에 접속한 후 작성한 genesis.json 파일로 제네시스 블록을 생성합니다.
geth --datadir test_node1 init ./test_node1/genesis.json
geth --datadir test_node2 init ./test_node2/genesis.json
제네시스 블록 생성에 성공하면 "Successfully wrote genesis state" 문구가 출력됩니다.
멀티 노드 연결
각 터미널에서 프라이빗 네트워크에 접속합니다. networkId는 1007번으로 접속합니다.
geth --networkid 1007 --datadir test_node1 --nodiscover --port 30303 --allow-insecure-unlock --http --http.port "8545" --http.addr "0.0.0.0" --http.corsdomain "*" --http.api "eth, net, web3, miner, debug, personal, rpc" console
geth --networkid 1007 --datadir test_node2 --nodiscover --port 30304 --allow-insecure-unlock --http --http.port "8546" --http.addr "0.0.0.0" --http.corsdomain "*" --http.api "eth, net, web3, miner, debug, personal, rpc" console
첫번째 터미널에서 enode를 확인합니다. enode://로 시작하는 문자열이 출력됩니다.
admin.nodeInfo.enode
문자열을 복사해 2번째 터미널에 입력합니다. true가 반환되면 두개의 노드가 정상적으로 연결된 겁니다.
admin.addPeer("첫번째 enode 문자열")
첫번째 터미널에서 아래 명령어로 현재 연결된 피어를 확인합니다.
admin.peers
현재 연결된 피어의 갯수를 확인할 수 있습니다.
net.peerCount
연결 확인(채굴)
각 노드에서 새로운 계정을 생성합니다.
personal.newAccount()
계정의 잠금을 해제합니다.
// 계정 잠금 상태 확인
personal.listWallets[0].status
// 잠금 해제, 3번째 값이 0이면 geth 종료될 때 까지 해제 유지
personal.unlockAccount(eth.accounts[0], 'password', 0)
1번째 노드의 coinbase는 0번째 계정이 됩니다. 이제 채굴을 시작합니다. 1번째 노드에서 망치 모양과 함께 "Successfully sealed new block" 메시지가 출력됩니다.
// 채굴노드 확인
eth.coinbase
// 채굴 시작
miner.start()
// 채굴 중지
miner.stop()
1번재 터미널에서 채굴이 시작되면 2번째 터미널에서는 "Imported new chain segment" 메시지가 출력됩니다.
트랜잭션 생성
1번째 터미널에서 채굴을 진행하면서 이더가 쌓였을 테니 노드 1에서 노드 2로 이더를 전송해보겠습니다. 송금을 하기 위해서는 각 계정의 잠금 상태를 반드시 해제해야 합니다.
eth.sendTransaction({
----- from : eth.coinbase,
----- to : "노드 2 주소값",
----- value : web3.toWei(2, 'ether)
})
트랜잭션이 발생되고 pending 상태가 됩니다. 1 터미널에서 채굴을 시작합니다. 채굴을 하면 새로운 블록이 생기고 트랜잭션이 처리됩니다. 트랜잭션 확인은 트랜잭션 해시값으로 확인 가능합니다.
eth.getTransaction("트랜잭션 해시")
노드 2 계정을 확인해보면 2이더가 송금된 것을 확인할 수 있습니다.
eth.getBalance(eth.accounts[0])
'Blockchain' 카테고리의 다른 글
[Blockchain] 이더리움 스마트 컨트랙트 배포하기(Remix) (0) | 2022.07.12 |
---|---|
[Blockchain] 블록체인 오라클(Oracle) 문제란? (0) | 2022.07.11 |
[Blockchain] 이더리움 EVM 작동 구조 원리 (0) | 2022.07.08 |
[Blockchain] 이더리움이란? (1) | 2022.07.07 |
[Blockchain] 비트코인 UTXO 뜻 원리 (0) | 2022.07.07 |
댓글