Взаимодействие со смартконтрактом через web3.js: Uncaught TypeError: MyContract.at не является функцией

Я пытаюсь взаимодействовать со своим смарт-контрактом, но получаю сообщение об ошибке: Uncaught TypeError: MyContract.at не является функцией

Мой код:

var web3 = require('ethereum.js');
web3.setProvider(new web3.providers.HttpProvider());

var MyContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"type":"function"}]);

var result = MyContract.at("MyContractAddress").get();
console.log(result);

Когда я запрашиваю функциональность Geth по умолчанию, я получаю правильный ответ:

var version = web3.version.api;
console.log(version);  "0.2.4"
var web3 = require('ethereum.js');ты уверен, что этого не должно бытьvar web3 = require('web3.js');

Ответы (2)

Вам нужно предоставить адрес вашего узла geth конструктору HttpProvider, чтобы ваш клиент web3 был подключен к узлу. Некоторые функции web3, такие как contract.at(), работают, только если вы подключены к узлу. Для работы web3.version.api не требуется подключение к эфириуму.

web3.setProvider(new web3.providers.HttpProvider('http://geth-node-ip:8545'));

Если вы установили адрес для HttpProvider, проверьте правильность IP-адреса и номера порта. (в качестве примера я использую 8545, так как это порт RPC по умолчанию)

Я добавляю узел, но все равно безрезультатно. Как и в моем примере выше, я могу получить версию Geth, а также получить значение transactionCount определенного адреса: var number = web3.eth.getTransactionCount("MyAddress"); console.log(число);
Я не знаю, как вы получаете экземпляр web3 из вашего файла «ethereum.js», но если я получу свой из следующего, остальная часть вашего кода будет работать для меня (при условии, что у меня есть IP-адрес geth и фактический адрес контракта заполнен).var Web3 = require('web3'); var web3 = new Web3();

Вам нужно создать экземпляр этого контракта, как описано здесь . Вы правильно создали объект контракта (подумайте о том, чтобы поместить свой ABI в отдельный файл), но затем вам нужно создать экземпляр через

var MyContract = web3.eth.contract(ABI);
var contractInstance = MyContract.at(address);

Если вы не развернули свой контракт, вы должны сделать это в первую очередь (это даст вам то, addressчто вы можете повторно использовать с этого момента:

var contractInstance = MyContract.new([contructorParam1] [, contructorParam2], {data: '0x12345...', from: myAccount, gas: 1000000});

Более полное пошаговое руководство я разместил у себя на гитхабе .

У меня все тот же результат; MyContract.at не является функцией. У него проблемы с частью ".at", пробовал и с другим контрактом. Контракт отлично работает в Geth.
Вы запускали код, который я предложил, в гете или в браузере? Попробуйте сначала в geth. Также проверьте console.log(JSON.stringify(MyContract)).
Я пробую код в своем браузере, но он работает только в консоли Geth. У меня есть связь между моим браузером и моим узлом Geth с помощью; номер переменной = web3.eth.getTransactionCount("МойАдрес"); console.log(число); Но с MyContract.at я получаю сообщение об ошибке. В качестве примера я использую простой контракт на хранение: solidity.readthedocs.io/en/latest/…
И я запускаю свой узел Geth с помощью: geth --unlock 0 --rpc --rpcport "8080". Я также могу отправить eth_sendTransaction через RPC JSON, проблема в том, что я хочу запросить и отобразить свой баланс. Я застрял на MyContract.at...
Пожалуйста, опубликуйте вывод того, что я предложил выше.
Также убедитесь, что вы используете браузер geth и she на одной и той же машине. Я думаю, что удаленный доступ отключен по умолчанию.
В моем браузере я получаю «неопределенное» с console.log(JSON.stringify(MyContract)). С Geth это работает с myContract.get()
Вот мой код abi в Geth: { abi: [{ константа: false, входы: [{...}], имя: "set", выходы: [], тип: "функция" }, { константа: true, входы : [], name: "get", outputs: [{...}], type: "function" }], address: "0x8a85848d503dfD8817157D90aA27220e3E4CFB67", transactionHash: null, allEvents: function(), get: function(), установить: функция () }
Jeroen, проверьте, что ваш ABI является массивом JS при передаче в web3.eth.contract(ABI) и не преобразован в строку. Я был в тупике этим же контрактом.at(addr) в течение нескольких дней, но только сейчас разобрался.
Решено, это была проблема с моими библиотеками web3.js. После переустановки работает.