cosmos-sdk/docs/quark/glossary.md

84 lines
3.7 KiB
Markdown
Raw Normal View History

2017-07-14 09:01:54 -07:00
# Glossary
This defines many of the terms that are used in the other documents. If there
is every a concept that seems unclear, check here.
## Transaction
A transaction is a packet of binary data that contains all information to
validate and perform an action on the blockchain. The only other data that
it interacts with is the current state of the chain (kv store), and it must
have a deterministic action. The transaction is the main piece of one request.
We currently make heavy use of go-wire and go-data to provide automatic binary
and json encodings (and decodings) for objects, even when they embed many
interfaces inside. There is one public `TxMapper` in the basecoin root package,
and all modules can register their own transaction types there. This allows us
to deserialize the entire tx in one location (even with types defined in other
repos), to easily embed an arbitrary Tx inside another without specifying
the specific type, and provide an automatic json representation to provide to
users (or apps) to inspect the chain.
## Context
As the request passes through the system, it can pick up information, that must
be carried along with it. Like the authorized it has received from another
middleware, or the block height it runs at. This is all deterministic
information from the context in which the request runs (based on the tx and
the block it was included in) and can be used to validate the tx.
## Data Store
To be able to provide proofs to tendermint, we keep all data in one key-value
store, indexed with a merkle tree. This allows us to easily provide a root
hash and proofs for queries without requiring complex logic inside each
module. Standarizing this also allows powerful light-client tooling as it knows
how to verify all data in the store.
The downside is there is one quite simple interface that the application has
to `Get` and `Set` data. There is not even a range query. Although there are
some data structures like queues and range queries that are also in the `state`
package to provide higher-level functionality in a standard format.
## Isolation
One of the main arguments for blockchain is security. So while we encourage
the use of third-party modules, we must be vigilant against security holes.
If you use the `stack` package, it will provide two different types of
sandboxing for you.
The first step, is that when `DeliverTx` is called on a module, it is never
given the entire data store, but rather only its own prefixed section. This
is achieved by prefixing all keys transparently with `<module name> + 0x0`,
using the null byte as a separator. Since module name must be a string, no
clever naming scheme can lead to a collision. Inside the module, we can write
anywhere we want, without worry that we have to touch some data that is not ours.
The second step involves the permissions in the context. The context can say
that this tx was signed by eg. Rigel. But if any module can add that permission,
it would be too easy to forge accounts. Thus, each permission is associated
with the module that granted it (in this case `auth`), and if a module tries
to add a permission for another module, it will panic. There is also
protection if a module creates a brand new fake context to trick the downstream
modules.
This means that modules can confidently write to their local section of the
database and trust the permissions associated with the context, without concern
of interferance from other modules. (Okay, if you see a bunch of C-code in
the module traversing through all the memory space of the application, then
get worried....)
## Handler
## Middleware
## Modules
## Dispathcer
## IPC (Inter-Plugin Communication)
## IBC (Inter-Blockchain Communication)
Wow, this is a big topic. Also a WIP. Add more here...