Проблема с Truffle Console: невозможно прочитать вызов свойства undefined

У меня проблема с базовым примером HelloWorld, закодированным в Solidity и управляемым с помощью truffle с помощью testrpc.

прочность прагмы ^0,4,2;

контракт HelloWorld { uint public balance;

функция HelloWorld() { баланс = 1000; } }

введите описание изображения здесь

>  truffle(development)>
> HelloWorld.deployed().balance.call().then(console.log) TypeError:
> Cannot read property 'call' of undefined
>     at evalmachine.<anonymous>:1:30
>     at ContextifyScript.Script.runInContext (vm.js:35:29)
>     at Object.exports.runInContext (vm.js:67:17)
>     at TruffleInterpreter.interpret (c:\Users\whha\AppData\Roaming\npm\node_modules\truffle\lib\repl.js:128:17)
>     at bound (domain.js:280:14)
>     at REPLServer.runBound [as eval] (domain.js:293:12)
>     at REPLServer.<anonymous> (repl.js:545:10)
>     at emitOne (events.js:96:13)
>     at REPLServer.emit (events.js:188:7)
>     at REPLServer.Interface._onLine (readline.js:239:10) truffle(development)>

Проблема выглядела похожей на эту тему , но она не решает мою проблему:

Контракт правильно развернут и имеет действительный документ JSON, я действительно не понимаю, почему я не могу получить доступ к его членам. Единственное, что возвращает значение, это конструктор.

truffle(development)> HelloWorld.deployed().constructor
[Function: Object]

Любые идеи??

Ответы (2)

Если вы используете последнюю версию Truffle (v.3.x), способ вызова функции или переменной в вашем контракте немного изменился в соответствии с документацией по обновлению .

В Truffle 2.0 ваши контрактные абстракции управляли вашими сетями наивным образом и добавляли такие конструкции, как «сеть по умолчанию», которые открывали возможность использования неправильных сетевых артефактов и развернутых адресов в неподходящее время. Это обеспечило причудливый и простой в использовании синтаксис — например, MyContract.deployed().myFunction(...) — но оставил ваш код открытым для ошибок. В Truffle 3.0 этот синтаксис изменен, и теперь .deployed() можно использовать, как обещание (см. пример ниже). Точно так же это позволяет легко интегрировать абстракции ваших контрактов с EIP 190, стандартом управления пакетами Ethereum. Все это к лучшему, но это означает, что вам придется внести некоторые изменения по всем направлениям.

Итак, в вашем случае, если вы хотите вызвать функцию, вы должны сделать это:

HelloWorld.deployed().then(function(instance) {
    return instance.balance.call();
}).then(function(balance) {
    console.log(balance);
});

Пожалуйста, обратитесь к последней документации для получения более подробной информации.

вы также можете использовать:

HelloWorld.deployed().then(helloworld=> console.log(helloworld.balance.call()))

или же

HelloWorld.deployed().then(function(instance){helloworld=instance})

тогда

helloworld.balance.call()
этот ответ - то, что вам нужно, чтобы получить результаты из консоли, которые они демонстрируют здесь: youtube.com/watch?v=8jI1TuEaTro @BadrBellaj, хорошая работа :)
Даже если он вызывает функцию-получатель, которую я вижу Gas usage: 27034на ganacheконсоли, не должно быть свободного вызова view()функций? @Badr Bellaj♦