Overview
Concepts
High level Mechanism
add schedule using governance proposals [Permissioned - Main DAO];
remove schedule using governance proposals [Permissioned - Main DAO or Security subDAO];
every given block period execute cosmwasm msgs for added schedules.
General Mechanics
The module allows to receive MsgAddSchedule
and MsgRemoveSchedule
governance messages.
It also contains permissions:
MsgAddSchedule
can only be executed as main dao governance proposalMsgRemoveSchedule
can only be executed as main dao governance proposal OR security subdao proposal
In BeginBlocker and EndBlocker module searches for all schedules (with limit by Params.Limit
) that are ready to be executed, using last_execute_height
.
That way after the schedule was added it will be executed every period
of blocks (or more than period
if too many schedules ready to execute).
Example
Adding schedule
To add schedule we need to send governance proposal:
{
"messages": [
{
"@type": "/secret.cron.MsgAddSchedule",
"authority": "secret10d07y265gmmuvt4z0w9aw880jnsr700jc88vt0",
"name": "custom",
"period": "2",
"msgs": [
{
"contract": "secret1mfk7n6mc2cg6lznujmeckdh4x0a5ezf6hx6y8q",
"msg": "7fc422718d9ba824726425866666f408aa66c0d4413803dc064e4ec115bbbbf7{\"increment\":{}}"
}
]
}
],
"metadata": "ipfs://CID",
"deposit": "10000000000uscrt",
"title": "increase counter",
"summary": "increase counter",
"expedited": false
}
Removing schedule
To remove schedule we need to send governance proposal:
{
"messages": [
{
"@type": "/secret.cron.MsgRemoveSchedule",
"authority": "secret10d07y265gmmuvt4z0w9aw880jnsr700jc88vt0",
"name": "custom"
}
],
"metadata": "ipfs://CID",
"deposit": "10000000000uscrt",
"title": "remove schedule",
"summary": "summary",
"expedited": false
}
Key Innovation: Implicit Hash Consensus
The core breakthrough is the addition of an implicit_hash
field to Tendermint block headers, enabling deterministic consensus on scheduled execution.
Header Extension: Tendermint block headers now include implicit_hash
- a SHA-256 hash of scheduled messages for the next round.
Two-Phase Execution:
Commitment Phase (Block N-1 EndBlock): Calculate hash of scheduled messages → store in
tm-secret-enclave
Execution Phase (Block N BeginBlock): Retrieve hash → include in header → verify and execute
Architecture
The implementation requires coordinated changes across five repositories:
SecretNetwork
Application Logic
Cron scheduling, message encryption, hash calculation
tm-secret-enclave
Secure State Bridge
Cross-block hash storage
tendermint-go
Consensus Integration
Header creation with implicit hash
cosmos-sdk
ABCI Coordination
Header propagation across ABCI methods
tendermint-rs
Rust Validation
Header structure validation
Execution Flow

Message Types
The formats are as follows:
MsgAddSchedule - adds new schedule to the cron module:
message MsgAddSchedule {
string authority = 1; // Governance account address
string name = 2; // Schedule identifier
uint64 period = 3; // Execution interval in blocks
repeated MsgExecuteContract msgs = 4; // Messages to execute
}
MsgRemoveSchedule - removes schedule from the cron module:
message MsgRemoveSchedule {
string authority = 1; // Governance account address
string name = 2; // Schedule identifier to remove
}
MsgExecuteContract - contract execution specification:
message MsgExecuteContract {
string contract = 1; // Smart contract address
string msg = 2; // JSON-encoded message
}
After collecting all schedules ready for execution, we execute them in order.
For each schedule, every stored msg is complemented with more necessary fields to form wasmtypes.MsgExecuteContract
:
// wasmtypes.MsgExecuteContract
msg := types.MsgExecuteContract{
Sender: senderAddr, // Cron module account
Contract: contractAddr, // Passed with Schedule.Msgs
Msg: encryptedMsg, // Encrypted message content
SentFunds: sdk.NewCoins(), // Empty Coins
}
Then it's executed using wasmd WasmMsgServer implementation within the secure enclave.
For state to be modified, all messages in a given schedule should return successful result. If any cosmwasm msg fails to execute for any reason, all messages in a given schedule will be rolled back.
Last updated
Was this helpful?