ligo/src/proto/environment/updater.mli

175 lines
6.2 KiB
OCaml
Raw Normal View History

2016-09-08 21:13:10 +04:00
(** Tezos Protocol Environment - Protocol Implementation Updater *)
open Hash
(** The version agnostic toplevel structure of operations. *)
2016-09-08 21:13:10 +04:00
type shell_operation = {
net_id: Net_id.t ;
2016-09-08 21:13:10 +04:00
}
val shell_operation_encoding: shell_operation Data_encoding.t
type raw_operation = {
shell: shell_operation ;
proto: MBytes.t ;
}
val raw_operation_encoding: raw_operation Data_encoding.t
2016-09-08 21:13:10 +04:00
(** The version agnostic toplevel structure of blocks. *)
2016-10-19 22:47:04 +04:00
type shell_block = {
net_id: Net_id.t ;
2016-09-08 21:13:10 +04:00
(** The genesis of the chain this block belongs to. *)
predecessor: Block_hash.t ;
(** The preceding block in the chain. *)
timestamp: Time.t ;
(** The date at which this block has been forged. *)
operations: Operation_list_list_hash.t ;
(** The sequence of operations. *)
2016-09-08 21:13:10 +04:00
fitness: MBytes.t list ;
(** The announced score of the block. As a sequence of sequences
of unsigned bytes. Ordered by length and then by contents
lexicographically. *)
}
2016-10-19 22:47:04 +04:00
val shell_block_encoding: shell_block Data_encoding.t
2016-09-08 21:13:10 +04:00
2016-10-19 22:47:04 +04:00
type raw_block = {
shell: shell_block ;
2016-09-08 21:13:10 +04:00
proto: MBytes.t ;
}
val raw_block_encoding: raw_block Data_encoding.t
2016-09-08 21:13:10 +04:00
type validation_result = {
context: Context.t ;
fitness: Fitness.fitness ;
message: string option ;
}
type rpc_context = {
context: Context.t ;
timestamp: Time.t ;
fitness: Fitness.fitness ;
}
2016-09-08 21:13:10 +04:00
(** This is the signature of a Tezos protocol implementation. It has
access to the standard library and the Environment module. *)
2016-09-08 21:13:10 +04:00
module type PROTOCOL = sig
type error = ..
type 'a tzresult = ('a, error list) result
(** The version specific type of operations. *)
type operation
(** The maximum size of operations in bytes *)
val max_operation_data_length : int
(** The maximum size of block headers in bytes *)
2016-10-19 22:47:04 +04:00
val max_block_length : int
2016-09-08 21:13:10 +04:00
(** The maximum *)
val max_number_of_operations : int
(** The parsing / preliminary validation function for
2016-10-19 22:47:04 +04:00
operations. Similar to {!parse_block}. *)
2016-09-08 21:13:10 +04:00
val parse_operation :
Operation_hash.t -> raw_operation -> operation tzresult
(** Basic ordering of operations. [compare_operations op1 op2] means
that [op1] should appear before [op2] in a block. *)
val compare_operations : operation -> operation -> int
(** A functional state that is transmitted through the steps of a
block validation sequence. It must retain the current state of
the store (that can be extracted from the outside using
{!current_context}, and whose final value is produced by
{!finalize_block}). It can also contain the information that
must be remembered during the validation, which must be
immutable (as validator or baker implementations are allowed to
pause, replay or backtrack during the validation process). *)
type validation_state
(** Access the context at a given validation step. *)
val current_context : validation_state -> Context.t tzresult Lwt.t
(** Checks that a block is well formed in a given context. This
function should run quickly, as its main use is to reject bad
blocks from the network as early as possible. The input context
is the one resulting of an ancestor block of same protocol
version, not necessarily the one of its predecessor. *)
val precheck_block :
ancestor_context: Context.t ->
ancestor_timestamp: Time.t ->
raw_block ->
unit tzresult Lwt.t
(** The first step in a block validation sequence. Initializes a
validation context for validating a block. Takes as argument the
{!raw_block} to initialize the context for this block, patching
the context resulting of the application of the predecessor
block passed as parameter. The function {!precheck_block} may
not have been called before [begin_application], so all the
check performed by the former must be repeated in the latter. *)
val begin_application :
predecessor_context: Context.t ->
predecessor_timestamp: Time.t ->
predecessor_fitness: Fitness.fitness ->
raw_block ->
validation_state tzresult Lwt.t
(** Initializes a validation context for constructing a new block
(as opposed to validating an existing block). Since there is no
{!raw_block} header available, the parts that it provides are
passed as arguments (predecessor block hash, context resulting
of the application of the predecessor block, and timestamp). *)
val begin_construction :
predecessor_context: Context.t ->
predecessor_timestamp: Time.t ->
predecessor_fitness: Fitness.fitness ->
predecessor: Block_hash.t ->
timestamp: Time.t ->
validation_state tzresult Lwt.t
(** Called after {!begin_application} (or {!begin_construction}) and
before {!finalize_block}, with each operation in the block. *)
val apply_operation :
validation_state -> operation -> validation_state tzresult Lwt.t
(** The last step in a block validation sequence. It produces the
context that will be used as input for the validation of its
successor block candidates. *)
val finalize_block :
validation_state -> validation_result tzresult Lwt.t
2016-09-08 21:13:10 +04:00
(** The list of remote procedures exported by this implementation *)
val rpc_services : rpc_context RPC.directory
2016-09-08 21:13:10 +04:00
val configure_sandbox :
Context.t -> Data_encoding.json option -> Context.t tzresult Lwt.t
end
(** An OCaml source component of a protocol implementation. *)
type component = {
(** The OCaml module name. *)
name : string ;
(** The OCaml interface source code *)
interface : string option ;
(** The OCaml source code *)
implementation : string ;
}
(** Takes a version hash, a list of OCaml components in compilation
order. The last element must be named [protocol] and respect the
[protocol.ml] interface. Tries to compile it and returns true
2016-09-08 21:13:10 +04:00
if the operation was successful. *)
val compile : Protocol_hash.t -> component list -> bool Lwt.t
(** Activates a given protocol version from a given context. This
means that the context used for the next block will use this
version (this is not an immediate change). The version must have
been previously compiled successfully. *)
val activate : Context.t -> Protocol_hash.t -> Context.t Lwt.t
val set_test_protocol: Context.t -> Protocol_hash.t -> Context.t Lwt.t
val fork_test_network: Context.t -> Context.t Lwt.t