프라이빗 네트워크 구축
안녕하세요~ 스마트 컨트랙트와 솔리디티 공부를 위해 지난번 크립토 좀비 시리즈를 마친 후 다시 돌아왔습니다. 현재 코로나 때문에 어디 밖에 나가지도 못하고 집에서 딱 공부하기 좋은 환경이 되었습니다... ㅜㅜ
그.래.서 Geth를 이용해 직접 프라이빗 네트워크를 구축하여 한 번 실습을 해보려고 합니다. 참고 자료는 Founders 2019 Summer 개발자 과정에 있는 실습 자료를 바탕으로 하였습니다.
링크주소: https://decenteruniv.com/founders_2019_summer/
저는 이 파운더스 2019때 개발자가 아닌 기획자로 써 참여를 하였는데요. 최근 블록체인 개발 관련 공부를 하면서 괜찮은 자료를 찾다가 파운더스때 자료들이 생각나서 한번 찾아 보았습니다. 거기에서 컨센서스에서 만든 개발 관련 자료들이 있어서 따라 해보면서 공부를 해보려고 합니다.
링크 주소: https://consensys.net/
시작 하기에 앞서서 개발 환경에 대한 소개를 간단히 하려고 합니다. 저는 현재 노트북 LG Gram을 사용중이고 윈도우와 우분투 19.10을 듀얼부팅을 해놓아서 따로 virtualbox나 vmware같은 가상 머신을 따로 설치하여 우분투를 설치 하지는 않았습니다. 듀얼부팅은 이분의 자료를 많이 참고 하였는데 아마 지우고 깔고를 한 5번정도 하고 나서 우분투에 대한 적응이 되었습니다.. 정말 힘들었어요 ㅜㅜ 특히나 한영키, 한글, 테마, 저장경로, 터미널, 터미널 명령어, command line형식, sudo 등등 며칠간 사용하면서 많이 해매고 다양한 사람들의 자료를 참고해서 어느정도 익숙해 진것 같습니다. 혹시 궁금하신 것이 있으시면 연락주시면 제가 알고있는 부분은 도와드리도록 하겠습니다! (카카오톡은 깔지 못했습니다 ㅠㅜ)
듀얼부팅: https://jimnong.tistory.com/676
만약 윈도우를 사용하시는 분이시라면 따로 설치를 해주셔서 환경을 만드셔야 합니다. 보통은 리눅스 환경에서 실행하는 것을 선호하는 것 같습니다.
Vitrual Box: https://www.virtualbox.org/wiki/Downloads
Ubuntu: https://ubuntu.com/download/desktop
우분투에서 작업을 하면서 노드 js와 npm을 깔아 두었기 때문에 저는 바로 geth를 설치하였습니다.
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt update
sudo apt-get install ethereum
다음과 같이 설치를 해 주신 뒤 터미널에 geth version을 치시면 다음과 같은 화면을 보실 수 있습니다.
우선 시작하기에 앞서 Geth란 무엇인지 살펴보시죠
geth는 이더리움 노드들을 운영하기 위한 커맨드 라인 인터페이스로 Go로 구현되었다고 합니다. 이러한 노드들을 클라이언트라고 하는데요. 이 기능을 하기 위해 프로그램이 필요한데, 가장 많이 사용하는 프로그램이 geth라고 합니다.
POW부터 바로 실습을 해봅시다! 우분투 바탕화면에 저는 우선 geth practice라는 폴더를 하나 생성해두었습니다. 거기에서 다음과 같이 gethPoW라는 폴더를 만들어 주었습니다.
이 폴더 안으로 들어가서 마우스 우측 버튼을 클릭하여 터미널에서 열기를 클릭합니다.
그러면 다음과 같이 자동적으로 경로가 설정됩니다. 명령어에 익숙하신 분들이면 mkdir 과 cd를 통해 바로 하시면 되겠습니다. 이 창에서 puppeth를 입력해 줍니다.
그러면 다음과 같은 화면을 보실 수 있습니다. 저기에 네트워크 이름을 설정하라고 하네요 저는 geth_pow라고 이름을 설정하였습니다.
다음에 관련 네트워크 설정을 하실때 geth_pow를 치시면 바로 들어오실 수 있을 것입니다. 여기에서 Configure new genesis 클릭을 위해 2를 쳐줍시다.
빠른 진행을 위해 위에서 2를 쳐준뒤 1, 1을 연속으로 쳐주었습니다. 이를 통해 새로운 제네시스를 생성하고 합의 알고리즘으로 pow즉 작업증명방식을 선택하였습니다. 밑의 pre-funded 부분에서는 pre-funded account가 없기 때문에 그냥 엔터를 쳐줍시다.
또한 precompile-addresses 부분도 n을 눌러주어서 없다고 하고 network id를 저는 1500으로 설정을 하였습니다.
그 다음으로 manage existing genesis로 들어간뒤 제네니스 구성을 export를 2를 눌러 export 해주시고 which folder to save the~ 이 문장에서 엔터를 치시면 현재 폴더에 다음과 같은 자료들이 생성됩니다.
이후에 기존 터미널 창에서 Ctrl + c 를 눌러서 빠져나온뒤 터미널 창에
geth -- datadir . init geth_pow.json
이렇게 적어 줍시다 geth옆에 -이 작대기 두번 누르셔야합니다.
그러면 다음과 같이 geth를 초기화 하여 개인의 로컬넷 블록체인이 생성되신것을 확인하실 수 있을 것입니다.
이것을 보시면 디렉토리에 또한 geth폴더와 keystore 파일또한 생긴것을 확인하실 수 있을 것입니다. 이제 계정을 만들어 봅시다. 명령어는 이렇게 치시면 됩니다.
geth -- datadir . account new
그러면 다음과 같이 address와 개인 키가 생성된 것을 확인 하실 수 있습니다. 계정을 생성하실 때 비밀번호는 기억해 두시길 바랍니다. 또 하나의 계정을 만듭시다.
각 계정의 주소와 자신이 설정한 비밀번호를 기억해 두시길 바랍니다.
이제 네트워크 ID를 쳐서 노드를 실행시킬 것인데 아까 저는 네트워크를 1500이라고 설정을 해두어서 다음과 같이 입력을 하겠습니다.
geth -- datadir . -- networkid 1500
그러면 다음과 같은 창이 뜨면서 프라이빗 네트워크 구동을 한 화면이 뜨게 됩니다. Looking for peers라는 글이 뜨면서 계속적으로 상대방 노드를 찾고 있습니다.
이제 이창은 그대로 냅두고 새로운 터미널 창을 아까와 같은 디렉토리(저장경로)에서 열어줍시다.
시작된 노드를 콘솔에 연결시키기 위해 다음과 같이 코드를 작성해 줍니다.
geth attach geth.ipc
이 명령어는 자바스크립트 API를 이용하여 프로그래밍 적으로 상호작용할 수 있도록 대화식 자바스크립트 콘솔을 연결시키기 위한 명령어 입니다. 이를 통해 ipc를 통해 json-rpc를 사용해 geth와 통신합니다.
이러한 화면과 원래 기존 창에는
다음과 같은 글이 떠서 이더베이스가 자동적으로 구성되었다는 것을 알려줍니다.
기본적으로 etherbase에는 처음에 만들어 둔 계정인 eth.account[0]이 설정되어 있습니다. 대화식 콘솔 창에서 다음과 같은 명령어들을 작성해 봅시다.
> eth.blockNumber // 블록의 수
> eth.coinbase // eth.coinbase의 주소 아마 eth.account[0]의 주소일 것임
> eth.accounts // 계정에 대한 것을 보여줌
> eth.getBalance(eth.coinbase) // 첨에 만든 계정이 얼마가지고 있는 지 보여줌
> web3.fromWei(eth.getBalance(eth.coinbase), ‘ether’) // wei에서 이더단위로 변환
> eth.getBalance(eth.accounts[1]) // 두번째로 만든 계정의 잔액
아직 블록이 생성되지 않아서 0, 코인베이스 잔액과 두 번째 계정의 잔액도 마찬가지로 0을 확인할 수 있습니다.
자 이제 채굴을 시작해 봅시다. 이 명령어를 쳐봅시다.
miner.start() // 채굴 시작
그러면 처음 터미널 창에서 다음과 같은 화면을 보실 수 있습니다. 어느정도 채굴이 완료된 뒤에 저는 miner.stop() 이라는 명령어를 넣어 채굴을 멈추었습니다.
다음과 같이 최종적으로 블록은 26개가 되었고 채굴에 대한 보상으로 처음으로 만든 계정은 52이더를 받았습니다. 하지만 계정 2에는 아직 이더가 없습니다. 따라서 이더를 한번 보내봅시다. 이더를 보내기 위해서는 다음과 같은 명령어를 쳐주어야 합니다.
> personal.unlockAccount(eth.coinbase) // 이더 전송 허용하게 해줌
> eth.sendTransaction({from: eth.coinbase,to: eth.accounts[1],
value: 1000})
> eth.getBalance(eth.accounts[1])
처음 계정을 언락을 시켜서 이더를 전송할 수 있게 비밀번호를 쳐서 풀어준다음 계정2에다가 값을 설정해서 보내줍니다. 지금은 miner.start() 즉 채굴을 하지 않은 상태이기 때문에 트랜잭션이 발생하지 않아서 그런가 두번째 계정의 잔액이 증가하지 않았습니다. 따라서 다시 채굴을 시작하였다가 끄고 확인을 하게되면 기존 계정 1에있던 잔액이 보낸만큼 줄어들고 계정 2에 있던 잔액이 1000으로 바뀐것을 확인하실 수 있을것입니다.
트랜잭션 정보와 블록으로부터 정보를 얻기 위해 다음과 같은 명령어를 통해 확인하실 수 있습니다.
> eth.getTransaction(‘PASTE_TX_HASH_HERE’)
> eth.getBlock(PASTE_BLOCK_NUMBER_HERE)
난이도, 가스, 채굴자가 누구인지 등등 다양한 정보들을 얻을 수 있습니다.
이렇게 geth puppeth을 이용한 PoW 네트워크를 만들어 채굴을 해보았습니다. 다음에는 puppeth을 이용해 PoA 네트워크를 만들어 보는 시간을 갖겠습니다. 감사합니다.
이정민(dlwoabsdk@gmail.com)