Вызовите методы контракта с web3 из вновь созданного аккаунта - PullRequest
0 голосов
/ 20 мая 2018

Мне нужно вызывать методы из моего контракта в Ethereum без использования MetaMask.Я использую Infura API и пытаюсь вызвать мои методы из учетной записи, недавно созданной с помощью метода web3.eth.create ().Этот метод возвращает объект, подобный этому:

{
    address: "0xb8CE9ab6943e0eCED004cG5834Hfn7d",
    privateKey: "0x348ce564d427a3311b6536bbcff9390d69395b06ed6",
    signTransaction: function(tx){...},
    sign: function(data){...},
    encrypt: function(password){...}
} 

Я также использую провайдера infura:

 const web3 = new Web3(new Web3.providers.HttpProvider(
    "https://rinkeby.infura.io/5555666777888"
  ))

Итак, когда я пытаюсь написать что-то вроде этого:

contract.methods.contribute().send({
          from: '0xb8CE9ab6943e0eCED004cG5834Hfn7d', // here I paste recently created address
          value: web3.utils.toWei("0.5", "ether")
        });

У меня есть эта ошибка:

Ошибка: адрес «от» не указан ни в указанных параметрах, ни в параметрах по умолчанию.

Как это может быть не из адресаесли я напишу это в опции from ??

PS С Metamask мое приложение работает нормально.Но когда я выхожу из MetaMask и пытаюсь создать новую учетную запись и использовать ее, у меня возникает эта проблема.

1 Ответ

0 голосов
/ 13 июня 2018

На самом деле мы не можем просто отправлять транзакции с вновь созданного адреса.Мы должны подписать эту транзакцию с нашим закрытым ключом.Например, мы можем использовать модуль ethereumjs-tx для NodeJS.

const Web3 = require('web3')
const Tx = require('ethereumjs-tx')

let web3 = new Web3(
  new Web3.providers.HttpProvider(
    "https://ropsten.infura.io/---your api key-----"
  )
)

const account = '0x46fC1600b1869b3b4F9097185...'; //Your account address
const privateKey = Buffer.from('6e4702be2aa6b2c96ca22df40a004c2c944...', 'hex');
const contractAddress = '0x2b622616e3f338266a4becb32...'; // Deployed manually
const abi = [Your ABI from contract]
const contract = new web3.eth.Contract(abi, contractAddress, {
  from: account,
  gasLimit: 3000000,
});

const contractFunction = contract.methods.createCampaign(0.1); // Here you can call your contract functions

const functionAbi = contractFunction.encodeABI();

let estimatedGas;
let nonce;

console.log("Getting gas estimate");

contractFunction.estimateGas({from: account}).then((gasAmount) => {
  estimatedGas = gasAmount.toString(16);

  console.log("Estimated gas: " + estimatedGas);

  web3.eth.getTransactionCount(account).then(_nonce => {
    nonce = _nonce.toString(16);

    console.log("Nonce: " + nonce);
    const txParams = {
      gasPrice: 100000,
      gasLimit: 3000000,
      to: contractAddress,
      data: functionAbi,
      from: account,
      nonce: '0x' + nonce
    };

    const tx = new Tx(txParams);
    tx.sign(privateKey); // Transaction Signing here

    const serializedTx = tx.serialize();

    web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex')).on('receipt', receipt => {
      console.log(receipt);
    })
  });
});

Время транзакции составляет около 20-30 секунд, поэтому вам придется немного подождать.

...