Иногда было бы очень полезно иметь возможность видеть строковые представления значений переменных в консоли Geth, например, значений аргументов в функциях. Можно ли как-то распечатать их на консоль Geth?
Скорее всего, вы ищете Events . Они не только помогают при отладке, но и полезны в обычном производственном коде.
События объявляются как функции, например:
event VoteCast(address voter, uint votes, bool inFavor);
Затем где-то (например, в функции подсчета голосов):
function vote(bool inFavor) {
var votes = shares[msg.sender];
// ...
emit VoteCast(msg.sender, votes, inFavor);
}
В javascript объект контракта имеет метод события, который можно использовать для чтения событий, когда они происходят. На самом деле, он может читать события, которые произошли в прошлом.
var voteCast = someContract.voteCast();
voteCast.watch(function(err, result) {/* some callback */});
// Alternately, to get the events all at once.
voteCast.get(function(err, result) /* some other callback* /)
События имеют ряд особенностей, которых слишком много, чтобы вдаваться в подробности здесь. Тем не менее, они являются неотъемлемой частью высокоуровневой работы с децентрализованными приложениями.
РЕДАКТИРОВАТЬ: logX
устарело и не отображается в документации Solidity 0.8+. Приведенный ниже пример работает только при использовании Solidity до версии 0.7.6 и теперь должен быть заменен библиотеками Events или Solidity, позволяющими использовать console.log()
код вашего контракта.
С момента моего первого ответа многие проекты улучшили отладку:
import "truffle/Console.sol";
import "hardhat/console.sol";
Печать не существует в Solidity. Вместо этого используйте оператор logX, как указано в руководстве.
Поскольку вы упомянули geth console
, вы можете попробовать console.log()
для целей отладки:
console.log ("Ваше отладочное сообщение" + debug.object);
Это возможно, потому что geth
поддерживаетweb3.js
print
не поддерживается Solidity, поскольку он поддерживает парадигму, управляемую событиями, но, поскольку он использует синтаксис JavaScript, его очень удобно использовать console.log
для целей отладки. Но это не рекомендуется для производственного/живого использования, поскольку письменный контракт Solidity будет распределен по узлам, и использование событий будет идеальным.console.log(result);
для вывода результата на консоль.
Мэтью Шмидт
эт