Всякий раз, когда я пытаюсь заключить контракт, я получаю:
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» локально.
Решение:
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
В идеале я бы обновил свой код для работы с последним пакетом, но пока доволен этим решением.
let svd = new web3.eth.Contract(abi, scAddress);
но не мог вызывать функции, всегда выдавал ошибкуcannot read property length
Добавление к ответу от @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
. Любые идеи?
Исмаэль
Гавей
MyContract = web3.eth.contract(abi).at(contractAdress)
роллотоммаси