¿Cuál es la declaración de solidez para imprimir datos en la consola?

A veces, sería muy útil poder ver representaciones de cadenas de valores de variables en la consola de Geth, como valores de argumentos en funciones. ¿Puedo de alguna manera imprimirlos en la consola Geth?

Respuestas (3)

Lo más probable es que esté buscando Eventos . No solo ayudan con la depuración, sino que también son útiles en el código de producción normal.

Los eventos se declaran como funciones, así:

event VoteCast(address voter, uint votes, bool inFavor);

Luego, en algún lugar (por ejemplo, en una función de conteo de votos):

function vote(bool inFavor) {
    var votes = shares[msg.sender];
    // ...
    emit VoteCast(msg.sender, votes, inFavor);
}

En javascript, un objeto de contrato tiene un método de evento, que se puede usar para leer eventos cuando ocurren. De hecho, puede leer eventos que sucedieron en el pasado.

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* /)

Los eventos tienen una serie de peculiaridades, que son demasiadas para entrar en detalles aquí. No obstante, son una parte integral del trabajo de dapp de alto nivel.

EDITAR: logXestá en desuso y no aparece en la documentación de Solidity 0.8+. El siguiente ejemplo solo funciona si usa Solidity hasta la versión 0.7.6 y ahora debe ser reemplazado por bibliotecas de Eventos o Solidity que permitan el uso console.log()dentro de su código de contrato.

Desde mi primera respuesta, muchos proyectos mejoraron la experiencia de depuración:


Respuesta obsoleta

La impresión no existe en Solidity. Utilice la instrucción logX como se indica en el manual en su lugar.

Las declaraciones de registro son de muy bajo nivel. Es mejor usar eventos específicos.
De acuerdo, son de bajo nivel, pero pueden ser útiles especialmente para la depuración temporal para ver rápidamente un valor en los IDE que admiten declaraciones de registro e imprimen sus parámetros.

Como mencionaste geth console, puedes probar console.log()con fines de depuración:

console.log ("Su mensaje de depuración" + debug.object);

Esto es posible porque gethadmiteweb3.js

esta es la forma js, no la solidez
@MaxLXJ printno es compatible con Solidity, ya que admite el paradigma basado en eventos, pero dado que aprovecha la sintaxis de JavaScript, es bastante útil console.logpara fines de depuración. Pero esto no se recomienda para uso en producción/en vivo, ya que el contrato escrito de Solidity se distribuirá entre los nodos, y el uso de eventos será ideal.
Es cierto que no es solidez, pero probablemente es lo que la mayoría de la gente quiere: una manera fácil de imprimir algo en la consola. Esto funciona si escribe el archivo console.log en la consola y no en el código de solidez.
@MarcoAltieri, ¿podría dar un ejemplo del uso de console.log dentro de la solidez? Esto parece una gran falla en la implementación del lenguaje.
El enlace de @CᴴᴀZ da un ejemplo para imprimir un evento en la consola
@GeoffLangenderfer Sí, y lo están usando console.log(result);para imprimir el resultado en la consola.