Scabbard Diesel Backed Receipt Store
Summary
This document provides information on the use of a Diesel backed receipt store in scabbard. This move away from the current implementation, a LMDB backed receipt store, is part of a larger effort to make Splinter cloud compatible.
Guide-level explanation
Migrations
Migrations for the receipt store tables run with the splinter database migrate
command. Running the receipt store migrations with this command does not require
any additional flags or options, the migrations will be run for the database
connection specified or the default if none is specified.
Scabbard
When the appropriate features are enabled the splinter daemon will create the scabbard factory with the connection URL for the Splinter data stores. The scabbard service will then create the Diesel backed receipt store using this connection.
Reference-level explanation
Migrations
The MigrateAction’s run function determines the connection type,
runs the Splinter database migrations, and then uses the same connection pool to
run the sawtooth migrations using the appropriate method,
run_sqlite_migrations or run_postgres_migrations. The receipt store tables
are then created in the same PostgreSQL or SQLite instance that contains the
database tables for the other Splinter data stores.
Scabbard
A new diesel backed receipt store is created by passing a sqlite or postgres
connection pool to the DieselReceiptStore’s new method. The PostgreSQL or
SQLite connection string passed to the ScabbardFactoryBuilder via the
with_receipt_db_url is used to create a ScabbardFactoryStorageConfig which
is used in creating the diesel backed receipt store. In scabbard the diesel
backed receipt store is created slightly differently depending on whether or not
“database-support” feature is enabled.
When “database-support” is enabled, the ScabbardFactory has a
store_factory_config field with type ScabbardFactoryStorageConfig.
ScabbardFactoryStorageConfig has variants Postgres and Sqlite
which each contain a connection pool. The connection pool is used to create a
diesel receipt store as shown below.
When “database-support” is not enabled, the ScabbardFactory has a
receipt_store_factory_config field which has the type
ScabbardFactoryStorageConfig. When “database-support” is not enabled the
definition of ScabbardFactoryStorageConfig still has the Postgres and
Sqlite variants but also includes a Lmdb variant. The connection pool from
the Sqlite or Postgres variant is used to create a new diesel receipt store
as shown below.
DieselReceiptStore’s new method also has an optional service_id argument.
Including a service ID will scope the receipt store to that specified ID. In
scabbard this ID is the combined circuit ID and service ID formatted as
circuit_id::service_id.
Arc::new(RwLock::new(DieselReceiptStore::new(pool.clone(), format!("{}::{}", circuit_id, service_id))))
Including a service ID when creating the DieselReceiptStore allows for
receipts to be isolated to a specific circuit and service, this is an important
distinction to have when a node has multiple circuits.
Prior art
The use of circuit_id and service_id to create an isolation ID for different
instances of the Diesel backed receipt store is based on the Diesel backed
commit hash store in scabbard.