У меня проблема с базовым примером 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]
Любые идеи??
Если вы используете последнюю версию 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()
английский
альпер
Gas usage: 27034
наganache
консоли, не должно быть свободного вызоваview()
функций? @Badr Bellaj♦