Skip to content

Latest commit

 

History

History
71 lines (47 loc) · 4.5 KB

README.md

File metadata and controls

71 lines (47 loc) · 4.5 KB

x/fixationstore

Abstract

This document specifies the fixationstore module of Lava Protocol.

This module primarily serves as a utility for other modules in the Lava Protocol. It's not designed for direct user interaction, except for a limited set of queries intended for debugging. As such, it functions as an essential support utility within the protocol's ecosystem.

The fixationstore allows other modules to create fixation stores that manages lists of entries with versions in the store. Fixation entries may change over time, and their versions must be retained on-chain as long as they are referenced. For examples, an older version of a plan is needed as long as the subscription that uses it lives.

Contents

Concepts

Entry

A fixated entry version is identified by its index (name) and block (version). The "latest" entry version is the one with the highest block that is not greater than the current (which is retrieved from the context) block height. If an entry version is in the future (with respect to current block height), then it will become the new latest entry when its block is reached.

Reference Count

Entry versions maintain reference count (refcount) that determine their lifetime. New entry versions (appended) start with refcount 1. The refcount of the latest version is incremented using the function GetEntry(). The refcount of the latest version is decremented when a newer version is appended, or when a future version becomes in effect. References taken with the function GetEntry() can be dropped (and the refcount decremented) by using the PutEntry() function. The PutEntry() function can also be used to cancel/remove a future entry.

Stale Period

When an entry's refcount reaches 0, it remains partly visible for a predefined period of blocks (stale-period, currently defined as 240 blocks), and then becomes stale and fully invisible. During the stale-period the GetEntry() function will ignore the entry, however the FindEntry() function will find it. If the nearest-no-later (then a given block) entry is already stale, the FindEntry() function will return not-found. Stale entries eventually get cleaned up automatically.

Usage

Common fixation store functions:

  • AppendEntry() adds a new version of an entry (could be a future version).
  • ModifyEntry() updates an existing version of an entry (could be a future version).
  • GetEntry() gets the latest (up to current) version of an entry, except if in stale-period. Increases the refcount by 1.
  • HasEntry() checks for existence of a specific version of an entry.
  • FindEntry() gets the nearest-no-later version of an entry, including if in stale-period. There's no effect on the refcount.
  • FindEntry2() same as FindEntry(), and also returns the version (block) of the entry. There's no effect on the refcount.
  • ReadEntry() gets a specific entry version (stale or not).
  • PutEntry() gets the latest (up to current) version of an entry, except if in stale-period. Decreases the refcount by 1.
  • DelEntry() deletes and entry and make it invisible to GetEntry(). Calls to the FindEntry() function for a block beyond that time of deletion (at or later) would fail too. Note, DelEntry() will also discard any pending future versions of the entry.

Parameters

The fixationstore module does not contain parameters.

Queries

The fixationstore module supports the following queries:

Query Arguments What it does
all-indices store-key (string), prefix (string) Shows all entry indices of a specific fixation store
entry store-key (string), prefix (string), key (string), block (uint64) Shows a specific entry version of a specific fixation store
store-keys none Shows all timer store keys and prefixes
versions store-key (string), prefix (string), key (string) Shows all versions of a specific entry of a specific fixation store

Transactions

The fixationstore module does not support any transaction.

Proposals

The fixationstore module does not support any proposals.