공대생 정리노트

geth 사설망 실행하기 본문

블록체인

geth 사설망 실행하기

woojinger 2021. 12. 19. 16:26

https://geth.ethereum.org/docs/interface/private-network

private network

 

Private Networks | Go Ethereum

Private Networks This guide explains how to set up a private network of multiple Geth nodes. An Ethereum network is a private network if the nodes are not connected to the main network. In this context private only means reserved or isolated, rather than p

geth.ethereum.org

http://www.yes24.com/Product/Goods/61189103

 

처음 배우는 블록체인 - YES24

블록체인 애플리케이션 개발에 필요한 이론과 기본기를 한 권에!이 책은 블록체인의 구조, 이론, 애플리케이션 개발을 모두 다루는 입문서입니다. 다양한 그림과 비트코인 및 이더리움을 중심

www.yes24.com


먼저  Go Ethereum을 설치한다

https://github.com/ethereum/go-ethereum

 

GitHub - ethereum/go-ethereum: Official Go implementation of the Ethereum protocol

Official Go implementation of the Ethereum protocol - GitHub - ethereum/go-ethereum: Official Go implementation of the Ethereum protocol

github.com

make geth 실행 후 geth를 실행할 수 있게 geth 바이너리 파일을 path에 등록한다.

 

이후 제네시스 블록을 만든다.

// genesis.json
{
    "config": {
        "chanId": 33, 
        "homesteadBlock": 0,
        "eip150Block" : 0,
        "eip155Block": 0,
        "eip158Block":0
    },

    "nonce": "0x0000000000000013",
    "timestamp": "0x0",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "gasLimit": "0x8000000",
    "difficulty": "0x100",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0x3333333333333333333333333333333333333333",
    "alloc": {}
}
geth --datadir ./private_net/ init genesis.json

위 명령어를 실행하면 json 파일에 정의된 대로 geth node를 초기화한다.

초기화에 성공하면 다음 명령으로 geth console을 실행한다.

 

geth --networkid 10 --datadir ./private_net --port 10052 console 2>> ./error.log

제네시스 블록의 데이터 디렉토리를 사용함으로써 Geth의 데이터베이스를 초기화하는데 성공하였다.

블록체인 노드간 연결을 할 때 둘 다 같은 제네시스 블록을 사용하고 네트워크 id를 사용해야 한다. 그래서 --networkid로 네트워크 id를 설정해주는 것이다. 

 

채굴을 하는 명령은 다음과 같이 수행하였다.

$ personal.newAccount()
> Passphrase: "비밀번호"
> Repeat passphrase: "비밀번호"
> "0x60da2a27c0417c9b2214f83407506b006e0842d8"
$ eth.accounts
> ["0x60da2a27c0417c9b2214f83407506b006e0842d8"]
// 코인베이스 계정 주소 확인. 블록을 생성하려고 채굴했을 때 보상을 받는 계정 주소
$ eth.coinbase
> "0x60da2a27c0417c9b2214f83407506b006e0842d8"
// 제네시스 블록 확인. 몇 번째 블록을 확인하고 싶을 때 사용하는 명령
$ eth.getBlock(0)
> 
{
baseFeePerGas: 100000000,
difficulty: 131072,
...
}
// 채굴 시작 : miner.start(스레드수)
$ miner.start(1)
> null
// 채굴 확인
$ eth.mining
> true
// 코인베이스 계정 주소 잔액 확인(wei)
$ eth.getBalance(eth.accounts[0])
> 124000000000000000000
// 채굴 중지
$ miner.stop()

채굴을 했으니 이제 다른 계좌로 송금을 해보자.

$ eth.accounts
> ["0x9004ef55b0d60f1de68631b27aba7421f0a096f3", "0x60da2a27c0417c9b2214f83407506b006e0842d8", "0xc27c8321e73abe3415bd933f4e1d0e9d9a481ed9"]
$ eth.getBalance(eth.accounts[2])
> 0
// accounts[1]의 이더 확인
$ web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
> 76
// accounts[1]에서 accounts[2]로 1이더 송금 시도
> eth.sendTransaction({from: eth.accounts[1], to: eth.accounts[2], value: web3.toWei(1,"ether")})
Error: authentication needed: password or unlock
	at web3.js:6365:37(47)
	at send (web3.js:5099:62(35))
	at <eval>:1:20(21)

그냥 송금을 하려 하면 인증이 필요하다며 에러가 뜬다.

