Web3.js를 통해 이더리움 블록체인 네트워크의 노드와 통신을 구축할 수 있습니다. JSON RPC 형식으로 통신을 지원하며, 노드에 접속하는 엔드포인트는 Infura에서 HTTP, IPC, WebSocket 프로토콜을 사용해 생성할 수 있습니다. Web3.js 개념과 Infura에 대해서는 아래 글을 참고해주세요
Web3.js 사용방법
web3.js에서 지원하는 모듈로 계정 정보, 트랜잭션, 블록 정보등을 읽어오는 간단한 프로그램을 작성합니다. Geth를 돌려서 노드를 실행할 수 있지만 더욱 편리한 방법인 Infura를 통해 엔드포인트를 가져올 겁니다.
1. 간단한 잔액 확인 web3.eth.getBalance() 사용
① 프로젝트를 생성합니다.
Node 프로젝트를 초기화하고, web3 모듈을 다운로드 받습니다.
$ npm init
$ npm install web3
② getBalance.js를 생성하고 아래 코드를 입력합니다.
const Web3 = require('web3');
const rpcURL = "Infura에서 받은 엔드포인트 입력"
const account = "Ropsten 네트워크 지갑 주소"
const web3 = new Web3(rpcURL);
web3.eth.getBalance(account)
.then((balance)=>{
console.log(`${account} 지갑 잔액은 ${balance}입니다`);
})
제가 Ropsten 네트워크에서 계정 잔액을 그대로 출력합니다. 출력되는 잔액의 단위는 wei입니다. 너무 작은 단위기 때문에 ETH로 환산하기 위해서는 web3.utils 모듈을 사용합니다.
0xEFAb267AE6deb0d88576283Abc145f14DCAFDf79 지갑 잔액은 14901551301985318194입니다
web3.utils.fromWei() 모듈을 사용해서 wei로 표기되는 잔액을 ETH로 변경할 수 있습니다.
web3.eth.getBalance(account)
.then((balance)=>{
console.log(`${account} 지갑 잔액은 ${balance} wei 입니다`);
return web3.utils.fromWei(balance, 'ether');
})
.then((ethBal)=>{
console.log(`잔액을 이더 단위로 환산하면 ${ethBal}입니다`)
})
2. 트랜잭션 조회하기 [getTransaction]
트랜잭션을 조회하기 위해서는 web3.eth.getTransaction()을 사용합니다. 인자로는 트랜잭션의 해시를 받고, 트랜잭션 정보를 반환합니다.
① getTransaction.js 파일을 생성하고 아래 코드를 입력합니다. web3.eth 모듈이 반환하는 정보는 Promise 형태로 반환됩니다. 비동기로 반환되는 정보를 출력하기 위해서는 .then()으로 받아줘야 합니다. 자바스크립트 비동기에 대해 궁금하신 분들은 아래 글을 참고해주세요
const Web3 = require('web3');
const rpcURL = "Infura에서 받은 엔드포인트 입력"
const txHash = "트랜잭션의 해시 값"
const web3 = new Web3(rpcURL);
web3.eth.getTransaction(txHash)
.then((txInfo)=>{
console.log(txInfo);
})
② 코드를 실행하면 객체 형식의 트랜잭션 정보가 출력됩니다.
$ node 02_getTransaction.js
트랜잭션 객체 정보
{ accessList: [], blockHash: '0x105342fdd61cfcf6bf411b95b0c137fdd97807587e2ebce550db9d3b7b26741a', blockNumber: 12677628, chainId: '0x3', from: '0xEFAb267AE6deb0d88576283Abc145f14DCAFDf79', gas: 21000, gasPrice: '1500000007', hash: '0xc4816921218b0f8038c41e875b7399fc577d78bd2571a62132b711c7595dc814', input: '0x', maxFeePerGas: '1500000010', maxPriorityFeePerGas: '1500000000', nonce: 60, r: '0x5a41977e4c404f817ee7e5fc3368333d927373c330c1b0db35f8bfd12490a83', s: '0x4866567fad5e55be2033fb7c761b081c2b583c41a02eef3eab11b134b33143aa', to: '0x7C21d996E69207a08A581911B7BB4DF2870144d0', transactionIndex: 8, type: 2, v: '0x0', value: '1000000000000000000' }
3. 트랜잭션 조회하기 [getTransactionFromBlock]
블록 정보로 트랜잭션을 조회합니다. 입력값으로는 블록 번호 또는 블록의 해시값을 받습니다. 두번째 인자로는 블록내의 몇번째 트랜잭션을 가져올지 index를 전달받습니다.
getTransactionFromBlock(hashStringOrNumber, indexNumber [, callback])
코드를 작성합니다. 해당 블록의 idx 번째의 트랜잭션 정보를 출력합니다.
const Web3 = require('web3');
const rpcURL = "Infura에서 받은 엔드포인트 입력"
const txHash = "트랜잭션의 해시 값"
const web3 = new Web3(rpcURL);
web3.eth.getTransactionFromBlock(blockInfo, idx)
.then((res)=>{
console.log(res);
})
4. 블록 정보 조회하기 [getBlock]
이더리움 블록체인에 연결된 블록의 정보를 조회합니다. web3.eth.getBlock은 BlockNumber나 블록 해시값을 인자로 받으며, Promise 형태로 블록 정보를 반환합니다.
① getBlock.js 파일을 생성하고 아래 코드를 입력합니다.
const Web3 = require('web3');
const rpcURL = "https://ropsten.infura.io/v3/7ea55eb19f3c4887a39e9f078d47f212"
const blockNum = 12677628
const blockHash = "0x105342fdd61cfcf6bf411b95b0c137fdd97807587e2ebce550db9d3b7b26741a"
const web3 = new Web3(rpcURL);
function getBlock(blockInfo){
web3.eth.getBlock(blockInfo)
.then((res)=>{
console.log(res);
})
}
getBlock(blockHash);
② Block 정보가 출력됩니다.
Reference
'Blockchain' 카테고리의 다른 글
[Blockchain] 이더스캔 서비스 구축하기 (0) | 2022.08.04 |
---|---|
[Blockchain] getTransactionsByAccount() 함수 구현하기 (0) | 2022.08.04 |
[Blockchain] Infura 사용하는 이유 방법 (0) | 2022.07.29 |
[Blockchain] Web3란? (0) | 2022.07.29 |
[Blockchain] 탈중앙화 신원증명 DID 컨트랙트 개발 (0) | 2022.07.26 |
댓글