본문 바로가기

IT/블록체인 Blockchain

[Ethereum] 이더리움 이더 Transfer, 마이닝

반응형


지난 포스팅에 이어서 이더리움 어카운트간 Ether를 Transfer 해 보고 해당 트랜잭션을 Miner가 블록체인에 새로운 블록으로 쓰는 작업을 해 보겠습니다.

 

먼저, geth 콘솔에서 자바스크립트 파일을 이용해 쉽게 어카운트 밸런스를 확인할 수 있는 방법을 알려 드리겠습니다.

 

아래 내용처럼 js파일을 작성합니다. 저는 balance.js라고 저장했습니다.

 

1
2
3
4
5
6
7
function checkAllBalances() {
var i =0;
eth.accounts.forEach( function(e){
     console.log("  eth.accounts["+i+"]: " +  e + " \tbalance: " + web3.fromWei(eth.getBalance(e), "ether"+ " ether");
i++;
})
};
cs

 

그리고 geth console에서 해당 js파일을 로드하면 checkAllBalances() 함수를 이용해서 모든 account의 balance를 바로 확인할 수 있습니다.

 

1
2
3
4
5
6
loadScript('balance.js')
true
> checkAllBalances();
  eth.accounts[0]: 0x2b92f15795e68184c13f7909bd7a677a001c9795   balance: 10 ether
  eth.accounts[1]: 0xb96e9e8de522371cdd34f96b803f556645d8f204   balance: 20 ether
  eth.accounts[2]: 0x67f47ec4e6b9acb498ece377177145f3f5d84bf9   balance: 0 ether
cs

 

이 상태에서, 어카운트 간 ether transfer를 해 봅니다.

먼저 출금할 어카운트를 unlock하고, eth.sendTransaction 메서드를 사용해 계좌이체를 해 보았습니다.

 

1
2
3
4
5
6
personal.unlockAccount('0x2b92f15795e68184c13f7909bd7a677a001c9795')
Unlock account 0x2b92f15795e68184c13f7909bd7a677a001c9795
Passphrase:
true
> eth.sendTransaction({from: '0x2b92f15795e68184c13f7909bd7a677a001c9795', to: '0x67f47ec4e6b9acb498ece377177145f3f5d84bf9', value: web3.toWei(1"ether")})
"0xb9dc4252eb066cb7c6b4a62b16f7054418f34ec52a53e8b3a4d13c9260cd0d84"
cs

 

트랜잭션은 정상적으로 종료 되었습니다. 하지만 balance를 확인해 보면 변함이 없습니다. 왜 그럴까요?

트랜잭션이 실행되어도 그 내용이 블록에 씌여지지 않으면 밸런스가 업데이트 되지 않기 때문입니다.

블록에 트랜잭션을 쓰기 위해서는 마이닝 작업이 필요합니다. 콘솔에서 다음과 같은 명령어로 마이닝을 시작합니다.


miner.start()

 

마이닝을 시작하면 geth 로그에서 다음과 같은 내용을 볼 수 있습니다.

 

1
2
3
4
5
6
7
8
9
125 14:55:34.451245 internal/ethapi/api.go:1047] Tx(0xb9dc4252eb066cb7c6b4a62b16f7054418f34ec52a53e8b3a4d13c9260cd0d84) to: 0x67f47ec4e6b9acb498ece377177145f3f5d84bf9
I1125 15:02:54.886033 miner/miner.go:136] Starting mining operation (CPU=1 TOT=2)
I1125 15:02:54.888677 eth/backend.go:479] Automatic pregeneration of ethash DAG ON (ethash dir: /home/dh/.ethash)
I1125 15:02:54.906167 eth/backend.go:486] checking DAG (ethash dir: /home/dh/.ethash)
I1125 15:02:54.939951 miner/worker.go:542] commit new work on block 1 with 1 txs & 0 uncles. Took 41.423045ms
I1125 15:02:54.946166 vendor/github.com/ethereum/ethash/ethash.go:259] Generating DAG for epoch 0 (size 1073739904) (0000000000000000000000000000000000000000000000000000000000000000)
I1125 15:03:15.571190 vendor/github.com/ethereum/ethash/ethash.go:291] Generating DAG: 0%
I1125 15:03:48.054945 vendor/github.com/ethereum/ethash/ethash.go:291] Generating DAG: 1%
....
cs

 

두 번째 블록 (genesis block이 블록 0이므로 block 1) 에 조금 전에 있었던 transaction을 쓴다는 내용이 보이죠?

그리고 DAG를 생성한다는 내용도 있습니다. 

이더리움의 PoW (Proof of Work) 알고리즘은 DAG를 사용합니다. CPU나 GPU의 병렬계산에 최적화 되어 있어서 메모리가 별로 필요 없는 비트코인과 달리, 이더리움은 ASIC을 이용한 마이닝을 지양하기 위해서 메모리를 많이 사용하는 PoW 알고리즘인 DAG를 채용했고 DAG를 위한 데이터가 몇 기가바이트 필요한데 그 데이터를 생성한다는 의미입니다.

DAG는 "Directed Acyclic Graph" 의 약자라고 합니다.

 

마이닝을 시작하고 나면 처음 Genesis block에 정의된 난이도 (difficulty) 와 PC의 성능에 따라서 어느 정도 시간이 지난 후에 두 번째 블록이 씌여 집니다.

저는 PC의 성능이 너무 느려서, 난이도를 상당히 낮게 맞춰 놓았는데도 블록 하나를 쓰는데 하루가 넘게 걸렸습니다. -_-;;

