본문 바로가기
Blockchain

[Blockchain] 이더리움 Geth 사용 방법 2 (이더 송금하기)

by 개발자 염상진 2022. 7. 5.

이더 송금하기

현재 처리 대기중인 트랜잭션 목록을 조회합니다.

> eth.pendingTransactions
[]

account 1에서 account 0로 2이더를 전송합니다. 송금에는 eth.sendTransaction()을 사용합니다. 트랜잭션이 생성되면 트랝잭션 해시가 출력됩니다. 송금 후 잔액 변동이 없는 이유는 트랜잭션이 블록에 올라가지 않았기 때문입니다. 

 

 

// 잔액 존재
> eth.getBalance(eth.accounts[1])
50000000000000000000

// 2 이더를 송금합니다.
> eth.sendTransaction({
...... from:eth.accounts[1],
...... to:eth.accounts[0],
...... value:web3.toWei(2, 'ether'),
...... data:web3.toHex('send message')
...... })

// 트랜잭션 해시
"0xdf00808c0e01376c9c111a3e1b2a0f473eca50a7e90d6b7215e813a79464e06f"

// 잔액 변동 없음
> eth.getBalance(eth.accounts[0])
300000
  • from : 트랜잭션을 보내는 계정 주소
  • to : 수신자 계정 주소
  • value : 전송 금액
  • data : 전송 메시지
  • web3.toHex : 인자로 주어진 값들을 16진수로 변환합니다. 문자열은 UTF-8 문자열로 표현합니다

 

현재 처리 대기중인 트랜잭션을 확인합니다. 방금 생성한 트랜잭션이 pending 되어 있습니다. 또한 blockHash, blockNumber, transactionIndex가 모두 null로 되어 있습니다. 아직 트랜잭션이 블록에 올라가지 않았기 때문입니다.

> eth.pendingTransactions
[{
    blockHash: null,
    blockNumber: null,
    from: "0x1a9d8ca79769da4e7fd27e94f688e6438761f14a",
    gas: 21816,
    gasPrice: 1000000000,
    hash: "0xdf00808c0e01376c9c111a3e1b2a0f473eca50a7e90d6b7215e813a79464e06f",
    input: "0x73656e64206d657373616765",
    nonce: 0,
    r: "0x8ae2218ac5b5ea0ccf798572294509379292abb2bf505f1e479b9f32f87063",
    s: "0x234c82dd9206a5c527cc1e0e01cdb1e4b45dbe8ce3fd2c7231e8d110ab731bcb",
    to: "0x4d3ef63064ccc938a80791a0d80df671aceae315",
    transactionIndex: null,
    type: "0x0",
    v: "0x426b",
    value: 2000000000000000000
}]

 

채굴하기

트랜잭션을 블록에 올리기 위해서는 블록을 생성 / 검증 목적으로 채굴이 진행되어야 합니다. 난이도가 낮게 설정되어 있어 그런지 채굴이 금방됩니다. 

// coinbase를 지정하고 채굴을 시작합니다.
> miner.start(10)
null

// 현재 채굴중인지 확인합니다.
> eth.mining
true

// 채굴을 시작하면 blockNumber가 증가합니다.
> eth.blockNumber
19
> eth.blockNumber
21

// 채굴을 중단합니다.
> miner.stop()
null

 

 

채굴 후 처리 대기중인 트랜잭션을 확인하면 사라진 것을 확인할 수 있습니다.

> eth.pendingTransactions
[]

계정 0의 잔액을 확인해보면 송금이 정상적으로 된 것을 확인할 수 있습니다.

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

> web3.fromWei(eth.getBalance(eth.accounts[0]), 'ether')
2.0000000000003

 

트랜잭션 확인하기

송금시 출력되었던 트랜잭션 해시값을 가지고 트랜잭션 세부 정보를 확인할 수 있습니다. 채굴을 진행했으므로 blockHash, blockNumber, transactionIndex가 모두 채워져 있습니다. 이번 트랜잭션은 11번째 블록에 올라갔습니다.

> eth.getTransaction("0xdf00808c0e01376c9c111a3e1b2a0f473eca50a7e90d6b7215e813a79464e06f"
... )
{
  blockHash: "0x57009d022c810a496e3d346dccb6748056c00843e6e9a9cf2f1f91df8109b3cd",
  blockNumber: 11,
  from: "0x1a9d8ca79769da4e7fd27e94f688e6438761f14a",
  gas: 21816,
  gasPrice: 1000000000,
  hash: "0xdf00808c0e01376c9c111a3e1b2a0f473eca50a7e90d6b7215e813a79464e06f",
  input: "0x73656e64206d657373616765",
  nonce: 0,
  r: "0x8ae2218ac5b5ea0ccf798572294509379292abb2bf505f1e479b9f32f87063",
  s: "0x234c82dd9206a5c527cc1e0e01cdb1e4b45dbe8ce3fd2c7231e8d110ab731bcb",
  to: "0x4d3ef63064ccc938a80791a0d80df671aceae315",
  transactionIndex: 0,
  type: "0x0",
  v: "0x426b",
  value: 2000000000000000000
}

 

