¿Usando una variable en una consulta anidada cifrada de Oraclize?

Tengo la siguiente consulta de Oraclize que funciona (genera un número aleatorio entre 1 y 5, con la clave API cifrada):

oraclize_query(1, "nested", "[URL] ['json(https://api.random.org/json-rpc/1/invoke).result.random.data.0', '\\n{\"jsonrpc\":\"2.0\",\"method\":\"generateIntegers\",\"params\":{\"apiKey\":\"${[decrypt] BA3g1TNRkJ0lqv18s+v3chf2FoZEzUXuyhOUWCcoBDKrmv51clDqUvw36lLEDJizgDrCyX7GREX7YVOfctHAT/lhLiTZNQFNjw11mq/y9mJ2gXKWw+EP/13AUnvvtDcjLek7KaBsYxk2qYuKn78Nt+EAasij}\",\"n\":1,\"min\":1,\"max\":5,\"replacement\":true${[identity] \"}\"},\"id\":1${[identity] \"}\"}']");  

Si tengo una numbervariable uint, quiero poder usarla en la consulta anterior (como el valor 'máximo'). Por ¿La forma más simple de usar una variable en una consulta de Oracle? esto se hace con las funciones strConcaty uint2stren el contrato de Oracle. Conseguí que esto funcionara cuando oraclize_queryno está anidado y la clave API no está cifrada, pero parece que no puedo hacerlo funcionar con la consulta anidada anterior con la clave API cifrada.

Esto es lo que he probado:

string string1 = '\\n{\"jsonrpc\":\"2.0\",\"method\":\"generateIntegers\",\"params\":{\"apiKey\":\"${[decrypt] BA3g1TNRkJ0lqv18s+v3chf2FoZEzUXuyhOUWCcoBDKrmv51clDqUvw36lLEDJizgDrCyX7GREX7YVOfctHAT/lhLiTZNQFNjw11mq/y9mJ2gXKWw+EP/13AUnvvtDcjLek7KaBsYxk2qYuKn78Nt+EAasij}\",\"n\":1,\"min\":1,\"max\":';

uint number = 5;

string string3 = ',\"replacement\":true${[identity] \"}\"},\"id\":1${[identity] \"}\"}';

oraclize_query(1, "nested", "[URL] ['json(https://api.random.org/json-rpc/1/invoke).result.random.data.0', strConcat(string1, uint2str(number), string3)]");  

Al probar esto, estoy usando una nueva clave API cifrada cada vez.

Respuestas (1)

strConcat no debe incluirse dentro de la cadena de consulta. Es una función de Solidez. La forma correcta es la siguiente:

    string memory string1 = "[URL] ['json(https://api.random.org/json-rpc/1/invoke).result.random', '\\n{\"jsonrpc\":\"2.0\",\"method\":\"generateIntegers\",\"params\":{\"apiKey\":${[decrypt] BP/GT8fDh+lRNPRE4RWT/86Hcypys4kfapOzLwEHs56g4HrWhISOEKm+oKQy96i5rQnv2+mGbHNNTywqWslefgoRaYVFqXUB6cjEpKCK5XfZrDStmpftxmuO/Ekhqjj3cltH5BxYUO/PUIBzkpRECDTXP0ByjaM=},\"n\":1,\"min\":0,\"max\":";

    string memory string2 = uint2str(100);

    string memory string3 = ",\"replacement\":true,\"base\":10${[identity] \"}\"},\"id\":1${[identity] \"}\"}']";

    string memory query = strConcat(string1, string2, string3);

    bytes32 rngId = oraclize_query("nested", query);

Debido a la forma en que el motor descifra y analiza las cadenas, debe cifrar su clave API de la siguiente manera:

    "\"YOUR_API_KEY\""
esto funciona pero debería ser "result.random.data.0" con una consulta random.org no "result.random"