web3js 트랙잭션

1. 트랜잭션

1.1.트랜잭션 구성 요소

1.1.1. gasPrice

1.1.2. gas

1.1.3. nonce

Send Transaction

  1. Web3js 기본값 세팅

    import Web3 from 'web3';
    
    interface settingsTypes {
      RPC_URL: string;
      WALLET_ADDRESS: string;
      PRIVATE_KEY: string;
      ABI: string;
      CONTRACT_ADDRESS: string;
    }
    
    // 전송에 사용할 지갑 주소
    const address = settings.WALLET_ADDRESS;
    
    // 컨트랙트 abi
    const abi = require(`./ABI/${settings.ABI}`);
    
    // 컨트랙트 주소
    const contractAddress = settings.CONTRACT_ADDRESS;
    
  2. Web3 Instance 생성

    const provider = new Web3.providers.HttpProvider(settings.RPC_URL);
    const web3 = new Web3(provider);
    
  3. 지갑에 Private Key 추가 (서명에 사용)

    web3.eth.accounts.wallet.add(settings.PRIVATE_KEY);
    
  4. Contract Instance 생성

    // 위의 1번에서 가져온 Contract Address와 abi
    const CONTRACT_INSTANCE = new web3.eth.Contract(abi, contractAddress);
    
  5. Transaction Option값 설정

    5.1. GasPrice : 거래에 사용할 가스량

    // 최근에 사용한 가스 값 가져오기
    const gasPrice = await web3.eth.getGasPrice().then(currentGasPrice => {
      return web3.utils.toHex(Math.round(parseInt(currentGasPrice)));
    });
    

    5.2. gas: 최대로 사용할 가스 제한량

    // 블록체인 노드가 보낼 트랜잭션에서 사용될 예측 가스량을 반환 해준다.
    let gas: string;
    if (params) {
      gas = await CONTRACT_INSTANCE.methods[method](...params)
        .estimateGas({
          from: address,
        })
        .then((gas: any) => {
          return gas;
        })
        .catch((err: any) => {
          return err.message;
        });
    } else {
      gas = await CONTRACT_INSTANCE.methods[method]()
        .estimateGas({
          from: address,
        })
        .then((gas: any) => {
          return gas;
        })
        .catch((err: any) => {
          return err.message;
        });
    }
    

    5.3. nonce: 트랜잭션 수

    기본 값으로 nonce가 부여 되지만 이전 nonce번호가 부여된 트랜잭션이 체결 되기 전에는 같은 nonce가 부여 되기 때문에 다음과 같이 pending처리를 해줌

    const nonce = await web3.eth.getTransactionCount(address, 'pending');
    
  6. 트랜잭션 전송

    let receipt: any;
    
    if (params) {
      receipt = await CONTRACT_INSTANCE.methods[method](...params).send({
        from: address,
        gas: gas,
        gasPrice: gasPrice,
        nonce: nonce,
      });
    } else {
      receipt = await CONTRACT_INSTANCE.methods[method]().send({
        from: address,
        gas: gas,
        gasPrice: gasPrice,
        nonce: nonce,
      });
    }
    

Call Transaction

  1. Web3js 기본값 세팅

    import Web3 from 'web3';
    
    interface settingsTypes {
      RPC_URL: string;
      WALLET_ADDRESS: string;
      PRIVATE_KEY: string;
      ABI: string;
      CONTRACT_ADDRESS: string;
    }
    
    // 전송에 사용할 지갑 주소
    const address = settings.WALLET_ADDRESS;
    
    // 컨트랙트 abi
    const abi = require(`./ABI/${settings.ABI}`);
    
    // 컨트랙트 주소
    const contractAddress = settings.CONTRACT_ADDRESS;
    
  2. Web3 Instance 생성

    const provider = new Web3.providers.HttpProvider(settings.RPC_URL);
    const web3 = new Web3(provider);
    
  3. 지갑에 Private Key 추가 (서명에 사용)

    web3.eth.accounts.wallet.add(settings.PRIVATE_KEY);
    
  4. Contract Instance 생성

    // 위의 1번에서 가져온 Contract Address와 abi
    const CONTRACT_INSTANCE = new web3.eth.Contract(abi, contractAddress);
    
  5. 트랜잭션 호출

    let receipt: any;
    
    if (params) {
      receipt = await CONTRACT_INSTANCE.methods[method](...params).call({
        from: address,
      });
    } else {
      receipt = await CONTRACT_INSTANCE.methods[method]().call({
        from: address,
      });
    }