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?
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: logX
está 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:
import "truffle/Console.sol";
import "hardhat/console.sol";
La impresión no existe en Solidity. Utilice la instrucción logX como se indica en el manual en su lugar.
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 geth
admiteweb3.js
print
no es compatible con Solidity, ya que admite el paradigma basado en eventos, pero dado que aprovecha la sintaxis de JavaScript, es bastante útil console.log
para 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.console.log(result);
para imprimir el resultado en la consola.
Mateo Schmidt
ética