Offchain Services
The Flare Systems Protocol utilizes a set of off-chain services encapsulated within the Flare Systems Client. These services interact with blockchain smart contracts to support various protocols. Key components include:
- Protocol Manager Service: Handles periodic transactions (
submit1
,submit2
,submitSignatures
, and futuresubmit3
) for each voting round by querying protocol data providers. - Reward Aggregator Service: Submits the Merkle root of combined reward claims once per reward epoch.
- Signing Policy Voter Service: Signs new signing policies after they are defined, once per reward epoch.
- Voter Registration Service: Registers voters on the
VoterRegistry
contract. - Finalizer Service: Submits finalization transactions when a voter is eligible to finalize a specific sub-protocol.
- Scheduler: Coordinates transaction scheduling across services.
- Uptime Voting Client: Submits validator uptime votes once per reward epoch.
Each voter runs an independent instance of the Flare Systems Client, which manages private keys and transaction submissions, enabling participation across multiple sub-protocols.
Protocol Manager Serviceβ
The Protocol Manager Service sends the following transactions within each voting epoch:
- submit1, submit2, submit3: Data submission at scheduled times.
- submitSignatures: Submits signatures once all required data is collected.
Data Flow:
- The service queries protocol data providers via API to fetch data.
- The fetched data is processed, encoded, and sent in transaction calldata as:
where each payload includes:
tx_data = function_selector + concatenated_data
protocolId
(1 byte)votingRoundId
(4 bytes)size
(2 bytes)payload
(encoded protocol data)
API Endpoints for Protocol Data Providers:
GET /submit1/:votingRoundId/:submitAddress
GET /submit2/:votingRoundId/:submitAddress
GET /submitSignatures/:votingRoundId/:submitSignaturesAddress
GET /submit3/:votingRoundId/:submitAddress
Response Format:
{
"status": "OK",
"data": "0x1234...",
"additionalData": "0x5678..."
}
The services are voter-agnostic, requiring only votingRoundId
and submitAddress
as inputs.
Reward Aggregator Serviceβ
The Reward Aggregator Service calculates and submits the Merkle root of reward claims at the end of each reward epoch:
- Fetches reward data from protocol reward calculators using C-chain and P-chain indexers.
- Submits the final Merkle root via
signRewards
.
API for Reward Calculation:
GET /rewards/:rewardEpochId
- Response:
{
"status": "OK",
"data": "0xabc123..."
}
Signing Policy Voter Serviceβ
Monitors the SigningPolicyInitialized
event on the Relay contract:
- Signs the new policy using
signNewSigningPolicy
. - Tracks
SigningPolicySigned
events to determine if further signatures are needed.
Voter Registration Serviceβ
- Listens for
VotePowerBlockSelected
events. - Registers the voter on the
VoterRegistry
contract before theSigningPolicyInitialized
event signals the end of the registration period.
Finalizer Serviceβ
The Finalizer Service handles finalizing votes:
- Collects signatures from the
submitSignatures
transaction. - Once a sufficient weight of signatures is gathered, submits finalization data to the Relay contract.
- Prioritizes finalization during the grace period to maximize rewards.
Finalization Strategy:
- Finalizes within the grace period if eligible.
- Competes for first finalization if the grace period has expired.
Data Encoding and Payloadsβ
Data for submitSignatures
is structured as follows:
Version 0:
type
(1 byte): Message type (0 for ECDSA).message
(38 bytes):protocolId
(1 byte)votingRoundId
(4 bytes)randomQualityScore
(1 byte)merkleRoot
(32 bytes)
signature
(65 bytes): ECDSA signature components (v
,r
,s
).unsignedMessage
(optional): Additional data (e.g., revealed random number).
Version 1: Similar structure with adjusted payload format.
Data Availability and Merkle Treesβ
Each sub-protocol assembles Merkle trees using off-chain data:
- Data is obtained via the
GET /data/:votingRoundID
endpoint. - The API returns:
{
"status": "OK",
"data": [{"abiName": "StructName", "data": {...}}]
} - ABI definitions are accessible via
GET /data-abis
.
Storage and Calculation Modelβ
Data Sources:
- Events emitted by smart contracts.
- Calldata from specific contract calls.
- Immutable contract values, indexed by time.
The Flare blockchain indexer enables querying by time intervals and event types. Voters use the indexer to fetch data and perform calculations, which are then encoded into Merkle roots.
Benefits:
- Supports complex calculations beyond Solidityβs capabilities.
- Reduces storage costs by storing only Merkle roots on-chain.
Result Availability and APIsβ
Voters assemble Merkle roots for voting and can provide services to access confirmed data. This data can be exposed via APIs, allowing users to obtain calculation results with full Merkle proofs for on-chain verification.
Transaction Prioritizationβ
The Submission Smart Contract prioritizes key transactions (submit1
, submit2
, signatureDeposit
) to subsidize gas costs. Multiple sign transactions are allowed, but only one subsidized submission is permitted per voting round.