본문 바로가기
블록체인

이더리움3. web3 라이브러리

by 혀닙 2022. 6. 28.

목차

  1. web3란?
  2. 셋팅
  3. 클래스 및 인스턴스
  4. 주요 메서드를 이용한 기능 구현 테스트

 

 

 

 

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
        //가나쉬는 트랜잭션 발생 시 블럭을 생성해줌
    });
});

 

댓글