목차
- web3란?
- 셋팅
- 클래스 및 인스턴스
- 주요 메서드를 이용한 기능 구현 테스트
1. Web3란?
- 이더리움 생태계를 구축하기 위한 함수들을 포함하고 있는 모듈들의 집합인 라이브러리
2. 셋팅
2-1. 프로젝트에 web3 추가하기
$ npm install web3
2-2. web3 인스턴스 생성 및 provider 셋팅
import Web3 from 'web3';
const web3: Web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545'));
3. Web3
3-1. web3.js 라이브러리의 메인(umbrella) 클래스
Web3.utils
Web3.version
Web3.givenProvider
Web3.providers
Web3.modules
3-2. 인스턴스
> web3.eth
> web3.shh
> web3.bzz
> web3.utils
> web3.version //"1.2.3"
- web3 정적(static) 클래스와 인스턴스의 속성 둘다에서 접근 가능한 속성
- web3.utils: 유용함 함수모음
- web3. version : 현재 패키지 버전 정보를 string으로 반환
3-3. 자주 쓰이는 인스턴스의 메서드
web3.eth.getAccounts() //노드에 의해 관리되는 계정들을 배열로 반환
web3.eth.getBlockNumber() //가장 최근 블록의 번호를 반환
web3.eth.getBalance() //주어진 주소의 잔액을 반환
web3.eth.getBlock(blockHashOrBlockNumber [, returnTransactionObjects])//블록 번호 또는 해쉬와 일치하는 블럭을 반환
web3.eth.getBlockTransactionCount(blockHashOrBlockNumber) //주어진 블럭 안에 있는 transaction의 수 반환
web3.eth.getTransaction(transactionHash [, callback]) //주어진 해시와 일치하는 transaction 반환
web3.eth.getTransactionCount(address) //계정으로부터 보내진 transaction의 수 반환
web3.eth.sendTransaction(transactionObject [, callback]) //network로 transaction 전송
web3.eth.sendSignedTransaction(signedTransactionData) //서명이 완료된 transaction 전송
web3.utils.toHex(mixed) //주어진 값을 Hex로 변환해서 hex 문자열로 반환
web3.utils.toWei(number [, unit])
wei 는 가장 작은 이더 단위이다.
화면상에는 어떤 단위로 보여지더라도 계산 시에는 반드시 wei를 사용해서 계산하도록 하자
4. 메서드를 이용한 기능 구현 테스트
import Web3 from 'web3';
const ethTx = require('ethereumjs-tx').Transaction;
describe('web3 test 코드', () => {
let web3: Web3;
let accounts: string[];
let sender: string;
let receiver: string;
let privateKey: Buffer;
let txCount: number;
it('web3 연결 test', () => {
web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545'));
});
it('latest Block 높이 가져오기', async () => {
const blockNumber: number = await web3.eth.getBlockNumber();
console.log('blockNumber: ', blockNumber); //0
});
it('전체 accounts 가져오기', async () => {
accounts = await web3.eth.getAccounts();
sender = accounts[3]; //0x4888BeEaffdB05A1e9589AE004d39Bc281c5dCB1
receiver = accounts[4]; //0x812e549eEdBc688FC6DF6FEf6488DB050D2E1CED
});
it('첫번째 계정 balance 가져오기', async () => {
const balance: any = await web3.eth.getBalance(accounts[0]);
console.log('ETH :', balance / 10 ** 18);
});
it('단위 변경 해보기', () => {
console.log(web3.utils.toWei('1', 'gwei')); //1000000000 1지웨이를 웨이로 변환
console.log(web3.utils.toWei('1', 'ether')); //1000000000000000000 1웨이를 웨이로 변환
});
it('트랜잭션 카운터 구해오기', async () => {
txCount = await web3.eth.getTransactionCount(sender);
privateKey = Buffer.from('e0746faa42aa516ef0a476dd4b6e6fd1de695f56577078f4f63ab219b7775495', 'hex');
console.log('txCount: ', txCount); //0=>hex
console.log('txCountToHex', web3.utils.toHex(txCount)); //16진수로 변경
});
it('트랜잭션 실행하기', async () => {
const txObject = {
nonce: web3.utils.toHex(txCount),
from: receiver,
to: sender,
value: web3.utils.toHex(web3.utils.toWei('1', 'ether')), //단위는 wei여야 함
gasLimit: web3.utils.toHex(6721975), //블럭당 gasLimit
gasPrice: web3.utils.toHex(web3.utils.toWei('1', 'gwei')), //단위당 가스비
data: web3.utils.toHex(''), //스마트 컨트랙트 함수 호출할 때 쓰는 부분
};
const tx = new ethTx(txObject);
console.log('tx before PrivKey: ', tx);
tx.sign(privateKey);
console.log('tx after priveKey', tx);
const serializedTx = tx.serialize();
const txHash = '';
//내용 전송
await web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'));
console.log('txHash: ', txHash);
});
it('balance 확인', async () => {
const senderBalance: any = await web3.eth.getBalance(sender);
const receiverBalance: any = await web3.eth.getBalance(receiver);
console.log("sender's balance: ", senderBalance / 10 ** 18); //100
console.log("receiver's balance: ", receiverBalance / 10 ** 18); //100
//가나쉬는 트랜잭션 발생 시 블럭을 생성해줌
});
});
'블록체인' 카테고리의 다른 글
web3로 블럭, tx, txReceipt 가져오기 (0) | 2022.07.01 |
---|---|
puppeth 명령어를 통한 genesis.json 생성하기 (0) | 2022.07.01 |
이더리움 생태계 (0) | 2022.06.27 |
transaction 생성 (0) | 2022.06.22 |
P2P 통신을 통해 노드 간 체인 주고받기[수정중] (0) | 2022.06.20 |
댓글