Verwenden von oraclize und solidity-util - Probleme beim Aufteilen von Zeichenfolgen, die durch Leerzeichen getrennt sind

Ich lerne, Oraclize zu verwenden, um es mit random.org zu verbinden, um Zufallszahlen zu generieren.

Hier ist mein Testvertragscode:

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

}

Ich habe das obige auf http://remix.ethereum.org über Rinkeyby testnet getestet. Ich habe den Vertrag bereitgestellt und dann die update()Funktion aufgerufen und dann beide öffentlichen Felder überprüft und sie waren leer / 0:

Geben Sie hier die Bildbeschreibung ein

Was mache ich hier falsch?

Wenn ich den Teil des Codes mit der Aufteilung der Zufallszahl durch Leerzeichen herausnehme, beginnt der Rückruf zu funktionieren.

Geben Sie hier die Bildbeschreibung ein

Irgendwelche Ideen?

Antworten (1)

Ich habe eine andere solidity utils-Bibliothek + die WolframAlpha-Alpha-API verwendet, um es wie folgt zu lösen:

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

}