Makefile: simplify the compilation process.

This patch is co-authored with: cagdas.bozman@ocamlpro.com

With this patch the economic protocol is now compiled as as
"functor-pack", parameterized over the environment. This will ease the
protocol reusability outside of the tezos source tree (e.g. for a
michelson Web IDE) and will allow proper unit testing of the economic
protocol.

This functorization allows to break the dependency of the
'tezos-protocol-compiler' on various '.mli' of the node, and hence
we don't need anymore the unusual compilation schema:

  a.mli -> b.mli -> b.ml -> a.ml

where 'A' is linked after 'B' but 'a.mli' should still be compiled
before 'b.mli'. This will simplify a switch to 'ocp-build' or 'jbuiler'.
This commit is contained in:
Grégoire Henry 2017-10-09 10:55:12 +02:00 committed by Benjamin Canou
parent dc74acba56
commit 370112f9b8
100 changed files with 1168 additions and 917 deletions

7
.gitignore vendored
View File

@ -1,5 +1,6 @@
/tezos-node /tezos-node
/tezos-protocol-packer
/tezos-protocol-compiler /tezos-protocol-compiler
/tezos-client /tezos-client
/tezos-attacker /tezos-attacker
@ -8,9 +9,9 @@
/src/.ocamlinit.node /src/.ocamlinit.node
/src/Makefile.local /src/Makefile.local
/src/compiler/environment_gen /src/environment/tezos_protocol_environment_sigs_v1.ml
/src/node/updater/proto_environment.mli
/src/compiler/embedded_cmis.ml /src/compiler/tezos_compiler_embedded_cmis.ml
/src/proto/**/_tzbuild /src/proto/**/_tzbuild
/src/proto/register_client_*.ml /src/proto/register_client_*.ml

View File

@ -1,52 +1,2 @@
S node/net
B node/net
S node/updater
B node/updater
S node/shell
B node/shell
S node/db
B node/db
S node/main
B node/main
S minutils
B minutils
S utils
B utils
S proto/environment
B proto/environment
S compiler
B compiler
S client
B client
S attacker
B attacker
FLG -w -30 FLG -w -30
FLG -w -40 FLG -w -40
PKG base64
PKG calendar
PKG cmdliner
PKG cohttp
PKG compiler-libs.optcomp
PKG conduit
PKG cstruct
PKG dynlink
PKG ezjsonm
PKG git
PKG git-unix
PKG irmin-unix
PKG irmin-git
PKG irmin
PKG lwt
PKG magic-mime
PKG mtime.clock.os
PKG nocrypto
PKG ocplib-endian
PKG ocplib-json-typed
PKG ocplib-ocamlres
PKG ocplib-resto.directory
PKG result
PKG sodium
PKG ssl
PKG unix
PKG zarith
PKG leveldb

View File

