Использование oraclize и solidity-util - проблемы с разбиением строки, разделенной пробелом

Я учусь использовать Oraclize, чтобы подключить его к random.org для генерации случайных чисел.

Вот код моего тестового контракта:

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', '...');
    }

}

Я проверил это на http://remix.ethereum.org через тестовую сеть Rinkeyby. Я развернул контракт, а затем вызвал update()функцию, а затем проверил оба общедоступных поля, и они были пустыми / 0:

введите описание изображения здесь

Что я здесь делаю неправильно?

Когда я вынимаю случайное число , разделенное пробелом, часть кода, обратный вызов начинает работать.

введите описание изображения здесь

Есть идеи?

Ответы (1)

Я использовал другую библиотеку утилит Solidity + альфа-API WolframAlpha, чтобы решить ее следующим образом:

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;
    }

}