상세 컨텐츠

본문 제목

로컬에서 두개의 노드 연결 (PoW 버전 geth)

Blockchain/Ethereum

by Yongari 2023. 2. 4. 19:18

본문

 

 

로컬에서 두 개의 노드 연결

 

 

1. "docker ps -a"커맨드를 입력해서 실행 중인 docker container list를 확인합니다.



2. "docker start con_ubuntu" 커맨드를 입력해서 docker의 STATUS가 "Exited"일경우 시작해줍니다.

 

 

3. docker의 STATUS가 이미 Up인 경우 docker exec -it con_ubuntu bash로 접속해줍니다. 

커맨드는 다음과 같은 뜻입니다.


    docker exec -it con_ubuntu(접속할 컨테이너 이름) bash(bash를 쓰겠다.)


4. 그리고 각각 2개 터미널에서 위와 같은 커맨드를입력해서 사진과 같이 만듭니다.

 터미널 접속 이후 "cd /go-ethereum"을 꼭 해주셔야합니다. 

 

 

5. 그리고  터미널에서 다음 커맨드를 순서대로 입력합니다.  데이터 디렉토리와 제네시스 블록 생성하는 단계입니다. 

 

5-1 각각의 geth노드가 쓸 디렉토리 생성

 

mkdir test_node1 test_node2

 

 

5-2 각각 genesis.json 생성

 

vi /go-ethereum/test_node1/genesis.json
vi /go-ethereum/test_node2/genesis.json

# vi이후 아래 내용을 복사 붙여넣기

{
  "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"
}

 

 

6. 첫 번째 Node와 두 번째 Node 생성

 

6-1. genesis.json 파일로 genesis block을 생성하기

 

geth --datadir test_node1 init test_node1/genesis.json

geth --datadir test_node2 init test_node2/genesis.json

 

 

6-2. 다음 로그처럼 마지막 줄에 "Successfully wrote genesis state"가 출력되면 정상동작한 것입니다. (genesis block 생성)

 

 

 

7. 두 개의 노드 연결

 

7-1. 터미널 1에서 첫 번째 노드 연결

 

geth --networkid 1007 --datadir test_node1 --nodiscover --port 30303 --allow-insecure-unlock --authrpc.port "8547" --http --http.port "8548" --http.addr "0.0.0.0" --http.corsdomain "*" --http.api "eth, net, web3, miner, debug, personal, rpc" console

 

7-2. 터미널 2에서 두 번째 노드 연결 

 

geth --networkid 1007 --datadir test_node2 --nodiscover --port 30304 --allow-insecure-unlock --authrpc.port "8549" --http --http.port "8550" --http.addr "0.0.0.0" --http.corsdomain "*" --http.api "eth, net, web3, miner, debug, personal, rpc" console

 

7-3 2개 터미널에서 다음과 같은  로그가 나오면 정상동작한 것입니다.

 

 

7-4 각 터미널에서 enode 값을 출력하는 다음 커맨드를 입력합니다.

 

admin.nodeInfo.enode

 

다음과 같이 "enode//"로 시작하는 주소가 나옵니다.

 

 

7-5 터미널 1로 이동후 터미널2의 enode를 입력해서 연결합니다.

 

다음 커맨드를 입력해서 다른 geth 노드를 연결합니다. 

admin.addPeer("enode 주소")

 

연결이 성공하면 admin.addPeer 커맨드 입력시 다른 geth 노드의 enode가 출력됩니다.

만약 터미널1에서 터미널2가 연결이 안되면 터미널2에서 터미널1의 enode를 입력해서 연결 시도합니다.

그래도 안되면 test_node1, test_node2 디렉토리를 삭제하고 처음부터 새로 초기화할 것을 권유드립니다.

 

성공 로그는 다음과 같습니다.

 

 

 

 

7-6 채굴(마이닝)

 

7-6-1 첫번재 노드에서 다음 커맨드로 새로운 계정을 만듭니다.

personal.newAccount()

 

