Usando oraclize y solidity-util: tengo problemas para dividir cadenas separadas por espacios

Estoy aprendiendo a usar Oraclize para conectarlo a random.org para generar números aleatorios.

Aquí está mi código de contrato de prueba:

pragma solidity ^0.4.25;

import "github.com/oraclize/ethereum-api/oraclizeAPI.sol";
import "github.com/willitscale/solidity-util/lib/Strings.sol";
import "github.com/willitscale/solidity-util/lib/Integers.sol";
import "github.com/willitscale/solidity-util/lib/Addresses.sol";

contract Oraclize is usingOraclize {

    using Strings for string;
    using Integers for uint;
    using Addresses for address;

    string public randomNumbers;
    uint[] public randomNumbersArray;

    event newOraclizeQuery(string description);
    event randomNumbersGenerated(string randomNumbers);

    constructor() public {
        update();
    }

    function __callback(bytes32, string result) public {
        if (msg.sender != oraclize_cbAddress()) revert();
        randomNumbers = result;

        string[] storage split = result.split(" ");

        for (uint i = 0; i < split.length; i++) {
            randomNumbersArray.push(parseInt(split[i]));
        }

        emit randomNumbersGenerated(randomNumbers);
    }

    function update() public payable {
        emit newOraclizeQuery("Loading new set of random numbers, standing by for the answer...");
        oraclize_query('URL', '...');
    }

}

Probé lo anterior en http://remix.ethereum.org a través de Rinkeyby testnet. Implementé el contrato y luego llamé a la update()función y luego verifiqué ambos campos públicos y estaban vacíos / 0:

ingrese la descripción de la imagen aquí

¿Qué estoy haciendo mal aquí?

Cuando elimino el número aleatorio dividido por parte del espacio del código, la devolución de llamada comienza a funcionar.

ingrese la descripción de la imagen aquí

¿Algunas ideas?

Respuestas (1)

He usado una biblioteca de utilidades de solidez diferente + WolframAlpha alpha api para resolverlo así:

pragma solidity ^0.4.25;

import "github.com/oraclize/ethereum-api/oraclizeAPI.sol";
import "github.com/Arachnid/solidity-stringutils/strings.sol";

contract OraclizeTest is usingOraclize {

    using strings for *;

    string public randomNumbers;
    bytes32 public loadNewRandomNumbersQueryId;

    event NewRandomNumbers(string _randomNumbers);

    function loadNewRandomNumbers() public payable {
        loadNewRandomNumbersQueryId = oraclize_query("WolframAlpha", "10 unique random numbers between 0 and 53");
    }

    function __callback(bytes32 _queryId, string _result) public {
        require(_queryId == loadNewRandomNumbersQueryId, "Oraclize Query Id Does Not Match");
        require(msg.sender == oraclize_cbAddress(), "Invalid Oraclize Callback Address");

        if (_queryId == loadNewRandomNumbersQueryId) {
            randomNumbers = _result;
            emit NewRandomNumbers(randomNumbers);
        }
    }

    function parseRandomNumbers() public view returns (uint[] _randomNumbersArray) {
        strings.slice memory s = randomNumbers.toSlice();
        strings.slice memory delim = ",".toSlice();
        uint[] memory parts = new uint[](s.count(delim) + 1);
        for (uint i = 0; i < parts.length; i++) {
            parts[i] = parseInt(s.split(delim).toString());
        }
        return parts;
    }

}