¿Es posible usar eventos para implementar una funcionalidad similar a la de un servidor?

En la documentación y los enlaces sugeridos y esta pregunta, se menciona que los eventos están vinculados a los métodos y se activan cuando se llama a un método (a través de una transacción). Hay un ejemplo de un contrato:

contract ClientReceipt {
    event Deposit(
        address indexed _from,
        bytes32 indexed _id,
        uint _value
    );

    function deposit(bytes32 _id) {
        // Any call to this function (even deeply nested) can
        // be detected from the JavaScript API by filtering
        // for `Deposit` to be called.
        Deposit(msg.sender, _id, msg.value);
    }
}

en el que se activa un evento cada vez que se llama al método deposit() . Intenté cambiar los tipos de argumentos y escribí el siguiente contrato simplificado:

contract ClientReceipt {
    event Deposit(
        uint256 a
    );

    function deposit(uint256 a) {
        // Any call to this function (even deeply nested) can
        // be detected from the JavaScript API by filtering
        // for `Deposit` to be called.
        Deposit(a);
    }
}

pero me sale el error:

TypeError: Cannot read property 'event' of undefined

al implementar y llamar al método (en browser-solidity ).

  • ¿Por qué el evento no se dispara correctamente?
  • ¿Se puede usar un oyente como un servidor de Javascript, cada vez que se llama a un método desde el script?
  • Cuando se activa un evento en una función que cambia el estado de la función, ¿se activa después de que se haya cambiado el estado (se extrajo la transacción correspondiente)?

Editar:

El detector de eventos de Javascript:

var abi = /* abi as generated by the compiler */;
var ClientReceipt = web3.eth.contract(abi);
var clientReceipt = ClientReceipt.at(0x123 /* address */);

var event = clientReceipt.Deposit(function(error, result) {
    if (!error)
        console.log(result);
    else {
        // Based on the result call another method of the contract
        clientReceipt.callMethod({gas: 4700000});
    }
});
¿Puede agregar la parte de Javascript de su ejemplo de código?
Lo agregué. El problema es que el evento no se dispara correctamente.
El hecho de que sobrescribas la eventvariable es extraño. Sin embargo, cuando probé su código, con un cambio menor para trabajar dentro de Truffle, funcionó como se esperaba.
Lo siento, he copiado ambos ejemplos en los fragmentos de código. Funciona como se esperaba, aunque el resultado devuelto por los oyentes no está bien documentado.

Respuestas (1)

De su ejemplo de código, los eventos se activan correctamente.

Puede usar eventos en un servidor si ejecuta un NodeJs. Tal vez alguien más pueda intervenir con problemas de confiabilidad.

El evento se activa cuando se extrae el bloque. Entonces, sí, el evento se dispara después de que el estado haya cambiado.

Nota al margen. Un patrón emergente es prefijar sus eventos con Log. Así que llámalo event LogDeposit(uint a);.

El objeto en cadena devolvió:

{
    "índice de registro": 0,
    "índice de transacción": 0,
    "transacciónHash": "0xa1a1e96217d05ca3f305ea051104da6de62c0df479d680494cc3e4dc013a846d",
    "blockHash": "0x923ede06e8027f07d239980b3d1502397e81958882a06008676647ad62c18e9d",
    "número de bloque": 504,
    "dirección": "0x1c7dc63b49a32c4b6cbc9c1a0e816b574c00e2fa",
    "tipo": "minado",
    "evento": "Depósito",
    "argumentos": {
        "un": "1"
    }
}
Lo hicieron; Estaba usando la solidez del navegador cuando recibí esos errores, pero en una red de prueba privada usando gethellos se disparan.