49 lines
2.4 KiB
ReStructuredText
49 lines
2.4 KiB
ReStructuredText
.. _protocol_environment:
|
||
|
||
Economic protocol sandboxing
|
||
============================
|
||
|
||
In Alpha, as in any sound future protocols, updates are approved by
|
||
voting. That way, the responsibility of switching to a new protocol code
|
||
is the responsibility of voters, and one could argue that it is up to
|
||
them to check that the code does not call, for instance, unsafe array
|
||
access functions.
|
||
|
||
Yet, we decided to introduce a minimum level of machine checks, by
|
||
compiling with a specific compiler that checks that no known-unsafe
|
||
function is used. This static form of sandboxing is performed by the
|
||
OCaml typechecker: we simply compile protocols in a restricted set of
|
||
modules with restricted interfaces that hide any unsafe, non wanted
|
||
feature.
|
||
|
||
Another goal of that specific environment is maintaining a stable OCaml
|
||
API for protocol development. Imagine that at some point, the OCaml
|
||
standard library changes (a function is added or removed, a type is
|
||
changed), then we will be able to upgrade to the new OCaml while still
|
||
remaining compatible with past protocols, by providing an adapter layer.
|
||
|
||
Here is a quick description of each file in this environment:
|
||
|
||
- Files ``array.mli``, ``buffer.mli``, ``bytes.mli``, ``format.mli``,
|
||
``int32.mli``, ``int64.mli``, ``list.mli``, ``map.mli``,
|
||
``pervasives.mli``, ``set.mli`` and ``string.mli`` are stripped down
|
||
interfaces to the OCaml standard library modules. The removed
|
||
elements are: effects on toplevel references or channels, unsafe
|
||
functions, functions that are known sources of bugs, and anything
|
||
deprecated.
|
||
- As we removed polymorphic comparison operators, ``compare.mli``
|
||
implements monomorphic operators for standard OCaml and Tezos types.
|
||
An example use is ``Compare.Int.(3 = 4)`` instead of plain OCaml
|
||
``(3 = 4)``.
|
||
- Files ``lwt*`` is the stripped down interface to Lwt, of which we
|
||
removed any non deterministic functions, since we only use Lwt for
|
||
asynchronous access to the storage.
|
||
- Files ``data_encoding.mli``, ``error_monad.mli``, ``mBytes.mli``,
|
||
``hash.mli``, ``base58.mli``, ``blake2B.mli``, ``ed25519.mli``,
|
||
``hex_encode.mli``, ``json.mli``, ``time.mli``, ``z.mli``,
|
||
``micheline.mli`` and files ``RPC_*`` are stripped down versions of
|
||
the Tezos standard library.
|
||
- Files ``tezos_data.mli``, ``context.mli``, ``fitness.mli`` and
|
||
``updater.mli`` are interfaces to the shell’s data definitions and
|
||
storage accessors that are accessible to the protocol.
|