이더리움(Ethereum) 개발 기초 #2 – 채굴과 송금

1

지난 기사를 통해 윈도우에 이더리움 개발 프로그램 Geth를 설치하고, 실행하는 방법에 대해 설명하였다. 이번에는 채굴부터 송금에 대해 이야기해보자.

먼저 Geth를 구동하자. 지난 번에 했던 방법과 동일하게 구동하며, 대신 log를 남기는 명령어를 추가했다. 로그를 남기는 명령어로 실행하지 않으면, 채굴 중 그 내용이 모두 화면에 표시되기 때문에 추가 작업을 하기에 다소 번거로울 수 있다.

> d:\Geth\geth –networkid 1185 –nodiscover –maxpeers 0 –datadir d:\Geth console 2>> d:\Geth\geth.log

채굴을 했을 때 보상받는 계정을 Etherbase라고 하며, 이것은 기본적으로 첫번째 생성된 계정으로 지정되고, eth.coinbase 명령어로 확인 가능하다

> eth.coinbase

물론, miner.setEtherbase 명령어로 계정의 변경도 가능하니 참고하기 바란다.
계정을 만들었으니, 채굴 전에 잔액을 확인하는 방법 먼저 알아두는 것이 좋다. 잔액 확인은 eth.getBalance() 함수로 가능하다. 현재 잔액이 없으므로 0가 확인된다.

> eth.getBalance(eth.accounts[0])
0

채굴

이제 채굴을 시작해보자. 채굴은 miner.start(쓰레드 수)로 시작할 수 있다. 쓰레드 수는 실행하는 쓰레드의 개수를 입력하면 되고, 이번에는 하나의 쓰레드만 가동해 본다.

> miner.start(1)
null

채굴 중인 내용은 시작할 때 지정한 geth.log 파일을 통해서 확인할 수 있고, eth.mining 명령으로 실행 중인지 확인할 수 있다. 또, eth.hashrate와 eth.blockNumber 등의 명령어로 진행된 채굴 상황을 볼 수 있다.

> eth.mining
true
> eth.hashrate
57032
> eth.blockNumber
166

블록이 생성되었다면 miner.stop() 명령어로 채굴을 중지한 후, 잔액을 확인해보자.
eth.getBalance() 명령을 실행하면 wei 단위로 표시되기 때문에 엄청난 잔액이 있는 것처럼 보일 것이다. 이전 기사에도 이야기했지만, 1ether는 10의 18승 wei이기 때문이다. 이것을 ether로 보기 위해서는 web3.fromWei() 명령어를 이용한다.

현재 채굴로 받을 수 있는 보상은 1블록에 5ether이다. 채굴을 중단할 때까지 블록의 길이가 178이었으므로 178×5=890이 되는 것이다.

> eth.getBalance(eth.accounts[0])
890000000000000000000
> web3.fromWei(eth.getBalance(eth.accounts[0]),”ether”)
890
> eth.blockNumber
178

이와같이 짧은 시간 안에 채굴과 블록생성이 가능한 이유는 현재 프로젝트가 프라이빗 블록체인으로 다루어지기 때문이다. 퍼블릭 블록체인에 대해서는 다음에 다룰 예정이다.

이더의 송금

송금 명령어는 eth.sendTransaction() 명령어로 가능하다. 하지만, 실행하면 오류가 발생할 것이다. 다음 명령어를 실행해, accounts[0]에서 accounts[1]으로 10ether를 송금해 보자.

> eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value:web3.toWei(10,”ether”)})

오류가 발생하는 이유는 송금에는 수수료가 발생하기 때문이며, 실수로 다른 계정에서 송금하는 것을 방지하기 위해 오류를 만드는 것이다. 이럴 때는 계정의 잠금을 풀고 송금을 진행할 수 있다. 계정 잠금을 푸는 명령어는 아래와 같다.

> personal.unlockAccount(eth.accounts[0],”pw0001″)

unlockAccount() 함수의 변수는 첫번째가 계정, 두번째가 그 계정의 비밀번호다. 계정만 입력하게 되면 암호 입력창이 나타나 입력할 수 있다. 잠금 해제는 보통 300초 동안 유지되며, 필요에 따라 마지막에 추가 변수(초 단위)를 입력하여 해제 시간을 조절할 수 있다.

잠금을 해제한 후 송금 명령어를 다시 입력하면 트랜잭션 ID가 화면에 표시되고 송금이 진행될 것이다. 하지만, 현재 상황에서 실제 accounts[1]에는 잔액이 확인되지 않는다. 그것은 아직 블록체인에 송금 내역이 기록되지 않았기 때문이다.
대신, 아직 보류 중인 트랜잭션을 확인하게 되면 송금된 내역을 확인할 수 있게 된다. 보류 중인 트랜잭션은 아래의 명령어로 확인 가능하다.

> eth.pendingTransactions

이제, 트랜잭션을 마무리하기 위해 miner.start(1) 명령어로 블록을 생성해 완료해 보자. 잠시 후면 블록 생성과 함께 트랜잭션이 마무리되고, 보류 중인 트랜잭션이 없다는 것을 확인할 수 있다.

수수료

여기서, 다시 account[1]에서 account[2]로 5 이더를 전송하는 작업을 해 보자. account[2]가 없다면 먼저, personal.newAccount() 명령어를 통해 생성하면 된다.
위에서 설명한 것처럼, 먼저 account[1]의 잠금을 해제하고, sendTransaction()을 통해 5 이더를 보낸다. 그 후, miner.start(1)로 블록을 생성하면 트랜잭션이 처리될 것이다.

이런 작업 후 각 account의 잔고를 확인해보면, account[2]에 5 이더가 들어간 것을 확인할 수 있지만, account[1]에는 잔고가 4.999622 이더가 남아 있는 것을 확인할 수 있다. 이것은 송금이 발생된 후에 수수료인 gas가 보낸 계정에서 자동 출금되었기 때문이다.
여기서 gas의 양을 확인하기 위해 getTransaction() 명령어를 확인해보자.

> eth.getTransaction(“0x8a3f29782c109c92335bcda2ac9763eb9d1506c54c463d094ce35a65639d6249”)

트랜잭션 ID를 입력하여 결과값을 확인하면 gas와 gasPrice 값이 표시된다. gas의 값은 지불할 수 있는 최대 수수료를 의미하고, 실제 지불한 gas는 아니다. 실제 지불한 gas는 잔액의 차이를 gasPrice(wei 단위)로 나눈 값이다.
그러므로 현재 지불한 gas는 아래의 공식으로 계산된다. 잔액의 차액은 318,000,000,000,000 wei이다.

지불한 수수료 = 318,000,000,000,000 / 18,000,000,000 = 17,667 gas

트랜잭션에 표시한 90,000 gas에 비해서 적은 양이 수수료로 사용된 것을 확인할 수 있다.

지금까지는 Geth에 대한 기본적인 내용을 다루어봤다. 다음에는 스마트 컨트랙트에 대한 기본적인 이해부터 알아볼 계획이다.

 

이더리움 개발 1편 바로가기
Geth 설치 및 계정생성 : https://crosswave.net/?p=1063