zkFP Inference

zkFP inference represents running inference on an AI or ML model in Vanna's decentralized filestore in an optimistic fashion with no proof directly generated to secure inference. However, the staking contract allows for the inference consumer to post a stake and submit a challenge to the inference within a challenge period. If challenged, the node that ran the inference generates a ZK-SNARK that acts as a fraud proof and will be validated by the nodes on the Vanna Network. On successful challenges, the inference node is slashed; on unsuccessful challenges, the challenger's stake is lost. The proof will be available on the data availability layer, which can be queried through our inference transaction explorer.

In order to run zkFP inference, you need to implement the ArbInference interface for inferCallZK.

model - The IPFS CID for the model

input - The input parameters to the inference request

function inferCallZKFP(bytes memory model, bytes memory input) external returns (bytes memory);

Below is an example of a minimal smart contract that runs zkFP inference:

ArbInference.sol
pragma solidity >=0.4.21 <0.9.0;

/// @title Infer Call
/// @notice This contract is used to run on-chain inference.
/// This custom contract will set on 0x000000000000000000000000000000000000011a since we set it in precompile.go.
interface ArbInference {
    function inferCall(bytes memory model, bytes memory input) external returns (bytes memory);
    function inferCallZK(bytes memory model, bytes memory input) external returns (bytes memory);
    function inferCallZKFP(bytes memory model, bytes memory input) external returns (bytes memory);
}
zkFPInference.sol
pragma solidity ^0.8.18;

import "contracts/ArbInference.sol";

contract zkFPInference {
    string value;

    function zkfpInfer(
        string calldata modelName,
        string calldata inputData
    ) public {
        value = string(abi.encodePacked(ArbInference(address(0x11a)).inferCallZKFP(abi.encodePacked(modelName), abi.encodePacked(inputData))));
    }
    
    function getValue() public view returns (string memory) {
        return value;
    }
}

Last updated