블록체인 Block-Chain - Private network 만들기

dev_swan·2022년 6월 30일
0

블록체인

목록 보기
17/36
post-thumbnail

👉 GETH (Go Ethereum)

  • Geth는 이더리움 클라이언트 소프트웨어로, 이더리움 블록체인 네트워크의 풀노드를 구축하기 위해 사용됩니다.
  • Go 언어를 기반으로 이더리움 풀노드를 구현하고 작동시키기 위한 명령어 라인 인터페이스를 제공한다.
  • 클라이언트 소프트웨어 중에서 가장 유명하고 많이 쓰이는게 Geth입니다.

👉 GETH 역할

☝️ 채굴자나 어플리케이션 개발자들의 프로그램 인터페이스 역할

  • geth를 통해 이더리움 블록체인의 노드로써 참여할 수 있습니다.
  • 채굴, 암호화폐 전송, 스마트 컨트랙트의 작성, 트랜젝션 브로드캐스팅이 가능합니다.

☝️ 풀 블록 데이터 베이스를 다운

  • 블록 전체의 거래 내역 탐색이 가능합니다. ( full sync )

☝️ 풀 노드로서 블록 검증

  • 이더리움 블록체인에 기여가 가능합니다.

👉 Node의 타입

노드(실행중인 클라이언트)는 크게 3가지 타입으로 구분됩니다.

  • Full node: 전체 블록체인 데이터를 저장하고, 블록 검증에 참여하고 모든 블록과 상태를 확인합니다.
  • Archive node: Full Node가 저장 중인 것을 전부 저장하고, 과거 State의 아카이브 저장합니다.
  • Light node: 블록 헤더를 저장하고 다른 모든것을 요청합니다.

👉 Geth 블록동기화 3가지 모드

  • 전체 동기화(Full sync) - 제네시스 블록부터 현재블록까지 모든블록을 동기화
  • 빠른 동기화(Fast sync) - 최근의 1024개 블록의 상태, 트랜잭션, 리시트 등을 포함하는 블록헤더만을 동기화. 이전 히스토리를 알수없기 떄문에 트랜잭션의 유효성 검증을 할수가 없음.
  • 경량 동기화(Light sync) - 현재 상태정보만 동기화
  • 블록동기화를 할때는 모드를 지정하지 않으면 Fast 모드를 default로 동기화 합니다.
  • Light sync모드로 블록 동기화를 하고싶을 경우 명령어
	geth --syncmode light
  • 받아온 데이터들을 삭제하고 싶을경우 명령어
	geth removedb

👉 IPC 통신 ( 프로세스 간 통신 )

  • 블록체인 네트워크와 통신하는 RPC와는 다른 통신으로 프로세스간에 통신을 할 때 사용하는 통신으로 컴퓨터 내부적으로 서로 다른 프로세스에게 데이터를 주고 받는것입니다.
  • Geth에서 실행하고 있는 노드와 IPC통신을 이용해서 통신을 할 것입니다.

👉 이더리움 메인넷 IPC 통신

geth 환경 변수 설정하기

vi ~/.bash_profile
export PATH=$PATH:/home/ash991213/workspace/ethereum/go-ethereum/build/bin
source ~/.bash_profile

이더리움 메인넷 경량 동기화하기 ( Light sync )

geth --syncmode light


geth 노드의 콘솔에 연결 후 IPC 통신 연결하기

geth attach /home/ash991213/.ethereum/geth.ipc


admin module

  • admin.nodeInfo.enode = Peer를 연결하고 싶다면 이 노드값을 가지고 연결할 수 있습니다. 해당 노드의 고유한 IP주소라고 보면 됩니다.

  • admin.datadir = 앞으로 생성할 계정이나 log가 저장될 datadir 경로입니다.


personal module

  • personal.newAccount() = 새로운 지갑을 생성합니다. datadir안에 ketstroe안에 파일이 하나 생성됩니다. 지갑을 생성할 때 해당 지갑의 비밀번호도 같이 생성합니다.


  • json 파일로 지갑 생성해보기 - json 파일 넣고 비밀번호 입력해서 MetaMask에 신규 지갑 생성합니다.
  • MetaMask -> 계정 가져오기 -> json 파일 선택


  • 파일 선택 -> Linux의 .ethereum/keystore에 방금 추가된 json 파일 가져오기 -> 지갑 만들때 생성한 비밀번호 입력


  • 계정 지갑 주소 복사후 생성한 지갑과 주소 비교

지갑 주소 : 0x4a31853CDF22F7b7ec30c2e55D8CF413344FAc64


eth module

  • eth.accounts = 현재 노드에 연결된 지갑들을 가져옵니다.

  • eth.coinbase = 코인베이스 내용을 가져옵니다. light sync는 coinbase 기능은 사용할 수 없습니다.


