This distinctive module allows for the creation of advanced, goal-oriented queries and logical systems that can be applied to a wide range of use cases, while still maintaining the determinism and predictability of blockchain technology. It also features a collection of predefined, blockchain-specific predicates that can be used to access information about the state of the blockchain.
A program is a text that is parsed and compiled by the interpreter. A program is composed of a set of predicates, which are defined by the user and can be used to express the desired query logic.
A predicate is a statement that describes a relationship between one or more variables or constants. A predicate consists of a name followed by zero or more arguments.
Rule & Fact
A rule is a statement that describes a relationship between one or more variables or constants, similar to a predicate. However, unlike a predicate, a rule also specifies one or more conditions that must be true in order for the relationship described by the rule to hold.
A rule has the following format:
head :- body.
:- is called the "if-then" operator, and it means that the relationship described in the head of the rule
holds only if the conditions in the body are true.
grandfather(X,Y) :- father(X,Z), father(Z,Y). # X is the grandfather of Y if X is the father of Z and Z is the father of Y.
A fact is a special type of rule that has no body (with no
:- and no conditions). A fact has the following format:
father(john, mary). # john is the father of mary.
A variable is a predicate argument that is used as a placeholder for a value. It can represent any type of data, such as numbers, strings, or lists.
Variables are denoted by a name that starts with an uppercase letter, for example
father(X, mary). # ask for all X that are the father of mary.
A query is a statement used to retrieve information from the blockchain. It can be sent against a program, but this
is optional. The interpreter evaluates the query and returns the result to the caller. Queries can be submitted to a
module using the
Ask message is used to submit a query to the module. It has the following format:
Program field is optional. If it is not specified, the query is just evaluated against the current state of the
If it is specified, the query is evaluated against the program that is passed as an argument.
Program: "father(john, mary)."
Query: "father(X, mary)."
The logic module supports chain-specific predicates that can be used to query the state of the blockchain. For example,
chain_id predicate can be used to retrieve the chain ID of the current blockchain. Several other predicates are
available, such as
block_time... Please refer to the go documentation for the full list of available
chain_id(X). # ask for the chain ID.
The response is an object that contains the following fields:
height: the height of the block at which the query was evaluated.
gas_used: the amount of gas used to evaluate the query.
answer: the result of the query. It is an object that contains the following fields:
success: a boolean that indicates whether the query was successful or not. Successful means that solutions were found, i.e. the query was satisfiable.
has_more: a boolean that indicates whether there are more results to be retrieved. It's just informative since no more results can be retrieved.
variables: an array of strings that contains the names of the variables that were used in the query.
results: an array of objects that contains the results of the query. Each result is an object that contains the following fields:
substitutions: an array of objects that contains the substitutions that were made to satisfy the query. A substitution is a set of variable-value pairs that is used to replace variables with constants. A substitution is the result of unification. A substitution is used to replace variables with constants when evaluating a rule.
The performance of the logic module is closely tied to the complexity of the query and the size of the program. To optimize performance, especially in a constrained environment like the blockchain, it is important to minimize the size of the program. Keep in mind that he module uses backtracking to search for solutions, making it most effective when used for queries that are satisfiable. Indeed, if the query is not satisfiable, the module will attempt to find a solution by backtracking and searching through possible solutions for an extended period before ultimately being canceled.
Ask message incurs gas consumption, which is calculated as the sum of the gas used to evaluate each predicate during
the query evaluation process. Each predicate has a fixed gas cost that is based on its complexity.
While querying the module does not require any fees, the use of gas serves as a mechanism to limit the size and complexity of the query, ensuring optimal performance and fairness.
The logic module is a deterministic program that is executed in a sandboxed environment and does not have the ability to submit transactions or make changes to the blockchain's state. It is therefore safe to use.
To control the cpu and memory usage of the module, the module is limited by several different mechanisms:
max_gas: the maximum amount of gas that can be used to evaluate a query.
max_size: the maximum size of the program that can be evaluated.
max_result_count: the maximum number of results that can be returned by a query.
Additional limitations are being considered for the future, such as restricting the number of variables that can be utilized within a query, or limiting the depth of the backtracking algorithm.
Table of Contents
Filter defines the parameters for filtering the set of strings which can designate anything. The filter is used to whitelist or blacklist strings.
|string||repeated||whitelist specifies a list of strings that are allowed. If this field is not specified, all strings (in the context of the filter) are allowed.|
|string||repeated||blacklist specifies a list of strings that are excluded from the set of allowed strings. If a string is included in both whitelist and blacklist, it will be excluded. This means that blacklisted strings prevails over whitelisted ones. If this field is not specified, no strings are excluded.|
GasPolicy defines the policy for calculating predicate invocation costs and the resulting gas consumption. The gas policy is defined as a list of predicates and their associated unit costs, a default unit cost for predicates if not specified in the list, and a weighting factor that is applied to the unit cost of each predicate to yield.
|string||WeightingFactor is the factor that is applied to the unit cost of each predicate to yield the gas value. If not provided or set to 0, the value is set to 1.|
|string||DefaultPredicateCost is the default unit cost of a predicate when not specified in the PredicateCosts list. If not provided or set to 0, the value is set to 1.|
|PredicateCost||repeated||PredicateCosts is the list of predicates and their associated unit costs.|
Interpreter defines the various parameters for the interpreter.
|Filter||predicates_filter specifies the filter for the predicates that are allowed to be used by the interpreter. The filter is used to whitelist or blacklist predicates represented as |
|string||bootstrap specifies the initial program to run when booting the logic interpreter. If not specified, the default boot sequence will be executed.|
|Filter||virtual_files_filter specifies the filter for the virtual files that are allowed to be used by the interpreter. The filter is used to whitelist or blacklist virtual files represented as URI, for example: |
Limits defines the limits of the logic module.
|string||max_gas specifies the maximum amount of computing power, measured in "gas," that is allowed to be consumed when executing a request by the interpreter. The interpreter calculates the gas consumption based on the number and type of operations that are executed, as well as, in some cases, the complexity of the processed data. nil value remove max gas limitation.|
|string||max_size specifies the maximum size, in bytes, that is accepted for a program. nil value remove size limitation.|
|string||max_result_count specifies the maximum number of results that can be requested for a query. nil value remove max result count limitation.|
|string||max_user_output_size specifies the maximum number of bytes to keep in the user output. If the user output exceeds this size, the interpreter will overwrite the oldest bytes with the new ones to keep the size constant. nil value or 0 value means that no user output is used at all.|
Params defines all the configuration parameters of the "logic" module.
|Interpreter||Interpreter specifies the parameter for the logic interpreter.|
|Limits||Limits defines the limits of the logic module. The limits are used to prevent the interpreter from running for too long. If the interpreter runs for too long, the execution will be aborted.|
|GasPolicy||GasPolicy defines the parameters for calculating predicate invocation costs.|
PredicateCost defines the unit cost of a predicate during its invocation by the interpreter.
|string||Predicate is the name of the predicate, optionally followed by its arity (e.g. "findall/3"). If no arity is specified, the unit cost is applied to all predicates with the same name.|
|string||Cost is the unit cost of the predicate.|
GenesisState defines the logic module's genesis state.
|Params||The state parameters for the logic module.|
Answer represents the answer to a logic query.
|bool||result is the result of the query.|
|bool||has_more specifies if there are more solutions than the ones returned.|
|string||repeated||variables represent all the variables in the query.|
|Result||repeated||results represent all the results of the query.|
Result represents the result of a query.
|Substitution||repeated||substitutions represent all the substitutions made to the variables in the query to obtain the answer.|
Substitution represents a substitution made to the variables in the query to obtain the answer.
|string||variable is the name of the variable.|
|Term||term is the term that the variable is substituted with.|
Term is the representation of a piece of data and can be a constant, a variable, or an atom.
|string||name is the name of the term.|
|Term||repeated||arguments are the arguments of the term, which can be constants, variables, or atoms.|
QueryServiceAskRequest is request type for the QueryService/Ask RPC method.
|string||program is the logic program to be queried.|
|string||query is the query string to be executed.|
QueryServiceAskResponse is response type for the QueryService/Ask RPC method.
|uint64||height is the block height at which the query was executed.|
|uint64||gas_used is the amount of gas used to execute the query.|
|Answer||answer is the answer to the query.|
|string||user_output is the output of the query execution, if any. the length of the output is limited by the max_query_output_size parameter.|
QueryServiceParamsRequest is request type for the QueryService/Params RPC method.
QueryServiceParamsResponse is response type for the QueryService/Params RPC method.
|Params||params holds all the parameters of this module.|
QueryService defines the gRPC querier service.
|Method Name||Request Type||Response Type||Description||HTTP Verb||Endpoint|
|QueryServiceParamsRequest||QueryServiceParamsResponse||Params queries all parameters for the logic module.||GET||/okp4/okp4d/logic/params|
|QueryServiceAskRequest||QueryServiceAskResponse||Ask executes a logic query and returns the solutions found. Since the query is without any side-effect, the query is not executed in the context of a transaction and no fee is charged for this, but the execution is constrained by the current limits configured in the module.||GET||/okp4/okp4d/logic/ask|
MsgUpdateParams defines a Msg for updating the x/logic module parameters.
|string||authority is the address of the governance account.|
|Params||params defines the x/logic parameters to update. NOTE: All parameters must be supplied.|
MsgUpdateParamsResponse defines the response structure for executing a MsgUpdateParams message.
MsgService defines the service for the logic module. Do nothing for now as the service is without any side effects.
|Method Name||Request Type||Response Type||Description||HTTP Verb||Endpoint|
|MsgUpdateParams||MsgUpdateParamsResponse||UpdateParams defined a governance operation for updating the x/logic module parameters. The authority is hard-coded to the Cosmos SDK x/gov module account|