Add Interchain SPV book section (#5632)

* Add Interchain SPV book section

* hyphenate interchain

* spv -> SPV

* improve header store explanation

* networks -> platforms

* bump spin subdep versions
This commit is contained in:
Patrick Amato 2019-08-28 19:46:26 -06:00 committed by GitHub
parent 2803eb0d72
commit 5a5a6b3840
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 207 additions and 2 deletions

4
Cargo.lock generated
View File

@ -1647,7 +1647,7 @@ name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
"spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@ -2303,7 +2303,7 @@ dependencies = [
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
"protobuf 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"quick-error 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"spin 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
"spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]

View File

@ -74,6 +74,7 @@
- [Validator](validator-proposal.md)
- [Simple Payment and State Verification](simple-payment-and-state-verification.md)
- [Cross-Program Invocation](cross-program-invocation.md)
- [Inter-chain Transaction Verification](interchain-transaction-verification.md)
- [Implemented Design Proposals](implemented-proposals.md)
- [Blocktree](blocktree.md)

View File

@ -0,0 +1,204 @@
# Inter-chain Transaction Verification Program
## Problem
Inter-chain applications are not new to the digital asset ecosystem; in fact, even
the smaller centralized exchanges still categorically dwarf all single chain dapps
put together in terms of users and volume. They command massive valuations and
have spent years effectively optimizing their core products for a broad range of
end users. However, their basic operations center around mechanisms that require
their users to unilaterally trust them, typically with little to no recourse
or protection from accidental loss. This has led to the broader digital asset
ecosystem being fractured along network lines because interoperability solutions typically:
* Are technically complex to fully implement
* Create unstable network scale incentive structures
* Require consistent and high level cooperation between stakeholders
## Proposed Solution
Simple Payment Verification (SPV) is a generic term for a range of different
methodologies used by light clients on most major blockchain networks to verify
aspects of the network state without the burden of fully storing and maintaining
the chain itself. In most cases, this means relying on a form of hash tree to
supply a proof of the presence of a given transaction in a certain block by
comparing against a root hash in that blocks header or equivalent. This allows
a light client or wallet to reach a probabilistic level of certainty about
on-chain events by itself with a minimum of trust required with regard to network nodes.
Traditionally the process of assembling and validating these proofs is carried
out off chain by nodes, wallets, or other clients, but it also offers a potential
mechanism for inter-chain state verification. However, by moving the capability
to validate SPV proofs on-chain as a smart contract while leveraging the archival
properties inherent to the blockchain, it is possible to construct a system for
programmatically detecting and verifying transactions on other networks without
the involvement of any type of trusted oracle or complex multi-stage consensus
mechanism. This concept is broadly generalisable to any network with an SPV
mechanism and can even be operated bilaterally on other smart contract platforms,
opening up the possibility of cheap, fast, inter-chain transfer of value without
relying on collateral, hashlocks, or trusted intermediaries.
Opting to take advantage of well established and developmentally stable mechanisms
already common to all major blockchains allows SPV based interoperability solutions
to be dramatically simpler than orchestrated multi-stage approaches. As part of
this, they dispense with the need for widely agreed upon cross chain communication
standards and the large multi-party organizations that write them in favor of a
set of discrete contract-based services that can be easily utilized by caller
contracts through a common abstraction format. This will set the groundwork for
a broad range of dapps and contracts able to interoperate across the variegated
and every growing platform ecosystem.
## Terminology
SPV Program - Client-facing interface for the inter-chain SPV system, manages participant roles.
SPV Engine - Validates transaction proofs, subset of the SPV Program.
Client - The caller to the SPV Program, typically another solana contract.
Prover - Party who generates proofs for transactions and submits them to the SPV Program.
Transaction Proof - Created by Provers, contains a merkle proof, transaction, and blockheader reference.
Merkle Proof - Basic SPV proof that validates the presence of a transaction in a certain block.
Block Header - Represents the basic parameters and relative position of a given block.
Proof Request - An order placed by a client for verification of transaction(s) by provers.
Header Store - A data structure for storing and referencing ranges of block headers in proofs.
Client Request - Transaction from the client to the SPV Program to trigger creation of a Proof Request.
Sub-account - A Solana account owned by another contract account, without its own private key.
## Service
SPV Programs run as contracts deployed on the Solana network and maintain a type
of public marketplace for SPV proofs that allows any party to submit both requests
for proofs as well as proofs themselves for verification in response to requests.
There will be multiple SPV Program instances active at any given time, at least
one for each connected external network and potentially multiple instances per
network. SPV program instances will be relatively consistent in their high level
API and feature sets with some variation between currency platforms (Bitcoin,
Litecoin) and smart contract platforms owing to the potential for verification of
network state changes beyond simply transactions. In every case regardless of
network, the SPV Program relies on an internal component called an SPV engine to
provide stateless verification of the actual SPV proofs upon which the higher
level client facing features and api are built. The SPV engine requires a
network specific implementation, but allows easy extension of the larger
inter-chain ecosystem by any team who chooses to carry out that implementation
and drop it into the standard SPV program for deployment.
For purposes of Proof Requests, the requester is referred to as the program client,
which in most if not all cases will be another Solana Contract. The client can
choose to submit a request pertaining to a specific transaction or to include a
broader filter that can apply to any of a range of parameters of a transaction
including its inputs, outputs, and amount. For example, A client could submit a
request for any transaction sent from a given address A to address B with the
amount X after a certain time. This structure can be used in a range of
applications, such as verifying a specific intended payment in the case of an
atomic swap or detecting the movement of collateral assets for a loan.
Following submission of a Client Request, assuming that it is successfully
validated, a proof request account is created by the SPV program to track the
progress of the request. Provers use the account to specify the request they
intend to fill in the proofs they submit for validation, at which point the
SPV program validates those proofs and if successful, saves them to the account
data of the request account. Clients can monitor the status of their requests
and see any applicable transactions alongside their proofs by querying the
account data of the request account. In future iterations when supported by
Solana, this process will be simplified by contracts publishing events rather
than requiring a polling style process as described.
## Implementation
The Solana Inter-chain SPV mechanism consists of the following components and participants:
#### SPV engine
A contract deployed on Solana which statelessly verifies SPV proofs for the caller.
It takes as arguments for validation:
* An SPV proof in the correct format of the blockchain associated with the program
* Reference(s) to the relevant block headers to compare that proof against
* The necessary parameters of the transaction to verify
If the proof in question is successfully validated, the SPV program saves proof
of that verification to the request account, which can be saved by the caller to
its account data or otherwise handled as necessary. SPV programs also expose
utilities and structs used for representation and validation of headers,
transactions, hashes, etc. on a chain by chain basis.
#### SPV program
A contract deployed on Solana which coordinates and intermediates the interaction
between Clients and Provers and manages the validation of requests, headers,
proofs, etc. It is the primary point of access for Client contracts to access the
inter-chain. SPV mechanism. It offers the following core features:
* Submit Proof Request - allows client to place a request for a specific proof or set of proofs
* Cancel Proof Request - allows client to invalidate a pending request
* Fill Proof Request - used by Provers to submit for validation a proof corresponding to a given Proof Request
The SPV program maintains a publicly available listing of valid pending Proof
Requests in its account data for the benefit of the Provers, who monitor it and
enclose references to target requests with their submitted proofs.
#### Proof Request
A message sent by the Client to the SPV engine denoting a request for a proof of
a specific transaction or set of transactions. Proof Requests can either manually
specify a certain transaction by its hash or can elect to submit a filter that
matches multiple transactions or classes of transactions. For example, a filter
matching “any transaction from address xxx to address yyy” could be used to detect
payment of a debt or settlement of an inter-chain swap. Likewise, a filter matching
“any transaction from address xxx” could be used by a lending or synthetic token
minting contract to monitor and react to changes in collateralization. Proof
Requests are sent with a fee, which is disbursed by the SPV engine contract to
the appropriate Prover once a proof matching that request is validated.
#### Request Book
The public listing of valid, open Proof Requests available to provers to fill or
for clients to cancel. Roughly analogous to an orderbook in an exchange, but with
a single type of listing rather than two separate sides. It is stored in the
account data of the SPV program.
#### Proof
A proof of the presence of a given transaction in the blockchain in question.
Proofs encompass both the actual merkle proof and reference(s) to a chain of valid
sequential block headers. They are constructed and submitted by Provers in
accordance with the specifications of the publicly available Proof Requests
hosted on the request book by the SPV program. Upon Validation, they are saved
to the account data of the relevant Proof Request, which can be used by the
Client to monitor the state of the request.
#### Client
The originator of a request for a transaction proof. Clients will most often be
other contracts as parts of dapps or specific financial products like loans,
swaps, escrow, etc. The client in any given verification process cycle initially
submits a ClientRequest which communicates the parameters and fee and if
successfully validated, results in the creation of a Proof Request account by
the SPV program. The Client may also submit a CancelRequest referencing an active
Proof Request in order to denote it as invalid for purposes of proof submission.
#### Prover
The submitter of a proof that fills a Proof Request. Provers monitor the request
book of the SPV program for outstanding Proof Requests and generate matching
proofs, which they submit to the SPV program for validation. If the proof is
accepted, the fee associated with the Proof Request in question is disbursed to
the Prover. Provers typically operate as Solana Blockstreamer nodes that also
have access to a Bitcoin node, which they use for purposes of constructing proofs
and accessing block headers.
#### Header Store
An account-based data structure used to maintain block headers for the purpose
of inclusion in submitted proofs by reference to the header store account.
header stores can be maintained by independent entities, since header chain
validation is a component of the SPV program proof validation mechanism. Fees
that are paid out by Proof Requests to Provers are split between the submitter
of the merkle proof itself and the header store that is referenced in the
submitted proof. Due to the current inability to grow already allocated account
data capacity, the use case necessitates a data structure that can grow
indefinitely without rebalancing. Sub-accounts are accounts owned by the SPV
program without their own private keys that are used for storage by allocating
blockheaders to their account data. Multiple potential approaches to the
implementation of the header store system are feasible:
Store Headers in program sub-accounts indexed by Public address:
* Each sub-account holds one header and has a public key matching the blockhash
* Requires same number of account data lookups as confirmations per verification
* Limit on number of confirmations (15-20) via max transaction data ceiling
* No network-wide duplication of individual headers
Linked List of multiple sub-accounts storing headers:
* Maintain sequential index of storage accounts, many headers per storage account
* Max 2 account data lookups for >99.9% of verifications (1 for most)
* Compact sequential data address format allows any number of confirmations and fast lookups
* Facilitates network-wide header duplication inefficiencies