CODEDRAGON ㆍSecurity/Blockchain
이더리움의 송금 및 채굴 (Step by Step)
Ethereum Testnet을 설치하고 Ethereum 송금하는 실습과정입니다.
Step1: 제네시스 블록 생성 및 네트워크 구성
Step2: 테스트 네트워크 구동
Step3: 계정 생성 및 확인
Step4: 이더 송금
Step5: 이더 잔고 확인
Step6: 채굴
Step7: 이더 송금
Step8: balance 체크
Step9: 정보확인
Step1: 제네시스 블록 생성 및 네트워크 구성
Testnet을 구성
mkdir testnet이라는 명령어를 통해서 Testnet 데이터를, 블록체인 데이터를 저장할 디렉터리를 만들어 줍니다.
osboxes@osboxes:~$ mkdir testnet |
genesis.json 파일을 생성
genesis.json이라는 파일을 생성을 해 주는데 이것이 genesis 블록을 생성하기 위한 설정 정보를 갖다 주는 것입니다.
osboxes@osboxes:~/testnet$ vi genesis.json |
genesis.json 파일 내용 확인 - Windows
Windows에서 genesis.json 파일을 오픈한 후 모든 내용을 복사합니다.
genesis.json 파일 내용 붙여넣기
Ubuntu로 돌아와서 우분투 콘솔 메뉴에서 붙여넣기 합니다.
메뉴: [Edit] >> [Paste] 붙여넣기 합니다.
:wp 입력하여 수정한 내용을 파일에 저장한 후 vi 편집기를 빠져나옵니다.
:wp |
osboxes@osboxes:~/testnet$ vi genesis.json |
genesis 블록을 생성
geth init 명령어로 genesis 블록을 생성하기 위한, 즉 private 블록체인을 운영하기 위한 준비 작업을 마무리하도록 하겠습니다.
datadir 옵션을 주는 데 datadir은 계정폴더 밑의 만든 testnet이라고 하는 디렉터리를 지정하도록 하겠습니다.
그리고 마지막 인자로 genesis 블록에 대한 설정 정보가 있는 genesis.json 파일을 위치를 알려줍니다.
이렇게 하면 지금 genesis 블록에 대한 설정이 완료가 되어서 이제 Ethereum, Testnet을 기동하기 위한 준비는 끝나게 됩니다.
geth init --datadir /home/osboxes/testnet /home/osboxes/testnet/genesis.json
osboxes@osboxes:~/testnet$ geth init --datadir
/home/osboxes/testnet /home/osboxes/testnet/genesis.json |
정상 설치 확인
정상적으로 되었는지는 이렇게 tree라는 명령어를 통해서 현재 디렉터리, testnet의 디렉터리를 보면 이렇게 데이터들, 블록체인 데이터를 저장하기 위한 설정들이 완료되었음을 확인할 수가 있습니다.
이상으로 여기까지가 genesis 블록 생성을 통한 Ethereum private 네트워크를 또는 테스트 네트워크를 기동하기 위한 준비가 끝난 상황입니다.
osboxes@osboxes:~/testnet$ tree
. 4 directories, 11 files |
Step2: 테스트 네트워크 구동
Testnet을 기동을 해 보도록 하겠습니다.
Testnet은 geth consol을 통해서 Testnet을, Ethereum 네트워크를 기동을 시키고 콘솔에 접속을 하게 됩니다.
네트워크 아이디는 현재 우리가 Testnet을 구성하는 네트워크의 고유한 아이디인데 숫자로 임의의 값을 설정을 해 주시면 됩니다.
nodiscover는 다른 쪽 노드에서 현재 우리가 만든 Testnet을, 노드를 검색하지 않도록, 이 nodiscover를 통해서 private 블록체인이 되는 것입니다.
maxpeers를 통해서 단독 노드를 구성을 합니다.
데이터 디렉터리는 좀 전에 생성했던 testnet으로 설정합니다.
geth console --networkid 2080 --nodiscover --maxpeers 0 --datadir /home/osboxes/testnet
osboxes@osboxes:~/testnet$ geth console --networkid 2080
--nodiscover --maxpeers 0 --datadir /home/osboxes/testnet 340dfb939ae1b96046687b018dc202e673accbcdf4028b627214152efcb77197 fa00a1d59d2b5@127.0.0.1:30303?discport=0" instance:
Geth/v1.8.23-stable-c9427004/linux-amd64/go1.10.4 > |
Testnet의 기동, Ethereum 네트워크가 기동이 되었고 지금 자바스트립트 콘솔에 접속이 되어서 명령어를 실행할 수 있는 상태입니다.
Step3: 계정 생성 및 확인
ether0 계정 생성
personal.newaccount 명령을 통해서 계정을 생성을 하도록 하겠습니다. 이때 이 geth0라고 하는 이 인자는 어카운트의 암호가 됩니다. 이렇게 하면 이 주소가 새로 생성된 Ethereum 계정입니다.
> personal.newAccount("ether0") |
ether1 계정 생성
하나 더 생성해 보도록 하겠습니다.
> personal.newAccount("ether1") |
이렇게 해서 2개의 지갑을 생성 또는 2개의 Ethereum 계정을 생성을 했습니다.
마이너의 전자지갑 주소 확인하기
eth.coinbase 명령어는 전자지갑 주소, 마이너의 전자지갑 주소를 알려줍니다.
Ethereum을 제일 처음에 시작하면 디폴트로 제일 처음 생성된 주소(ether0)가 마이너의 주소이기도 합니다.
> eth.coinbase |
마이너 주소 바꾸기
만약에 마이너 주소를 두 번째 생성된 마이너(ether1)로 바꾸기 위해 이 주소를 복사를 합니다.
그리고 miner.setEtherbase라는 명령어를 통해서 그래서 현재 노드의 채굴자의 획득하는 전자지갑 주소를 바꿔줍니다.
> miner.setEtherbase("0xf85e2d6674b7c9e12fc805e7e8e28f31397f9536") |
바뀐 마이너의 전자지갑 주소 확인하기
eth.coinbase로 확인해 보시면 새로운 주소, 두 번째 전자지갑 주소(ether1), 그러니까 Ethereum 계정 주소로 바뀌어 있음을 확인할 수 있습니다.
> eth.coinbase |
원래대로 돌리기
다시 원래대로 ether0 주소로 돌리도록 하겠습니다.
그리고 다시 eth.coinbase로 확인합니다.
> miner.setEtherbase("0x8c16404f2ed65382234fdf83ab63c549d3155515") |
정상적으로 첫 번째 계정(ether0)으로 채굴자 주소가 설정되어 있는 것을 확인할 수가 있습니다.
생성된 전자지갑 주소 확인하기
eth.accounts라고 하는 명령어가 있는데 제가 일일이 이런 20바이트 이상의 전자지갑 주소 또는 Ethereum 계정을 기억하거나 복사하는 것이 좀 번거롭기 때문에 eth.accounts라고 하는 명령어를 통해서 생성된 전자지갑 주소를 확인할 수 있습니다.
> eth.accounts |
eth.accounts는 주소에 대한 Array 배열입니다.
그래서 eth.accounts[0] 또는 [1] 이런 식으로 해서 순서대로 생성된 전자지갑 주소를 접근할 수가 있습니다.
> eth.accounts[0] |
accounts[0], accounts[1]이라고 각각의 주소를 호칭하도록 하겠습니다.
Step4: 이더 송금
ether를 송금을 하는 것이 본 실습의 목표인데 ether를 송금을 해 보도록 하겠습니다.
accounts[0] -> accounts[1]로 1 ether 송금하기 (Error)
eth.sendTransaction을 통해서 accounts[0]에서 accounts[1]로 1 ether를 보내라고 하는 명령어를 수행합니다.
eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value:web3.toWei(1, "ether")})
>
eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1],
value:web3.toWei(1, "ether")}) > |
실행을 하면 실행이 안 됩니다.
이 오류를 보면 패스워드를 넣으라고 이야기하는데 송금을 하기 위해서는 이 from에 송금을 패스워드 unlock을 해 줘야 됩니다.
패스워드 unlock
그래야만 송금을 할 수가 있고요. 그래서 unlock을 하는 명령어, personal.unlockAccount라는 명령을 통해서 할 수가 있습니다. 그리고 인자로는 계정을 생성할 때 입력했던 패스워드를 넣어 줍니다.
> personal.unlockAccount(eth.accounts[0],
"ether0") > |
다시 송금을 시도합니다.
다시 에러가 발생하면서 실행이 되지 않습니다. 왜냐하면, 두 번째 이유로 지금 두 계정에 ether 잔고가 없기 때문입니다.
> eth.sendTransaction({from:eth.accounts[0],
to:eth.accounts[1], value:web3.toWei(1, "ether")}) > |
Step5: 이더 잔고 확인
ether 잔고를 확인하는 방법은 eth.getbalance로 ether 잔고를 확인할 수가 있습니다.
accounts[0] ether 잔고 확인
먼저 accounts[0]번의 잔고를 확인하도록 하겠습니다. 0이고요.
> eth.getBalance(eth.accounts[0]) |
accounts[1] ether 잔고 확인
accounts[1]번 주소에도 0 ether입니다. 그래서 ether가 없기 때문에 지금 보낼 수가 없습니다.
> eth.getBalance(eth.accounts[1]) |
두 계정에 ether 잔고가 없는 것을 확인할 수 있습니다.
Step6: 채굴
ether를 받는 방법은 3가지가 있다고 했는데 그중에 우리가 사용할 방법은 마이닝을 통해서 ether를 받도록 하겠습니다.
miner.start(1)을 하면 실행을 하면 마이닝이 시작됩니다.
먼저 명령어가 실행되면 마이닝을 할 수 있는 준비 작업을 하게 됩니다.
> miner.start(1) |
이렇게 콘솔에 메시지들이 계속 나오기 때문에 작업에 방해가 되므로 일단 작업을 중지한 후 다시 한번 나갔다가
에러 메시지, 또는 콘솔 메시지를 로그 파일로 저장하는 그런 명령어를 실행해서 다시 작업을 실행하도록 하겠습니다.
Ctrl+C를 누르다음 > 프롬프트가 나오면 바로 exit 명령어를 쳐서 빠져나옵니다.
INFO [04-03|01:55:16.108]
Generating DAG in progress
epoch=0 percentage=2
elapsed=14.965s |
geth console --networkid 2080 --nodiscover --maxpeers 0 --datadir /home/osboxes/testnet 2>> /home/osboxes/testnet/geth.log
osboxes@osboxes:~/testnet$ geth console --networkid 2080
--nodiscover --maxpeers 0 --datadir /home/osboxes/testnet 2>>
/home/osboxes/testnet/geth.log instance:
Geth/v1.8.23-stable-c9427004/linux-amd64/go1.10.4 > |
geth.log 파일 모니터링 - console1
새로운 터미널창을 하나 띄워서 tail -f라는 명령어는 이 파일을 모니터링을 하라는 명령어입니다.
osboxes@osboxes:~$ tail -f /home/osboxes/testnet/geth.log 45025340dfb939ae1b96046687b018dc202e673accbcdf4028b627214152 efcb77197fa00a1d59d2b5@127.0.0.1:30303?discport=0" |
콘솔창 재배치
모니터링하면서 작업하기 위해 콘솔창을 재배치합니다.
위쪽이 console1이고 아래쪽이 console0입니다.
마이닝 시작 - console0
다시 마이닝을 시작하도록 하겠습니다.
miner.start(1)
> miner.start(1) |
console0 창으로는 메시지가 나오지 않고 console1 창으로 메시지가 나오는 것을 확인할 수가 있습니다.
[0], [1] 이더 확인
Generating DAG in progress 상태는 아직 마이닝 준비 작업하고 있는 상태입니다.
아직 마이닝 전이라 ether를 확인해 보시면 아직 ether가 없음을 확인할 수 있습니다.
> miner.start(1) |
지금 마이닝을 하기 위한 작업들이 끝났고 지금 이렇게 마이닝(mined potential block)이 되고 있는 것을 확인할 수 있습니다. balance를 다시 확인합니다.
> eth.getBalance(eth.accounts[0]) |
Step7: 이더 송금
[0], [1] 이더 확인
> eth.getBalance(eth.accounts[0]) |
1ether 송금
송금을 해 보도록 하겠습니다.
eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value:web3.toWei(1, "ether")})
>
eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1],
value:web3.toWei(1, "ether")}) > personal.unlockAccount(eth.accounts[0],
"ether0") |
명령어를 실행하면 Transaction id가 나오고요. 이 Transaction id를 통해서 확인을 할 수가 있습니다. 송금이 되었습니다.
Step8: balance 체크
마이닝 중단 (옵션)
마이닝을 중단시키면 ether가 충분하지 않아 pedding Transaction을 확인할 수 있습니다.
minor.stop() |
[0], [1] 이더 확인
> eth.getBalance(eth.accounts[0]) |
송금을 했습니다. 각각의 balance를 [0], [1]번을 확인해 보면 아직 ether에 변화가 없는 것을 확인할 수 있습니다.
pending transaction 확인
지금 상황은 Transaction이 pending 상태인 경우입니다.
이것은 좀 전에 마이닝을 중지를 시켰기 때문에 채굴이 되지 않아서 지금 현재 pending 상태에 있는 것입니다.
그래서 pending 상태에 있는 Transaction들은 pendingTransacion 명령어를 통해서 확인할 수가 있습니다.
> eth.pendingTransactions |
현재 pending 상태에 있는 거래들을 확인할 수가 있습니다.
블록 넘버가 null이기 때문에 채굴이 안 되고 pending 상태라는 것을 알 수 있습니다.
다시 마이닝을 시작하도록 하겠습니다. (옵션)
마이닝을 중단하고 pendding transaction을 확인한 경우 확인 후 다시 마이닝을 시작합니다.
miner.start(1) |
마이닝 시작이 되어 새로운 신규 불록이 생성이 되었기 때문에 pendingTransaction이 없습니다.
> eth.pendingTransactions |
[0], [1] 이더 확인
송금을 했습니다. 각각의 balance를 [0], [1]번을 확인해 보면 1ether가 송금되어 변화가 있는 것을 확인할 수 있습니다.
>
eth.getBalance(eth.accounts[0]) |
Step9: 정보 확인
트랜잭션 정보 확인
Transaction id를 복사를 하고요. 그래서 저희가 eth.getTransaction을 해서 Transaction id를 입력을 하면 Transaction 정보를 확인할 수 있습니다.
eth.getTransaction("0xe4a4a3f443282a3a1c76d305c2d5ff19f
19368eb4bfc6da409cfa820c422fd43")
>
eth.getTransaction("0xe4a4a3f443282a3a1c76d305c2d5ff19f19368eb4bfc6da409cfa820c422fd43") |
아까는 블록 넘버(blockNumber)하고 블록 캐시가 다 null 값이었는데 지금은 블록, 이 Transaction이 포함된 블록에 대한 정보를 확인할 수가 있습니다. blockNumber 2번 블록에 대해서 포함되어 있습니다.
블록 정보 확인
eth.getBlock(2)
> eth.getBlock(2) 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0x8c16404f2ed65382234fdf83ab63c549d3155515", |
블록 넘버 2를 넣으면 마이너에 대한 지갑 아이디, 난이도, 사용된 Gas, Gas limit, 해시 값 등 이 블록이 포함하고 있는 Transaction들을 확인할 수가 있습니다.
'Security > Blockchain' 카테고리의 다른 글
P2P(개인 대 개인) 네트워크 방식 장점 (0) | 2019.05.07 |
---|---|
블록체인 저장 방식 (0) | 2019.04.29 |
이더리움 백서의 구조 (0) | 2019.04.19 |
Struct (0) | 2019.04.13 |
MetaMask 계정 생성 (0) | 2019.04.08 |