miner module

  • miner.start() = 채굴을 실행하는 메서드인데 인자값으로 몇개의 쓰레드로 채굴을 할것인지 넣어줍니다.
  • miner.stop() = 채굴을 중지하는 메서드입니다.
  • light syncminer 기능은 사용할 수 없습니다.

👉 Private network 생성해보기

☝️ Genesis Block 만들기

{
	"difficulty": "200000", // 난이도
	"gasLimit": "3100000", // 한블록당 가스 한도
	"alloc": { // 제네시스 블록을 생성할때 해당 계정에다가 balance를 넣고 시작합니다.
		"0xe7Cfd36ACfB1109Ac1080c30Ee7a2FAC263cAAe2": {
			"balance": "100100000000000000000"
		}
	},
	"config": {
		"chainId": 7722, // 체인 아이디
		"homesteadBlock": 0, // 이더리움의 버전이 4가지가 있는데 그중 2번째 버전입니다.
        "eip150Block": 0, // Ethereum improvement proposal의 약자로 개선제안으로 이 제안을 넣어서 Geth를 실행하겠다라는 뜻입니다.
		"eip155Block": 0,
		"eip158Block": 0
	}
}

☝️ 제네시스 블록을 바탕으로 새로운 Private network 만들기.

	geth --datadir node init genesis.json

  • Private network가 정상적으로 만들어졌으면 위에서 설정한 node라는 이름의 디렉토리가 생성됩니다.

☝️ geth 실행 ( 새로 만들 Private network를 실핻합니다. )

	geth --datadir node

  • Private network에 연결되며 ChainIdgenesis.json에서 설정한 7722로 network가 생성된것을 확인할 수 있습니다.

☝️ geth IPC 연결 ( 새로 만든 Private networkIPC통신 연결합니다)

	geth attach /home/ash991213/workspace/220630/node/geth.ipc

  • 만들어둔 Private network에 동기화를 할때 모드를 설정하지 않아 Fast sync가 되었고 현재 module miner 기능도 포함되어 있는것을 확인할 수 있습니다.

☝️ 자동으로 다른 노드와 addPeer가 되지 않도록 discover 속성을 끄고 테스트합니다.

	geth --datadir node --nodiscover

👉 Private network 채굴 (Miner)

☝️ Miner를 하기위해서는 coinbase가 필요합니다. 또한 coinbase를 만들기 위해서는 계정이 필요하니 새로운 계정을 만들어주도록 하겠습니다.

    personal.newAccount() // "0x3d0b85514424664dfb7c50050e2bde64e29e9d9f"


☝️ eth.accounts로 지갑이 생성된것을 확인합니다.

	eth.accounts // ["0x3d0b85514424664dfb7c50050e2bde64e29e9d9f"]


☝️ eth.coinbasecoinbase를 확인합니다.

	eth.coinbase // "0x3d0b85514424664dfb7c50050e2bde64e29e9d9f"


☝️ 값을 바꾸고 싶다라면 personal.newAccount()로 다른 지갑을 하나 생성합니다.

	personal.newAccount() // "0x35da8d49366f4b77bdd7d4aded70ca71fba98eee"


☝️ miner.setEtherbase(eth.accounts[1])로 방금 생성한 지갑으로 coinbase 내용을 수정합니다.

	miner.setEtherbase(eth.accounts[1]) // true


☝️ eth.coinbase로 다시 coinbase를 확인해보면 coinbase가 2번째 생성한 지갑주소로 바뀐것을 확인할 수 있습니다.

	eth.coinbase // "0x35da8d49366f4b77bdd7d4aded70ca71fba98eee"


☝️ miner.start(1)로 마이닝을 시작합니다. 인자값에는 마이닝할때 사용할 쓰레드 값입니다.

	miner.start(1) // null

  • 중간중간 블록 채굴에 성공하는 것을 확인할 수 있습니다.

☝️ miner.stop()으로 마이닝을 멈춥니다.

	miner.stop() // null


☝️ eth.getBalance(eth.coinbase)로 채굴한 wei를 확인합니다.

	eth.getBalance(eth.coinbase) // 140000000000000000000


☝️ wei값으로 나오니 web3.fromWei(eth.getBalance(eth.coinbase),'ether')ether단위로 확인합니다.

	web3.fromWei(eth.getBalance(eth.coinbase),'ether')


👉 네트워크 연결하기

☝️ admin.nodeInfo.enode로 본인의 enode를 확인합니다.

	admin.nodeInfo.enode


☝️ 다른 노드의 enode 값을 가지고 admin.addPeer()`로 인자값에 enode를 넣어줍니다.

	admin.addPeer("다른 노드의 enode값") // true


☝️ admin.peers로 연결된 노드를 확인합니다.

	admin.peers // [연결된 노드들]

0개의 댓글