pub struct Dbc {
pub id: DbcId,
pub src_tx: DbcTransaction,
pub secrets: DbcSecrets,
pub signed_spends: BTreeSet<SignedSpend>,
}
Expand description
Represents a Digital Bearer Certificate (Dbc).
A Dbc is like a check. Only the recipient can spend it.
A Dbc has a PublicAddress representing the recipient of the Dbc.
An PublicAddress consists of a PublicKey. The user who receives payments to this PublicAddress, will be holding a MainKey - a secret key, which corresponds to the PublicAddress.
The PublicAddress can be given out to multiple parties and multiple Dbcs can share the same PublicAddress.
The spentbook nodes never sees the PublicAddress. Instead, when a transaction output dbc is created for a given PublicAddress, a random derivation index is generated and used to derive a DbcId, which will be used for this new dbc.
The DbcId is a unique identifier of a Dbc. So there can only ever be one Dbc with that id, previously, now and forever. The DbcId consists of a PublicKey. To unlock the tokens of the Dbc, the corresponding DerivedKey (consists of a SecretKey) must be used. It is derived from the MainKey, in the same way as the DbcId was derived from the PublicAddress to get the DbcId.
So, there are two important pairs to conceptually be aware of. The MainKey and PublicAddress is a unique pair of a user, where the MainKey is held secret, and the PublicAddress is given to all and anyone who wishes to send tokens to you. A sender of tokens will derive the DbcId from the PublicAddress, which will identify the Dbc that holds the tokens going to the recipient. The sender does this using a derivation index. The recipient of the tokens, will use the same derivation index, to derive the DerivedKey from the MainKey. The DerivedKey and DbcId pair is the second important pair. For an outsider, there is no way to associate either the DerivedKey or the DbcId to the PublicAddress (or for that matter to the MainKey, if they were ever to see it, which they shouldn’t of course). Only by having the derivation index, which is only known to sender and recipient, can such a connection be made.
To spend or work with a Dbc, wallet software must obtain the corresponding
MainKey from the user, and then call an API function that accepts a MainKey,
eg: dbc.derivation_index(&main_key)
Fields§
§id: DbcId
The id of this Dbc. It is unique, and there can never be another Dbc with the same id. It used in SignedSpends.
src_tx: DbcTransaction
The transaction where this DBC was created.
secrets: DbcSecrets
Secret information for and about the recipient of this Dbc.
signed_spends: BTreeSet<SignedSpend>
The transaction’s input’s SignedSpends
Implementations§
source§impl Dbc
impl Dbc
pub fn public_address(&self) -> &PublicAddress
sourcepub fn derived_key(&self, main_key: &MainKey) -> Result<DerivedKey>
pub fn derived_key(&self, main_key: &MainKey) -> Result<DerivedKey>
Return DerivedKey using MainKey supplied by caller. Will return an error if the supplied MainKey does not match the Dbc PublicAddress.
sourcepub fn derivation_index(&self) -> DerivationIndex
pub fn derivation_index(&self) -> DerivationIndex
Return the derivation index that was used to derive DbcId and corresponding DerivedKey of a Dbc.
sourcepub fn fee_output(&self) -> &FeeOutput
pub fn fee_output(&self) -> &FeeOutput
Return the fee output used in the source transaction
sourcepub fn reason(&self) -> Hash
pub fn reason(&self) -> Hash
Return the reason why this Dbc was spent. Will be the default Hash (empty) if reason is none.
sourcepub fn verify(&self, main_key: &MainKey) -> Result<(), Error>
pub fn verify(&self, main_key: &MainKey) -> Result<(), Error>
Verifies that this Dbc is valid.
A Dbc recipient should call this immediately upon receipt.
important: this will verify there is a matching transaction provided for each SignedSpend, although this does not check if the Dbc has been spent. For that, one must query the spentbook nodes.
Note that the spentbook nodes cannot perform this check. Only the Dbc recipient (private key holder) can.
see TransactionVerifier::verify() for a description of verifier requirements.
Trait Implementations§
impl Eq for Dbc
impl StructuralEq for Dbc
impl StructuralPartialEq for Dbc
Auto Trait Implementations§
impl RefUnwindSafe for Dbc
impl Send for Dbc
impl Sync for Dbc
impl Unpin for Dbc
impl UnwindSafe for Dbc
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where &'a Self: for<'a> IntoIterator,
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere Self: Borrow<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> Rwhere Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere Self: AsRef<U>, U: 'a + ?Sized, R: 'a,
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere Self: AsMut<U>, U: 'a + ?Sized, R: 'a,
self
, then passes self.as_mut()
into the pipe
function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere Self: DerefMut<Target = T> + Deref, T: ?Sized,
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
.tap_ref_mut()
only in debug builds, and is erased in release
builds.