Что такое оператор Solidity для печати данных на консоли?

Иногда было бы очень полезно иметь возможность видеть строковые представления значений переменных в консоли Geth, например, значений аргументов в функциях. Можно ли как-то распечатать их на консоль Geth?

Ответы (3)

Скорее всего, вы ищете 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()код вашего контракта.

С момента моего первого ответа многие проекты улучшили отладку:


Устаревший ответ

Печать не существует в Solidity. Вместо этого используйте оператор logX, как указано в руководстве.

Операторы журнала действительно низкого уровня. Лучше использовать конкретные события.
Согласитесь, что они низкоуровневые, но могут быть полезны, особенно для временной отладки, чтобы быстро увидеть значение в IDE, поддерживающих операторы журнала, и красиво распечатать их параметры.

Поскольку вы упомянули geth console, вы можете попробовать console.log()для целей отладки:

console.log ("Ваше отладочное сообщение" + debug.object);

Это возможно, потому что gethподдерживаетweb3.js

это путь js, а не солидность
@MaxLXJ printне поддерживается Solidity, поскольку он поддерживает парадигму, управляемую событиями, но, поскольку он использует синтаксис JavaScript, его очень удобно использовать console.logдля целей отладки. Но это не рекомендуется для производственного/живого использования, поскольку письменный контракт Solidity будет распределен по узлам, и использование событий будет идеальным.
Это правда, что это не солидность, но, вероятно, это то, чего хочет большинство людей: простой способ напечатать что-то в консоли. Это работает, если вы пишете console.log в консоли, а не в коде солидности.
@MarcoAltieri, не могли бы вы привести пример использования console.log в Solidity? Это похоже на серьезную ошибку в языковой реализации.
Ссылка @CᴴᴀZ дает пример вывода события на консоль.
@GeoffLangenderfer Да, и они используют console.log(result);для вывода результата на консоль.