@ -1,93 +1,108 @@
TZPROTOCOLPACKER:=../tezos-protocol-packer
TZCOMPILER:=../tezos-protocol-compiler
TZNODE:=../tezos-node
TZCLIENT:=../tezos-client
all: ${TZCOMPILER} ${TZNODE} ${TZCLIENT}
-include Makefile.local -include Makefile.local
include Makefile.config include Makefile.config
include Makefile.files include Makefile.files
TZCOMPILER=../tezos-protocol-compiler
TZNODE=../tezos-node
TZCLIENT=../tezos-client
TZATTACKER=../tezos-attacker
all: ${TZCOMPILER} ${TZNODE} ${TZCLIENT} # ${TZATTACKER}
NODEPS := NODEPS :=
############################################################################ ############################################################################
## Protocol environment ## Protocol environment
############################################################################ ############################################################################
.INTERMEDIATE: compiler/environment_gen .INTERMEDIATE: ${SIGS_PACKER}
.SECONDARY: node/updater/proto_environment.mli .SECONDARY: ${PACKED_SIGS_V1}.ml
compiler/environment_gen: compiler/environment_gen.ml ENVIRONMENT_OBJS := ${PACKED_SIGS_V1}.cmi ${PACKED_SIGS_V1}.cmx
${ENVIRONMENT_OBJS}: PACKAGES=
${ENVIRONMENT_OBJS}: SOURCE_DIRECTORIES=${ENVIRONMENT_DIRECTORIES}
${ENVIRONMENT_OBJS}: TARGET="(tezos_protocol_environment_sigs_v1.cmx)"
${ENVIRONMENT_OBJS}: OPENED_MODULES=
${SIGS_PACKER}: ${SIGS_PACKER}.ml
@echo LINK $(notdir $@) @echo LINK $(notdir $@)
@$(OCAMLOPT) -o $@ $^ @$(OCAMLOPT) -o $@ $^
node/updater/proto_environment.mli: \ ${PACKED_SIGS_V1}.ml: \
compiler/environment_gen $(PROTOCOL_ENV_INTFS) ${SIGS_PACKER} $(PROTOCOL_ENV_INTFS)
@echo GENERATING $(notdir $@) @echo GENERATING $(notdir $@)
@compiler/environment_gen node/updater/proto_environment.mli \ @${SIGS_PACKER} $(PROTOCOL_ENV_INTFS) > $@
$(PROTOCOL_ENV_INTFS)
compiler/sigs/proto_environment.mli: node/updater/proto_environment.mli ${PACKED_SIGS_V1}.cmi: ${PACKED_SIGS_V1}.cmx
${PACKED_SIGS_V1}.cmx: EXTRA_OCAMLFLAGS = -nopervasives
compiler/sigs/proto_environment.cmi: \
compiler/sigs/proto_environment.mli compiler/sigs/protocol_sigs.cmi \
compiler/sigs/camlinternalFormatBasics.cmi
@echo OCAMLOPT ${TARGET} $@
@$(OCAMLOPT) -nopervasives -nostdlib -opaque -I tmp -I compiler/sigs -c $<
partial-clean:: partial-clean::
rm -f node/updater/proto_environment.mli rm -f ${SIGS_PACKER}
rm -f compiler/environment_gen rm -f ${PACKED_SIGS_V1}.ml
############################################################################ ############################################################################
## Protocol environment ## Protocol packer
############################################################################ ############################################################################
PACKER_OBJS := \
${PACKER_LIB_IMPLS:.ml=.cmx} ${PACKER_LIB_IMPLS:.ml=.ml.deps} \
${PACKER_LIB_INTFS:.mli=.cmi} ${PACKER_LIB_INTFS:.mli=.mli.deps} \
${PACKER_IMPLS:.ml=.cmx} ${PACKER_IMPLS:.ml=.ml.deps} \
compiler/sigs/register.cmi: EXTRA_OCAMLFLAGS = -opaque ${PACKER_OBJS}: PACKAGES=
${PACKER_OBJS}: SOURCE_DIRECTORIES=${PACKER_DIRECTORIES}
${PACKER_OBJS}: TARGET="(packer.cmxa)"
${PACKER_OBJS}: OPENED_MODULES=
COMPILER_PRECOMPILED_OBJS := \ packer.cmxa: ${PACKER_LIB_IMPLS:.ml=.cmx}
${COMPILER_PRECOMPILED_INTFS:.mli=.cmi} \ @echo LINK $(notdir $@)
${COMPILER_PRECOMPILED_INTFS:.mli=.mli.deps} @${OCAMLOPT} ${OCAMLFLAGS} -a -o $@ $^
${COMPILER_PRECOMPILED_OBJS}: PACKAGES=${COMPILER_PRECOMPILED_PACKAGES} ${TZPROTOCOLPACKER}: packer.cmxa ${PACKER_IMPLS:.ml=.cmx}
${COMPILER_PRECOMPILED_OBJS}: SOURCE_DIRECTORIES=${COMPILER_PRECOMPILED_SOURCE_DIRECTORIES} @echo LINK $(notdir $@)
${COMPILER_PRECOMPILED_OBJS}: TARGET="(embedded_cmis.cmx)" @$(OCAMLOPT) -o $@ $^
${COMPILER_PRECOMPILED_OBJS}: OPENED_MODULES=${COMPILER_PRECOMPILED_OPENED_MODULES}
compiler/sigs/camlinternalFormatBasics.cmi: clean::
ln -sf $(shell ocamlc -where)/camlinternalFormatBasics.cmi $@ rm -rf ${TZPROTOCOLPACKER}
.INTERMEDIATE: compiler/embedded_cmis.ml ############################################################################
compiler/embedded_cmis.cmx: compiler/embedded_cmis.cmi ## Protocol compiler (also embedded in the node)
############################################################################
compiler/embedded_cmis.ml: ${COMPILER_EMBEDDED_CMIS} COMPILER_OBJS := \
${COMPILER_IMPLS:.ml=.cmx} ${COMPILER_IMPLS:.ml=.ml.deps} \
${COMPILER_LIB_IMPLS:.ml=.cmx} ${COMPILER_LIB_IMPLS:.ml=.ml.deps} \
${COMPILER_LIB_INTFS:.mli=.cmi} ${COMPILER_LIB_INTFS:.mli=.mli.deps} \
${TZCOMPILER}
${COMPILER_OBJS}: PACKAGES=${COMPILER_PACKAGES}
${COMPILER_OBJS}: SOURCE_DIRECTORIES=${COMPILER_SOURCE_DIRECTORIES}
${COMPILER_OBJS}: TARGET="(compiler.cmxa)"
${COMPILER_OBJS}: OPENED_MODULES=${COMPILER_OPENED_MODULES}
compiler/tezos_protocol_registerer.cmi: EXTRA_OCAMLFLAGS = -opaque
.INTERMEDIATE: compiler/tezos_compiler_embedded_cmis.ml
compiler/tezos_compiler_embedded_cmis.cmx: compiler/tezos_compiler_embedded_cmis.cmi
compiler/tezos_compiler_embedded_cmis.ml: ${COMPILER_EMBEDDED_CMIS}
@echo OCAMLRES ${TARGET} $(notdir $@) @echo OCAMLRES ${TARGET} $(notdir $@)
@$(OCAMLRES) -format ocaml -o $@ $^ @$(OCAMLRES) -format ocaml -o $@ $^
compiler.cmxa: ${COMPILER_LIB_IMPLS:.ml=.cmx}
@echo LINK $(notdir $@)
@${OCAMLOPT} ${OCAMLFLAGS} -a -o $@ $^
${TZCOMPILER}: packer.cmxa minutils.cmxa utils.cmxa compiler.cmxa ${COMPILER_IMPLS:.ml=.cmx}
@echo LINK $(notdir $@)
@$(OCAMLOPT) -linkpkg $(patsubst %, -package %, $(COMPILER_PACKAGES)) -o $@ $^
partial-clean:: partial-clean::
rm -f compiler/embedded_cmis.ml rm -f compiler/tezos_compiler_embedded_cmis.ml
NO_DEPS += \ clean::
node/updater/protocol_sigs.mli \ rm -f ${TZCOMPILER}
node/updater/proto_environment.mli \
node/updater/register.mli \
node/db/persist.mli \
node/db/context.mli
node/updater/protocol_sigs.cmi: compiler/sigs/protocol_sigs.cmi
@cp -a compiler/sigs/protocol_sigs.cmi node/updater
node/updater/proto_environment.cmi: compiler/sigs/proto_environment.cmi
@cp -a compiler/sigs/proto_environment.cmi node/updater
node/updater/register.cmi: compiler/sigs/register.cmi
@cp -a compiler/sigs/register.cmi node/updater
node/db/persist.cmi: compiler/sigs/persist.cmi
@cp -a compiler/sigs/persist.cmi node/db
node/db/context.cmi: compiler/sigs/context.cmi
@cp -a compiler/sigs/context.cmi node/db
############################################################################ ############################################################################
@ -139,30 +154,8 @@ utils.top:
( $(patsubst %, echo "#mod_use \"%\";;" ; ,${MINUTILS_LIB_IMPLS} ${UTILS_LIB_IMPLS}) ) >> .ocamlinit.utils ( $(patsubst %, echo "#mod_use \"%\";;" ; ,${MINUTILS_LIB_IMPLS} ${UTILS_LIB_IMPLS}) ) >> .ocamlinit.utils
utop -init .ocamlinit.utils ${UTOPFLAGS} utop -init .ocamlinit.utils ${UTOPFLAGS}
############################################################################ partial-clean::
## Node protocol compiler (also embedded in the main program) -rm -f .ocamlinit.utils
############################################################################
COMPILER_OBJS := \
${COMPILER_IMPLS:.ml=.cmx} ${COMPILER_IMPLS:.ml=.ml.deps} \
${COMPILER_LIB_IMPLS:.ml=.cmx} ${COMPILER_LIB_IMPLS:.ml=.ml.deps} \
${COMPILER_LIB_INTFS:.mli=.cmi} ${COMPILER_LIB_INTFS:.mli=.mli.deps} \
${TZCOMPILER}
${COMPILER_OBJS}: PACKAGES=${COMPILER_PACKAGES}
${COMPILER_OBJS}: SOURCE_DIRECTORIES=${COMPILER_SOURCE_DIRECTORIES}
${COMPILER_OBJS}: TARGET="(compiler.cmxa)"
${COMPILER_OBJS}: OPENED_MODULES=${COMPILER_OPENED_MODULES}
compiler.cmxa: ${COMPILER_LIB_IMPLS:.ml=.cmx}
@echo LINK $(notdir $@)
@${OCAMLOPT} ${OCAMLFLAGS} -a -o $@ $^
${TZCOMPILER}: minutils.cmxa utils.cmxa compiler.cmxa ${COMPILER_IMPLS:.ml=.cmx}
@echo LINK $(notdir $@)
@$(OCAMLOPT) -linkpkg $(patsubst %, -package %, $(COMPILER_PACKAGES)) -o $@ $^
clean::
rm -f ${TZCOMPILER}
############################################################################ ############################################################################
## Node program ## Node program
@ -179,6 +172,9 @@ ${NODE_OBJS}: SOURCE_DIRECTORIES=${NODE_SOURCE_DIRECTORIES}
${NODE_OBJS}: TARGET="(node.cmxa)" ${NODE_OBJS}: TARGET="(node.cmxa)"
${NODE_OBJS}: OPENED_MODULES=${NODE_OPENED_MODULES} ${NODE_OBJS}: OPENED_MODULES=${NODE_OPENED_MODULES}
${NODE_IMPLS:.ml=.cmx} ${NODE_IMPLS:.ml=.ml.deps} \
${NODE_INTFS:.mli=.cmi} ${NODE_INTFS:.mli=.mli.deps}: TARGET="(tezos-node)"
node/updater/environment.cmi: node/updater/environment.cmx node/updater/environment.cmi: node/updater/environment.cmx
node.cmxa: ${NODE_LIB_IMPLS:.ml=.cmx} node.cmxa: ${NODE_LIB_IMPLS:.ml=.cmx}
@ -186,7 +182,7 @@ node.cmxa: ${NODE_LIB_IMPLS:.ml=.cmx}
@${OCAMLOPT} ${OCAMLFLAGS} -a -o $@ $^ @${OCAMLOPT} ${OCAMLFLAGS} -a -o $@ $^
${NODE_IMPLS:.ml=.cmx}: ${EMBEDDED_NODE_PROTOCOLS} ${NODE_IMPLS:.ml=.cmx}: ${EMBEDDED_NODE_PROTOCOLS}
${TZNODE}: minutils.cmxa utils.cmxa compiler.cmxa node.cmxa ${EMBEDDED_NODE_PROTOCOLS} ${NODE_IMPLS:.ml=.cmx} ${TZNODE}: packer.cmxa minutils.cmxa utils.cmxa compiler.cmxa node.cmxa ${EMBEDDED_NODE_PROTOCOLS} ${NODE_IMPLS:.ml=.cmx}
@echo LINK $(notdir $@) @echo LINK $(notdir $@)
@${OCAMLOPT} -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ @${OCAMLOPT} -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^
@ -206,6 +202,11 @@ node.top: ${MINUTILS_LIB_IMPLS} ${UTILS_LIB_IMPLS} ${COMPILER_LIB_IMPLS} ${FULL_
clean:: clean::
rm -f ${TZNODE} rm -f ${TZNODE}
partial-clean::
-rm -f .ocamlinit.node
############################################################################ ############################################################################
## Client program ## Client program
############################################################################ ############################################################################
@ -229,7 +230,7 @@ client.cmxa: ${CLIENT_LIB_IMPLS:.ml=.cmx}
${EMBEDDED_CLIENT_VERSIONS}: client.cmxa ${EMBEDDED_CLIENT_PROTOCOLS} ${EMBEDDED_CLIENT_VERSIONS}: client.cmxa ${EMBEDDED_CLIENT_PROTOCOLS}
${CLIENT_IMPLS:.ml=.cmx}: ${EMBEDDED_CLIENT_VERSIONS} ${CLIENT_IMPLS:.ml=.cmx}: ${EMBEDDED_CLIENT_VERSIONS}
${TZCLIENT}: minutils.cmxa utils.cmxa compiler.cmxa node.cmxa \ ${TZCLIENT}: packer.cmxa minutils.cmxa utils.cmxa compiler.cmxa node.cmxa \
client.cmxa \ client.cmxa \
${EMBEDDED_CLIENT_PROTOCOLS} \ ${EMBEDDED_CLIENT_PROTOCOLS} \
${EMBEDDED_CLIENT_VERSIONS} \ ${EMBEDDED_CLIENT_VERSIONS} \
@ -266,14 +267,15 @@ partial-clean::
## Dependencies ## Dependencies
NO_DEPS += \ NO_DEPS += \
compiler/embedded_cmis.ml \ compiler/tezos_compiler_embedded_cmis.ml \
compiler/embedded_cmis.mli compiler/tezos_compiler_embedded_cmis.mli
compiler/embedded_cmis.cmx compiler/embedded_cmis.cmi: OPENED_MODULES= compiler/tezos_compiler_embedded_cmis.cmx compiler/tezos_compiler_embedded_cmis.cmi: OPENED_MODULES=
ifneq ($(MAKECMDGOALS),clean) ifneq ($(MAKECMDGOALS),clean)
include .depend include .depend
endif endif
DEPENDS := $(filter-out $(NO_DEPS), \ DEPENDS := $(filter-out $(NO_DEPS), \
$(PACKER_LIB_INTFS) $(PACKER_LIB_IMPLS) $(PACKER_IMPLS) \
$(MINUTILS_LIB_INTFS) $(MINUTILS_LIB_IMPLS) \ $(MINUTILS_LIB_INTFS) $(MINUTILS_LIB_IMPLS) \
$(UTILS_LIB_INTFS) $(UTILS_LIB_IMPLS) \ $(UTILS_LIB_INTFS) $(UTILS_LIB_IMPLS) \
${COMPILER_PRECOMPILED_INTFS} \ ${COMPILER_PRECOMPILED_INTFS} \
@ -289,9 +291,9 @@ DEPENDS := $(filter-out $(NO_DEPS), \
DEPENDS_BYTECODE := \ DEPENDS_BYTECODE := \
$(filter-out $(NO_DEPS), $(MINUTILS_LIB_INTFS) $(MINUTILS_LIB_IMPLS)) $(filter-out $(NO_DEPS), $(MINUTILS_LIB_INTFS) $(MINUTILS_LIB_IMPLS))
predepend: node/updater/proto_environment.mli predepend: ${PACKED_SIGS_V1}.ml
compiler/tezos_compiler.cmo compiler/tezos_compiler.cmx: \ compiler/tezos_compiler.cmo compiler/tezos_compiler.cmx: \
compiler/embedded_cmis.cmi compiler/embedded_cmis.cmx compiler/tezos_compiler_embedded_cmis.cmi compiler/tezos_compiler_embedded_cmis.cmx
.SECONDARY: $(patsubst %,%.deps,${DEPENDS}) $(patsubst %,%.deps.byte,${DEPENDS_BYTECODE}) .SECONDARY: $(patsubst %,%.deps,${DEPENDS}) $(patsubst %,%.deps.byte,${DEPENDS_BYTECODE})
.depend: $(patsubst %,%.deps,${DEPENDS}) $(patsubst %,%.deps.byte,${DEPENDS_BYTECODE}) .depend: $(patsubst %,%.deps,${DEPENDS}) $(patsubst %,%.deps.byte,${DEPENDS_BYTECODE})
@ -318,48 +320,29 @@ partial-clean::
## Embedded protocol modules ## Embedded protocol modules
.SECONDEXPANSION: .SECONDEXPANSION:
proto/embedded_proto_%.cmxa: \ proto/tezos_embedded_protocol_%.cmx: \
${TZCOMPILER} \ ${TZCOMPILER} \
proto/%/TEZOS_PROTOCOL \ proto/%/TEZOS_PROTOCOL \
$$(wildcard proto/%/*.ml) \ $$(wildcard proto/%/*.ml) \
$$(wildcard proto/%/*.mli) $$(wildcard proto/%/*.mli)
@echo "TZCOMPILER (tezos_protocol_$*.cmx)"
@${TZCOMPILER} -static ${DEVFLAGS} \ @${TZCOMPILER} -static ${DEVFLAGS} \
-build-dir proto/$*/_tzbuild \ proto/tezos_embedded_protocol_$* proto/$*
$@ proto/$*/
CLIENT_PROTO_INCLUDES := \
minutils utils compiler node/updater node/db node/net node/shell client \
$(shell ocamlfind query lwt ocplib-json-typed sodium zarith)
proto/client_embedded_proto_%.cmxa: \
${TZCOMPILER} \
node/updater/environment.cmi \
node/updater/environment.cmx \
node/updater/proto_environment.cmi \
node/updater/proto_environment.cmx \
proto/%/TEZOS_PROTOCOL \
$$(wildcard proto/%/*.ml) \
$$(wildcard proto/%/*.mli)
@./${TZCOMPILER} -static -client ${DEVFLAGS} \
-build-dir client/embedded/$*/_tzbuild \
$(addprefix -I , ${CLIENT_PROTO_INCLUDES}) \
$@ proto/$*
partial-clean:: partial-clean::
-rm -rf $(patsubst proto/embedded_proto_%.cmxa,proto/%/_tzbuild, \ -rm -rf ${EMBEDDED_NODE_PROTOCOLS}
${EMBEDDED_NODE_PROTOCOLS})
-rm -f $(patsubst proto/client_embedded_proto_%.cmxa, \
proto/register_client_embedded_proto_%.ml, \
${EMBEDDED_CLIENT_PROTOCOLS})
## Embedded client protocol modules ## Embedded client protocol modules
client/embedded/client_%.cmx: \ client/embedded/client_%.cmx: \
$(patsubst %.ml, %.cmx, $(NODE_LIB_IMPLS) $(CLIENT_LIB_IMPLS)) \ $(patsubst %.ml, %.cmx, $(NODE_LIB_IMPLS) $(CLIENT_LIB_IMPLS)) \
proto/client_embedded_proto_%.cmxa \ proto/tezos_embedded_protocol_%.cmx \
$$(shell find client/embedded/% \( -name _tzbuild \) -prune -or \( -name \*.ml -print -or -name \*.mli -print \)) $$(shell find client/embedded/% \( -name _tzbuild \) -prune -or \( -name \*.ml -print -or -name \*.mli -print \))
@$(MAKE) -C client/embedded/$* ../client_$*.cmx @$(MAKE) -C client/embedded/$* ../client_$*.cmx
client/embedded/client_genesis.cmx: \
client/embedded/client_alpha.cmx
partial-clean:: partial-clean::
-for d in $$(ls -d client/embedded/*/) ; do make clean -C $$d ; done -for d in $$(ls -d client/embedded/*/) ; do make clean -C $$d ; done
-rm -f client/embedded/*.cm* client/embedded/*.o -rm -f client/embedded/*.cm* client/embedded/*.o

View File

@ -1,8 +1,14 @@
SRCDIR ?= . SRCDIR ?= .
SIGS_PACKER:=environment/tezos_protocol_environment_sigs_packer
PACKED_SIGS_V1:=environment/tezos_protocol_environment_sigs_v1
ENVIRONMENT_SOURCE_DIRECTORIES := \
${SRCDIR}/environment
PROTOCOL_ENV_INTFS := \ PROTOCOL_ENV_INTFS := \
$(addprefix proto/environment/, \ $(addprefix environment/v1/, \
pervasives.mli \ pervasives.mli \
compare.mli \ compare.mli \
\ \
@ -34,6 +40,18 @@ $(addprefix proto/environment/, \
updater.mli \ updater.mli \
) )
PACKER_DIRECTORIES := \
${SRCDIR}/packer
PACKER_LIB_INTFS := \
packer/tezos_protocol_packer.mli
PACKER_LIB_IMPLS := \
packer/tezos_protocol_packer.ml
PACKER_IMPLS := \
packer_main.ml
############################################################################ ############################################################################
## Minimal utils library compatible with js_of_ocaml ## Minimal utils library compatible with js_of_ocaml
############################################################################ ############################################################################
@ -127,43 +145,39 @@ UTILS_PACKAGES := \
zarith \ zarith \
$(COVERAGEPKG) \ $(COVERAGEPKG) \
############################################################################ ############################################################################
## Node protocol compiler (also embedded in the main program) ## Node protocol compiler (also embedded in the main program)
############################################################################ ############################################################################
COMPILER_SOURCE_DIRECTORIES := \ COMPILER_SOURCE_DIRECTORIES := \
${ENVIRONMENT_SOURCE_DIRECTORIES} \
${PACKER_DIRECTORIES} \
${UTILS_SOURCE_DIRECTORIES} \ ${UTILS_SOURCE_DIRECTORIES} \
${SRCDIR}/compiler ${SRCDIR}/compiler
COMPILER_OPENED_MODULES := Error_monad Hash Utils COMPILER_OPENED_MODULES := Tezos_data Hash
$(shell ocamlfind query stdlib)/camlinternalFormatBasics.cmi: \
$(shell ocamlfind query stdlib)/camlinternalFormatBasics.mli
@echo -n # do nothing...
COMPILER_EMBEDDED_CMIS := \ COMPILER_EMBEDDED_CMIS := \
compiler/sigs/camlinternalFormatBasics.cmi \ $(shell ocamlfind query stdlib)/camlinternalFormatBasics.cmi \
compiler/sigs/proto_environment.cmi \ ${PACKED_SIGS_V1}.cmi \
compiler/sigs/register.cmi compiler/tezos_protocol_registerer.cmi
COMPILER_PRECOMPILED_INTFS := \ COMPILER_IMPLS := \
compiler/sigs/tezos_data.mli \ compiler_main.ml \
compiler/sigs/persist.mli \
compiler/sigs/context.mli \
compiler/sigs/protocol_sigs.mli \
compiler/sigs/proto_environment.mli \
compiler/sigs/register.mli
COMPILER_PRECOMPILED_PACKAGES := \
${MINUTILS_PACKAGES} ${UTILS_PACKAGES}
COMPILER_PRECOMPILED_SOURCE_DIRECTORIES := \
${UTILS_SOURCE_DIRECTORIES} compiler/sigs/
COMPILER_PRECOMPILED_OPENED_MODULES := Error_monad Hash Utils
COMPILER_LIB_INTFS := \ COMPILER_LIB_INTFS := \
compiler/tezos_compiler_embedded_cmis.mli \
compiler/tezos_protocol_registerer.mli \
compiler/tezos_compiler.mli \ compiler/tezos_compiler.mli \
compiler/embedded_cmis.mli \
COMPILER_LIB_IMPLS := \ COMPILER_LIB_IMPLS := \
compiler/embedded_cmis.ml \ compiler/tezos_compiler_embedded_cmis.ml \
compiler/tezos_protocol_registerer.ml \
compiler/tezos_compiler.ml \ compiler/tezos_compiler.ml \
COMPILER_IMPLS := \ COMPILER_IMPLS := \
@ -173,11 +187,6 @@ COMPILER_PACKAGES := \
${UTILS_PACKAGES} \ ${UTILS_PACKAGES} \
compiler-libs \ compiler-libs \
compiler-libs.optcomp \ compiler-libs.optcomp \
lwt.unix \
ocplib-endian \
ocplib-ocamlres \
unix \
############################################################################ ############################################################################
## Node program ## Node program
@ -216,9 +225,7 @@ NODE_LIB_INTFS := \
node/db/store_helpers.mli \ node/db/store_helpers.mli \
node/db/store.mli \ node/db/store.mli \
\ \
node/updater/protocol_sigs.mli \
node/updater/updater.mli \ node/updater/updater.mli \
node/updater/proto_environment.mli \
node/updater/register.mli \ node/updater/register.mli \
\ \
node/shell/state.mli \ node/shell/state.mli \
@ -261,10 +268,8 @@ FULL_NODE_LIB_IMPLS := \
node/db/store_helpers.ml \ node/db/store_helpers.ml \
node/db/store.ml \ node/db/store.ml \
\ \
node/updater/protocol_sigs.mli \
node/updater/updater.ml \ node/updater/updater.ml \
node/updater/environment.ml \ node/updater/tezos_protocol_environment.ml \
node/updater/proto_environment.ml \
node/updater/register.ml \ node/updater/register.ml \
\ \
node/shell/state.ml \ node/shell/state.ml \
@ -310,6 +315,7 @@ NODE_PACKAGES := \
dynlink \ dynlink \
git \ git \
irmin-unix \ irmin-unix \
mtime \
ocplib-resto.directory \ ocplib-resto.directory \
ssl \ ssl \
threads.posix \ threads.posix \
@ -320,7 +326,7 @@ EMBEDDED_PROTOCOLS := \
$(shell ls ${SRCDIR}/proto/*/TEZOS_PROTOCOL)) $(shell ls ${SRCDIR}/proto/*/TEZOS_PROTOCOL))
EMBEDDED_NODE_PROTOCOLS := \ EMBEDDED_NODE_PROTOCOLS := \
$(patsubst %,${SRCDIR}/proto/embedded_proto_%.cmxa, ${EMBEDDED_PROTOCOLS}) $(patsubst %,${SRCDIR}/proto/tezos_embedded_protocol_%.cmx, ${EMBEDDED_PROTOCOLS})
############################################################################ ############################################################################
## Client program ## Client program
@ -365,9 +371,7 @@ CLIENT_PACKAGES := \
${NODE_PACKAGES} \ ${NODE_PACKAGES} \
magic-mime \ magic-mime \
EMBEDDED_CLIENT_PROTOCOLS := \ EMBEDDED_CLIENT_PROTOCOLS := ${EMBEDDED_NODE_PROTOCOLS}
$(patsubst %,${SRCDIR}/proto/client_embedded_proto_%.cmxa, \
${EMBEDDED_PROTOCOLS})
CLIENT_VERSIONS := \ CLIENT_VERSIONS := \
$(patsubst ${SRCDIR}/client/embedded/%/,%, \ $(patsubst ${SRCDIR}/client/embedded/%/,%, \
@ -376,3 +380,58 @@ CLIENT_VERSIONS := \
EMBEDDED_CLIENT_VERSIONS := \ EMBEDDED_CLIENT_VERSIONS := \
$(patsubst %,${SRCDIR}/client/embedded/client_%.cmx, \ $(patsubst %,${SRCDIR}/client/embedded/client_%.cmx, \
${CLIENT_VERSIONS}) ${CLIENT_VERSIONS})
ALPHA_MODULES := $(addprefix ${SRCDIR}/proto/alpha/, \
misc.ml \
tezos_hash.ml \
\
qty_repr.ml \
tez_repr.ml \
period_repr.ml \
time_repr.ml \
constants_repr.ml \
fitness_repr.ml \
raw_level_repr.ml \
voting_period_repr.ml \
cycle_repr.ml \
level_repr.ml \
seed_repr.ml \
script_int_repr.ml \
script_repr.ml \
contract_repr.ml \
roll_repr.ml \
vote_repr.ml \
operation_repr.ml \
block_header_repr.ml \
\
storage_sigs.ml \
storage_functors.ml \
storage.ml \
\
level_storage.ml \
nonce_storage.ml \
seed_storage.ml \
roll_storage.ml \
contract_storage.ml \
reward_storage.ml \
bootstrap_storage.ml \
fitness_storage.ml \
vote_storage.ml \
init_storage.ml \
public_key_storage.ml \
\
tezos_context.ml \
\
script_typed_ir.ml \
script_ir_translator.ml \
script_interpreter.ml \
\
mining.ml \
amendment.ml \
apply.ml \
\
services.ml \
services_registration.ml \
main.ml \
)

View File

@ -1,4 +1,54 @@
REC REC
FLG -open Error_monad -open Hash -open Utils -open Tezos_data B ../minutils
S ../minutils
B ../utils
S ../utils
B ../compiler
S ../compiler
B ../node/db
S ../node/db
B ../node/net
S ../node/net
B ../node/updater
S ../node/updater
B ../node/shell
S ../node/shell
B ../node/main
S ../node/main
S embedded S embedded
B embedded B embedded
FLG -open Error_monad -open Hash -open Utils -open Tezos_data
# minutils
PKG cstruct
PKG lwt
PKG ocplib-json-typed.bson
PKG ocplib-resto.directory
# utils
PKG zarith
PKG base64
PKG calendar
PKG ezjsonm
PKG ipaddr.unix
PKG lwt.unix
PKG mtime.clock.os
PKG nocrypto
PKG sodium
PKG zarith
# compiler
PKG compiler-libs
PKG compiler-libs.optcomp
PKG sodium
# node
PKG calendar
PKG cmdliner
PKG cohttp.lwt
PKG dynlink
PKG git
PKG irmin-unix
PKG mtime
PKG ocplib-resto.directory
PKG ssl
PKG threads.posix
PKG leveldb
# client
PKG magic-mime

View File

@ -7,7 +7,7 @@
(* *) (* *)
(**************************************************************************) (**************************************************************************)
module Ed25519 = Environment.Ed25519 module Ed25519 = Tezos_protocol_environment.Ed25519
module Public_key_hash = Client_aliases.Alias (struct module Public_key_hash = Client_aliases.Alias (struct
type t = Ed25519.Public_key_hash.t type t = Ed25519.Public_key_hash.t

View File

@ -7,7 +7,7 @@
(* *) (* *)
(**************************************************************************) (**************************************************************************)
module Ed25519 = Environment.Ed25519 module Ed25519 = Tezos_protocol_environment.Ed25519
module Public_key_hash : module Public_key_hash :
Client_aliases.Alias with type t = Ed25519.Public_key_hash.t Client_aliases.Alias with type t = Ed25519.Public_key_hash.t

View File

@ -39,7 +39,7 @@ let commands () =
(fun () dirname cctxt -> (fun () dirname cctxt ->
Lwt.catch Lwt.catch
(fun () -> (fun () ->
let proto = Tezos_compiler.read_dir dirname in let _hash, proto = Tezos_compiler.read_dir dirname in
Client_node_rpcs.inject_protocol cctxt.rpc_config proto >>= function Client_node_rpcs.inject_protocol cctxt.rpc_config proto >>= function
| Ok hash -> | Ok hash ->
cctxt.message "Injected protocol %a successfully" Protocol_hash.pp_short hash >>= fun () -> cctxt.message "Injected protocol %a successfully" Protocol_hash.pp_short hash >>= fun () ->
@ -62,7 +62,7 @@ let commands () =
@@ stop) @@ stop)
(fun () ph cctxt -> (fun () ph cctxt ->
Client_node_rpcs.Protocols.contents cctxt.rpc_config ph >>=? fun proto -> Client_node_rpcs.Protocols.contents cctxt.rpc_config ph >>=? fun proto ->
Updater.extract "" ph proto >>= fun () -> Updater.extract (Protocol_hash.to_short_b58check ph) ~hash:ph proto >>= fun () ->
cctxt.message "Extracted protocol %a" Protocol_hash.pp_short ph >>= fun () -> cctxt.message "Extracted protocol %a" Protocol_hash.pp_short ph >>= fun () ->
return () return ()
) ; ) ;

View File

@ -7,6 +7,7 @@ include ../../../Makefile.config
NODE_DIRECTORIES = \ NODE_DIRECTORIES = \
$(addprefix ../../../, \ $(addprefix ../../../, \
environment \
minutils \ minutils \
utils \ utils \
node/updater \ node/updater \
@ -21,12 +22,9 @@ SOURCE_DIRECTORIES += \
../../../proto ../../../proto
OPENED_MODULES := \ OPENED_MODULES := \
Client_embedded_proto_${PROTO_VERSION} \
Register_client_embedded_proto_${PROTO_VERSION} \
Error_monad \ Error_monad \
Hash \ Hash \
Tezos_data \ Tezos_data
${OPENED_MODULES}
OBJS := \ OBJS := \
${CLIENT_IMPLS:.ml=.cmx} ${CLIENT_INTFS:.mli=.cmi} ${CLIENT_IMPLS:.ml=.cmx} ${CLIENT_INTFS:.mli=.cmi}
@ -37,9 +35,9 @@ ${OBJS} ${OBJS_DEPS}: TARGET="(client_$(PROTO_VERSION).cmx)"
${OBJS}: EXTRA_OCAMLFLAGS = -for-pack Client_$(PROTO_VERSION) ${OBJS}: EXTRA_OCAMLFLAGS = -for-pack Client_$(PROTO_VERSION)
../client_$(PROTO_VERSION).cmx: EXTRA_OCAMLFLAGS = ../client_$(PROTO_VERSION).cmx: EXTRA_OCAMLFLAGS =
${OBJS} ${OBJS_DEPS} ../client_$(PROTO_VERSION).cmx: \ ${OBJS} ${OBJS_DEPS} ../client_$(PROTO_VERSION).cmx: \
PACKAGES=lwt ocplib-json-typed sodium ocplib-ocamlres uutf PACKAGES=lwt ocplib-json-typed sodium ocplib-ocamlres uutf ocplib-endian zarith
${OBJS} ${OBJS_DEPS} ../client_$(PROTO_VERSION).cmx: \ ${OBJS} ${OBJS_DEPS} ../client_$(PROTO_VERSION).cmx: \
../../../proto/client_embedded_proto_${PROTO_VERSION}.cmxa ../../../proto/tezos_embedded_protocol_${PROTO_VERSION}.cmx
../client_$(PROTO_VERSION).cmx: $(patsubst %.ml, %.cmx, ${CLIENT_IMPLS}) ../client_$(PROTO_VERSION).cmx: $(patsubst %.ml, %.cmx, ${CLIENT_IMPLS})
@echo LINK $(notdir $@) @echo LINK $(notdir $@)

View File

@ -13,6 +13,7 @@ CLIENT_INTFS := \
client_proto_main.mli client_proto_main.mli
CLIENT_IMPLS := \ CLIENT_IMPLS := \
client_proto_alpha.ml \
script_located_ir.ml \ script_located_ir.ml \
michelson_macros.ml \ michelson_macros.ml \
michelson_parser.ml \ michelson_parser.ml \
@ -28,7 +29,8 @@ CLIENT_IMPLS := \
include ../Makefile.shared include ../Makefile.shared
${OBJS}: OPENED_MODULES += Environment Tezos_context ${OBJS_DEPS} ${OBJS}: OPENED_MODULES += Client_proto_alpha Tezos_context
client_proto_alpha.ml.deps client_proto_alpha.cmx: OPENED_MODULES :=
.PHONY: clean .PHONY: clean
clean:: clean::

View File

@ -30,7 +30,7 @@ let rec forge_block_header
Tezos_context.Block_header.forge_unsigned Tezos_context.Block_header.forge_unsigned
shell { priority ; seed_nonce_hash ; proof_of_work_nonce } in shell { priority ; seed_nonce_hash ; proof_of_work_nonce } in
let signed_header = let signed_header =
Ed25519.Signature.append delegate_sk unsigned_header in Environment.Ed25519.Signature.append delegate_sk unsigned_header in
let block_hash = Block_hash.hash_bytes [signed_header] in let block_hash = Block_hash.hash_bytes [signed_header] in
if Mining.check_hash block_hash stamp_threshold then if Mining.check_hash block_hash stamp_threshold then
signed_header signed_header

View File

@ -0,0 +1,16 @@
(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2016. *)
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
module Raw = Tezos_embedded_protocol_alpha
module Environment = Tezos_protocol_environment.Make(Raw.Register.Name)()
module P = Raw.Functor.Make(Environment)
include P
include Updater.WrapProtocol(Raw.Register.Name)(Environment)(P)

View File

@ -538,7 +538,7 @@ let report_errors cctxt errs =
| Overflow _ -> cctxt.warning "Unexpected arithmetic overflow" | Overflow _ -> cctxt.warning "Unexpected arithmetic overflow"
| err -> | err ->
cctxt.warning "%a" cctxt.warning "%a"
Local_environment.Environment.Error_monad.pp_print_error [ err ] in Environment.Error_monad.pp_print_error [ err ] in
let rec print_error_trace locations errs = let rec print_error_trace locations errs =
let locations = match errs with let locations = match errs with
| (Ill_typed_data (_, _, _) | (Ill_typed_data (_, _, _)

View File

@ -2,6 +2,7 @@
PROTO_VERSION = demo PROTO_VERSION = demo
CLIENT_IMPLS = \ CLIENT_IMPLS = \
client_proto_demo.ml \
client_proto_rpcs.ml \ client_proto_rpcs.ml \
client_proto_main.ml client_proto_main.ml
@ -10,3 +11,6 @@ CLIENT_INTFS = \
client_proto_main.mli client_proto_main.mli
include ../Makefile.shared include ../Makefile.shared
${OBJS_DEPS} ${OBJS}: OPENED_MODULES += Client_proto_demo
client_proto_demo.ml.deps client_proto_demo.cmx: OPENED_MODULES :=

View File

@ -0,0 +1,16 @@
(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2016. *)
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
module Raw = Tezos_embedded_protocol_demo
module Environment = Tezos_protocol_environment.Make(Raw.Register.Name)()
module P = Raw.Functor.Make(Environment)
include P
include Updater.WrapProtocol(Raw.Register.Name)(Environment)(P)

View File

@ -44,7 +44,7 @@ let mine cctxt =
[ v ; b ] [ v ; b ]
| _ -> | _ ->
Lwt.ignore_result Lwt.ignore_result
(cctxt.message "Cannot parse fitness: %a" Fitness.pp bi.fitness); (cctxt.message "Cannot parse fitness: %a" Environment.Fitness.pp bi.fitness);
exit 2 in exit 2 in
Client_node_rpcs.forge_block_header cctxt.rpc_config Client_node_rpcs.forge_block_header cctxt.rpc_config
{ shell = { net_id = bi.net_id ; { shell = { net_id = bi.net_id ;

View File

@ -2,6 +2,7 @@
PROTO_VERSION = genesis PROTO_VERSION = genesis
CLIENT_IMPLS = \ CLIENT_IMPLS = \
client_proto_genesis.ml \
client_proto_main.ml client_proto_main.ml
CLIENT_INTFS = \ CLIENT_INTFS = \
@ -9,4 +10,10 @@ CLIENT_INTFS = \
include ../Makefile.shared include ../Makefile.shared
${OBJS}: ../../../proto/client_embedded_proto_alpha.cmxa SOURCE_DIRECTORIES += ..
${OBJS_DEPS} ${OBJS}: ../client_alpha.cmx
${OBJS_DEPS} ${OBJS}: OPENED_MODULES += Client_proto_genesis
client_proto_genesis.ml.deps client_proto_genesis.cmx: OPENED_MODULES :=
../client_alpha.cmx:

View File

@ -0,0 +1,16 @@
(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2016. *)
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
module Raw = Tezos_embedded_protocol_genesis
module Environment = Tezos_protocol_environment.Make(Raw.Register.Name)()
module P = Raw.Functor.Make(Environment)
include P
include Updater.WrapProtocol(Raw.Register.Name)(Environment)(P)

View File

@ -73,7 +73,7 @@ let commands () =
@@ stop) @@ stop)
begin fun timestamp hash fitness seckey cctxt -> begin fun timestamp hash fitness seckey cctxt ->
let fitness = let fitness =
Client_embedded_proto_alpha.Fitness_repr.from_int64 fitness in Client_alpha.Client_proto_alpha.Fitness_repr.from_int64 fitness in
mine cctxt.rpc_config ?timestamp cctxt.config.block mine cctxt.rpc_config ?timestamp cctxt.config.block
(Activate hash) fitness seckey >>=? fun hash -> (Activate hash) fitness seckey >>=? fun hash ->
cctxt.answer "Injected %a" Block_hash.pp_short hash >>= fun () -> cctxt.answer "Injected %a" Block_hash.pp_short hash >>= fun () ->
@ -96,7 +96,7 @@ let commands () =
@@ stop) @@ stop)
begin fun timestamp hash fitness seckey cctxt -> begin fun timestamp hash fitness seckey cctxt ->
let fitness = let fitness =
Client_embedded_proto_alpha.Fitness_repr.from_int64 fitness in Client_alpha.Client_proto_alpha.Fitness_repr.from_int64 fitness in
mine cctxt.rpc_config ?timestamp cctxt.config.block mine cctxt.rpc_config ?timestamp cctxt.config.block
(Activate_testnet (hash, Int64.mul 24L 3600L)) (Activate_testnet (hash, Int64.mul 24L 3600L))
fitness seckey >>=? fun hash -> fitness seckey >>=? fun hash ->

View File

@ -7,6 +7,8 @@
(* *) (* *)
(**************************************************************************) (**************************************************************************)
open Client_proto_genesis
val mine: val mine:
Client_rpcs.config -> Client_rpcs.config ->
?timestamp: Time.t -> ?timestamp: Time.t ->

View File

@ -1,2 +1,30 @@
REC REC
FLG -open Error_monad -open Hash -open Utils S ../environment
B ../environment
S ../packer
B ../packer
B ../minutils
S ../minutils
B ../utils
S ../utils
FLG -open Tezos_data -open Hash
# minutils
PKG cstruct
PKG lwt
PKG ocplib-json-typed.bson
PKG ocplib-resto.directory
# utils
PKG zarith
PKG base64
PKG calendar
PKG ezjsonm
PKG ipaddr.unix
PKG lwt.unix
PKG mtime.clock.os
PKG nocrypto
PKG sodium
PKG zarith
# compiler
PKG compiler-libs
PKG compiler-libs.optcomp
PKG sodium

View File

@ -1,65 +0,0 @@
(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2016. *)
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
let mli = open_out Sys.argv.(1)
let dump_file oc file =
let ic = open_in file in
let buf = Bytes.create 256 in
let rec loop () =
let len = input ic buf 0 (Bytes.length buf) in
if len <> 0 then (output oc buf 0 len; loop ())
in
loop ();
close_in ic
let included = ["Pervasives"]
let () =
Printf.fprintf mli
"module Make(Param : sig val name: string end)() : sig\n"
let () =
for i = 2 to Array.length Sys.argv - 1 do
let file = Sys.argv.(i) in
let unit =
String.capitalize_ascii
(Filename.chop_extension (Filename.basename file)) in
if List.mem unit included then begin
Printf.fprintf mli "# 1 %S\n" file ;
dump_file mli file
end;
Printf.fprintf mli "module %s : sig\n" unit;
Printf.fprintf mli "# 1 %S\n" file ;
dump_file mli file;
Printf.fprintf mli "end\n";
if unit = "Result" then begin
Printf.fprintf mli
"type ('a, 'b) result = ('a, 'b) Result.result = Ok of 'a | Error of 'b\n";
end;
done
let () =
Printf.fprintf mli {|
module type PACKED_PROTOCOL = sig
val hash : Hash.Protocol_hash.t
include Updater.PROTOCOL
val error_encoding : error Data_encoding.t
val classify_errors : error list -> [ `Branch | `Temporary | `Permanent ]
val pp : Format.formatter -> error -> unit
val complete_b58prefix : Context.t -> string -> string list Lwt.t
end
val __cast: (module PACKED_PROTOCOL) -> (module Protocol_sigs.PACKED_PROTOCOL)
|}
let () =
Printf.fprintf mli "end\n" ;
close_out mli

View File

@ -8,9 +8,17 @@
(**************************************************************************) (**************************************************************************)
let compiler_name = "tezos-protocol-compiler" let compiler_name = "tezos-protocol-compiler"
let packer_name = "tezos-protocol-packer"
let () = let () =
if Filename.basename Sys.argv.(0) = compiler_name then begin if Filename.basename Sys.argv.(0) = packer_name then begin
try
Tezos_compiler.main ();
Pervasives.exit 0
with exn ->
Format.eprintf "%a\n%!" Opterrors.report_error exn;
Pervasives.exit 1
end else if Filename.basename Sys.argv.(0) = compiler_name then begin
try try
Tezos_compiler.main (); Tezos_compiler.main ();
Pervasives.exit 0 Pervasives.exit 0
@ -18,3 +26,4 @@ let () =
Format.eprintf "%a\n%!" Opterrors.report_error exn; Format.eprintf "%a\n%!" Opterrors.report_error exn;
Pervasives.exit 1 Pervasives.exit 1
end end

View File

@ -1 +0,0 @@
../../node/updater/proto_environment.mli

View File

@ -16,9 +16,7 @@
*) *)
open Tezos_data (* TODO: fail in the presence of "external" *)
(* GRGR TODO: fail in the presence of "external" *)
module Backend = struct module Backend = struct
(* See backend_intf.mli. *) (* See backend_intf.mli. *)
@ -36,6 +34,7 @@ module Backend = struct
(* The "-1" is to allow for a potential closure environment parameter. *) (* The "-1" is to allow for a potential closure environment parameter. *)
Proc.max_arguments_for_tailcalls - 1 Proc.max_arguments_for_tailcalls - 1
end end
let backend = (module Backend : Backend_intf.S) let backend = (module Backend : Backend_intf.S)
let warnings = "+a-4-6-7-9-29-40..42-44-45-48" let warnings = "+a-4-6-7-9-29-40..42-44-45-48"
@ -45,6 +44,53 @@ let () =
Clflags.unsafe_string := false ; Clflags.unsafe_string := false ;
Clflags.native_code := true Clflags.native_code := true
(** Override the default 'Env.Persistent_signature.load'
with a lookup in locally defined hashtable.
*)
let preloaded_cmis : (string, Env.Persistent_signature.t) Hashtbl.t =
Hashtbl.create ~random:true 42
(* Set hook *)
let () =
let open Env.Persistent_signature in
Env.Persistent_signature.load :=
(fun ~unit_name ->
try Some (Hashtbl.find preloaded_cmis (String.capitalize_ascii unit_name))
with Not_found -> None)
let load_cmi_from_file file =
Hashtbl.add preloaded_cmis
(String.capitalize_ascii Filename.(basename (chop_extension file)))
{ filename = file ;
cmi = Cmi_format.read_cmi file ;
}
let load_embeded_cmi (unit_name, content) =
let content = Bytes.of_string content in
(* Read cmi magic *)
let magic_len = String.length Config.cmi_magic_number in
let magic = Bytes.sub content 0 magic_len in
assert (magic = Bytes.of_string Config.cmi_magic_number) ;
(* Read cmi_name and cmi_sign *)
let pos = magic_len in
let (cmi_name, cmi_sign) = Marshal.from_bytes content pos in
let pos = pos + Marshal.total_size content pos in
(* Read cmi_crcs *)
let cmi_crcs = Marshal.from_bytes content pos in
let pos = pos + Marshal.total_size content pos in
(* Read cmi_flags *)
let cmi_flags = Marshal.from_bytes content pos in
(* TODO check crcrs... *)
Hashtbl.add
preloaded_cmis
(String.capitalize_ascii unit_name)
{ filename = unit_name ^ ".cmi" ;
cmi = { cmi_name; cmi_sign; cmi_crcs; cmi_flags } ;
}
let load_embeded_cmis cmis = List.iter load_embeded_cmi cmis
(** Compilation environment. (** Compilation environment.
[tezos_protocol_env] defines the list of [cmi] available while compiling [tezos_protocol_env] defines the list of [cmi] available while compiling
@ -58,13 +104,20 @@ let () =
*) *)
let tezos_protocol_env = let tezos_protocol_env =
[ "camlinternalFormatBasics", Embedded_cmis.camlinternalFormatBasics_cmi ; let open Tezos_compiler_embedded_cmis in
"proto_environment", Embedded_cmis.proto_environment_cmi ; [
"CamlinternalFormatBasics", camlinternalFormatBasics_cmi ;
"Tezos_protocol_environment_sigs_v1", tezos_protocol_environment_sigs_v1_cmi ;
] ]
let register_env = let register_env =
[ "register", Embedded_cmis.register_cmi ] let open Tezos_compiler_embedded_cmis in
[
"Tezos_protocol_registerer", tezos_protocol_registerer_cmi ;
]
(** Helpers *) (** Helpers *)
@ -76,21 +129,6 @@ let create_file ?(perm = 0o644) name content =
ignore(write_substring fd content 0 (String.length content)); ignore(write_substring fd content 0 (String.length content));
close fd close fd
let read_md5 file =
let ic = open_in file in
let md5 = input_line ic in
close_in ic ;
md5
let rec create_dir ?(perm = 0o755) dir =
if not (Sys.file_exists dir) then begin
create_dir (Filename.dirname dir);
Unix.mkdir dir perm
end
let dump_cmi dir (file, content) =
create_file (dir // file ^ ".cmi") content
let safe_unlink file = let safe_unlink file =
try Unix.unlink file try Unix.unlink file
with Unix.Unix_error(Unix.ENOENT, _, _) -> () with Unix.Unix_error(Unix.ENOENT, _, _) -> ()
@ -103,20 +141,74 @@ let unlink_object obj =
safe_unlink (Filename.chop_suffix obj ".cmx" ^ ".cmi"); safe_unlink (Filename.chop_suffix obj ".cmx" ^ ".cmi");
safe_unlink (Filename.chop_suffix obj ".cmx" ^ ".o") safe_unlink (Filename.chop_suffix obj ".cmx" ^ ".o")
let debug_flag = ref false
(** TEZOS_PROTOCOL files *) let debug fmt =
if !debug_flag then Format.eprintf fmt
else Format.ifprintf Format.err_formatter fmt
let hash_file file =
let open Sodium.Generichash in
let buflen = 8092 in
let buf = BytesLabels.create buflen in
let fd = Unix.openfile file [Unix.O_RDONLY] 0o600 in
let state = init ~size:32 () in
let rec loop () =
match Unix.read fd buf 0 buflen with
| 0 -> ()
| nb_read ->
Bytes.update state @@
if nb_read = buflen then buf else BytesLabels.sub buf 0 nb_read
in
loop () ;
Unix.close fd ;
BytesLabels.unsafe_to_string (Bytes.of_hash (final state))
(** Semi-generic compilation functions *)
let pack_objects output objects =
let output = output ^ ".cmx" in
Compmisc.init_path true;
Asmpackager.package_files
~backend Format.err_formatter Env.initial_safe_string objects output ;
Warnings.check_fatal () ;
output
let link_shared output objects =
Compenv.(readenv Format.err_formatter Before_link) ;
Compmisc.init_path true;
Asmlink.link_shared Format.err_formatter objects output ;
Warnings.check_fatal ()
let compile_ml ?for_pack ml =
let target = Filename.chop_extension ml in
Clflags.for_package := for_pack ;
Compenv.(readenv Format.err_formatter (Before_compile ml));
Optcompile.implementation ~backend Format.err_formatter ml target ;
Clflags.for_package := None ;
target ^ ".cmx"
module Meta = struct module Meta = struct
let name = "TEZOS_PROTOCOL" let name = "TEZOS_PROTOCOL"
let config_file_encoding = let config_file_encoding =
let open Data_encoding in let open Data_encoding in
obj2 obj3
(opt "hash" ~description:"Used to force the hash of the protocol" Protocol_hash.encoding) (opt "hash"
(req "modules" ~description:"Modules comprising the protocol" (list string)) ~description:"Used to force the hash of the protocol"
Protocol_hash.encoding)
(opt "expected_env_version"
Protocol.env_version_encoding)
(req "modules"
~description:"Modules comprising the protocol"
(list string))
let to_file dirname ?hash modules = let to_file dirname ?hash ?env_version modules =
let config_file = let config_file =
Data_encoding.Json.construct config_file_encoding (hash, modules) in Data_encoding.Json.construct
config_file_encoding
(hash, env_version, modules) in
Utils.write_file ~bin:false (dirname // name) @@ Utils.write_file ~bin:false (dirname // name) @@
Data_encoding_ezjsonm.to_string config_file Data_encoding_ezjsonm.to_string config_file
@ -125,8 +217,8 @@ module Meta = struct
Data_encoding_ezjsonm.from_string |> function Data_encoding_ezjsonm.from_string |> function
| Error err -> Pervasives.failwith err | Error err -> Pervasives.failwith err
| Ok json -> Data_encoding.Json.destruct config_file_encoding json | Ok json -> Data_encoding.Json.destruct config_file_encoding json
end
end
let find_component dirname module_name = let find_component dirname module_name =
let open Protocol in let open Protocol in
@ -144,293 +236,99 @@ let find_component dirname module_name =
{ name = module_name; interface = Some interface; implementation } { name = module_name; interface = Some interface; implementation }
let read_dir dirname = let read_dir dirname =
let _hash, modules = Meta.of_file dirname in let hash, expected_env, modules = Meta.of_file dirname in
List.map (find_component dirname) modules let components = List.map (find_component dirname) modules in
let expected_env = match expected_env with None -> Protocol.V1 | Some v -> v in
let protocol = Protocol.{ expected_env ; components } in
let hash =
match hash with
| None -> Protocol.hash protocol
| Some hash -> hash in
hash, protocol
(** Semi-generic compilation functions *) (** Main *)
let compile_mli ?(ctxt = "") ?(keep_object = false) target mli =
Printf.printf "OCAMLOPT%s %s\n%!" ctxt (Filename.basename target ^ ".cmi");
Compenv.(readenv Format.err_formatter (Before_compile mli)) ;
Optcompile.interface Format.err_formatter mli target ;
if not keep_object then
at_exit (fun () -> safe_unlink (target ^ ".cmi"))
let compile_ml ?(ctxt = "") ?(keep_object = false) ?for_pack target ml =
Printf.printf "OCAMLOPT%s %s\n%!" ctxt (Filename.basename target ^ ".cmx") ;
Compenv.(readenv Format.err_formatter (Before_compile ml));
Clflags.for_package := for_pack;
Optcompile.implementation
~backend Format.err_formatter ml target;
Clflags.for_package := None;
if not keep_object then
at_exit (fun () -> unlink_object (target ^ ".cmx")) ;
target ^ ".cmx"
let modification_date file = Unix.((stat file).st_mtime)
let compile_units
?ctxt
?(update_needed = true)
?keep_object ?for_pack ~source_dir ~build_dir units =
let compile_unit update_needed unit =
let basename = String.uncapitalize_ascii unit in
let mli = source_dir // basename ^ ".mli" in
let cmi = build_dir // basename ^ ".cmi" in
let ml = source_dir // basename ^ ".ml" in
let cmx = build_dir // basename ^ ".cmx" in
let target = build_dir // basename in
let update_needed =
update_needed
|| not (Sys.file_exists cmi)
|| ( Sys.file_exists mli
&& modification_date cmi < modification_date mli )
|| not (Sys.file_exists cmx)
|| modification_date cmx < modification_date ml in
if update_needed then begin
unlink_object cmx ;
if Sys.file_exists mli then compile_mli ?ctxt ?keep_object target mli ;
ignore (compile_ml ?ctxt ?keep_object ?for_pack target ml)
end ;
update_needed, cmx in
List.fold_left
(fun (update_needed, acc) unit->
let update_needed, output = compile_unit update_needed unit in
update_needed, output :: acc)
(update_needed, []) units
|> snd |> List.rev
let pack_objects ?(ctxt = "") ?(keep_object = false) output objects =
Printf.printf "PACK%s %s\n%!" ctxt (Filename.basename output);
Compmisc.init_path true;
Asmpackager.package_files
~backend Format.err_formatter Env.initial_safe_string objects output;
if not keep_object then at_exit (fun () -> unlink_object output) ;
Warnings.check_fatal ()
let link_shared ?(static=false) output objects =
Printf.printf "LINK %s\n%!" (Filename.basename output);
Compenv.(readenv Format.err_formatter Before_link);
Compmisc.init_path true;
if static then
Asmlibrarian.create_archive objects output
else
Asmlink.link_shared Format.err_formatter objects output;
Warnings.check_fatal ()
(** Main for the 'forked' compiler.
It expect the following arguments:
output.cmxs source_dir
where, [source_dir] should contains a TEZOS_PROTOCOL file such as:
hash = "69872d2940b7d11c9eabbc685115bd7867a94424"
modules = [Data; Main]
The [source_dir] should also contains the corresponding source
file. For instance: [data.ml], [main.ml] and optionnaly [data.mli]
and [main.mli].
*)
let create_register_file client file hash packname modules =
let unit = List.hd (List.rev modules) in
let environment_module = packname ^ ".Local_environment.Environment" in
let error_monad_module = environment_module ^ ".Error_monad" in
let context_module = environment_module ^ ".Context" in
let hash_module = environment_module ^ ".Hash" in
create_file file
(Printf.sprintf
"module Packed_protocol = struct\n\
\ let hash = (%s.Protocol_hash.of_b58check_exn %S)\n\
\ type error = %s.error = ..\n\
\ type 'a tzresult = 'a %s.tzresult\n\
\ include %s.%s\n\
\ let error_encoding = %s.error_encoding ()\n\
\ let classify_errors = %s.classify_errors\n\
\ let pp = %s.pp\n\
\ let complete_b58prefix = %s.complete
\ end\n\
\ %s\n\
"
hash_module
(Protocol_hash.to_b58check hash)
error_monad_module
error_monad_module
packname (String.capitalize_ascii unit)
error_monad_module
error_monad_module
error_monad_module
context_module
(if client then
"include Register.Make(Packed_protocol)"
else
Printf.sprintf
"let () = Register.register (%s.__cast (module Packed_protocol : %s.PACKED_PROTOCOL))" environment_module environment_module))
let mktemp_dir () = let mktemp_dir () =
Filename.get_temp_dir_name () // Filename.get_temp_dir_name () //
Printf.sprintf "tezos-protocol-build-%06X" (Random.int 0xFFFFFF) Printf.sprintf "tezos-protocol-build-%06X" (Random.int 0xFFFFFF)
let main () = let main () =
Random.self_init () ; Random.self_init () ;
Sodium.Random.stir () ;
let anonymous = ref [] let anonymous = ref []
and client = ref false and static = ref false
and build_dir = ref None and build_dir = ref None in
and include_dirs = ref [] in
let static = ref false in
let args_spec = [ let args_spec = [
"-static", Arg.Set static, " Build a library (.cmxa)"; "-static", Arg.Set static, " Only build the static library (no .cmxs)";
"-client", Arg.Set client, " Preserve type equality with concrete node environment (used to embed protocol into the client)" ;
"-I", Arg.String (fun s -> include_dirs := s :: !include_dirs), "path Path for concrete node signatures (used to embed protocol into the client)" ;
"-bin-annot", Arg.Set Clflags.binary_annotations, " (see ocamlopt)" ; "-bin-annot", Arg.Set Clflags.binary_annotations, " (see ocamlopt)" ;
"-g", Arg.Set Clflags.debug, " (see ocamlopt)" ; "-g", Arg.Set Clflags.debug, " (see ocamlopt)" ;
"-build-dir", Arg.String (fun s -> build_dir := Some s), "path Reuse build dir (incremental compilation)"] in "-build-dir", Arg.String (fun s -> build_dir := Some s),
let usage_msg = Printf.sprintf "Usage: %s <out> <src>\nOptions are:" Sys.argv.(0) in "use custom build directory and preserve build artifacts"
] in
let usage_msg =
Printf.sprintf
"Usage: %s [options] <out> <srcdir>\nOptions are:"
Sys.argv.(0) in
Arg.parse args_spec (fun s -> anonymous := s :: !anonymous) usage_msg ; Arg.parse args_spec (fun s -> anonymous := s :: !anonymous) usage_msg ;
let (output, source_dir) =
let client = !client and include_dirs = !include_dirs in
let output, source_dir =
match List.rev !anonymous with match List.rev !anonymous with
| [ output ; source_dir ] -> output, source_dir | [ output ; protocol_dir ] -> output, protocol_dir
| _ -> Arg.usage args_spec usage_msg ; Pervasives.exit 1 in | _ -> Arg.usage args_spec usage_msg ; Pervasives.exit 1 in
if include_dirs <> [] && not client then begin let build_dir =
Arg.usage args_spec usage_msg ; Pervasives.exit 1
end ;
let keep_object, build_dir, sigs_dir =
match !build_dir with match !build_dir with
| None -> | None ->
let build_dir = mktemp_dir () in let dir = mktemp_dir () in
false, build_dir, build_dir // "sigs" at_exit (fun () -> Lwt_main.run (Lwt_utils.remove_dir dir)) ;
| Some build_dir -> dir
true, build_dir, mktemp_dir () in | Some dir -> dir in
create_dir build_dir ; Lwt_main.run (Lwt_utils.create_dir ~perm:0o755 build_dir) ;
create_dir sigs_dir ; Lwt_main.run (Lwt_utils.create_dir ~perm:0o755 (Filename.dirname output)) ;
at_exit (fun () -> let hash, protocol = read_dir source_dir in
Unix.rmdir sigs_dir ; (* Generate the 'functor' *)
if not keep_object then Unix.rmdir build_dir ) ; let functor_file = build_dir // "functor.ml" in
let oc = open_out functor_file in
let hash, units = Meta.of_file source_dir in Tezos_protocol_packer.dump oc
let hash = match hash with (Array.map
| Some hash -> hash begin fun { Protocol.name } ->
| None -> Protocol.hash @@ List.map (find_component source_dir) units let name_lowercase = String.uncapitalize_ascii name in
in source_dir // name_lowercase ^ ".ml"
let packname = end
if keep_object then (Array.of_list protocol.components)) ;
String.capitalize_ascii (Filename.(basename @@ chop_extension output)) close_out oc ;
else (* Compile the protocol *)
Format.asprintf "Protocol_%a" Protocol_hash.pp hash in let proto_cmi = Filename.chop_extension functor_file ^ ".cmi" in
let packed_objects = let functor_unit =
if keep_object then String.capitalize_ascii
Filename.dirname output // String.uncapitalize_ascii packname ^ ".cmx" Filename.(basename (chop_extension functor_file)) in
else let for_pack = String.capitalize_ascii (Filename.basename output) in
build_dir // packname ^ ".cmx" in
let ctxt = Printf.sprintf " (%s)" (Filename.basename output) in
let logname =
if keep_object then
try
Scanf.sscanf
Filename.(basename @@ chop_extension output)
"embedded_proto_%s"
(fun s -> "proto." ^ s)
with _ ->
Filename.(basename @@ chop_extension output)
else
Format.asprintf "proto.%a" Protocol_hash.pp hash in
(* TODO proper error *)
assert (List.length units >= 1);
(* Initialize the compilers *) (* Initialize the compilers *)
Compenv.(readenv Format.err_formatter Before_args); Compenv.(readenv Format.err_formatter Before_args);
if not client then Clflags.no_std_include := true;
Clflags.include_dirs := build_dir :: sigs_dir :: include_dirs;
Clflags.nopervasives := true; Clflags.nopervasives := true;
Clflags.no_std_include := true ;
Clflags.include_dirs := [Filename.dirname functor_file] ;
Warnings.parse_options false warnings ; Warnings.parse_options false warnings ;
Warnings.parse_options true warn_error ; Warnings.parse_options true warn_error ;
let md5 = load_embeded_cmis tezos_protocol_env ;
if not client then let packed_protocol_object = compile_ml ~for_pack functor_file in
Digest.(to_hex (file Sys.executable_name))
else
try
let environment_cmi =
Misc.find_in_path_uncap !Clflags.include_dirs "environment.cmi" in
let environment_cmx =
Misc.find_in_path_uncap !Clflags.include_dirs "environment.cmx" in
Digest.(to_hex (file Sys.executable_name) ^
(to_hex (file environment_cmi)) ^
(to_hex (file environment_cmx)))
with Not_found ->
Printf.eprintf "%s: Cannot find 'environment.cmi'.\n%!" Sys.argv.(0);
Pervasives.exit 1
in
let update_needed =
not (Sys.file_exists (build_dir // ".tezos_compiler"))
|| read_md5 (build_dir // ".tezos_compiler") <> md5 in
if keep_object then load_embeded_cmis register_env ;
create_file (build_dir // ".tezos_compiler") (md5 ^ "\n"); load_cmi_from_file proto_cmi ;
(* Compile the /ad-hoc/ Error_monad. *)
List.iter (dump_cmi sigs_dir) tezos_protocol_env ;
at_exit (fun () -> List.iter (unlink_cmi sigs_dir) tezos_protocol_env ) ;
let local_environment_unit = "local_environment" in
let local_environment_ml = build_dir // local_environment_unit ^ ".ml" in
create_file local_environment_ml @@ Printf.sprintf {|
module Environment = %s.Make(struct let name = %S end)()
|}
(if client then "Environment" else "Proto_environment")
logname ;
if not keep_object then
at_exit (fun () ->
safe_unlink local_environment_ml) ;
let local_environment_object =
compile_units
~ctxt
~for_pack:packname
~keep_object
~build_dir ~source_dir:build_dir [local_environment_unit]
in
Compenv.implicit_modules :=
[ "Local_environment"; "Environment" ;
"Error_monad" ; "Hash" ; "Logging" ; "Tezos_data" ];
(* Compile the protocol *)
let objects =
compile_units
~ctxt
~update_needed
~keep_object ~for_pack:packname ~build_dir ~source_dir units in
pack_objects ~ctxt ~keep_object
packed_objects (local_environment_object @ objects) ;
(* Compiler the 'registering module' *) (* Compiler the 'registering module' *)
List.iter (dump_cmi sigs_dir) register_env; let register_file = Filename.dirname functor_file // "register.ml" in
at_exit (fun () -> List.iter (unlink_cmi sigs_dir) register_env ) ; create_file register_file
let register_unit = (Printf.sprintf
if client then "module Name = struct let name = %S end\n\
Filename.dirname output // \ let () = Tezos_protocol_registerer.register Name.name (module %s.Make)"
"register_" ^ (Protocol_hash.to_b58check hash)
Filename.(basename @@ chop_extension output) functor_unit) ;
else let register_object = compile_ml ~for_pack register_file in
build_dir // Format.asprintf "register_%s" packname in
let register_file = register_unit ^ ".ml" in let resulting_object =
create_register_file client register_file hash packname units ; pack_objects output [ packed_protocol_object ; register_object ] in
if not keep_object then at_exit (fun () -> safe_unlink register_file) ;
if keep_object then
Clflags.include_dirs := !Clflags.include_dirs @ [Filename.dirname output] ;
let register_object =
compile_ml ~keep_object:client (register_unit) register_file in
(* Create the final [cmxs] *) (* Create the final [cmxs] *)
if not !static then begin
Clflags.link_everything := true ; Clflags.link_everything := true ;
link_shared ~static:!static output [packed_objects; register_object] link_shared (output ^ ".cmxs") [resulting_object] ;
end

View File

@ -7,16 +7,19 @@
(* *) (* *)
(**************************************************************************) (**************************************************************************)
open Hash
open Tezos_data
(** Low-level part of the [Updater]. *) (** Low-level part of the [Updater]. *)
module Meta : sig module Meta : sig
val to_file: Lwt_io.file_name -> ?hash:Protocol_hash.t -> string list -> unit val to_file:
val of_file: Lwt_io.file_name -> Protocol_hash.t option * string list Lwt_io.file_name ->
?hash:Protocol_hash.t ->
?env_version:Protocol.env_version ->
string list -> unit
val of_file:
Lwt_io.file_name ->
Protocol_hash.t option * Protocol.env_version option * string list
end end
val read_dir: Lwt_io.file_name -> Protocol.t val read_dir: Lwt_io.file_name -> Protocol_hash.t * Protocol.t
val main: unit -> unit val main: unit -> unit

View File

@ -8,5 +8,5 @@
(**************************************************************************) (**************************************************************************)
val camlinternalFormatBasics_cmi: string val camlinternalFormatBasics_cmi: string
val proto_environment_cmi: string val tezos_protocol_environment_sigs_v1_cmi: string
val register_cmi: string val tezos_protocol_registerer_cmi: string

View File

@ -0,0 +1,27 @@
(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2016. *)
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
module type PROTOCOL_V1 =
functor (Env : Tezos_protocol_environment_sigs_v1.T) -> Env.Updater.PROTOCOL
module VersionTable = Protocol_hash.Table
let versions : (module PROTOCOL_V1) VersionTable.t =
VersionTable.create 20
let register hash proto =
let hash = Protocol_hash.of_b58check_exn hash in
VersionTable.add versions hash proto
let mem hash = VersionTable.mem versions hash
let get_exn hash = VersionTable.find versions hash
let get hash =
try Some (get_exn hash)
with Not_found -> None

View File

@ -0,0 +1,17 @@
(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2016. *)
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
module type PROTOCOL_V1 =
functor (Env : Tezos_protocol_environment_sigs_v1.T) -> Env.Updater.PROTOCOL
val register: string -> (module PROTOCOL_V1) -> unit
val mem: Protocol_hash.t -> bool
val get: Protocol_hash.t -> (module PROTOCOL_V1) option
val get_exn: Protocol_hash.t -> (module PROTOCOL_V1)

1
src/environment/.merlin Normal file
View File

@ -0,0 +1 @@
REC

View File

@ -0,0 +1,51 @@
(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2016. *)
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
let dump_file oc file =
let ic = open_in file in
let buflen = 8096 in
let buf = Bytes.create buflen in
let rec loop () =
let len = input ic buf 0 buflen in
if len <> 0 then begin
Printf.fprintf oc "%s" (if len = buflen then buf else Bytes.sub buf 0 len) ;
loop ()
end
in
loop () ;
close_in ic
let opened_modules = [
"Pervasives" ;
"Error_monad" ;
"Hash" ;
"Tezos_data" ;
]
let include_mli oc file =
let unit =
String.capitalize_ascii
(Filename.chop_extension (Filename.basename file)) in
Printf.fprintf stdout "module %s : sig\n" unit ;
Printf.fprintf stdout "# 1 %S\n" file ;
dump_file stdout file ;
Printf.fprintf stdout "end\n" ;
if unit = "Result" then
Printf.fprintf stdout
"type ('a, 'b) result = ('a, 'b) Result.result = \
\ Ok of 'a | Error of 'b\n" ;
if List.mem unit opened_modules then Printf.fprintf stdout "open %s\n" unit
let () =
Printf.fprintf stdout "module type T = sig\n" ;
for i = 1 to Array.length Sys.argv - 1 do
let file = Sys.argv.(i) in
include_mli stdout file ;
done ;
Printf.fprintf stdout "end\n%!"

View File

@ -0,0 +1 @@
FLG -open Error_monad -open Hash -open Tezos_data

View File

@ -1,8 +1,6 @@
(** View over the context store, restricted to types, access and (** View over the context store, restricted to types, access and
functional manipulation of an existing context. *) functional manipulation of an existing context. *)
open Hash
include Persist.STORE include Persist.STORE
val register_resolver: val register_resolver:

View File

@ -1,5 +1,3 @@
open MBytes
(** In memory JSON data *) (** In memory JSON data *)
type json = type json =
[ `O of (string * json) list [ `O of (string * json) list

View File

@ -1,8 +1,5 @@
(** Tezos - Persistent structures on top of {!Store} or {!Context} *) (** Tezos - Persistent structures on top of {!Store} or {!Context} *)
open Lwt
(** Keys in (kex x value) database implementations *) (** Keys in (kex x value) database implementations *)
type key = string list type key = string list

View File

@ -7,8 +7,6 @@
(* *) (* *)
(**************************************************************************) (**************************************************************************)
open Hash
module type DATA = sig module type DATA = sig
type t type t
@ -80,8 +78,13 @@ end
module Protocol : sig module Protocol : sig
type t = {
expected_env: env_version ;
components: component list ;
}
(** An OCaml source component of a protocol implementation. *) (** An OCaml source component of a protocol implementation. *)
type component = { and component = {
(** The OCaml module name. *) (** The OCaml module name. *)
name : string ; name : string ;
(** The OCaml interface source code *) (** The OCaml interface source code *)
@ -90,10 +93,10 @@ module Protocol : sig
implementation : string ; implementation : string ;
} }
type t = component list and env_version = V1
val component_encoding: component Data_encoding.t val component_encoding: component Data_encoding.t
val env_version_encoding: env_version Data_encoding.t
include HASHABLE_DATA with type t := t include HASHABLE_DATA with type t := t
and type hash := Protocol_hash.t and type hash := Protocol_hash.t

View File

@ -1,8 +1,5 @@
(** Tezos Protocol Environment - Protocol Implementation Updater *) (** Tezos Protocol Environment - Protocol Implementation Updater *)
open Hash
open Tezos_data
type validation_result = { type validation_result = {
context: Context.t ; context: Context.t ;
fitness: Fitness.t ; fitness: Fitness.t ;
@ -22,9 +19,6 @@ type rpc_context = {
access to the standard library and the Environment module. *) access to the standard library and the Environment module. *)
module type PROTOCOL = sig module type PROTOCOL = sig
type error = ..
type 'a tzresult = ('a, error list) result
(** The version specific type of operations. *) (** The version specific type of operations. *)
type operation type operation

7
src/minutils/.merlin Normal file
View File

@ -0,0 +1,7 @@
REC
B .
S .
PKG cstruct
PKG lwt
PKG ocplib-json-typed.bson
PKG ocplib-resto.directory

View File

@ -1,2 +1,50 @@
REC REC
B ../minutils
S ../minutils
B ../utils
S ../utils
B ../compiler
S ../compiler
B db
S db
B net
S net
B updater
S updater
B shell
S shell
B main
S main
FLG -open Error_monad -open Hash -open Utils -open Tezos_data FLG -open Error_monad -open Hash -open Utils -open Tezos_data
# minutils
PKG cstruct
PKG lwt
PKG ocplib-json-typed.bson
PKG ocplib-resto.directory
# utils
PKG zarith
PKG base64
PKG calendar
PKG ezjsonm
PKG ipaddr.unix
PKG lwt.unix
PKG mtime.clock.os
PKG nocrypto
PKG sodium
PKG zarith
# compiler
PKG compiler-libs
PKG compiler-libs.optcomp
PKG sodium
# node
PKG calendar
PKG cmdliner
PKG cohttp.lwt
PKG dynlink
PKG git
PKG irmin-unix
PKG mtime
PKG ocplib-resto.directory
PKG ssl
PKG threads.posix
PKG leveldb

View File

@ -67,7 +67,7 @@ let init_logger ?verbosity (log_config : Node_config_file.log) =
let init_node ?sandbox (config : Node_config_file.t) = let init_node ?sandbox (config : Node_config_file.t) =
let patch_context json ctxt = let patch_context json ctxt =
let module Proto = (val Updater.get_exn genesis.protocol) in let module Proto = (val State.Registred_protocol.get_exn genesis.protocol) in
Lwt_utils.protect begin fun () -> Lwt_utils.protect begin fun () ->
Proto.configure_sandbox ctxt json Proto.configure_sandbox ctxt json
end >|= function end >|= function

View File

@ -515,7 +515,7 @@ module RPC = struct
| None -> Lwt.fail Not_found | None -> Lwt.fail Not_found
| Some { context = ctxt } -> | Some { context = ctxt } ->
Context.get_protocol ctxt >>= fun protocol_hash -> Context.get_protocol ctxt >>= fun protocol_hash ->
let (module Proto) = Updater.get_exn protocol_hash in let (module Proto) = State.Registred_protocol.get_exn protocol_hash in
Base58.complete str >>= fun l1 -> Base58.complete str >>= fun l1 ->
Proto.complete_b58prefix ctxt str >>= fun l2 -> Proto.complete_b58prefix ctxt str >>= fun l2 ->
Lwt.return (l1 @ l2) Lwt.return (l1 @ l2)
@ -525,7 +525,7 @@ module RPC = struct
| None -> Lwt.return None | None -> Lwt.return None
| Some rpc_context -> | Some rpc_context ->
Context.get_protocol rpc_context.context >>= fun protocol_hash -> Context.get_protocol rpc_context.context >>= fun protocol_hash ->
let (module Proto) = Updater.get_exn protocol_hash in let (module Proto) = State.Registred_protocol.get_exn protocol_hash in
let dir = RPC.map (fun () -> rpc_context) Proto.rpc_services in let dir = RPC.map (fun () -> rpc_context) Proto.rpc_services in
Lwt.return (Some (RPC.map (fun _ -> ()) dir)) Lwt.return (Some (RPC.map (fun _ -> ()) dir))

View File

@ -713,40 +713,13 @@ let inject_operation =
RPC.Path.(root / "inject_operation") RPC.Path.(root / "inject_operation")
let inject_protocol = let inject_protocol =
let proto_of_rpc =
List.map (fun (name, interface, implementation) ->
{ Protocol.name; interface; implementation })
in
let rpc_of_proto =
List.map (fun { Protocol.name; interface; implementation } ->
(name, interface, implementation))
in
let proto =
conv
rpc_of_proto
proto_of_rpc
(list
(obj3
(req "name"
(describe ~title:"OCaml module name"
string))
(opt "interface"
(describe
~description:"Content of the .mli file"
string))
(req "implementation"
(describe
~description:"Content of the .ml file"
string))))
in
RPC.service RPC.service
~description: ~description:
"Inject a protocol in node. Returns the ID of the protocol." "Inject a protocol in node. Returns the ID of the protocol."
~input: ~input:
(obj3 (obj3
(req "protocol" (req "protocol"
(describe ~title: "Tezos protocol" (describe ~title: "Tezos protocol" Protocol.encoding))
proto))
(dft "blocking" (dft "blocking"
(describe (describe
~description: ~description:

View File

@ -115,8 +115,7 @@ type prevalidation_state =
-> prevalidation_state -> prevalidation_state
and 'a proto = and 'a proto =
(module Updater.REGISTRED_PROTOCOL (module State.Registred_protocol.T with type validation_state = 'a)
with type validation_state = 'a)
let start_prevalidation ?proto_header ~predecessor ~timestamp () = let start_prevalidation ?proto_header ~predecessor ~timestamp () =
let { Block_header.shell = let { Block_header.shell =
@ -128,7 +127,7 @@ let start_prevalidation ?proto_header ~predecessor ~timestamp () =
Context.get_protocol predecessor_context >>= fun protocol -> Context.get_protocol predecessor_context >>= fun protocol ->
let predecessor = State.Block.hash predecessor in let predecessor = State.Block.hash predecessor in
let (module Proto) = let (module Proto) =
match Updater.get protocol with match State.Registred_protocol.get protocol with
| None -> assert false (* FIXME, this should not happen! *) | None -> assert false (* FIXME, this should not happen! *)
| Some protocol -> protocol in | Some protocol -> protocol in
Context.reset_test_network Context.reset_test_network

View File

@ -577,6 +577,50 @@ module Protocol = struct
end end
module Registred_protocol = struct
module type T = sig
val hash: Protocol_hash.t
include Updater.RAW_PROTOCOL with type error := error
and type 'a tzresult := 'a tzresult
val complete_b58prefix : Context.t -> string -> string list Lwt.t
end
let build_v1 hash =
let (module F) = Tezos_protocol_registerer.get_exn hash in
let module Name = struct
let name = Protocol_hash.to_b58check hash
end in
let module Env = Tezos_protocol_environment.Make(Name)() in
(module struct
let hash = hash
module P = F(Env)
include P
include Updater.WrapProtocol(Name)(Env)(P)
let complete_b58prefix = Env.Context.complete
end : T)
module VersionTable = Protocol_hash.Table
let versions : (module T) VersionTable.t =
VersionTable.create 20
let mem hash =
VersionTable.mem versions hash || Tezos_protocol_registerer.mem hash
let get_exn hash =
try VersionTable.find versions hash
with Not_found ->
let proto = build_v1 hash in
VersionTable.add versions hash proto ;
proto
let get hash =
try Some (get_exn hash)
with Not_found -> None
end
let read let read
?patch_context ?patch_context
~store_root ~store_root

View File

@ -190,3 +190,19 @@ module Protocol : sig
val list: global_state -> Protocol_hash.Set.t Lwt.t val list: global_state -> Protocol_hash.Set.t Lwt.t
end end
module Registred_protocol : sig
module type T = sig
val hash: Protocol_hash.t
include Updater.RAW_PROTOCOL with type error := error
and type 'a tzresult := 'a tzresult
val complete_b58prefix : Context.t -> string -> string list Lwt.t
end
val mem: Protocol_hash.t -> bool
val get: Protocol_hash.t -> (module T) option
val get_exn: Protocol_hash.t -> (module T)
end

View File

@ -83,7 +83,7 @@ let fetch_protocols v (block: State.Block.t) =
State.Block.context block >>= fun context -> State.Block.context block >>= fun context ->
let proto_updated = let proto_updated =
Context.get_protocol context >>= fun protocol_hash -> Context.get_protocol context >>= fun protocol_hash ->
match Updater.get protocol_hash with match State.Registred_protocol.get protocol_hash with
| Some _ -> return false | Some _ -> return false
| None -> fetch_protocol v protocol_hash | None -> fetch_protocol v protocol_hash
and test_proto_updated = and test_proto_updated =
@ -91,7 +91,7 @@ let fetch_protocols v (block: State.Block.t) =
| Not_running -> return false | Not_running -> return false
| Forking { protocol } | Forking { protocol }
| Running { protocol } -> | Running { protocol } ->
match Updater.get protocol with match State.Registred_protocol.get protocol with
| Some _ -> return false | Some _ -> return false
| None -> fetch_protocol v protocol in | None -> fetch_protocol v protocol in
proto_updated >>=? fun proto_updated -> proto_updated >>=? fun proto_updated ->
@ -300,7 +300,7 @@ let apply_block net_state db
end >>=? fun () -> end >>=? fun () ->
Context.get_protocol pred_context >>= fun pred_protocol_hash -> Context.get_protocol pred_context >>= fun pred_protocol_hash ->
begin begin
match Updater.get pred_protocol_hash with match State.Registred_protocol.get pred_protocol_hash with
| None -> fail Unknown_protocol | None -> fail Unknown_protocol
| Some p -> return p | Some p -> return p
end >>=? fun (module Proto) -> end >>=? fun (module Proto) ->

View File

@ -7,9 +7,10 @@
(* *) (* *)
(**************************************************************************) (**************************************************************************)
module Make(Param : sig val name: string end)() = struct (* module Make(Param : sig val name: string end)() = struct *)
include Environment.Make(Param)() module V1 = struct
include Environment.Make(struct let name = "proto.alpha" end)()
let __cast (type error) (module X : PACKED_PROTOCOL) = let __cast (type error) (module X : PACKED_PROTOCOL) =
(module X : Protocol_sigs.PACKED_PROTOCOL) (module X : Protocol_sigs.PACKED_PROTOCOL)

View File

@ -1,87 +0,0 @@
(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2016. *)
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
(** Tezos Protocol Environment - Protocol Implementation Signature *)
open Tezos_data
(* See `src/proto/updater.mli` for documentation. *)
type validation_result = {
context: Context.t ;
fitness: Fitness.t ;
message: string option ;
max_operations_ttl: int ;
}
type rpc_context = {
block_hash: Block_hash.t ;
block_header: Block_header.t ;
operation_hashes: unit -> Operation_hash.t list list Lwt.t ;
operations: unit -> Operation.t list list Lwt.t ;
context: Context.t ;
}
module type PROTOCOL = sig
type error = ..
type 'a tzresult = ('a, error list) result
val max_operation_data_length : int
val max_block_length : int
val max_number_of_operations : int
type operation
val parse_operation :
Operation_hash.t -> Operation.t -> operation tzresult
val compare_operations : operation -> operation -> int
type validation_state
val current_context : validation_state -> Context.t tzresult Lwt.t
val precheck_block :
ancestor_context: Context.t ->
ancestor_timestamp: Time.t ->
Block_header.t ->
unit tzresult Lwt.t
val begin_application :
predecessor_context: Context.t ->
predecessor_timestamp: Time.t ->
predecessor_fitness: Fitness.t ->
Block_header.t ->
validation_state tzresult Lwt.t
val begin_construction :
predecessor_context: Context.t ->
predecessor_timestamp: Time.t ->
predecessor_level: Int32.t ->
predecessor_fitness: Fitness.t ->
predecessor: Block_hash.t ->
timestamp: Time.t ->
?proto_header: MBytes.t ->
unit -> validation_state tzresult Lwt.t
val apply_operation :
validation_state -> operation -> validation_state tzresult Lwt.t
val finalize_block :
validation_state -> validation_result tzresult Lwt.t
val rpc_services : rpc_context RPC.directory
val configure_sandbox :
Context.t -> Data_encoding.json option -> Context.t tzresult Lwt.t
end
module type PACKED_PROTOCOL = sig
val hash : Protocol_hash.t
include PROTOCOL
val error_encoding : error Data_encoding.t
val classify_errors : error list -> [ `Branch | `Temporary | `Permanent ]
val pp : Format.formatter -> error -> unit
val complete_b58prefix : Context.t -> string -> string list Lwt.t
end

View File

@ -6,62 +6,3 @@
(* All rights reserved. No warranty, explicit or implicit, provided. *) (* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *) (* *)
(**************************************************************************) (**************************************************************************)
module Make(Proto : Protocol_sigs.PACKED_PROTOCOL) = struct
type proto_error = Proto.error
type Error_monad.error += Ecoproto_error of Proto.error list
let wrap_error = function
| Ok _ as ok -> ok
| Error errors -> Error [Ecoproto_error errors]
let () =
let id = Format.asprintf "Ecoproto.%a" Protocol_hash.pp Proto.hash in
Error_monad.register_wrapped_error_kind
(fun ecoerrors -> Proto.classify_errors ecoerrors)
~id ~title:"Error returned by the protocol"
~description:"Wrapped error for the economic protocol."
~pp:(fun ppf ->
Format.fprintf ppf
"@[<v 2>Economic error:@ %a@]"
(Format.pp_print_list Proto.pp))
Data_encoding.(obj1 (req "ecoproto" (list Proto.error_encoding)))
(function Ecoproto_error ecoerrors -> Some ecoerrors
| _ -> None )
(function ecoerrors -> Ecoproto_error ecoerrors)
end
let register (module Proto : Protocol_sigs.PACKED_PROTOCOL) =
let module V = struct
include Proto
include Make(Proto)
let precheck_block
~ancestor_context ~ancestor_timestamp
raw_block =
precheck_block
~ancestor_context ~ancestor_timestamp
raw_block >|= wrap_error
let begin_application
~predecessor_context ~predecessor_timestamp
~predecessor_fitness
raw_block =
begin_application
~predecessor_context ~predecessor_timestamp
~predecessor_fitness
raw_block >|= wrap_error
let begin_construction
~predecessor_context ~predecessor_timestamp
~predecessor_level ~predecessor_fitness
~predecessor ~timestamp ?proto_header () =
begin_construction
~predecessor_context ~predecessor_timestamp
~predecessor_level ~predecessor_fitness
~predecessor ~timestamp ?proto_header () >|= wrap_error
let current_context c =
current_context c >|= wrap_error
let apply_operation c o =
apply_operation c o >|= wrap_error
let finalize_block c = finalize_block c >|= wrap_error
let parse_operation h b = parse_operation h b |> wrap_error
let configure_sandbox c j =
configure_sandbox c j >|= wrap_error
end in
Updater.register Proto.hash (module V)

View File

@ -7,9 +7,3 @@
(* *) (* *)
(**************************************************************************) (**************************************************************************)
module Make(Proto : Protocol_sigs.PACKED_PROTOCOL) : sig
type Error_monad.error += Ecoproto_error of Proto.error list
val wrap_error: 'a Proto.tzresult -> 'a tzresult
end
val register: (module Protocol_sigs.PACKED_PROTOCOL) -> unit

View File

@ -257,11 +257,16 @@ module Make(Param : sig val name: string end)() = struct
module Persist = Persist module Persist = Persist
module RPC = RPC module RPC = RPC
module Fitness = Fitness module Fitness = Fitness
module Updater = Updater
module Error_monad = struct module Error_monad = struct
type error_category = [ `Branch | `Temporary | `Permanent ] type error_category = [ `Branch | `Temporary | `Permanent ]
include Error_monad.Make() include Error_monad.Make()
end end
module Updater = struct
include Updater
module type PROTOCOL =
RAW_PROTOCOL with type error := Error_monad.error
and type 'a tzresult := 'a Error_monad.tzresult
end
module Logging = Logging.Make(Param) module Logging = Logging.Make(Param)
module Base58 = struct module Base58 = struct
include Base58 include Base58
@ -275,14 +280,4 @@ module Make(Param : sig val name: string end)() = struct
let register_resolver = Base58.register_resolver let register_resolver = Base58.register_resolver
let complete ctxt s = Base58.complete ctxt s let complete ctxt s = Base58.complete ctxt s
end end
module type PACKED_PROTOCOL = sig
val hash : Protocol_hash.t
include Updater.PROTOCOL
val error_encoding : error Data_encoding.t
val classify_errors : error list -> [ `Branch | `Temporary | `Permanent ]
val pp : Format.formatter -> error -> unit
val complete_b58prefix : Context.t -> string -> string list Lwt.t
end
end end

View File

@ -11,14 +11,14 @@ open Logging.Updater
let (//) = Filename.concat let (//) = Filename.concat
type validation_result = Protocol_sigs.validation_result = { type validation_result = {
context: Context.t ; context: Context.t ;
fitness: Fitness.t ; fitness: Fitness.t ;
message: string option ; message: string option ;
max_operations_ttl: int ; max_operations_ttl: int ;
} }
type rpc_context = Protocol_sigs.rpc_context = { type rpc_context = {
block_hash: Block_hash.t ; block_hash: Block_hash.t ;
block_header: Block_header.t ; block_header: Block_header.t ;
operation_hashes: unit -> Operation_hash.t list list Lwt.t ; operation_hashes: unit -> Operation_hash.t list list Lwt.t ;
@ -26,33 +26,50 @@ type rpc_context = Protocol_sigs.rpc_context = {
context: Context.t ; context: Context.t ;
} }
module type PROTOCOL = Protocol_sigs.PROTOCOL module type RAW_PROTOCOL = sig
module type PACKED_PROTOCOL = Protocol_sigs.PACKED_PROTOCOL type error = ..
module type REGISTRED_PROTOCOL = sig type 'a tzresult
val hash: Protocol_hash.t type operation
include PROTOCOL with type error := error val max_operation_data_length: int
and type 'a tzresult := 'a tzresult val max_block_length: int
val complete_b58prefix : Context.t -> string -> string list Lwt.t val max_number_of_operations: int
val parse_operation:
Operation_hash.t -> Operation.t -> operation tzresult
val compare_operations: operation -> operation -> int
type validation_state
val current_context: validation_state -> Context.t tzresult Lwt.t
val precheck_block:
ancestor_context: Context.t ->
ancestor_timestamp: Time.t ->
Block_header.t ->
unit tzresult Lwt.t
val begin_application:
predecessor_context: Context.t ->
predecessor_timestamp: Time.t ->
predecessor_fitness: Fitness.t ->
Block_header.t ->
validation_state tzresult Lwt.t
val begin_construction:
predecessor_context: Context.t ->
predecessor_timestamp: Time.t ->
predecessor_level: Int32.t ->
predecessor_fitness: Fitness.t ->
predecessor: Block_hash.t ->
timestamp: Time.t ->
?proto_header: MBytes.t ->
unit -> validation_state tzresult Lwt.t
val apply_operation:
validation_state -> operation -> validation_state tzresult Lwt.t
val finalize_block:
validation_state -> validation_result tzresult Lwt.t
val rpc_services: rpc_context RPC.directory
val configure_sandbox:
Context.t -> Data_encoding.json option -> Context.t tzresult Lwt.t
end end
(** Version table *)
module VersionTable = Protocol_hash.Table
let versions : ((module REGISTRED_PROTOCOL)) VersionTable.t =
VersionTable.create 20
let register hash proto =
VersionTable.add versions hash proto
let activate = Context.set_protocol let activate = Context.set_protocol
let fork_test_network = Context.fork_test_network let fork_test_network = Context.fork_test_network
let get_exn hash = VersionTable.find versions hash
let get hash =
try Some (get_exn hash)
with Not_found -> None
(** Compiler *) (** Compiler *)
let datadir = ref None let datadir = ref None
@ -82,13 +99,17 @@ let create_files dir units =
let files = List.concat files in let files = List.concat files in
Lwt.return files Lwt.return files
let extract dirname hash units = let extract dir ?hash (p: Protocol.t) =
let source_dir = dirname // Protocol_hash.to_short_b58check hash // "src" in create_files dir p.components >>= fun _files ->
create_files source_dir units >|= fun _files -> Tezos_compiler.Meta.to_file dir
Tezos_compiler.Meta.to_file source_dir ~hash ?hash
(List.map (fun {Protocol.name} -> String.capitalize_ascii name) units) ~env_version:p.expected_env
(List.map (fun {Protocol.name} -> String.capitalize_ascii name) p.components) ;
Lwt.return_unit
let do_compile hash units = let do_compile hash p =
assert (p.Protocol.expected_env = V1) ;
let units = p.components in
let datadir = get_datadir () in let datadir = get_datadir () in
let source_dir = datadir // Protocol_hash.to_short_b58check hash // "src" in let source_dir = datadir // Protocol_hash.to_short_b58check hash // "src" in
let log_file = datadir // Protocol_hash.to_short_b58check hash // "LOG" in let log_file = datadir // Protocol_hash.to_short_b58check hash // "LOG" in
@ -120,13 +141,81 @@ let do_compile hash units =
(Dynlink.error_message err) plugin_file; (Dynlink.error_message err) plugin_file;
Lwt.return false Lwt.return false
let compile hash units = let compile hash p =
if VersionTable.mem versions hash then if Tezos_protocol_registerer.mem hash then
Lwt.return true Lwt.return true
else begin else begin
do_compile hash units >>= fun success -> do_compile hash p >>= fun success ->
let loaded = VersionTable.mem versions hash in let loaded = Tezos_protocol_registerer.mem hash in
if success && not loaded then if success && not loaded then
log_error "Internal error while compiling %a" Protocol_hash.pp hash; log_error "Internal error while compiling %a" Protocol_hash.pp hash;
Lwt.return loaded Lwt.return loaded
end end
module type REGISTRED_PROTOCOL = sig
val hash: Protocol_hash.t
include RAW_PROTOCOL with type error := error
and type 'a tzresult := 'a tzresult
val complete_b58prefix : Context.t -> string -> string list Lwt.t
end
module WrapProtocol
(Name : sig val name: string end)
(Env : Tezos_protocol_environment_sigs_v1.T
with type Format.formatter = Format.formatter
and type 'a Data_encoding.t = 'a Data_encoding.t
and type 'a Lwt.t = 'a Lwt.t
and type ('a, 'b) Pervasives.result = ('a, 'b) Pervasives.result)
(P : Env.Updater.PROTOCOL) = struct
type proto_error = Env.Error_monad.error
type error += Ecoproto_error of proto_error list
let wrap_error = function
| Ok _ as ok -> ok
| Error errors -> Error [Ecoproto_error errors]
let () =
let id = Format.asprintf "Ecoproto.%s" Name.name in
Error_monad.register_wrapped_error_kind
(fun ecoerrors -> Env.Error_monad.classify_errors ecoerrors)
~id ~title:"Error returned by the protocol"
~description:"Wrapped error for the economic protocol."
~pp:(fun ppf ->
Format.fprintf ppf
"@[<v 2>Economic error:@ %a@]"
(Format.pp_print_list Env.Error_monad.pp))
Data_encoding.(obj1 (req "ecoproto"
(list (Env.Error_monad.error_encoding ()))))
(function Ecoproto_error ecoerrors -> Some ecoerrors
| _ -> None )
(function ecoerrors -> Ecoproto_error ecoerrors)
include P
let precheck_block
~ancestor_context ~ancestor_timestamp
raw_block =
precheck_block
~ancestor_context ~ancestor_timestamp
raw_block >|= wrap_error
let begin_application
~predecessor_context ~predecessor_timestamp
~predecessor_fitness
raw_block =
begin_application
~predecessor_context ~predecessor_timestamp
~predecessor_fitness
raw_block >|= wrap_error
let begin_construction
~predecessor_context ~predecessor_timestamp
~predecessor_level ~predecessor_fitness
~predecessor ~timestamp ?proto_header () =
begin_construction
~predecessor_context ~predecessor_timestamp
~predecessor_level ~predecessor_fitness
~predecessor ~timestamp ?proto_header () >|= wrap_error
let current_context c =
current_context c >|= wrap_error
let apply_operation c o =
apply_operation c o >|= wrap_error
let finalize_block c = finalize_block c >|= wrap_error
let parse_operation h b = parse_operation h b |> wrap_error
let configure_sandbox c j =
configure_sandbox c j >|= wrap_error
end

View File

@ -7,16 +7,16 @@
(* *) (* *)
(**************************************************************************) (**************************************************************************)
(* See `src/proto/updater.mli` for documentation. *) (* See `src/environment/v1//updater.mli` for documentation. *)
type validation_result = Protocol_sigs.validation_result = { type validation_result = {
context: Context.t ; context: Context.t ;
fitness: Fitness.t ; fitness: Fitness.t ;
message: string option ; message: string option ;
max_operations_ttl: int ; max_operations_ttl: int ;
} }
type rpc_context = Protocol_sigs.rpc_context = { type rpc_context = {
block_hash: Block_hash.t ; block_hash: Block_hash.t ;
block_header: Block_header.t ; block_header: Block_header.t ;
operation_hashes: unit -> Operation_hash.t list list Lwt.t ; operation_hashes: unit -> Operation_hash.t list list Lwt.t ;
@ -24,26 +24,80 @@ type rpc_context = Protocol_sigs.rpc_context = {
context: Context.t ; context: Context.t ;
} }
module type PROTOCOL = Protocol_sigs.PROTOCOL module type RAW_PROTOCOL = sig
module type PACKED_PROTOCOL = Protocol_sigs.PACKED_PROTOCOL type error = ..
module type REGISTRED_PROTOCOL = sig type 'a tzresult
val hash: Protocol_hash.t type operation
(* exception Ecoproto_error of error list *) val max_operation_data_length: int
include PROTOCOL with type error := error val max_block_length: int
and type 'a tzresult := 'a tzresult val max_number_of_operations: int
val complete_b58prefix : Context.t -> string -> string list Lwt.t val parse_operation:
Operation_hash.t -> Operation.t -> operation tzresult
val compare_operations: operation -> operation -> int
type validation_state
val current_context: validation_state -> Context.t tzresult Lwt.t
val precheck_block:
ancestor_context: Context.t ->
ancestor_timestamp: Time.t ->
Block_header.t ->
unit tzresult Lwt.t
val begin_application:
predecessor_context: Context.t ->
predecessor_timestamp: Time.t ->
predecessor_fitness: Fitness.t ->
Block_header.t ->
validation_state tzresult Lwt.t
val begin_construction:
predecessor_context: Context.t ->
predecessor_timestamp: Time.t ->
predecessor_level: Int32.t ->
predecessor_fitness: Fitness.t ->
predecessor: Block_hash.t ->
timestamp: Time.t ->
?proto_header: MBytes.t ->
unit -> validation_state tzresult Lwt.t
val apply_operation:
validation_state -> operation -> validation_state tzresult Lwt.t
val finalize_block:
validation_state -> validation_result tzresult Lwt.t
val rpc_services: rpc_context RPC.directory
val configure_sandbox:
Context.t -> Data_encoding.json option -> Context.t tzresult Lwt.t
end end
val extract: Lwt_io.file_name -> Protocol_hash.t -> Protocol.t -> unit Lwt.t
val compile: Protocol_hash.t -> Protocol.t -> bool Lwt.t val compile: Protocol_hash.t -> Protocol.t -> bool Lwt.t
val activate: Context.t -> Protocol_hash.t -> Context.t Lwt.t val activate: Context.t -> Protocol_hash.t -> Context.t Lwt.t
val fork_test_network: val fork_test_network:
Context.t -> protocol:Protocol_hash.t -> expiration:Time.t -> Context.t Lwt.t Context.t -> protocol:Protocol_hash.t -> expiration:Time.t -> Context.t Lwt.t
val register: Protocol_hash.t -> (module REGISTRED_PROTOCOL) -> unit val extract: Lwt_io.file_name -> ?hash:Protocol_hash.t -> Protocol.t -> unit Lwt.t
val get: Protocol_hash.t -> (module REGISTRED_PROTOCOL) option
val get_exn: Protocol_hash.t -> (module REGISTRED_PROTOCOL)
val init: string -> unit val init: string -> unit
module WrapProtocol(Name : sig val name: string end)
(Env : Tezos_protocol_environment_sigs_v1.T
with type Format.formatter = Format.formatter
and type 'a Data_encoding.t = 'a Data_encoding.t
and type 'a Lwt.t = 'a Lwt.t
and type ('a, 'b) Pervasives.result = ('a, 'b) result
and type Hash.Net_id.t = Hash.Net_id.t
and type Hash.Block_hash.t = Hash.Block_hash.t
and type Hash.Operation_hash.t = Hash.Operation_hash.t
and type Hash.Operation_list_list_hash.t = Hash.Operation_list_list_hash.t
and type Context.t = Context.t
and type Time.t = Time.t
and type MBytes.t = MBytes.t
and type Tezos_data.Operation.shell_header = Tezos_data.Operation.shell_header
and type Tezos_data.Operation.t = Tezos_data.Operation.t
and type Tezos_data.Block_header.shell_header = Tezos_data.Block_header.shell_header
and type Tezos_data.Block_header.t = Tezos_data.Block_header.t
and type 'a RPC.directory = 'a RPC.directory
and type Updater.validation_result = validation_result
and type Updater.rpc_context = rpc_context)
(P : Env.Updater.PROTOCOL) : sig
include RAW_PROTOCOL with type error := error
and type 'a tzresult := 'a tzresult
and type operation := P.operation
and type validation_state := P.validation_state
type error += Ecoproto_error of Env.Error_monad.error list
val wrap_error: 'a Env.Error_monad.tzresult -> 'a tzresult
end

View File

@ -0,0 +1,67 @@
(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2016. *)
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
let dump_file oc file =
let ic = open_in file in
let buflen = 8096 in
let buf = Bytes.create buflen in
let rec loop () =
let len = input ic buf 0 buflen in
if len <> 0 then begin
Printf.fprintf oc "%s"
(if len = buflen then Bytes.unsafe_to_string buf else Bytes.sub_string buf 0 len) ;
loop ()
end
in
loop () ;
close_in ic
let include_ml oc file =
let unit =
String.capitalize_ascii
(Filename.chop_extension (Filename.basename file)) in
(* FIXME insert .mli... *)
Printf.fprintf oc "module %s " unit ;
if Sys.file_exists (file ^ "i") then begin
Printf.fprintf oc ": sig\n" ;
Printf.fprintf oc "# 1 %S\n" (file ^ "i");
dump_file oc (file ^ "i") ;
Printf.fprintf oc "end " ;
end ;
Printf.fprintf oc "= struct\n" ;
Printf.fprintf oc "# 1 %S\n" file ;
dump_file oc file ;
Printf.fprintf oc "end\n%!"
let opened_modules = [
"Tezos_protocol_environment" ;
"Pervasives" ;
"Error_monad" ;
"Hash" ;
"Logging" ;
"Tezos_data" ;
]
let dump oc files =
Printf.fprintf oc
"module Make (Tezos_protocol_environment : Tezos_protocol_environment_sigs_v1.T) = struct\n" ;
Printf.fprintf oc "[@@@ocaml.warning \"-33\"]\n" ;
List.iter (Printf.fprintf oc "open %s\n") opened_modules ;
Printf.fprintf oc "[@@@ocaml.warning \"+33\"]\n" ;
for i = 0 to Array.length files - 1 do
include_ml oc files.(i) ;
done ;
Printf.fprintf oc " include %s\n"
(String.capitalize_ascii
(Filename.basename
(Filename.chop_extension files.(Array.length files - 1)))) ;
Printf.fprintf oc "end\n%!"
let main () =
dump stdout (Array.sub Sys.argv 1 (Array.length Sys.argv - 2))

View File

@ -0,0 +1,12 @@
(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2016. *)
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
val dump: out_channel -> string array -> unit
val main: unit -> unit

10
src/packer_main.ml Normal file
View File

@ -0,0 +1,10 @@
(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2016. *)
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
let () = Tezos_protocol_packer.main ()

View File

@ -9,5 +9,4 @@
(** Tezos Protocol Implementation - Protocol Signature Instance *) (** Tezos Protocol Implementation - Protocol Signature Instance *)
include Updater.PROTOCOL with type error := error include Updater.PROTOCOL
and type 'a tzresult := 'a tzresult

21
src/utils/.merlin Normal file
View File

@ -0,0 +1,21 @@
REC
B ../minutils
S ../minutils
B .
S .
# minutils
PKG cstruct
PKG lwt
PKG ocplib-json-typed.bson
PKG ocplib-resto.directory
# utils
PKG zarith
PKG base64
PKG calendar
PKG ezjsonm
PKG ipaddr.unix
PKG lwt.unix
PKG mtime.clock.os
PKG nocrypto
PKG sodium
PKG zarith

View File

@ -225,7 +225,10 @@ end
module Protocol = struct module Protocol = struct
type t = component list type t = {
expected_env: env_version ;
components: component list ;
}
and component = { and component = {
name: string ; name: string ;
@ -233,6 +236,8 @@ module Protocol = struct
implementation: string ; implementation: string ;
} }
and env_version = V1
let component_encoding = let component_encoding =
let open Data_encoding in let open Data_encoding in
conv conv
@ -245,7 +250,21 @@ module Protocol = struct
(opt "interface" string) (opt "interface" string)
(req "implementation" string)) (req "implementation" string))
let encoding = Data_encoding.list component_encoding let env_version_encoding =
let open Data_encoding in
conv
(function V1 -> 0)
(function 0 -> V1 | _ -> failwith "unexpected environment version")
int16
let encoding =
let open Data_encoding in
conv
(fun { expected_env ; components } -> (expected_env, components))
(fun (expected_env, components) -> { expected_env ; components })
(obj2
(req "expected_env_version" env_version_encoding)
(req "components" (list component_encoding)))
let pp fmt op = let pp fmt op =
Format.pp_print_string fmt @@ Format.pp_print_string fmt @@

View File

@ -82,7 +82,10 @@ end
module Protocol : sig module Protocol : sig
type t = component list type t = {
expected_env: env_version ;
components: component list ;
}
and component = { and component = {
name: string ; name: string ;
@ -90,7 +93,10 @@ module Protocol : sig
implementation: string ; implementation: string ;
} }
and env_version = V1
val component_encoding: component Data_encoding.t val component_encoding: component Data_encoding.t
val env_version_encoding: env_version Data_encoding.t
include HASHABLE_DATA with type t := t include HASHABLE_DATA with type t := t
and type hash := Protocol_hash.t and type hash := Protocol_hash.t

View File

@ -36,15 +36,13 @@ ${TESTLIB}: $(shell find ${SRCDIR}/../test/lib -name \*.ml -or -name \*.mli)
## External packages ## External packages
############################################################################ ############################################################################
PACKERLIB := ${SRCDIR}/packer.cmxa
MINUTILSLIB := ${SRCDIR}/minutils.cmxa MINUTILSLIB := ${SRCDIR}/minutils.cmxa
UTILSLIB := ${SRCDIR}/utils.cmxa UTILSLIB := ${SRCDIR}/utils.cmxa
COMPILERLIB := ${SRCDIR}/compiler.cmxa COMPILERLIB := ${SRCDIR}/compiler.cmxa
NODELIB := ${SRCDIR}/node.cmxa NODELIB := ${SRCDIR}/node.cmxa
CLIENTLIB := ${SRCDIR}/client.cmxa \ CLIENTLIB := ${SRCDIR}/client.cmxa \
$(patsubst ${SRCDIR}/client/embedded/%/, \
${SRCDIR}/proto/client_embedded_proto_%.cmxa, \
$(shell ls -d ${SRCDIR}/client/embedded/*/)) \
$(patsubst ${SRCDIR}/client/embedded/%/, \ $(patsubst ${SRCDIR}/client/embedded/%/, \
${SRCDIR}/client/embedded/client_%.cmx, \ ${SRCDIR}/client/embedded/client_%.cmx, \
$(shell ls -d ${SRCDIR}/client/embedded/*/)) $(shell ls -d ${SRCDIR}/client/embedded/*/))

View File

@ -10,7 +10,7 @@ include ../Makefile.shared
SOURCE_DIRECTORIES := ${NODE_SOURCE_DIRECTORIES} ../lib SOURCE_DIRECTORIES := ${NODE_SOURCE_DIRECTORIES} ../lib
LIB := ${MINUTILSLIB} ${UTILSLIB} ${COMPILERLIB} ${NODELIB} ${TESTLIB} LIB := ${PACKERLIB} ${MINUTILSLIB} ${UTILSLIB} ${COMPILERLIB} ${NODELIB} ${TESTLIB}
PACKAGES := \ PACKAGES := \
${NODE_PACKAGES} \ ${NODE_PACKAGES} \

View File

@ -1,6 +1,8 @@
REC REC
S . S .
B . B .
S ../../src/packer
B ../../src/packer
S ../../src/minutils S ../../src/minutils
B ../../src/minutils B ../../src/minutils
S ../../src/utils S ../../src/utils

View File

@ -18,8 +18,8 @@ SOURCE_DIRECTORIES := \
../lib ../lib
LIB := \ LIB := \
${MINUTILSLIB} ${UTILSLIB} ${COMPILERLIB} \ ${PACKERLIB} ${MINUTILSLIB} ${UTILSLIB} ${COMPILERLIB} \
${NODELIB} ${CLIENTLIB} ${EMBEDDED_CLIENT_PROTOCOLS} ${TESTLIB} ${NODELIB} ${EMBEDDED_CLIENT_PROTOCOLS} ${CLIENTLIB} ${TESTLIB}
PACKAGES := \ PACKAGES := \
${CLIENT_PACKAGES} \ ${CLIENT_PACKAGES} \
@ -27,12 +27,8 @@ PACKAGES := \
OPENED_MODULES := \ OPENED_MODULES := \
${CLIENT_OPENED_MODULES} \ ${CLIENT_OPENED_MODULES} \
Environment Client_embedded_proto_alpha Tezos_context Client_alpha Client_proto_alpha Tezos_context
${SRCDIR}/client/embedded/alpha/_tzbuild/%.cmi: ${SRCDIR}/proto/alpha/%.mli
${MAKE} -C ${SRCDIR} proto/client_embedded_proto_alpha.cmxa
${SRCDIR}/client/embedded/alpha/_tzbuild/%.cmx: ${SRCDIR}/proto/alpha/%.ml
${MAKE} -C ${SRCDIR} proto/client_embedded_proto_alpha.cmxa
${SRCDIR}/client/embedded/alpha/%.cmi: ${SRCDIR}/client/embedded/alpha/%.mli ${SRCDIR}/client/embedded/alpha/%.cmi: ${SRCDIR}/client/embedded/alpha/%.mli
${MAKE} -C ${SRCDIR} client/embedded/client_alpha.cmx ${MAKE} -C ${SRCDIR} client/embedded/client_alpha.cmx
${SRCDIR}/client/embedded/alpha/%.cmx: ${SRCDIR}/client/embedded/alpha/%.ml ${SRCDIR}/client/embedded/alpha/%.cmx: ${SRCDIR}/client/embedded/alpha/%.ml

View File

@ -7,9 +7,7 @@
(* *) (* *)
(**************************************************************************) (**************************************************************************)
open Client_embedded_proto_alpha module Ed25519 = Environment.Ed25519
open Tezos_context
open Client_alpha
let (//) = Filename.concat let (//) = Filename.concat
@ -316,7 +314,7 @@ module Assert = struct
equal_pkh ~msg actual_delegate expected_delegate equal_pkh ~msg actual_delegate expected_delegate
let ecoproto_error f = function let ecoproto_error f = function
| Register_client_embedded_proto_alpha.Ecoproto_error errors -> | Ecoproto_error errors ->
List.exists f errors List.exists f errors
| _ -> false | _ -> false
@ -341,7 +339,7 @@ module Assert = struct
Assert.contain_error ~msg ~f:(ecoproto_error (fun _ -> true)) Assert.contain_error ~msg ~f:(ecoproto_error (fun _ -> true))
let unknown_contract ~msg = let unknown_contract ~msg =
let open Client_embedded_proto_alpha.Storage_functors in let open Storage_functors in
Assert.contain_error ~msg ~f:begin ecoproto_error (function Assert.contain_error ~msg ~f:begin ecoproto_error (function
| Storage_error _ -> true | Storage_error _ -> true
| _ -> false) | _ -> false)
@ -431,7 +429,7 @@ module Mining = struct
let endorsement_reward block = let endorsement_reward block =
Client_proto_rpcs.Header.priority rpc_config block >>=? fun prio -> Client_proto_rpcs.Header.priority rpc_config block >>=? fun prio ->
Mining.endorsement_reward ~block_priority:prio >|= Mining.endorsement_reward ~block_priority:prio >|=
Register_client_embedded_proto_alpha.wrap_error >>|? wrap_error >>|?
Tez.to_cents Tez.to_cents
end end

View File

@ -7,9 +7,7 @@
(* *) (* *)
(**************************************************************************) (**************************************************************************)
open Client_embedded_proto_alpha module Ed25519 = Environment.Ed25519
open Tezos_context
open Client_alpha
val init : ?sandbox:string -> unit -> (int * Block_hash.t) tzresult Lwt.t val init : ?sandbox:string -> unit -> (int * Block_hash.t) tzresult Lwt.t
(** [init ()] sets up the test environment, and return the PID of (** [init ()] sets up the test environment, and return the PID of
@ -155,12 +153,12 @@ module Assert : sig
val failed_to_preapply: val failed_to_preapply:
msg:string -> msg:string ->
?op:Client_node_rpcs.operation -> ?op:Client_node_rpcs.operation ->
(Register_client_embedded_proto_alpha.Packed_protocol.error -> (Environment.Error_monad.error ->
bool) -> bool) ->
'a tzresult -> unit 'a tzresult -> unit
val ecoproto_error: val ecoproto_error:
(Register_client_embedded_proto_alpha.Packed_protocol.error -> bool) -> (Environment.Error_monad.error -> bool) ->
error -> bool error -> bool
val generic_economic_error : msg:string -> 'a tzresult -> unit val generic_economic_error : msg:string -> 'a tzresult -> unit

View File

@ -7,10 +7,6 @@
(* *) (* *)
(**************************************************************************) (**************************************************************************)
open Client_embedded_proto_alpha
open Tezos_context
open Client_alpha
module Helpers = Proto_alpha_helpers module Helpers = Proto_alpha_helpers
module Assert = Helpers.Assert module Assert = Helpers.Assert

View File

@ -7,9 +7,6 @@
(* *) (* *)
(**************************************************************************) (**************************************************************************)
open Client_embedded_proto_alpha
open Tezos_context
module Helpers = Proto_alpha_helpers module Helpers = Proto_alpha_helpers
module Assert = Helpers.Assert module Assert = Helpers.Assert

View File

@ -7,9 +7,6 @@
(* *) (* *)
(**************************************************************************) (**************************************************************************)
open Client_embedded_proto_alpha
open Tezos_context
module Helpers = Proto_alpha_helpers module Helpers = Proto_alpha_helpers
module Assert = Helpers.Assert module Assert = Helpers.Assert

View File

@ -7,8 +7,6 @@
(* *) (* *)
(**************************************************************************) (**************************************************************************)
open Client_embedded_proto_alpha
open Tezos_context
open Proto_alpha_helpers open Proto_alpha_helpers
let demo_protocol = let demo_protocol =

View File

@ -10,7 +10,7 @@ include ../Makefile.shared
SOURCE_DIRECTORIES := ${NODE_SOURCE_DIRECTORIES} ../lib SOURCE_DIRECTORIES := ${NODE_SOURCE_DIRECTORIES} ../lib
LIB := ${MINUTILSLIB} ${UTILSLIB} ${COMPILERLIB} ${NODELIB} ${EMBEDDED_NODE_PROTOCOLS} ${TESTLIB} LIB := ${PACKERLIB} ${MINUTILSLIB} ${UTILSLIB} ${COMPILERLIB} ${NODELIB} ${EMBEDDED_NODE_PROTOCOLS} ${TESTLIB}
PACKAGES := \ PACKAGES := \
${NODE_PACKAGES} \ ${NODE_PACKAGES} \

View File

@ -25,7 +25,7 @@ let genesis_protocol =
let genesis_time = let genesis_time =
Time.of_seconds 0L Time.of_seconds 0L
module Proto = (val Updater.get_exn genesis_protocol) module Proto = (val State.Registred_protocol.get_exn genesis_protocol)
let genesis : State.Net.genesis = { let genesis : State.Net.genesis = {
time = genesis_time ; time = genesis_time ;