Crate single_use_seals
source ·Expand description
§Single-use-seals
Set of traits that allow to implement Peter’s Todd single-use seal paradigm. Information in this file partially contains extracts from Peter’s works listed in “Further reading” section.
§Single-use-seal definition
Analogous to the real-world, physical, single-use-seals used to secure shipping containers, a single-use-seal primitive is a unique object that can be closed over a message exactly once. In short, a single-use-seal is an abstract mechanism to prevent double-spends.
A single-use-seal implementation supports two fundamental operations:
Close(l,m) → w
— Close seal l over message m, producing a witnessw
.Verify(l,w,m) → bool
— Verify that the seal l was closed over messagem
.
A single-use-seal implementation is secure if it is impossible for an attacker to cause the Verify function to return true for two distinct messages m1, m2, when applied to the same seal (it is acceptable, although non-ideal, for there to exist multiple witnesses for the same seal/message pair).
Practical single-use-seal implementations will also obviously require some way of generating new single-use-seals:
Gen(p)→l
— Generate a new seal basing on some seal definition datap
.
§Terminology
Single-use-seal: a commitment to commit to some (potentially unknown) message. The first commitment (i.e. single-use-seal) must be a well-defined (i.e. fully specified and unequally identifiable in some space, like in time/place or within a given formal informational system). Closing of a single-use-seal over message: a fulfilment of the first commitment: creation of the actual commitment to some message in a form unequally defined by the seal. Witness: data produced with closing of a single use seal which are required and sufficient for an independent party to verify that the seal was indeed closed over a given message (i.e. the commitment to the message had being created according to the seal definition).
NB: It’s important to note, that while its possible to deterministically define was a given seal closed it yet may be not possible to find out if the seal is open; i.e. seal status may be either “closed over message” or “unknown”. Some specific implementations of single-use-seals may define procedure to deterministically prove that a given seal is not closed (i.e. opened), however this is not a part of the specification and we should not rely on the existence of such possibility in all cases.
§Trait structure
The module defines trait SealProtocol
that can be used for
implementation of single-use-seals with methods for seal close and
verification. A type implementing this trait operates only with messages
(which is represented by any type that implements AsRef<[u8]>
,i.e. can be
represented as a sequence of bytes) and witnesses (which is represented by
an associated type SealProtocol::Witness
). At the same time,
SealProtocol
can’t define seals by itself.
Seal protocol operates with a *seal medium *: a proof of publication medium on which the seals are defined.
The module provides two options of implementing such medium: synchronous
SealProtocol
and asynchronous SealProtocolAsync
.
§Sample implementation
Examples of implementations can be found in bp::seals
module of bp-core
crate.
§Further reading
- Peter Todd. Preventing Consensus Fraud with Commitments and Single-Use-Seals. https://petertodd.org/2016/commitments-and-single-use-seals.
- Peter Todd. Scalable Semi-Trustless Asset Transfer via Single-Use-Seals and Proof-of-Publication. 1. Single-Use-Seal Definition. https://petertodd.org/2017/scalable-single-use-seal-asset-transfer
Enums§
- Error returned by
SealProtocol
andSealProtocolAsync
functions related to work with publication id (SealProtocol::PublicationId
). Required since not all implementation ofSealProtocol
may define publication identifier, and the traits provide default implementation for these functions always returningSealMediumError::PublicationNotSupported
. If the implementation would like to provide custom implementation, it may embed standard error related toSealProtocol
operations withinSealMediumError::MediumAccessError
case; the type of MediumAccessError is defined through generic argument toSealMediumError
. - Single-use-seal status returned by
SealProtocol::get_seal_status
andSealProtocolAsync::get_seal_status
functions.
Traits§
- Adds support for the seal close operation to
SealProtocol
. - CloseSealAsync
async
Adds support for the seal close operation toSealProtocolAsync
. - Adds support to
SealProtocol
for merging seal close operation into an existing witness data (closing some other seals). - MergeCloseSealAsync
async
Adds support toSealProtocolAsync
for merging seal close operation into an existing witness data (closing some other seals). - Trait for proof-of-publication medium on which the seals are defined, closed, verified and which can be used for convenience operations related to seals:
- SealProtocolAsync
async
Asynchronous version of theSealProtocol
trait. - Seal witness which can verify seal or multiple seals.
- SealWitnessAsync
async
Async version ofSealWitness
which can verify seal or multiple seals.