No puedo encontrar una manera de iniciar sesión cuando se revierte () en remix

Esta es la primera vez que trabajo con Solidity y pronto me encontré con un problema.

Cuando una dirección no tiene suficiente saldo o no tiene la autoridad para agregar monedas, quiero registrar un error, cuando ocurren estas excepciones, el script hace lo que se supone que debe hacer, que es return. El problema es que parece que no puedo encontrar mis registros en ningún lado.

Este es el código:

pragma solidity ^0.4.0;

contract Testcoin {
    address public creator;
    mapping (address => uint) public balances;

    event Delivered(address from, address to, uint amount);
    event StringLogger(string message);

    function TestCoin() {
        creator = msg.sender;
    }

    function create(address receiver, uint amount) {
        if (msg.sender != creator){ 
            emit StringLogger('This Account is not allowed too create tokens.');
            revert();
        }
        balances[receiver] += amount;
    }

    function transfer(address receiver, uint amount) {
        if (balances[msg.sender] < amount){         
            emit StringLogger('Not enough balance');
            revert();
        }
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        emit Delivered(msg.sender, receiver, amount);
    }

}

Cuando, por ejemplo, el remitente tiene un saldo de 3000 e intenta enviar 4000 a la dirección x, recibo un registro de que la transacción se extrajo pero falló, pero la salida y los registros están vacíos.

¿Cómo podría llegar a ver los registros para poder ver exactamente lo que sucedió?

Respuestas (1)

Una respuesta en dos partes.

Primero, lo que deberíamos estar tratando de hacer. No se preocupe por los errores de captura. Esto es lo opuesto a otras plataformas y estilos en los que se considera de mala forma permitir que una parada fuerte surja sin ser detectada.

Aquí, el software inmutable significa eliminar la complejidad innecesaria. Comunicar el motivo siempre introduce una complejidad innecesaria. Una mejor práctica es fallar temprano. Fallar duro.

Esta sección

if (msg.sender != Creator){ emit StringLogger('Esta cuenta no tiene permitido crear tokens.'); revertir(); }

revert()generará un error que aparecerá en las funciones del contrato de llamada y, finalmente, en el EOA que firmó la transacción. Obtienen una transacción fallida, lo que significa que el estado no cambió (aparte del gas perdido). El evento emitfue un cambio de estado, pero, por desgracia, no sucedió debido a lo revert()que vino después.

Esto no es algo contra lo que quieras pelear.

require(msg.sender == creator);

Hecho. No hay explicación para el usuario.

Y aquí:

if (balances[msg.sender] < amount){         
  emit StringLogger('Not enough balance');
  revert();
}

Esto lo hara:

require(balances[msg.sender] >= amount)

Hay un plan para ampliar revert()para incluir una razón, y eso será una mejora bienvenida. Mientras tanto, recomendaría que el estado del contrato sea completamente detectable por los clientes y que las transacciones inaceptables se detengan sin explicación.

Espero eso ayude.

Esa fue una respuesta extremadamente útil, Rob, como alguien que recién comienza, esto lo convierte en una curva de aprendizaje bastante empinada. Vengo de Javascript, donde literalmente registro todo mientras pruebo.