Docs: add doc on OPAM packages/source code architecture
This commit is contained in:
parent
2cae073e5b
commit
ac0a685769
@ -35,7 +35,7 @@ Where to start
|
|||||||
|
|
||||||
While you familiarize yourself with the basics as suggested above, you
|
While you familiarize yourself with the basics as suggested above, you
|
||||||
can have a look at the :ref:`software architecture
|
can have a look at the :ref:`software architecture
|
||||||
<the_big_picture>` of Tezos. It will
|
<software_architecture>` of Tezos. It will
|
||||||
give you the main components and their interactions, and links to the
|
give you the main components and their interactions, and links to the
|
||||||
documentations for the various parts.
|
documentations for the various parts.
|
||||||
|
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
.. _entering_alpha:
|
||||||
|
|
||||||
How to start reading protocol Alpha
|
How to start reading protocol Alpha
|
||||||
===================================
|
===================================
|
||||||
|
|
||||||
|
3030
docs/whitedoc/packages.svg
Normal file
3030
docs/whitedoc/packages.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 661 KiB |
@ -1,8 +1,19 @@
|
|||||||
.. _the_big_picture:
|
.. _software_architecture:
|
||||||
|
|
||||||
Tezos Software Architecture
|
Tezos Software Architecture
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
This document contains two section. The first section, which should be
|
||||||
|
readable by anyone, describes the main elements of Tezos from a
|
||||||
|
distance. It abstracts from all plumbing and both internal and system
|
||||||
|
dependencies to give a simple view of the main components, their
|
||||||
|
responsibilities and interactions. The second part is written for
|
||||||
|
developpers, and is at the level of OPAM packages.
|
||||||
|
|
||||||
|
The Big Picture
|
||||||
|
---------------
|
||||||
|
.. _the_big_picture:
|
||||||
|
|
||||||
The diagram below shows a very coarse grained architecture of Tezos.
|
The diagram below shows a very coarse grained architecture of Tezos.
|
||||||
|
|
||||||
|Tezos architecture diagram|
|
|Tezos architecture diagram|
|
||||||
@ -58,3 +69,258 @@ is fully inter-operable, and auto descriptive, using JSON schema.
|
|||||||
|
|
||||||
.. |Tezos architecture diagram| image:: octopus.svg
|
.. |Tezos architecture diagram| image:: octopus.svg
|
||||||
|
|
||||||
|
|
||||||
|
Software Architecture and Package Relashionships
|
||||||
|
------------------------------------------------
|
||||||
|
.. _packages:
|
||||||
|
|
||||||
|
The diagram below shows the main OPAM packages present in the source
|
||||||
|
code of Tezos, and their dependencies. The ``tezos-`` prefix has been
|
||||||
|
dropped for clarity.
|
||||||
|
|
||||||
|
|Tezos source packages diagram|
|
||||||
|
|
||||||
|
In green at the bottom are binaries. Hilighted in yellow are the OPAM
|
||||||
|
packages (sometimes with shortened names). Black arrows show direct
|
||||||
|
dependencies. Orange arrows show other indirect relashionships (code
|
||||||
|
generation, interface sharing), explained below. The part circled in
|
||||||
|
blue, contains modules that bear no dependency to Unix, and can thus
|
||||||
|
be compiled to JavaScript. External dependencies are not shown in this
|
||||||
|
illustration.
|
||||||
|
|
||||||
|
Base and below
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
At the center, the :package:`tezos-base` package is where
|
||||||
|
the blockchain specific code starts. Before it are the set of libraries
|
||||||
|
that are used everywhere for basic operations.
|
||||||
|
|
||||||
|
- :package:`tezos-stdlib` contains a few extensions over the
|
||||||
|
OCaml standard library (a few string primitives, an ``Option``
|
||||||
|
module, etc.), a few ``Lwt`` utilities, and a ``Compare`` module
|
||||||
|
that implements monomorphic comparison operators.
|
||||||
|
- :package:`tezos-data-encoding` is the in-house
|
||||||
|
comibnator-based serialization library. From a single type
|
||||||
|
description ``t encoding``, the code can read to and write from
|
||||||
|
values of type ``t`` both binary and JSON representations. For
|
||||||
|
both, the library provides machine and human-redable documentations
|
||||||
|
by the use of documentation combinators. The JSON part depends on
|
||||||
|
:opam:`ocplib-json-typed`.
|
||||||
|
A :ref:`tutorial<data_encoding>` is available for this library.
|
||||||
|
- :package:`tezos-error-monad` is an in-house monadic
|
||||||
|
interface to the OCaml ``('a, 'b) result`` type, that fixes the
|
||||||
|
``'b`` to an extensible type ``error`` (actually a list, to hold an
|
||||||
|
error trace). When extending the type, programmers must also call
|
||||||
|
the ``register_error`` function that registers a pretty printer and
|
||||||
|
an encoding for serialization.
|
||||||
|
A :ref:`tutorial<error_monad>` is available for this library.
|
||||||
|
- :package:`tezos-rpc` provides the basics of Tezos' RPC service
|
||||||
|
mechanism. It provides combinators for building service hierarchies
|
||||||
|
à la Ocsigen/Eliom, registering and calling services. This module
|
||||||
|
is based on :opam:`ocplib-resto`, that allows for automatic
|
||||||
|
generation of a machine and human-readable of the hierarchy of
|
||||||
|
services: the structure of URLs and the expected formats for input
|
||||||
|
and output bodies, via the use of ``data_encoding``.
|
||||||
|
- :package:`tezos-crypto` wraps the external cryptography
|
||||||
|
libraries that we use. We try to use minimal references
|
||||||
|
implementations, with as thin as possible bindings. A possible plan
|
||||||
|
is to use libraries from the HACL projet, so that all of our crypto
|
||||||
|
is extracted from Fstar, either with thin C bindings or directly in
|
||||||
|
OCaml.
|
||||||
|
- :package:`tezos-micheline` is the concrete syntax used by
|
||||||
|
Michelson, the language of smart contracts. It mostly contains the
|
||||||
|
generic, untyped AST, a printer and a parser.
|
||||||
|
- :package:`tezos-base` wraps all these module in a common foundation
|
||||||
|
for all the other components of Tezos, and introduces the data
|
||||||
|
structures of the blockchain (e.g. ``Block_hash``,
|
||||||
|
``Block_header``, ``Block_locator``, ``Fitness``, ``P2p_identity``)
|
||||||
|
that are shared between the shell, economic protocol, client,
|
||||||
|
daemons and third party software. It also rewraps some modules from
|
||||||
|
``crypto`` as functors that build all-in-one modules for a given
|
||||||
|
type (for instance, the module for block hashes contains all
|
||||||
|
possible converters, command line and RPC argument builders, pretty
|
||||||
|
printers, an autocompleter, etc.). This package also contains the
|
||||||
|
``cli_entries`` module that we use to handle command line parsing
|
||||||
|
in some executables.
|
||||||
|
|
||||||
|
The Shell
|
||||||
|
~~~~~~~~~
|
||||||
|
|
||||||
|
The shell is the part of the node responsible for all communications,
|
||||||
|
peer-to-peer and RPC, acting as a cocoon around the economic
|
||||||
|
protocols.
|
||||||
|
|
||||||
|
- :package:`tezos-shell-services` contains the definition of the
|
||||||
|
node's service hierarchy, and calling functions to use in the
|
||||||
|
client (or any third party software). As this library is linked
|
||||||
|
into the client to call the services in a type-safe way, only the
|
||||||
|
description of services is done here. The registration of handlers
|
||||||
|
is done in the rest of the node's implementation.
|
||||||
|
- :package:`tezos-rpc-http` uses :opam:`cohttp` to implement the RPC
|
||||||
|
over HTTP server and client, allowing to make actual use of
|
||||||
|
services declared using :package:`tezos-rpc`.
|
||||||
|
- :package:`tezos-p2p` is the in-house peer-to-peer layer.
|
||||||
|
- :package:`tezos-storage` contains the raw simple key-value store
|
||||||
|
used for the chain data, and the raw versioned key-value store
|
||||||
|
used for storing the ledger's context (one version per
|
||||||
|
block). This is implemented using :opam:`irmin` and currently
|
||||||
|
:opam:`leveldb`.
|
||||||
|
- :package:`tezos-protocol-updater` maintains the table of available
|
||||||
|
protocol versions, embedded or dynamically linked.
|
||||||
|
- :package:`tezos-shell` implements the scheduling of block
|
||||||
|
validations, the mempool management, and the distributed database.
|
||||||
|
A description is available in :ref:`this document<validation>`.
|
||||||
|
|
||||||
|
The Economic Protocol Environment and Compiler
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Economic protocols are compiled by a specific version of the OCaml
|
||||||
|
compiler. This compiler restricts the set of modules available to the
|
||||||
|
economic protocol, as a form of static sandboxing. It also generates a
|
||||||
|
functorized version of the protocol, to make the execution of the
|
||||||
|
protocol in alternative environment possible.
|
||||||
|
|
||||||
|
- :package:`tezos-protocol-environment-sigs` contains the modules
|
||||||
|
that are available to the economic protocol. A review of this
|
||||||
|
sandbox is available :ref:`here<protocol_environment>`. This
|
||||||
|
modules include a stripped down standard library, and interfaces
|
||||||
|
to the crypto APIs, RPC definitions, and key-value store.
|
||||||
|
|
||||||
|
- :package:`tezos-protocol-compiler` is the compiler for economic
|
||||||
|
protocols: an alternative driver to the OCaml
|
||||||
|
:opam:`ocaml-compiler-libs` that typechecks within the protocol
|
||||||
|
environment, and performs some more checks on the protocol code.
|
||||||
|
|
||||||
|
- ``tezos-protocol-xxx`` is produced by the protocol compiler
|
||||||
|
and contains a functorized version of protocol ``xxx`` that takes its
|
||||||
|
standard library as parameter. This parameter can be filled with
|
||||||
|
any of the implementations described in the two points below.
|
||||||
|
|
||||||
|
- :package:`tezos-protocol-environment-shell` is the instance of the
|
||||||
|
environment whose RPC service registration and storage access are
|
||||||
|
the ones of the node. This is the environment that is fed by the
|
||||||
|
node when loading new protocols.
|
||||||
|
|
||||||
|
- :package:`tezos-protocol-environment` contains three alternative
|
||||||
|
instances of the protocol environment: one whose context access
|
||||||
|
function are dummy ones which can be used when only the types and
|
||||||
|
non contextual functions of the protocol are needed, another that
|
||||||
|
simulates the key-value store in memory for testing, and a functor
|
||||||
|
that let you build an environment from a few context accessors.
|
||||||
|
|
||||||
|
- ``tezos-embedded-protocol-xxx`` contains a version of protocol
|
||||||
|
``xxx`` whose standard library is pre-instanciated to the shell's
|
||||||
|
implementation, these are the ones that are linked into the
|
||||||
|
node. It alse contains a module that registers the protocol in the
|
||||||
|
node's protocol table.
|
||||||
|
|
||||||
|
The Embedded Economic Protocols
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Three economic protocols are included in the main Tezos repository.
|
||||||
|
|
||||||
|
- :package:`tezos-protocol-genesis`
|
||||||
|
(:package:`tezos-embedded-protocol-genesis`) is the protocol of
|
||||||
|
the genesis block. It accepts a single block, signed by a dictator
|
||||||
|
whose public key is hardcoded, that single action is to switch to
|
||||||
|
a new protocol chosen by the dictator.
|
||||||
|
- :package:`tezos-protocol-alpha`
|
||||||
|
(:package:`tezos-embedded-protocol-alpha`) is the first real
|
||||||
|
protocol of Tezos. A :ref:`tutorial<entering_alpha>` is available
|
||||||
|
to start reading the protocol's code.
|
||||||
|
- :package:`tezos-protocol-demo`
|
||||||
|
(:package:`tezos-embedded-protocol-demo`) is just a demo protocol
|
||||||
|
that does nothing interesting but has the right shape.
|
||||||
|
|
||||||
|
The Client Library
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The client is split into many packages, to enforce three separation
|
||||||
|
lines: shell vs economic protocol, Unix dependent vs Javascript
|
||||||
|
compatible, and library vs command line interface.
|
||||||
|
|
||||||
|
- :package:`tezos-client-base` define the client context, which is
|
||||||
|
an object whose methods allow for: accessing a wallet of keys,
|
||||||
|
interacting via the user, making RPC calls, and signing data using
|
||||||
|
signer plug-ins. Most of the, including RPC calling functions from
|
||||||
|
:package:`tezos-shell-services` and
|
||||||
|
:package:`tezos-protocol-alpha`, are abstracted over this object
|
||||||
|
type. That way, it is possible to use the same code for different
|
||||||
|
platforms ot toolkits.
|
||||||
|
- :package:`tezos-client-alpha` provides some functions to perform
|
||||||
|
the operations of protocol alpha using the wallet and signers from
|
||||||
|
the client context.
|
||||||
|
- :package:`tezos-client-commands` plugs the basic context access
|
||||||
|
functions from :package:`tezos-client-base` as handlers for the
|
||||||
|
commands of the ``tezos-client`` command line wallet.
|
||||||
|
- :package:`tezos-client-alpha-commands` plugs the functions from
|
||||||
|
:package:`tezos-client-alpha` as handlers for the alpha specific
|
||||||
|
commands of the ``tezos-client`` command line wallet.
|
||||||
|
- :package:`tezos-client-genesis` contains the basic dictator
|
||||||
|
commands available on the genesis protocol.
|
||||||
|
- :package:`tezos-client-base-unix` implements configuration file
|
||||||
|
and wallet storage in Unix files, user interaction via the Unix
|
||||||
|
console, and terminal based signer plug-ins.
|
||||||
|
|
||||||
|
Tests Packages
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The tests are splitted into various packages, testing more and more
|
||||||
|
elements while following the dependency chain. Use ``make test`` to
|
||||||
|
run them.
|
||||||
|
|
||||||
|
- :package-name:`tezos-client`
|
||||||
|
(in directory :src:`src/bin_client/test/`):
|
||||||
|
end-to-end tests as shell scripts that launch a local sandboxed node
|
||||||
|
and performs various tasks using the client
|
||||||
|
- :package-name:`tezos-p2p`
|
||||||
|
(in directory :src:`src/lib_p2p/test/`):
|
||||||
|
tests of the peer-to-peer layer, independently of the Tezos gossip
|
||||||
|
protocol (establishing connections, propagating peers, etc.)
|
||||||
|
- :package-name:`tezos-protocol-environment`
|
||||||
|
(in directory :src:`src/lib_protocol_environment/test/`):
|
||||||
|
tests for the in-memory context implementation.
|
||||||
|
- :package-name:`tezos-shell`
|
||||||
|
(in directory :src:`src/lib_shell/test/`):
|
||||||
|
tests for the chain data storage.
|
||||||
|
- :package-name:`tezos-stdlib`
|
||||||
|
(in directory :src:`src/lib_stdlib/test/`):
|
||||||
|
tests for the basic data structures.
|
||||||
|
- :package-name:`tezos-storage`
|
||||||
|
(in directory :src:`src/lib_storage/test/`):
|
||||||
|
tests for the versioned key-value context.
|
||||||
|
- :package-name:`tezos-client-alpha`, :package-name:`tezos-baking-alpha`
|
||||||
|
(in directory :src:`src/proto_alpha/lib_baking/test/`):
|
||||||
|
tests of the OCaml client library, performing various short
|
||||||
|
scenarios via RPCs to a sandboxed node.
|
||||||
|
- :package-name:`tezos-protocol-alpha`
|
||||||
|
(in directory :src:`src/proto_alpha/lib_protocol/test/`):
|
||||||
|
tests of the alpha protocol (without launching a node).
|
||||||
|
- :package-name:`tezos-crypto`
|
||||||
|
(in directory :src:`src/lib_crypto/test/`):
|
||||||
|
tests for the in-house merkle trees.
|
||||||
|
- :package-name:`tezos-data-encoding`
|
||||||
|
(in directory :src:`src/lib_data_encoding/test/`):
|
||||||
|
tests for the JSON and binary serialization and deserialization.
|
||||||
|
|
||||||
|
The Final Executables
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
- :package:`tezos-node` provides the node launcher binary
|
||||||
|
``tezos-node``. All the algorithmic being implemented in the
|
||||||
|
shell, this package only implements the node's CLI. It also
|
||||||
|
provides the sandboxed node shell script launcher (see the main
|
||||||
|
readme).
|
||||||
|
- :package:`tezos-client` provides the ``tezos-client`` and
|
||||||
|
``tezos-admin-client`` binaries. The former contains a small
|
||||||
|
comand line wallet, the latter an administration tool for the
|
||||||
|
node. It also provides a shell script that configures a shell
|
||||||
|
environment to interact with a sandboxed node.
|
||||||
|
- :package:`tezos-baker-alpha` provides the ``tezos-alpha-baker``
|
||||||
|
binary.
|
||||||
|
- :package:`tezos-protocol-compiler` provides the
|
||||||
|
``tezos-protocol-compiler`` binary that is used by the node to
|
||||||
|
compile new protocols on the fly, and that can be used for
|
||||||
|
developping new protocols.
|
||||||
|
|
||||||
|
.. |Tezos source packages diagram| image:: packages.svg
|
||||||
|
Loading…
Reference in New Issue
Block a user