본문 바로가기
개발 학습/블록체인

Docker로 노드 운영 (3) : Geth로 채굴, 트랜잭션 생성

by StelthPark 2022. 2. 19.

지금까지 나만의 프라이빗 블록체인을 작동시킬 준비가 끝이났다. 이제 제네시스 블록의 생성을 하고 블록체인이 돌아갈것이고 채굴과 내부에서 코인을 전송하고 트랜잭션을 날리고 조회하는 등 여러가지 작업을 해보자 

 

1. Geth 실행

$ geth --networkid 8484 --nodiscover --datadir test_data -allow-insecure-unlock --http.addr 0.0.0.0 --http --http.port 8545 --http.corsdomain "*" --http.api="db,eth,net,web3,personal,web3,miner,admin" --miner.threads 1 console 2>> test_data/geth.log

명령어에서 의미하는 것들은 다음과 같다.

  • datadir test_data : 데이터 디렉터리를 지정합니다.
  • networkid 8484 : 네트워크 식별자 입니다.
  • http : 이전에는 rpc였으나 현재 http로 변경되었습니다.
  • http.addr “ip” : IP는 현재 사용중인 IP를 입력하시면 됩니다.
  • http.port “port” : 포트 번호를 원하시는것으로 설정하면 됩니다.
  • http.corsdomain”*” : 접속가능한 RPC 클라이언트 URL을 지정하는것인데 “*” 경우 전체 허용입니다.
  • nodiscover : 생성자의 노드를 다른 노드에서 검색할 수 없게 하는 옵션입니다. 즉 같은 제네시스 블록과 네트워크 ID에 있는 블록들이 연결되는것을 방지합니다.
  • http.api “db,eth,net,web3,personal” : rpc에 의해 접근 가능한 api라고 보시면 됩니다. (geth내에서 사용가능한 명령어)
  • maxpeers 0 : 생성자의 노드에 연결할 수 있는 노드의 수를 지정합니다. 0을 지정하면 다른 노드와 연결하지 않습니다.
  • console : 대화형 자바스크립트 콘솔을 기동합니다.
  • 2>> /home/ngle/data_testnet/geth.log : 로그 파일을 만들 때사용할 옵션으로 에러를 해당 경로의 파일에 저장합니다.

 

명령어에서 수정할 부분은 없지만 IP부분은 현재 사용중인 IP를 입력하라고 해서 IP를 검색하여 입력했지만 오류가 난다. 그냥 0.0.0.0으로 하니 잘된다.. 일단 위 명령어로 그래도 작동해보고 안된다면 IP를 바꿔보자.

 

정상적으로 실행되면 > 표시가 나타난다.

 

먼저 EOA계정을 생성해보자 이더리움 계정에는 EOA와 CA두가지가 있는데 EOA는 진짜 우리가 전송이나 입금 등을 하는 주소로 이해하면 쉽다. CA는 컨트랙트로 컨트랙트를 배포할때 만들어지는 주소로 이해하면 쉽다.

 

아까 제네시스 블록을 만들때 썼던 첫 계정이 잘 만들어져 있는지 확인해보자

eth.accounts

나는 어제 제네시스 블록을 만들때 사용한 계정이 맨앞에 나타났다. 처음 만든다면 자신이 처음 genesis.json안에 적은 주소가 나타나게 될 것이다. 어제 제네시스 블록을 생성하기전 만든 계정 1번과 이후 전송을 테스트하기위한 계정 2번 그리고 이 글에서 작성할 때생성한 계정 3번까지 총 3개가 있고 1개의 계정을 더 생성해보자!

 

personal.newAccount('패스워드')

패스워드에 원하는 값을 입력하면 새 계정이 만들어진다. 새로만들 계정을 채굴시 보상받을 계정으로 선택하자. 보상받을 계정을 Etherbase라고 하는데 이 변수에는 기본적으로 eth.accounts[0]이 설정된다.

 

이제 우리가 원하는 계정을 변수로 지정해보자

miner.setEtherbase(personal.listAccounts[1]);

나는 eth.accounts 명령어로 나온 계정리스트중에 두번째 계정인 0xc4f8~을 채굴보상계정으로 선택했다.

