Abstract


PowerLoom Protocol is a decentralized data protocol primarily aimed at serving the ever growing informational needs of users of smart contract based applications like decentralized finance, games etc. It incentivizes participating peers to reach consensus around observations of state transitions and event emissions across multiple smart contracts. By utilizing data compositions upon smaller units of data upon which consensus has been reached, it ultimately serves as a peer validated, accurate source of information on which rich data applications like dashboards, bots, aggregators, insights trackers can be built.

Fundamental concepts and components


Protocol State Basic.png

Epoch


An epoch is a span of blockheights on which the protocol peers designated as ‘snapshotters’ collect state observations and event logs, and the protocol intermediates in reaching a consensus around. In the protocol, each epoch is assigned an epochId

An epoch denotes a range of block heights on the data source blockchain, (for eg, Ethereum mainnet in case we are tracking Uniswap v2 pair contracts). This makes it easier to collect state transitions and snapshots of data on equally spaced block height intervals, as well as to support future work on other lightweight anchor proof mechanisms like Merkle proofs, ZK-proofs, etc.

The size of an epoch is configurable. Let that be referred to as size(E)

Epoch Generator


A trusted service keeps track of the head of the chain as it moves ahead, and a marker h₀ against the max block height from the last released epoch. This makes the beginning of the next epoch, h₁ = h₀ + 1

and then publishes an epoch (h₁, h₂) by sending a transaction to the protocol state smart contract deployed on the Prost Chain (anchor chain) so that h₂ - h₁ + 1 == size(E). The next epoch, therefore, is tracked from h₂ + 1.

Each such transaction emits an EpochReleased event in the EVM implementation of the protocol state.

event EpochReleased(uint256 indexed epochId, uint256 begin, uint256 end, uint256 timestamp);