web3.eth.contract не является функцией при заключении контракта

Всякий раз, когда я пытаюсь заключить контракт, я получаю:

web3.eth.contract не является функцией

Я использую этот код:

const path = require('path');
const fs = require('fs');
const solc = require('solc');
const Web3 = require('web3');

const web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

// Compile the source code
let input = fs.readFileSync('./contracts/ProofOfExistence3.sol', 'utf8');
let output = solc.compile(input, 1);

let abi = JSON.parse(output.contracts[':ProofOfExistence3'].interface);
let bytecode = output.contracts[':ProofOfExistence3'].bytecode;

let gasEstimate = web3.eth.estimateGas({data: bytecode}).then(console.log);

// Contract object
let MyContract = web3.eth.contract(abi);

И если я запускаю только этот код ниже, я получаю неопределенность. Тот же код работает в браузере, но не в nodejs с официальным пакетом web3.

const Web3 = require('web3');
const web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

console.log(web3.eth.contract);

Возвращает неопределенное значение.

Любые идеи? Я запускаю «testrpc» локально.

Я думаю, это может быть связано с тем, что вы используете новую версию web3 1.0.0-beta.11. Попробуйте документацию с web3js.readthedocs.io/en/1.0/… или с предыдущей версией 0.20.0.
Может быть, если вы попробуете сMyContract = web3.eth.contract(abi).at(contractAdress)
У меня та же проблема, но я использую geth и его консоль по умолчанию, на которой запущена частная цепочка, созданная с помощью geth+puppeth. Я развертываю свой контракт, просто вставляя код web3deply из ремикса в консоль клиента (открытую geth), затем я создаю экземпляр контракта на var, используя var myContract = web3.eth.contract(ABI); на любом клиенте моей сети. Теперь я вызываю его функции, используя: myContract.at("0x9f8cedf1f93e46fac74cb9415db8bbec85f239b4").method(); Это правильная процедура? Я имею в виду, что другой, указанный в документации web3, у меня не работает, так как я возвращаю Контракт не является функцией, которую я

Ответы (7)

Решение:

MyContract = new web3.eth.Contract(abi)

Документы https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#eth-contract

При использовании версии 1.0.xвам необходимо пройти в бинарный интерфейс приложения, abiт.е. И используйте newключевое слово.

Я столкнулся с этой проблемой, когда использую web3 0.19.

Для веб3 1.0:

var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545/'));

new web3.eth.Contract(abiArray, contract_address, {from: address})
С большой буквы по контракту !

Как предложил Исмаэль, установка версии web3 на 0.20.0 в моем package.json позволила мне использовать этот код.

npm install ethereumjs-testrpc web3@0.20.1

В идеале я бы обновил свой код для работы с последним пакетом, но пока доволен этим решением.

переход на 0.20.0 также работал у меня, я мог получить экземпляр контракта с: let svd = new web3.eth.Contract(abi, scAddress);но не мог вызывать функции, всегда выдавал ошибкуcannot read property length
@Sepultura Я столкнулся с той же проблемой
Это сработало и для меня - мое использование: npm install ethereumjs-testrpc web3@0.20.1

Добавление к ответу от @David

Смартконтракт с web3 1.0.0-beta.31

В 1.0.0-beta... большая часть теперь обрабатывается с помощью промисов , поэтому вы можете сделать:

var MyContract = new web3.eth.Contract({abi}, '0x123....', {
    from: '0x456...', // default from address
    gasPrice: '20000000000' // default gas price in wei, 20 gwei in this case
});

Пример: Получить Баланс Токенов :

MyContract.methods.balanceOf('0x456...').call()
    .then(function(result){
    //the result holds your Token Balance that you can assign to a var
    var myTokenBalance = result;
    return result;
});
  • Где {abi}находится интерфейс ABI вашего контракта 0x123.....
  • Где 0x123....находится адрес вашего контракта.
  • Где 0x456....находится адрес вашей учетной записи Ethereum, в которой хранятся токены (т.е. учетной записи ETH, с которой вы хотите получить свой баланс токенов)

Примечание. Я использую провайдера IPCgeth.ipc для взаимодействия с моим узлом (поскольку я нахожусь на том же ПК, локальном хосте, поэтому больше сохранности вместо использования HTTP-запроса).

  if (typeof web3 !== 'undefined') {
    web3 = new Web3(web3.currentProvider);
  } else {
    var net = require('net');
    var web3 = new Web3('/home/yourHomeFolder/.ethereum/geth.ipc', net);
  };

Таким образом, вы больше не должны получать ошибку

web3.eth.contract не является функцией

Требуется cконтрактный капитал (здесь: web3.eth.Contract), так и должно быть

var contractAbi = new web3.eth.Contract(abi)

смотри что есть Cа не cв:web3.eth.Contract

Установка web3 версии 0.20.0 решит проблему. Установить,

npm install ethereumjs-testrpc web3@0.20.1

Я также ответил на него здесь

Вам просто нужно установить стабильную версию Web3:

npm install web3@^0.19.0 --save
Я использую эту версию и все же получаю сообщение об ошибке: contract.deploy is not a function. Любые идеи?