송금을 하려면 계정 잠금을 먼저 풀어야 하기 때문이다.

$ personal.unlockAccount(eth.accounts[1])
> Unlock account 0x60da2a27c0417c9b2214f83407506b006e0842d8
> Passphrase: 
> true
$ eth.sendTransaction({from: eth.accounts[1], to: eth.accounts[2], value: web3.toWei(1,"ether")})
> "0x88acff28cd27e5148d10162ec0816c1abf7e300c2ff088b1d6dbc1e789904a3e"
$ eth.getTransaction("0x88acff28cd27e5148d10162ec0816c1abf7e300c2ff088b1d6dbc1e789904a3e")
> {
  accessList: [],
  blockHash: null,
  blockNumber: null,
  chainId: "0xa",
  from: "0x60da2a27c0417c9b2214f83407506b006e0842d8",
  gas: 21000,
  gasPrice: 1000000074,
  hash: "0x88acff28cd27e5148d10162ec0816c1abf7e300c2ff088b1d6dbc1e789904a3e",
  input: "0x",
  maxFeePerGas: 1000000074,
  maxPriorityFeePerGas: 1000000000,
  nonce: 0,
  r: "0x96bda0abdc538e0733ec894f597778de6994f9bd6ea75f4dc475fe66fc664272",
  s: "0x3ef2f4d3c223c9f01d14cff28af173fb2185f2aa23566bc12b5192d6ff351b2c",
  to: "0xc27c8321e73abe3415bd933f4e1d0e9d9a481ed9",
  transactionIndex: null,
  type: "0x2",
  v: "0x0",
  value: 1000000000000000000
}
$ web3.fromWei(eth.getBalance(eth.accounts[2]),"ether")
> 0

트랜잭션의 blockNumber 항목이 null로 되있는 것을 볼 수 있다. 이 거래가 아직 블록에 저장되지 않았기 때문이다.

실제로 받는 주소의 잔액을 확인해보면 아직 0인 것을 볼 수 있다.

거래를 확정하려면 블록을 생성한 후 블록에 저장을 시켜야 한다.

$ miner.stat(1)
> null
$ web3.fromWei(eth.getBalance(eth.accounts[2]),"ether")
> 1
$ eth.getTransaction("0x88acff28cd27e5148d10162ec0816c1abf7e300c2ff088b1d6dbc1e789904a3e")
> {
  accessList: [],
  blockHash: "0x59479f238407afa96210ff7b72bf87a4545edb4e6014f51ecf3310f8f6825bcf",
  blockNumber: 130,
  chainId: "0xa",
  from: "0x60da2a27c0417c9b2214f83407506b006e0842d8",
  gas: 21000,
  gasPrice: 1000000033,
  hash: "0x88acff28cd27e5148d10162ec0816c1abf7e300c2ff088b1d6dbc1e789904a3e",
  input: "0x",
  maxFeePerGas: 1000000074,
  maxPriorityFeePerGas: 1000000000,
  nonce: 0,
  r: "0x96bda0abdc538e0733ec894f597778de6994f9bd6ea75f4dc475fe66fc664272",
  s: "0x3ef2f4d3c223c9f01d14cff28af173fb2185f2aa23566bc12b5192d6ff351b2c",
  to: "0xc27c8321e73abe3415bd933f4e1d0e9d9a481ed9",
  transactionIndex: 0,
  type: "0x2",
  v: "0x0",
  value: 1000000000000000000
}
$ web3.fromWei(eth.getBalance(eth.accounts[2], 130), "ether")
> 1
$  eth.getTransactionReceipt("0x88acff28cd27e5148d10162ec0816c1abf7e300c2ff088b1d6dbc1e789904a3e")
> {
  blockHash: "0x59479f238407afa96210ff7b72bf87a4545edb4e6014f51ecf3310f8f6825bcf",
  blockNumber: 130,
  contractAddress: null,
  cumulativeGasUsed: 21000,
  effectiveGasPrice: 1000000033,
  from: "0x60da2a27c0417c9b2214f83407506b006e0842d8",
  gasUsed: 21000,
  logs: [],
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  status: "0x1",
  to: "0xc27c8321e73abe3415bd933f4e1d0e9d9a481ed9",
  transactionHash: "0x88acff28cd27e5148d10162ec0816c1abf7e300c2ff088b1d6dbc1e789904a3e",
  transactionIndex: 0,
  type: "0x2"
}

blockNumber의 값이 바뀐 것을 볼 수 있다.

Comments