Tasks in an AVS
Introduction
Each AVS (actively validated service) must break down its operation into individual tasks, which the operators must resolve to receive yield. A task is executed off-chain, with the result of the computation being attested by multiple operators' signatures. These signatures are subsequently aggregated before the final validation and on-chain value writing occurs.
Lifecycle of a task
Task response period: Operators submit BLS signatures for their task results. The task result itself is not submitted; this response period simply acts as a commitment for the value. This duration is created to ensure that all operators submit their responses without revealing them in plaintext.
Task statistical period: Operators submit their actual task responses (to the Aggregator entity) and the system calculates statistics such as the number of valid signatories, their vote powers, and whether such vote powers meet the threshold for a task to be considered complete.
Task challenge period: Anyone can submit a challenge in this period to dispute the result of a task or its aggregated result.
Imua-AVS-Task Lifecycle (Flow)
Each task request follows a specific process. To illustrate this, let's examine the example of summing two numbers.
The Task Generator entity transmits the two numbers to be summed to the AVS contract.
The AVS contract emits a
NewTaskCreated
event, representing the two numbers to be summed.Operators listen to the AVS contract for this event, perform the summation, sign the result using a BLS signature, and transmit their signature to the Aggregator entity.
The Aggregator consolidates these signatures into a single aggregated signature using BLS signature aggregation. Once the required threshold is met, the Aggregator submits the aggregated signature back to the AVS contract.
The AVS contract verifies that the thresholds have been met and that the aggregated signature is valid. Upon successful verification, the execution result is accepted.
Task Creation
The following parameters are utilized to create tasks and can use them to register essential information on Imuachain:
TaskContractAddress string `json:"task_contract_address"`
TaskName string `json:"name"`
Hash []byte `json:"hash"`
TaskID uint64 `json:"task_id"`
TaskResponsePeriod uint64 `json:"task_response_period"`
TaskStatisticalPeriod uint64 `json:"task_statistical_period"`
TaskChallengePeriod uint64 `json:"task_challenge_period"`
ThresholdPercentage uint64 `json:"threshold_percentage"`
StartingEpoch uint64 `json:"starting_epoch"`
OperatorAddress string `json:"operator_address"`
TaskResponseHash string `json:"task_response_hash"`
TaskResponse []byte `json:"task_response"`
BlsSignature []byte `json:"bls_signature"`
Stage string `json:"stage"`
ActualThreshold uint64 `json:"actual_threshold"`
OptInCount uint64 `json:"opt_in_count"`
SignedCount uint64 `json:"signed_count"`
NoSignedCount uint64 `json:"no_signed_count"`
ErrSignedCount uint64 `json:"err_signed_count"`
CallerAddress string `json:"caller_address"`
The function for creating a task is as follows:
/// @dev CreateTask , avs owner create a new task
/// @param sender The external address for calling this method.
/// @param name The name of the task.
/// @param hash The data supplied by the contract, usually ABI-encoded.
/// @param taskResponsePeriod The deadline for task response.
/// @param taskChallengePeriod The challenge period for the task.
/// @param thresholdPercentage The signature threshold percentage.
/// @param taskStatisticalPeriod The statistical period for the task.
function createTask(
address sender,
string memory name,
bytes calldata hash,
uint64 taskResponsePeriod,
uint64 taskChallengePeriod,
uint64 thresholdPercentage,
uint64 taskStatisticalPeriod
) external returns (bool success);
An illustrative example demonstrating task submission utilizing the aforementioned parameters is as follows:
// Example task structure provided by AVS
taskResponse := types.TaskResponse{
TaskID: 17,
NumberSum: big.NewInt(1000),
}
// Task execution results
TaskResult: 000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000003e8
ResultHash: 070d7ad3b1d9d5ac46577330e53e62e08da159f533e6c325443122a5cc670582
BlsSignature: 92ef6e20aedaaa2d7a45dc2c0ca3cd19ef91f0b497931f0db0ed7c3fff178be4bfeb02253e57b780bfce144616a633b214dac7b1750b2dee5be91bdc61bc7a0cb24dc8877ac7ae4991fe1cd7546667938c33227e3a8f6f96b94ec69db04b000f
// Command to submit task result
imuad tx avs submit-task-result \\
--bls-signature 92ef6e20aedaaa2d7a45dc2c0ca3cd19ef91f0b497931f0db0ed7c3fff178be4bfeb02253e57b780bfce144616a633b214dac7b1750b2dee5be91bdc61bc7a0cb24dc8877ac7ae4991fe1cd7546667938c33227e3a8f6f96b94ec69db04b000f \\
--stage 1 \\
--task-contract-address 0x96949787E6a209AFb4dE035754F79DC9982D3F2a \\
--task-id 17 \\
--from dev1.info \\
--home "/Users/trestin/.tmp-imuad" \\
--chain-id "imuachaintestnet_233-1" \\
--keyring-backend test \\
--fees 50000000000hua
Task status query
# Execute the following command to query the task status
# The first param is the AVS address
# The second param is the task number
# The third param is the operator address
imuad query avs SubmitTaskResult 0x96949787E6a209AFb4dE035754F79DC9982D3F2a 17 im1mq6pj6f5tafmgkk6lehew5radfq3w20g38t6j3
# Response output
Response:
BLS Signature: ad9b563bc7d986b4e39207e644b90c1286c4c0169000d4b54fce0fcb4e167b91d5b2f5e31d3428564050ca281f818f4009c58d93a775a0fc8f38cc95a6d258ec009bc283843ee98191df47f00c13b04d1e1529b24aef2d2f7a2e21718e704dd3+V8mot+Evfxm
Operator Address: im1mq6pj6f5tafmgkk6lehew5radfq3w20g38t6j3
Stage: 2
Task Contract Address: 0x96949787E6a209AFb4dE035754F79DC9982D3F2a
Task ID: 2
Task Response: eyJUYXNrSUQiOjEsIk51bWJlclN1bSI6MTAwfQ==
Task Response Hash: 0x597bd5ccb1a3a7fbd0ae6a83ece927a0ec100ac5c0a3910e2a32a90eef97ce18
Last updated