Problemas para hacer funcionar un ejemplo simple de Oracle, la devolución de llamada nunca se ejecutó

He estado tratando de implementar y probar el contrato inteligente básico "SimpleDice" proporcionado como ejemplo de Oraclize.

Tuve que ajustarlo un poco para que funcione con Solidity 0.4.2, pero tal vez me esté perdiendo algo, tal vez Oraclize esté fallando.

El contrato inteligente se puede encontrar aquí: https://testnet.etherscan.io/address/0xe1b0d1eecc126b96f94cf55e6cf525ccae4bf0d8

EDITAR: También implementé un segundo contrato en https://testnet.etherscan.io/address/0xe25229cc19b5044f7cbe0c20abf9972c77b1e36c con más equilibrio, esto corrige los saltos no válidos, sin embargo , TODAVÍA veo que no se ejecutan devoluciones de llamada

Tengo el siguiente código (nota, usingOraclize.sol es el archivo ubicado en https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.4.sol ):

pragma solidity ^0.4.2;

import "usingOraclize.sol";

contract SimpleDice is usingOraclize {
    address owner;
    mapping (bytes32 => address) bets;

    function SimpleDice(){
        owner = msg.sender;
    }

    function() payable {
        if (msg.sender != owner) throw;
    }

    function __callback(bytes32 myid, string result) {
        if (msg.sender != oraclize_cbAddress()) throw;
        if (uint(bytes(result)[0]) - 48 > 3) {
            if (bets[myid].send(2 wei)) {
                log0("winner");
            }
        }
    }

    function bet() payable {
        rollDice();
    }

    function rollDice() {
        bytes32 myid = oraclize_query("WolframAlpha", "random number between 1 and 6");
        bets[myid] = msg.sender;
    }    

    function kill(){
        if (msg.sender == owner) suicide(msg.sender);
    }
}

Este código se compila y se implementa muy bien. Sin embargo, tenga en cuenta los siguientes problemas:

1) La primera vez que llamo bet() parece funcionar bien. SIN EMBARGO , como puede ver, Oraclize nunca ejecutó lo que se suponía que debía hacer y/o nunca llamó a mi función __callback

2) Las siguientes veces que llamo apuesta, la transacción falla con un "destino de salto no válido"

3) Las llamadas posteriores cuestan mucho combustible que se pierde por completo cada vez.

¿Alguien tiene idea de qué diablos está pasando? ¡muchas gracias!

Respuestas (3)

Thomas de Oracle aquí.

El problema estaba relacionado con geth y solo se experimentó en la red de prueba de Morden (los filtros de eventos estaban todos desordenados; el problema exacto en geth aún se está investigando).

También hemos habilitado detectores de eventos basados ​​en paridad en la red de prueba; ahora se han procesado todas las consultas pendientes (incluida la suya), pido disculpas por la demora.

Sucede, ¡gracias! Es bueno saber que todavía no me estoy volviendo completamente loco ;-)
¿Podría estar pasando esto ahora mismo con la red Rinkeby? Tampoco obtengo un __callbackdesencadenante de mi contrato: \

¿Enviaste suficiente Ether con tu solicitud? ¡Los costos también se aplican a Morden!

Tuve problemas similares y tuve que enviar alrededor de 1 ETH con mi solicitud (al menos funcionó entonces, menos podría haber sido suficiente, pero 1 ETH funcionó siempre). Por supuesto, solo hice esto en Morden.

Esto puede haber cambiado desde entonces, esto debería manejarse automáticamente, si revisa las transacciones internas, verá que se envía la tarifa.

Haz que el constructor también sea pagadero. Consulte el siguiente código.

constructor() public payable{
        owner = msg.sender;
    }