nodejs的web3进行打包发送交易,调用合约方法


使用服务器nodejs的web3进行打包发送交易,调用合约,参考连接: 使用服务器nodejs的web3进行打包发送交易,调用合约:
调用代码
var contract = new web3.eth.Contract(contractJson, contractAddress);
var transfer = contract.methods.transfer("0x...", 490);
var encodedABI = transfer.encodeABI();
// 调用
await txHandle(from, to, value, dataA, privateKey, providerAddress)
封装方法
/**
  * from 发送交易的账号地址
  * to 调用合约地址
  * value 如果需要付主币
  * encodedABI 编码后的交易信息
  * privateKey 发送交易的账号私钥
  * providerAddress 节点地址
  **/
  const txHandle = async (from, to, value, encodedABI, privateKey, providerAddress) => {
    const web3 = new Web3(providerAddress);
    // let price = await web3.eth.getGasPrice();
    return new Promise((resolve, reject) => {
      const tx = {
        from: from,
        // 执行交易的地址,可能是合约地址
        to: to,
        // gasPrice: 2,
        gas: 2000000,
        value: value,
        // 可选
        // nonce:
        // 合约的地址是根据你的账户地址和nonce值计算出来的,所以在不同网络中,如果nonce值相同,部署出的合约地址也相同
        data: encodedABI
      };
      const signPromise = web3.eth.accounts.signTransaction(tx, privateKey);
      // 由于签名后的裸交易字符串中已经编码了有关合约调用的全部信息,包括方法名、调用参数、gas价格等等,因此可以直接提交给以太坊节点广播:
      let res = false;
      signPromise.then((signedTx) => {
        const sentTx = web3.eth.sendSignedTransaction(signedTx.raw || signedTx.rawTransaction);
        sentTx.on("receipt", receipt => {
          resolve(true)
        });
        sentTx.on("error", err => {
          console.log('err txHandle == ', err);
          reject(err)
        });
      }).catch((err) => {
        console.log('signPromise err', err)
        reject(err)
      });
    })
  }