Geth puppeth을 사용해 프라이빗 네트워크 구축하기 2편 - POA

Lee Jeong Min·2021년 1월 2일
0

블록체인

목록 보기
9/9

지난번 시간엔 Geth puppeth을 사용해서 PoW 네트워크를 만들어 보았습니다. PoW라는 합의 알고리즘 이외에도 블록체인 네트워크에는 다양한 합의 알고리즘이 있는데요, 이번엔 PoA네트워크를 구성해보도록 하겠습니다.

자 다음과 같이 gethPoA라는 폴더를 하나 생성해 줍시다. 그 다음 파일 안으로 들어갑니다. 그곳에서 터미널을 킨 뒤 다음과 같이 명령어를 작성해 줍시다.

geth - datadir ./node1 account new // 새로운 계정을 만드는 명령어

작성을 하시고 비밀번호를 입력하시게 되면 공개키와 pk 키 파일이 생성이 됩니다. 이후 puppeth을 실행시킵시다.

실행을 시키고 나서 geth_poa 라는 네트워크 명을 적어줍시다.
그 이후로

순서대로 2 - 1 - 2 - 5를 눌러주어서 처음의 2는 새로운 제네시스 구성을 하는 것이고 두 번째 1을 눌러 스크래치로 부터 새로운 제네시스를 만든 뒤 세 번째 2는 poa합의 알고리즘을 선택을 하고 새로운 블록들간의 초를 5로 맞추어 줍니다.

그 이후로 처음에 만든 새로운 계정의 주소를 보증해주는 권한자로 만들기 위해 주소를 적어줍시다. POA란 권한증명으로 권한있는 검증자가 되어서 블록에 대해 검증을 해야하기 때문에 이를 어떤 계정에서 할 지 정해주는 것으로 생각됩니다. 또한 밑의 pre-funded 가 되기 위해 계정을 추가해 줍시다.

다음으로 넘어가서 pre-funded 부분에는 n을 적어주시고 네트워크 id로 2500, 순서대로 2, 2를 눌러주셔서 다음과 같은 화면으로 넘어갑니다. 여기서 Failed to create Aleth chain spec과 Failed to create Parity chain spec이라고 뜨는데 왜 그런지는 잘 모르겠네요.. 혹시 아시면 댓글로 부탁드리겠습니다.

창을 종료시키기 위해 컨트롤 + c를 누르시고 나서 다음 명령어를 쳐줍시다

geth - datadir ./node1 init geth_poa.json // 네트워크 초기화
geth - datadir ./node1 - networkid 2500 - ipcpath node1 // 클라이언트 가동

그림에는 1500이라고 잘못나와있습니다 수정합시다! 2500으로

그럼 이러한 화면이 나오면서 네트워크가 초기화되며 클라이언트가 가동되어서 피어를 찾는 INFO가 나오게 됩니다. 이제 새로운 터미널 창을 엽시다. 여기서 주의해야 할 점은 gethPoA폴더의 node1이 지정경로로 되어있게 터미널을 여셔야 합니다! 그 이후, 다음의 코드를 작성해줍시다

geth attach node1 // node1을 console에 연결

이렇게 터미널 창을 띄우신 후 이 창은 냅두시고 새로운 터미널 창을 gethPoA디렉토리 안에서 킨 뒤, 새로운 노드를 만들기 위해 다음과 같이 쳐줍시다.

geth - datadir ./node2 account new // 2번째 노드 계정 생성
geth - datadir ./node2 init geth_poa.json // 네트워크 초기화
geth - datadir ./node2 - networkid 2500 - ipcpath node2 - port 30308 // node2를 다른 포트를 이용하여 시작함.

위의 그림에선 포트를 30304로 하였는데 30308로 수정하였습니다.

다음과 같은 창을 보실 수 있을 것입니다! 이렇게 설정을 해주신뒤 gethPoA의 node2 디렉토리에서 새로운 터미널을 열어줍시다 그리고 나서 다음과 같이 적어줍시다

geth attach node2 // 노드 2를 콘솔로 연결

연결을 해주신 뒤

admin.peers
admin.nodeInfo.enode

다음과 같은 화면을 보실 수 있는데요. admin.peers를 치시면 빈 배열이 나오고 밑에다가admin.nodeInfo.enode를 작성해주어서 enode에 대한 정보를 얻어와 그것을 이제 geth attach node1 터미널 창에다가 추가할 것입니다. 다음과 같이 쳐줍시다

admin.peers
admin.addPeer('PASTE_ENODE_HERE') // 여기서 IP주소는 127.0.0.1로 바꾸어 줍시다.
admin.peers

여기서 enode란 URI의 형태로 Ethereum 노드를 설명하는 방법입니다. admin.peers를 처음에 쳤을 때는 마찬가지로 빈배열이었다가 admin.addPeer를 하고나서 다시 admin.peers를 치시면 위와 같은 화면을 보실 수 있을 것입니다.

다시 node2 화면으로 들어가서 admin.peers를 쳐봅시다

마찬가지로 node1의 enode가 리스트에 피어로 존재할것입니다. 그럼 채굴을 바로 시작해봅시다. 다음의 명령어들을 쳐봅시다.

miner.start() 
eth.getBalance(eth.coinbase) 
eth.coinbase

geth attach node2에서 채굴을 시작하라고 명령을 내리면 다음의 화면과 같이 Block sealing failed가 뜨면서 채굴에 실패한 모습을 보실 수 있습니다. 그것은 바로 POA합의 알고리즘에서는 말씀드렸다 시피 권한을 인증 받은 사람만이 블록의 검증과 채굴을 할 수 있는 권한을 가지기 때문에 node2는 그러한 권한이 없어서 실패한 것입니다. 위에서 일단 채굴은 실패했도 현재 node2의 이더 잔액은 0이며 일단 주소만 복사해 옵시다. 제 node2 eth.coinbase 주소는 "0xaee67697e6e0c427d270f39ad4854bae41159cec" 라서 가져왔습니다.

다시 권한을 가지고 있는 노드인 node1으로 가서 다음 명령어들을 시도해봅시다.

eth.getBalance(eth.coinbase) 
personal.unlockAccount(eth.coinbase)
miner.start()

보시면 node1의 getBalance는 0이 아닌 9.04~~~ 로 이미 채워져있는데요. 아까 처음에 puppeth을 이용하여 POA 네트워크를 만들 때 pre-funded에 node1의 주소를 입력해 놓아서 다음과 같은 결과를 확인하실 수 있습니다.

이 상태에서 채굴을 시작함과 동시에 node2의 주소로 이더를 송금해봅시다. 명령어는 다음과 같습니다.

eth.sendTransaction({from: eth.coinbase, to:
'PASTE_NODE2_COINBASE', value: 2000})

eth.getBalance(eth.coinbase)

이게 지금 제 모니터의 전체화면인데요 다시 하나하나 살펴보면

채굴을 진행되고 있는 모습을 볼 수 있으며

다음과 같이 node2이 eth.coinbase잔액이 2000으로 증가한 모습을 확인하실 수 있습니다.

이것으로 이렇게 간단한 POA 네트워크 실습을 마쳤는데요 다음엔 좀 더 좋은 자료로 찾아오겠습니다. 감사합니다.

profile
It is possible for ordinary people to choose to be extraordinary.

0개의 댓글