테스트 용도로 사용하실 때는 난이도를 1로 하는 것이 좋을 것 같네요.

 

현재 블록에 씌여지지 않은 트랜잭션은 다음과 같이 볼 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
eth.pendingTransactions
[{
    blockHash: null,
    blockNumber: null,
    from: "0x2b92f15795e68184c13f7909bd7a677a001c9795",
    gas: 90000,
    gasPrice: 21786820000,
    hash: "0x46f6d911c4b10233aec413a4c1a530d49612f22e13c3d01a85f481a52323baa5",
    input: "0x",
    nonce: 0,
    r: "0x897019fb4aea762338e643dd72634f6927eed10d6b5495fcdf75b68ee69eb195",
    s: "0x4b1b27796d8968c03de3b3a0e80ebb1d2783780747520c6fe9282a7e39e54f87",
    to: "0x67f47ec4e6b9acb498ece377177145f3f5d84bf9",
    transactionIndex: null,
    v: "0x1c",
    value: 1000000000000000000
}]
cs

 

블록에 써 진 후에는 null값이 return 됩니다.

 

마이닝된 블록은 아래처럼 볼 수 있네요.

 

1
2
3
debug.printBlock(1)
"Block(#1): Size: 650.00 B {\nMinerHash: d3c07964dbe01e39fde7c3fe1d67b2d0ef046bd0729a24c68eb73d37a214899f\nHeader(f214943e46d238ff3d19e6770544535fe75b1d54658d6dc63610127114890ba3):\n[\n\tParentHash:\t    06edf67b00ea1257b6d875f2d13425a618e65ea85e2c3a04905efac5982af05b\n\tUncleHash:\t    1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347\n\tCoinbase:\t    2b92f15795e68184c13f7909bd7a677a001c9795\n\tRoot:\t\t    b75b96cbf1f4bcc43f8096b13fc6717514880b0bf0b3efda630c3e98a73ab4c8\n\tTxSha\t\t    d1b1fe32f55a58782de9e4317fbfd30fbeaa446fd6a0a5fe78643ee5faffa027\n\tReceiptSha:\t    f1c5408a1273bd49325c93a7a9e6e40b23aa0c4d39fec07025cdb52466aaf3df\n\tBloom:\t\t    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\tDifficulty:\t    131072\n\tNumber:\t\t    1\n\tGasLimit:\t    134086657\n\tGasUsed:\t    21000\n\tTime:\t\t    1480061712\n\tExtra:\t\t    ׃\x01\x05\x02�geth�go1.7.3�linux\n\tMixDigest:      9857c130a3411ad2356f50c354f6073ddaf7cc30da2306e649507aa983aacdbf\n\tNonce:\t\t    440d676c45fde432\n]\nTransactions:\n[\n\tTX(46f6d911c4b10233aec413a4c1a530d49612f22e13c3d01a85f481a52323baa5)\n\tContract: false\n\tFrom:     2b92f15795e68184c13f7909bd7a677a001c9795\n\tTo:       67f47ec4e6b9acb498ece377177145f3f5d84bf9\n\tNonce:    0\n\tGasPrice: 21786820000\n\tGasLimit  90000\n\tValue:    1000000000000000000\n\tData:     0x\n\tV:        0x1c\n\tR:        0x897019fb4aea762338e643dd72634f6927eed10d6b5495fcdf75b68ee69eb195\n\tS:        0x4b1b27796d8968c03de3b3a0e80ebb1d2783780747520c6fe9282a7e39e54f87\n\tHex:      f86d80850512987da083015f909467f47ec4e6b9acb498ece377177145f3f5d84bf9880de0b6b3a7640000801ca0897019fb4aea762338e643dd72634f6927eed10d6b5495fcdf75b68ee69eb195a04b1b27796d8968c03de3b3a0e80ebb1d2783780747520c6fe9282a7e39e54f87\n]\nUncles:\n[]\n}\n"
 
cs

 

마이닝 후 이더 밸런스가 업데이트 된 것이 보입니다.

1 만큼의 Ether가 세 번째 어카운트로 넘어갔고, 첫 번째 어카운트는 마이닝의 대가로 Ether 5를 받았네요.

 

1
2
3
4
checkAllBalances()
  eth.accounts[0]: 0x2b92f15795e68184c13f7909bd7a677a001c9795   balance: 14 ether
  eth.accounts[1]: 0xb96e9e8de522371cdd34f96b803f556645d8f204   balance: 20 ether
  eth.accounts[2]: 0x67f47ec4e6b9acb498ece377177145f3f5d84bf9   balance: 1 ether
cs

 

다음 포스팅에서는 이더리움의 핵심인 Smart Contract (스마트 계약) 을 테스트 해 보겠습니다.

반응형
  • kyu 2017.06.02 00:45

    안녕하세요. 작성하신 글을 너무 잘보았습니다.
    위에 보면 js를 작성해서 콘솔에서 사용하는방법을 제시하셧는데
    위 코드를 html로 작성해서 web에서 사용을 할 수 있나요? 있다면 어떻게 사용할 수 있는지 간단한 설명을 좀 해주실수 있나요 ? 감사합니다!

    • 상크스 2017.07.17 16:36 신고

      html 과 js를 이용해서 웹상에서 억세스 할 수도 물론 있습니다. 다만 수고(혹은 검색) 이 좀 필요할 것 같고요, 웹에서 트랜잭션을 확인하시려면 로컬시스템에서 하는 것 보다는 테스트넷을 이용하시는걸 추천 합니다.