NodeJS 如何在使用infura部署在ropsten testnet上的智能合约中调用setter函数

brc7rcf0  于 2022-12-12  发布在  Node.js
关注(0)|答案(1)|浏览(149)

我想通过调用智能合约函数来设置一个值。智能合约部署在Ropsten Testnet上。我使用的是Infura,而不是运行一个节点。
我已经读到Infura不支持send()。那么我有哪些选择呢?
下面是我的代码:

web3 = new Web3(new Web3.providers.HttpProvider('https://ropsten.infura.io/v3/xxxxxxxxxxxxxxxxxxxxx'));
const abi = PrinterMarketplace;
const contractAddress = '0xa498b78b32755xxxxxxxxxxxxxxf3101a1b92'        
contract = await new web3.eth.Contract(
            abi,
            contractAddress);
contract.methods.setOffer(offerprice, fileHash, client, account).send({ from: account, gas: 3000000 })

出现以下错误:
错误:返回的错误:方法eth_sendTransaction不存在/不可用

s5a0g9ez

s5a0g9ez1#

调用使用Infura作为提供者的方法需要您发送rawTransaction或在发送之前对其进行签名。
如果您使用的是truffle,则可以使用@truffle/hdwallet-provider签署交易
下面的代码片段应该可以解决您的问题

const Web3 = require('web3')
const HDWallet = require('@truffle/hdwallet-provider')

const abi = PrinterMarketplace;
const contractAddress = '0xa498b78b32755xxxxxxxxxxxxxxf3101a1b92'

const web3 = new Web3(new HDWallet('YOUR_PRIVATE_KEY', 'INFURA_ROPSTEN_URL'))

const yourContract = new web3.eth.Contract(abi, contractAddress)

yourContract.methods
    .setOffer(offerprice, fileHash, client, account)
    .send({ from: account, gas: 3000000 })
    .on('confirmation', (confirmations, receipt) => {
      console.log('CONFIRMATION');
      console.log(confirmations);
      console.log(receipt);
    })
    .on('error', (error, receipt, confirmations) => {
      console.log('ERROR');
      console.log(error);
      console.log(receipt);
      console.log(confirmations);
    })

相关问题