How to integrate smart contract via web3 and infura provider

◇◆丶佛笑我妖孽 提交于 2019-12-11 07:36:33

问题


I have created a project with infura provider

const web3 = new Web3(new Web3.providers.HttpProvider('https://ropsten.infura.io/v3/07630919731949aa87a45b96c98a834d'))

And I try to call a smart-contract's method

{
  to: addressTo,
  from: addressFrom,
  data: {
    name: 'addWhitelisted',
    inputs: [{
      name: 'account',
      address: '0x57e755461FF79176fC8f14B085A8CBb4AE1fC2f6'
    }]
  }
}

Then I need to sign a transaction and call web3.eth.sendSignedTransaction?

But when i sign i get an error. Pls help. What I'm doing wrong?

  1. What kind of data it should be?

回答1:


You need use new web3.eth.Contract().methods.MyMethod().encodeABI() to generate data property of transaction for your contract

Here is example of code:

const Web3 = require('web3')
const web3 = new Web3(new Web3.providers.HttpProvider('https://ropsten.infura.io/v3/07630919731949aa87a45b96c98a834d'))

const CONTRACT_ADDRESS = '0x3312fd1a550451beeda9fd2bd6e686af9ebabe1e'
const ADDRESS_TO_WHITELIST = '0x11c652e32b8064000a4ab34af0ae24e4966e309e'
const PRIVATE_KEY = '0x331E79A051B6D2B1F34C4195E70752D59E7E4F7E55244FA67BCC9CF476141231'
const CONTRACT_ABI = [ { constant: false, inputs: [ { name: '_address', type: 'address' } ], name: 'addWhitelisted', outputs: [], payable: false, stateMutability: 'nonpayable', type: 'function' }, { constant: true, inputs: [ { name: '', type: 'address' } ], name: 'whiteList', outputs: [ { name: '', type: 'bool' } ], payable: false, stateMutability: 'view', type: 'function' } ]

const sendRawTx = rawTx =>
  new Promise((resolve, reject) =>
    web3.eth
      .sendSignedTransaction(rawTx)
      .on('transactionHash', resolve)
      .on('error', reject)
  );

(async () => {
  const { address: from } = web3.eth.accounts.privateKeyToAccount(PRIVATE_KEY)

  const contract = new web3.eth.Contract(CONTRACT_ABI, CONTRACT_ADDRESS)
  const query = await contract.methods.addWhitelisted(ADDRESS_TO_WHITELIST)

  const transaction = {
    to: CONTRACT_ADDRESS,
    from,
    value: '0',
    data: query.encodeABI(),
    gasPrice: web3.utils.toWei('20', 'gwei'),
    gas: Math.round((await query.estimateGas({ from })) * 1.5), // 1.5 coefficient, just make sure that gas amount is enough
    nonce: await web3.eth.getTransactionCount(from, 'pending')
  }

  const signed = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY)

  const hash = await sendRawTx(signed.rawTransaction)
  console.log(hash)
})()

where Contract.sol

pragma solidity ^0.5.10;

contract Test {
    mapping (address => bool) public whiteList;
    function addWhitelisted(address _address) public {
        whiteList[_address] = true;
    }
}


来源:https://stackoverflow.com/questions/57081821/how-to-integrate-smart-contract-via-web3-and-infura-provider

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!