이 글은 Hexo 기반의 블로그에서 옮겨온 글이며, 원본 글은 2018년 7월 26일에 작성되었다.
이 글은 지난 글에 이어서 개인 이더리움 네트워크를 활용해보면서 남기는 기록이다.
시작 상태
이더리움 개인 네트워크 설정 이후로, Javascript IPC에서 현재 상황을 알아보면 다음과 같다.
> eth.accounts //등록된 계좌들
[]
> eth.mining //현재 내가 채굴중인지 여부
false
> net.peerCount //이 네트워크에서 나와 연결된 다른 피어의 수
0
계좌 만들고 채굴하기
계좌 만들기
먼저, 아래의 명령어로 계좌를 만들 수 있다. 적당한 계좌 비밀번호를 입력하면 된다.
> personal.newAccount()
Passphrase:
Repeat passphrase:
"0x2f2ae2b466b08758a29f74f5ecae6d7114b2d562"
eth.accounts
명령어로 만든 계좌가 계좌 목록에 올라갔음을 확인할 수 있다.
참고로, personal.newAccount
함수로 계좌를 만들면 geth
의 데이터 디렉토리의 keystore
디렉토리 안에 개인 키 파일이 생성된다. 앞으로 사용할 개인 키는 이 곳에서 확인할 수 있다.
계좌 잔액 확인
혹시라도 시스템 오류가 생겨 처음 만든 내 계좌에 돈이 충전되어 있을 지 모르니 확인해보자.
> eth.getBalance("0x2f2ae2b466b08758a29f74f5ecae6d7114b2d562")
0
꿈 깨자. 그럴 일 없다.
내 계좌로 채굴 시작하기
역시 돈을 벌려면 일을 해야 하는 법이다. 채굴을 시작하려면 먼저 coinbase
주소를 설정해야 하는데, 아래와 같이 할 수 있다.
> miner.setEtherbase("0x2f2ae2b466b08758a29f74f5ecae6d7114b2d562") //coinbase 설정
true
> eth.coinbase //coinbase 확인
"0x2f2ae2b466b08758a29f74f5ecae6d7114b2d562"
처음이라면 그저 eth.coinbase
라고 입력하는 것 만으로 자동으로 coinbase
를 설정할 수 있다.
이제 miner.start()
명령어를 입력하여 채굴을 해 보자.
아래와 같은 로그가 뜨면 블록이 하나 만들어 진 것이다. (실제 로그 출력은 아마 number
가 뒤죽박죽 섞여 있을 것이다.)
INFO [07-26|16:21:13.424] Commit new mining work number=76 txs=0 uncles=0 elapsed=150.49µs
INFO [07-26|16:21:13.946] Successfully sealed new block number=76 hash=320aac…7a0d4e
INFO [07-26|16:21:13.947] 🔨 mined potential block number=76 hash=320aac…7a0d4e
INFO [07-26|16:21:22.677] 🔗 block reached canonical chain number=76 hash=320aac…7a0d4e
채굴을 끝내는 것은 miner.stop()
명령어로 할 수 있다. 참고로, DAG를 만들고 있을 때 이 명령어를 입력한다면 DAG 생성 과정이 끝난 후에 완전히 채굴이 멈추게 된다. DAG의 개념에 관해서는 이 잘 정리된 글을 추천한다.
채굴을 끝낸 다음에는 나의 잔액을 eth.getBalance("0x2f2ae...")
명령어로 다시 확인해보자. 나는 250000000000000000000
이 들어와 있었다... 떼부자다...
거래(트랜잭션) 만들기
계좌 잠금 해제
이 계좌로 경제 활동을 하려면 계좌를 잠금 해제해야 하는데, 쓰려고 의도하지 않은 계좌로 행동을 해버리는 사고를 막기 위해 계좌 잠금의 기능이 있다고 한다. 아래와 같이 잠금 해제할 수 있다.
> personal.unlockAccount("0x2f2ae2b466b08758a29f74f5ecae6d7114b2d562")
Unlock account 0x2f2ae2b466b08758a29f74f5ecae6d7114b2d562
Passphrase:
true
나중에 작업이 끝나면 꼭 personal.lockAccount("0x2f2ae...")
같은 명령어로 계좌를 다시 잠구도록 하자.
코인 보내기
이 과정을 진행하기 전, 위의 계좌 만들기 부분과 같은 방법으로 계좌를 하나 더 생성했다. 이 계좌의 주소는
0xb0f3506ad5cb776bccb521a3da9ef6026394cbf9
이다.
이제 트랜잭션을 만들 차례이다. eth.sendTransaction
함수를 이용해서 트랜잭션을 만들어 보내자. 아래는 20 ether를 보내는 트랜잭션을 생성하는 예시이다.
> eth.sendTransaction(
... {
...... from : "0x2f2ae2b466b08758a29f74f5ecae6d7114b2d562",
...... to : "0xb0f3506ad5cb776bccb521a3da9ef6026394cbf9",
...... value: web3.toWei(20, "ether")
...... }
... );
INFO [07-26|17:10:42.321] Submitted transaction fullhash=0x03ab851182a5c906aee4cb6c0d0f16fedadd94837260be54deee4567b16918b1 recipient=0xb0F3506Ad5cb776BcCb521A3Da9EF6026394CbF9
"0x03ab851182a5c906aee4cb6c0d0f16fedadd94837260be54deee4567b16918b1"
여기서, value
파라미터는 wei 단위이기 때문에, web3.toWei
함수를 활용하여 20 ether를 wei 단위로 변환하였다. 또한 필요한 gas
의 양은 자동 책정된다.
결과값으로는 트랜잭션 해시 값이 나온다.
승인되지 않은 거래 확인하기
아직 다음 블록이 나오지 않아, 위에서 만든 거래는 확인받지 못했을 것이다. 이 사실을 확인해보자.
> txpool.content.pending
{
0x2F2ae2B466B08758A29f74f5ecAE6d7114b2D562: {
... // 이 글에 언급하지 않은, 테스트용 거래가 세 개가 앞서 있다.
3: {
blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
blockNumber: null,
from: "0x2f2ae2b466b08758a29f74f5ecae6d7114b2d562",
gas: "0x15f90",
gasPrice: "0x430e23400",
hash: "0x03ab851182a5c906aee4cb6c0d0f16fedadd94837260be54deee4567b16918b1",
input: "0x",
nonce: "0x3",
r: "0xb62d5de13a99b4caaf941999d5aa96bef276ff29f96b61025237fd20bbac740c",
s: "0x383b6c2e3ec23c8aa24785d291f41d40c55b13470ea6a61ccfb5d4ce35790ef4",
to: "0xb0f3506ad5cb776bccb521a3da9ef6026394cbf9",
transactionIndex: "0x0",
v: "0xe483020ed9ed1",
value: "0x1158e460913d00000"
}
}
}
역시 pending 거래 목록에 있음을 확인할 수 있다.
블록을 만들고 거래 확인하기
다시 채굴 명령어 miner.start()
로 하나 이상의 블록을 만든 이후 다시 txpool.content.pending
을 살펴보면 미승인된 거래가 없음을 확인할 수 있다.
> txpool.content.pending
{}
```m[, ]
`eth.getTransaction` 명령어로 아까 우리의 트랜잭션을 확인해보자.
```js
> eth.getTransaction("0x03ab851182a5c906aee4cb6c0d0f16fedadd94837260be54deee4567b16918b1")
{
blockHash: "0x0147af80c0ec9db07debcdc1006ce37cdec765672fca49aca0325b9267eed166",
blockNumber: 84,
from: "0x2f2ae2b466b08758a29f74f5ecae6d7114b2d562",
gas: 90000,
gasPrice: 18000000000,
hash: "0x03ab851182a5c906aee4cb6c0d0f16fedadd94837260be54deee4567b16918b1",
input: "0x",
nonce: 3,
r: "0xb62d5de13a99b4caaf941999d5aa96bef276ff29f96b61025237fd20bbac740c",
s: "0x383b6c2e3ec23c8aa24785d291f41d40c55b13470ea6a61ccfb5d4ce35790ef4",
to: "0xb0f3506ad5cb776bccb521a3da9ef6026394cbf9",
transactionIndex: 3,
v: "0xe483020ed9ed1",
value: 20000000000000000000
}
아주 잘 승인된 듯하다.
eth.getBalance
명령어로 돈을 받은 계좌의 잔액을 확인해보면 적절하게 변동하였음을 알 수 있다.
> eth.getBalance("0xb0f3506ad5cb776bccb521a3da9ef6026394cbf9")
23000000000000000000 //이 글에서 언급하지 않은 세 번의 거래로 3 ether가 더 들어 있다.
이렇게 개인 이더리움 네트워크로 간단한 이더리움 거래를 해 보았다.
참고한 글
이번에도 많은 다른 글에서 도움을 받았다.
- https://github.com/ethereum/go-ethereum/blob/master/console/bridge.go
- https://steemit.com/kr/@sangphilkim/geth 이 글에서 가장 큰 도움을 받았다.
- https://crosswave.net/?p=2785
- https://ethereum.stackexchange.com/questions/12181/how-do-you-configure-geth-to-use-coinbase