Я учусь использовать 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:
Что я здесь делаю неправильно?
Когда я вынимаю случайное число , разделенное пробелом, часть кода, обратный вызов начинает работать.
Есть идеи?
Я использовал другую библиотеку утилит 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;
}
}