Как вызвать установочную функцию в смарт-контракте, который развернут в ropsten testnet с использованием infura

#javascript #node.js #ethereum #web3 #web3js

#javascript #node.js #ethereum #web3js

Вопрос:

Я хочу установить значение, вызвав функцию смарт-контракта. Смарт-контракт развернут в Ropsten Testnet. Я использую Infura вместо запуска узла.

Я уже читал, что .send() не поддерживается Infura. Итак, какие варианты у меня есть?

Вот мой код:

 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 не существует / недоступен

Ответ №1:

Вызов метода, использующего 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);
    })