📄Single Step FHE Request

In this example, we show how to make a simple request to Sight Oracle and get the response.

Example Contract

// SPDX-License-Identifier: BSD-3-Clause-Clear

pragma solidity ^0.8.20;

import "@sight-oracle/contracts/Oracle/Types.sol";
import "@sight-oracle/contracts/Oracle/Oracle.sol";
import "@sight-oracle/contracts/Oracle/RequestBuilder.sol";
import "@sight-oracle/contracts/Oracle/ResponseResolver.sol";

contract Example {

    // Use Sight Oracle's RequestBuilder and ResponseResolver to interact with Sight Oracle
    using RequestBuilder for RequestBuilder.Request;
    using ResponseResolver for CapsulatedValue;

    Oracle public oracle;
    CapsulatedValue private _target;

    constructor(address oracle_) payable {
        oracle = Oracle(payable(oracle_));
    }

    function makeRequest() public payable {
        // Initialize new FHE computation request of a single step.
        RequestBuilder.Request memory r = RequestBuilder.newRequest(
            msg.sender,
            1,
            address(this),
            this.callback.selector, // specify the callback for Oracle
            ''
        );

        // Generate a random encrypted value and store in Sight Network
        r.rand();

        // Call request.complete() to complete build process
        r.complete();

        // Send the request via Sight FHE Oracle
        oracle.send(r);
    }

    // only Oracle can call this
    function callback(bytes32 /** requestId **/, CapsulatedValue[] memory values) public onlyOracle {
        // Decode value from Oracle callback
        CapsulatedValue memory result = values[0];

        // Keep this encrypted target value
        _target = result;
    }

    modifier onlyOracle() {
        require(msg.sender == address(oracle), "Only Oracle Can Do This");
        _;
    }

}

Explanation

  1. Contract Initialization:

    • The Example contract imports the necessary modules from the Sight Oracle package.

    • The contract uses the RequestBuilder library to construct requests and the ResponseResolver library to interpret the responses.

  2. Constructor:

    • The constructor initializes the contract with the address of the Sight Oracle. This address is used to send requests and handle callbacks.

  3. makeRequest Function:

    • This function initiates a new request to the Sight Oracle.

    • A new request is created using RequestBuilder.newRequest, specifying the sender, the number of steps in the computation, the address to which the callback should be sent, and the callback function.

    • The rand function is called to generate a random encrypted value and store it in the Sight Network.

    • The complete function finalizes the request build process.

    • The send function sends the request to the Sight Oracle.

  4. callback Function:

    • This function is called by the Sight Oracle once the computation is complete.

    • It decodes the returned value using the ResponseResolver and stores the encrypted target value in the _target variable.

  5. Modifiers:

    • onlyOracle: Ensures that only the Sight Oracle can call the callback function.

By following this guide, you can easily make a request to the Sight Oracle and handle the response securely and efficiently.

Last updated