트랜잭션 해시 뿐만 아니라 블록 번호로도 트랜잭션을 조회할 수 있습니다.

> eth.getTransactionFromBlock(11)
{
  blockHash: "0x57009d022c810a496e3d346dccb6748056c00843e6e9a9cf2f1f91df8109b3cd",
  blockNumber: 11,
  from: "0x1a9d8ca79769da4e7fd27e94f688e6438761f14a",
  gas: 21816,
  gasPrice: 1000000000,
  hash: "0xdf00808c0e01376c9c111a3e1b2a0f473eca50a7e90d6b7215e813a79464e06f",
  input: "0x73656e64206d657373616765",
  nonce: 0,
  r: "0x8ae2218ac5b5ea0ccf798572294509379292abb2bf505f1e479b9f32f87063",
  s: "0x234c82dd9206a5c527cc1e0e01cdb1e4b45dbe8ce3fd2c7231e8d110ab731bcb",
  to: "0x4d3ef63064ccc938a80791a0d80df671aceae315",
  transactionIndex: 0,
  type: "0x0",
  v: "0x426b",
  value: 2000000000000000000
}

 

트랜잭션 뿐만 아니라 블록 정보를 조회할 수 있습니다.

> eth.getBlock(11)
{
  difficulty: 131072,
  extraData: "0xd883010a14846765746888676f312e31382e31856c696e7578",
  gasLimit: 2122649,
  gasUsed: 21816,
  hash: "0x57009d022c810a496e3d346dccb6748056c00843e6e9a9cf2f1f91df8109b3cd",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x1a9d8ca79769da4e7fd27e94f688e6438761f14a",
  mixHash: "0x8b56e0b2e00b68e668de43512e77e9ea22fd6c40654b5262aae490b824bc2741",
  nonce: "0x5eb0dfd3473e982d",
  number: 11,
  parentHash: "0x70cc16b76c203a5488077a419bda2865fd0488c162b0339c002eea3c1b8d703c",
  receiptsRoot: "0xdba3a73f21d55e0138f960ff4edf3be9dbb2be8c3dc61ca6e558899e5ebc865e",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 661,
  stateRoot: "0x929d32c889d87fbb78a836b3213d0f1069bc88bda01dbed07783be206950cb6c",
  timestamp: 1657028482,
  totalDifficulty: 1444692,
  transactions: ["0xdf00808c0e01376c9c111a3e1b2a0f473eca50a7e90d6b7215e813a79464e06f"],
  transactionsRoot: "0x68ed1573039e8348653bcf96625fe5d1a34b23a01aed06f40ebcf199d6be723e",
  uncles: []
}

 

 

 

송금 수수료

위의 케이스에서는 보내는 계정이 coinbase 였으므로, 수수료 차감이 되지 않았습니다. 채굴에 대한 보상으로 블록 생성시 새로 발급되는 암호화폐 + 거래 수수료가 지급되는데, coinbase 계정은 이미 수수료를 받으므로 본인이 낸 수수료를 본인이 받는 꼴입니다.

이를 확인하기 위해 account 0에서 account 1로 1이더를 전송합니다.

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

잔액이 분명 2 이더가 있었는데, 1이더 송금 후 잔액이 1 이하로 떨어졌습니다. 0.000021 정도가 거래 수수료(가스비)로 지불된 것입니다. 

> web3.fromWei(eth.getBalance(eth.accounts[0]), 'ether')
0.9999790000003

 

account 1의 잔액을 확인해보면 거래 수수료가 고스란히 coinbase 계정에 들어간 것을 확인할 수 있습니다.

> web3.fromWei(eth.getBalance(eth.accounts[1]), 'ether')
154.000021

 

 

 

 

[Blockchain] 이더리움 Geth 사용 방법

로컬 테스트넷에서 Geth 실행하는 방법 Geth를 로컬 테스트넷에서 실행하기 위해서는 먼저 데이터 디렉토리 + genesis.json 파일이 준비되어야 합니다. 데이터 디렉토리에서는 송수신한 블록 데이터

about-tech.tistory.com

 

 

[Blockchain] 이더리움 Geth 설치 방법(Ubuntu Docker)

Ubuntu 환경에서 이더리움 Geth 클라이언트를 실행할 수 있습니다. 우분투 환경은 Docker Hub에서 이미지를 가져와서 실행합니다. 물론 자체적으로 우분투를 메인 OS로 사용하시면 바로 Geth를 실행해

about-tech.tistory.com

 

댓글