[web3.js] 거래 보내기, 컨트랙트 사용

HyeongA·2023년 6월 12일
0

Blockchain_dev

목록 보기
14/20
post-thumbnail

web3.js란? & 설치 및 기본 사용법

💻 거래 보내기 (Goerli)

1. 기본 설정 (cmd)

  • npm init
  • npm install web3
  • node
  • const {Web3} = require('web3')
  • const web3 = new Web3('API_KEY') ; Infura에서 goerli api키 발급

2. Goerli 받을 지갑 등록

// 개인키
const privatekey = 'YOUR PRIVATE KEY' 
// 개인키로 계정생성 (개인키 => 지갑주소)
const account = web3.eth.accounts.privateKeyToAccount(privatekey) 
account 								  // 계정 정보 잘 나오는지 확인
web3.eth.accounts.wallet.add(account) 	  // 해당 환경에 지갑 정보 추가 
web3.eth.defaultAccount = account.address // 기본 지갑으로 설정

🔎 defaultAccount 등록 이유
- 가스비 발생 시 등록된 지갑에서 빠져나감
- 지갑 주소로도 등록하고 default로도 설정해서 web3.js에게 어떤 지갑을 사용하면 되는지 알려줌
- defaultAccount 설정하면 from없이 거래 가능


3. 거래 보내기

// 거래(to)지갑 등록
var account2 = '돈 받을 지갑주소'
// 거래
web3.eth.sendTransaction({from : account.address, to : account2, gas : "21000", value : "10000000000000000"})
// 기본 지갑이 설정된 경우 거래 
web3.eth.sendTransaction({to : account2, gas : "21000", value : "10000000000000000"}).then(console.log)


💻 Smart Contract 사용

기본 설정은 '거래 보내기'와 동일

0. 리믹스에서 컨트랙트 배포

//사용한 컨트랙트 코드
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
contract A {
  uint public a = 1;
  uint public b = 2;
  function setA(uint _a) public {
    a = _a;
  }
  function setB(uint _b) public {
    b = _b;
  }
}

1. defaultAccount 설정 (가스비 지불할 지갑)

//지갑 등록
var privateKey = 'YOUR PRIVATE KEY'
var account = web3.eth.accounts.privateKeyToAccount(privateKey)
//defaultAccount설정
web3.eth.accounts.wallet.add(account)
web3.eth.defaultAccount = account.address

2. Contract 연결

// 사용할 컨트랙트의 abi, 컨트랙트 주소
var abi = [CONTRACT ABI]
var c_address = 'CONTRACT ADDRESS'
// 위의 2개 정보로 contract 변수 선언
var contract = new web3.eth.Contract(abi, c_address)
// 해당 컨트랙트의 모든 함수 조회
contract.methods			

3. call / sign Transaction(send)

  • call
    - contract.methods.함수이름(input 값).call().then(console.log)
    - view, pure함수 호출
    - 가스비가 발생하지 않는 함수에 사용

  • sign Transaction(send)
    : 이전 버전에서는 send가 자유롭게 사용되었으나 4버전을 넘어오며 사용이 불가능해졌다. 따라서 sendSingedTransaction을 사용하여 우회적으로 거래를 일으킨다. 우선 tx를 만들고 개인키로 서명 후 receipt로 받아와서 내역보여주는 방법이다.
//거래 생성
var tx = {from : account.address, to : c_address , gas : 300000, gasPrice : 3000000, data : contract.methods.함수이름(input 값).encodeABI()}
//거래 서명
var signPromise = web3.eth.accounts.signTransaction(tx, account.privateKey)
//서명된 거래 보내기
signPromise.then((signedTx)=> {var sentTx = web3.eth.sendSignedTransaction(signedTx.raw || signedTx.rawTransaction); sentTx.on("receipt", receipt=> {console.log(receipt)})})


➕ Ver1 설치 후 send 사용

npm init
npm install web3@1.9.0  //ver1로 설치
node
//package 가져오기
var Web3 = require('web3')	//ver1에서는 {}없음
var web3 = new Web3('INFURA_API_KEY')
//지갑주소 등록
var privateKey = 'YOUR PRIVATE KEY'
var account = web3.eth.accounts.privateKeyToAccount(privateKey)
//defaultAccount 설정
web3.eth.accounts.wallet.add(account)
web3.eth.defaultAccount = account.address
//contract 가져오기
var abi = /*[CONTRACT ABI 여기에 넣기]*/
var c_address = 'CONTRACT ADDRESS 여기에 넣기'
var contract = new web3.eth.Contract(abi,c_address)
//call함수, send함수 실행
contract.methods.a().call().then(console.log)
contract.methods.setA(123456).send({from:account.address, gas : 300000}).then(console.log)
profile
Solidity | React | Python

0개의 댓글