eth.getBalance(eth.accounts[0])

getBalance에 변수 값을 다르게 주어 원하는 계정의 발란스를 확인 할 수 있다.

발란스는 Wei단위로 나타나는데 ether라는 단위로 변환 할수 있다

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

1000000000000000000으로 1뒤에 0이 18개 붙은게 1ether랑 같다. fromWei나 toWei를 통해 쉽게 ether 단위로 변환 할 수 있다.

 

그 외에도 아래 명령어들이 있다.

> eth.blockNumber 생성된 블록수 조회

> eth.getBlock(블록번호) 블록번호에 맞는 블록 정보 출력

 

 

메타마스크나 웹지갑에서 지갑에 로그인을 해야 지갑이 열리는것 처럼 우리가 가진 현재 생성 지갑들도 잠긴상태에 있을 것이다. 앞서 설정한 비밀번호로 지갑을 열고 열린 지갑만이 전송이나 어떤 행위를 할 수 있을것이다. 먼저 생성지갑중 하나를 선택하여 열려있는지 확인해보자

personal.listWallets[0].status

현재 인덱스0에 있는 지갑은 잠겨 있다. 이 잠긴 계정을 세 명령어중 하나로 해제할수 있다.

        > personal.unlockAccount(eth.coinbase)

        > personal.unlockAccount(eth.coinbase, "패스워드")

        > personal.unlockAccount("주소", "패스워드", 유효기간)
        // 유효기간을 0을 입력하면 geth 프로세스가 종료될 때까지 unlock 상태를 유지합니다.

eth.coinbase, 즉 채굴보상받을 계정을 현재 1번인덱스 계정으로 해두었고 해당 계정을 해제하였다.

 

 

2. 채굴

miner.start(1)

해당 명령어로 채굴을 시작할 수 있다. 1은 스레드 갯수이다. 명령어를 시작하고 채굴이 되고 있는지 eth.mining으로 확인해보자.

true가 나오면서 현재 채굴중인것을 알수 있다. 채굴이되면서 시간이 지나면 블록이 쌓이는걸 알수있다.

채굴을 종료할려면 miner.stop() 명령어를 쓰면되고 당연 채굴보상은 처음에 지정한 인덱스 1번계정이 받게되고있다. 여기서 확인해볼건 보상을 잘받고 있는지 인덱스1번의 발란스를 찍어보면 된다.

블록이 생성되고 보상을 받아 잔고가 계속 늘어나고 있다. 뭔가 기분이 좋다.

 

3. 트랜잭션 생성

트랜잭션을 만들어 처리되려면 채굴중인 상태가 되어야하므로 일단 채굴은 중지시켜본다.

그런 다음 인덱스0번 지갑에서 인덱스1번지갑으로 0.1이더를 전송하는 트랜잭션을 생성해보자 생성전 먼저 지갑을 해제해준다. unlock!!!

personal.unlockAccount(eth.accounts[0])
> eth.sendTransaction({
    	from:eth.accounts[0],
    	to:eth.accounts[1],
    	value:web3.toWei(1,'ether'),
    	data:web3.toHex('send message')
    })

결과 트랜잭션 해시값이 나오게 되고 트랜잭션 펜딩 배열에 들어가게 된다.

펜딩 배열은 처리대기 중인 트랜잭션들이 들어가고 채굴에 의해 블록이 생성되면 처리되어 배열에서 사라진다.

배열을 확인해보자! 명령어 eth.pendingTransactions

 

이제 배열에 대기중인 아이를 처리하기위해 채굴을 다시 켜준다. miner.start(1) !!!!!

펜딩 배열안에 대기중인 트랜잭션이 처리되고 빈배열이 되었다! 참고로 송금과 같은 트랜잭션을 날리면 수수료가 나가는데 이 수수료는 채굴자가 받게된다. 그리하여 채굴자가 트랜잭션을 날리게되면 자기자신한테 수수료가 들어오니 송금같은 처리시 보낸 이더만 나가게되고 수수료는 나가지않지만 채굴자가 아닌 사람이 트랜잭션을 날리게되면 보낸이더외에도 수수료가 더 차감되어 발란스에 적용된다.

 

 

댓글