brunch
매거진 개발실습

Geth puppeth 2편 - POA

프라이빗 네트워크 구축

by SKKRYPTO
다운로드.png


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


1*dnfwEgcwBBKMIRZ1g196tQ.png


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

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


1*YEgsbKjR4Txgy4TfXIlomQ.png


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


1*T2lXJJ8H8UqfdPljmOBsvQ.png


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

그 이후로


1*dG92JA2pxpg5q0vWnS3pxg.png


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

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


1*1FpnqdinGh5XzxrcAtd59Q.png


다음으로 넘어가서 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 // 클라이언트 가동


1*1JDf84-o1jhq8rzvEBdn-Q.png


네트워크 초기화

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


1*qP1a1wSPJpOQf9KOz9K3Sw.png


클라이언트 가동

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

> geth attach node1 // node1을 console에 연결


1*EMLg1xsPxvALYhw-SiccJA.png


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

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


1*5319O7usP4FiJ2tKyaNCKw.png
1*DzHMISyWa-1SV7h4Ldk2eQ.png


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

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

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

연결을 해주신 뒤

> admin.peers
> admin.nodeInfo.enode


1*oCcIEFaoXTqmoELVx27Vcg.png


geth attach node2의 화면

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

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


1*cFMhP7D3kBk9bVKTtVJJpA.png


geth attach node1의 화면

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

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


1*iaFrxi_Gam1oSK791fWwjQ.png


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

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


1*bLFOQl9HkOWaH2XWJJTsKg.png
1*RG4OQ-Dnb7ISm5EHnWswQA.png


채굴에 실패한 모습

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()


1*f95XZi-kNWoRZqYSF19NXA.png


보시면 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)


1*ghq8t7KqWrBkDHDJI_6Cdw.png



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


1*RY10NxzvvxE_ipq5yFhfsA.png


채굴이 진행되고 있는 과정

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


1*c0r3Nzby4TlF8uETPAwZUw.png


node1에서 돈을 송금하는 과정


1*Rn1BFhSjUSDxXvkrl4abWQ.png


node1에게 돈을 받아 nod2의 잔액이 2000이 된 모습

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

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





이정민(dlwoabsdk@gmail.com)

keyword
매거진의 이전글Geth puppeth 1편 - POW