Registro de eventos en Solidity

Noté el siguiente comportamiento del registro de eventos y quería confirmar si esa era la forma en que se suponía que funcionaba.

Código a continuación. La creación de funciones requiere dos campos. Puse "requerir" en su lugar para verificar si los campos son distintos de cero y no están vacíos.

Si solo ingreso un solo campo, diga "nombre", se produce un error como se esperaba. Ingresé un campo vacío para el nombre y 10 para el número como: "",10. Solidity lo lee correctamente e identifica qué elemento tiene el problema.

Sin embargo, cuando la función "crear" falla, no muestra ninguna de las declaraciones de registro anteriores dentro de la función. Esperaba que los registros se imprimieran secuencialmente y se detuvieran cuando se detectara la falla.

Tuve las siguientes preguntas:

  1. Cuando la función falla, ¿ignora todos los registros de eventos dentro de la función? Si es así, ¿hay otra forma de ejecutar esto para mostrar los registros secuencialmente con fines de depuración?
  2. Cuando "requerir" falla: ¿devuelve automáticamente el valor predeterminado (que en este caso es falso)? Esto probablemente sea bueno porque no tenemos declaraciones de devolución de escritura después de cada verificación "requerida".

-

    pragma solidity ^0.4.15;
    contract ABC {
        bytes32 public name;
        uint public number;

        event Log(string _myString);

        function ABC (bytes32 _name, uint _number) public {
            Log("Creating Object");
            name = _name;
            number = _number;

        }
    }    
    contract XYZ {

        ABC myABC;

        event Log(string _myString);

        function create(bytes32 _name, uint _number) public returns (bool isSuccess) {

            Log("checking name");
            require(_name != "");

            Log("name valid, now checking number");
            require(_number != 0);

            Log("name and number non-empty, creating a new contract");
            myABC = new ABC(_name,_number);

            Log("new contract created");

            return true;

        }
    }

Respuestas (1)

En Solidity, no hay ejecución parcial de funciones. Si en algún punto de la función se produce un error, toda la función falla y no se registrará ninguno de sus registros. En realidad, todos los registros aparecerían en el mismo objeto de transacción creado al completar la función completa, no se generarían uno por uno.

Puede pensar requireen algo similar a un if (condition) revert(), donde no se realizan cambios de estado; cuando hay un lanzamiento, todo vuelve al estado inicial (es decir, no pasa nada), excepto el gas utilizado para realizar la llamada de función.

Si desea depurar paso a paso, puede usar remixd ( https://remix.ethereum.org/ ), que tiene una herramienta de depuración paso a paso.

También se está trabajando en versiones posteriores de Solidity para hacer que los mensajes de error sean más descriptivos, por lo que en lugar de solo "código de operación no válido", las versiones posteriores pueden permitirle describir su mensaje de lanzamiento.

Gracias @carlolm por tu rápida respuesta. Ayuda a aclarar los conceptos.