블로그 아이덴티티블로그
글 개요
2019년 01월 10일 20:58다른 분야 공부/블록체인
본문

이 글은 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가 더 들어 있다.

이렇게 개인 이더리움 네트워크로 간단한 이더리움 거래를 해 보았다.

참고한 글

이번에도 많은 다른 글에서 도움을 받았다.


가장 위로