7-6-2 miner.start()로 채굴을 시작한다.

다음과 같은 로그가 출력되면 성공한 것이다. 

7-6-3 출력이 늘어난 것을 무시하고 miner.stop()을 하면 채굴이 정지된다.

 

 

7-6-4 eth.blockNumber를 통해 현재 블록숫자를 확인합니다.

 

 

 

 

8. 트랜잭션 생성

 

8-1. 두 번째 노드에서 다음과 같이 커맨드를 입력해서  계정을 생성합니다.

personal.newAccount()
Passphrase: 
Repeat passphrase: 
INFO [02-04|18:59:06.826] Your new key was generated               address=0x6f2F13b7E5b76262A687F3dFe0D6b2467548f43C
WARN [02-04|18:59:06.826] Please backup your key file!             path=/go-ethereum/test_node2/keystore/UTC--2023-02-04T09-59-05.065369609Z--6f2f13b7e5b76262a687f3dfe0d6b2467548f43c
WARN [02-04|18:59:06.826] Please remember your password! 
"0x6f2f13b7e5b76262a687f3dfe0d6b2467548f43c"

 

8-2. 첫 번째 노드의 계정 잔액을 확인합니다. 5720갭니다. 실제 이더면 좋겠네요.

> web3.fromWei(eth.getBalance(eth.coinbase), "ether")
5720

 

8-3. 첫 번째 노드의 계정에서 unlock을 실행합니다.

personal.unlockAccount(eth.coinbase)

Unlock account 0x10f05ca1bd614914ded07937cea599b79efb2979
Passphrase: 
true

 

8-4. 첫 번째 노드에서 두 번째  노드로 트랜잭션을 보낸다.

eth.sendTransaction({ from: eth.coinbase, to: "0x6f2f13b7e5b76262a687f3dfe0d6b2467548f43c", value: web3.toWei(5, "ether") })
INFO [02-04|19:00:35.639] Setting new local account                address=0x10F05CA1BD614914Ded07937Cea599B79efB2979
INFO [02-04|19:00:35.639] Submitted transaction                    hash=0xe3619726b39559b7dd8f90763fa756b0f7a09cf3342db8453aab5c1e40bdc951 from=0x10F05CA1BD614914Ded07937Cea599B79efB2979 nonce=0 recipient=0x6f2F13b7E5b76262A687F3dFe0D6b2467548f43C value=5,000,000,000,000,000,000
"0xe3619726b39559b7dd8f90763fa756b0f7a09cf3342db8453aab5c1e40bdc951"

 

8-5. eth.pendingTransactions 커맨드를 통해 대기중인 Transaction을 확인할 수 있습니다. 

> eth.pendingTransactions
[{
    blockHash: null,
    blockNumber: null,
    chainId: "0x3ef",
    from: "0x10f05ca1bd614914ded07937cea599b79efb2979",
    gas: 21000,
    gasPrice: 1000000000,
    hash: "0xe3619726b39559b7dd8f90763fa756b0f7a09cf3342db8453aab5c1e40bdc951",
    input: "0x",
    nonce: 0,
    r: "0x88fd189df8dc26f6df8be76585577920c9e6686116881cc374875dca3d4df748",
    s: "0x5edad2c1571404419d230fa5df6d2e40b83c2e711550455e461256cbf625dfc4",
    to: "0x6f2f13b7e5b76262a687f3dfe0d6b2467548f43c",
    transactionIndex: null,
    type: "0x0",
    v: "0x801",
    value: 5000000000000000000
}]

캡처

 

 

 

 

8-6. 이제 첫 번째 노드에서 다시 채굴을 시작하면 트랜잭션도 실행이 됩니다.

 

첫 번째 노드에서 miner.start()를 해서 채굴을 시작합니다.

 

eth.pendingTransactions 커맨드를 통해 pending 중인 트랜잭션을 확인해봅니다. 이제 실행되서 보이지 않습니다. 

 

다음과 같이 5 eth가 전송됐음을 알 수 있습니다.

 

관련글 더보기