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:
parent
dc74acba56
commit
370112f9b8
7
.gitignore
vendored
7
.gitignore
vendored
@ -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
|
||||||
|
50
src/.merlin
50
src/.merlin
@ -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
|
|
||||||
|
211
src/Makefile
211
src/Makefile
@ -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
|
||||||
|
@ -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 \
|
||||||
|
)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 ()
|
||||||
) ;
|
) ;
|
||||||
|
@ -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 $@)
|
||||||
|
@ -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::
|
||||||
|
@ -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
|
||||||
|
16
src/client/embedded/alpha/client_proto_alpha.ml
Normal file
16
src/client/embedded/alpha/client_proto_alpha.ml
Normal 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)
|
@ -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 (_, _, _)
|
||||||
|
@ -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 :=
|
||||||
|
16
src/client/embedded/demo/client_proto_demo.ml
Normal file
16
src/client/embedded/demo/client_proto_demo.ml
Normal 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)
|
@ -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 ;
|
||||||
|
@ -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:
|
||||||
|
16
src/client/embedded/genesis/client_proto_genesis.ml
Normal file
16
src/client/embedded/genesis/client_proto_genesis.ml
Normal 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)
|
@ -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 ->
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
(* *)
|
(* *)
|
||||||
(**************************************************************************)
|
(**************************************************************************)
|
||||||
|
|
||||||
|
open Client_proto_genesis
|
||||||
|
|
||||||
val mine:
|
val mine:
|
||||||
Client_rpcs.config ->
|
Client_rpcs.config ->
|
||||||
?timestamp: Time.t ->
|
?timestamp: Time.t ->
|
||||||
|
@ -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
|
||||||
|
@ -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
|
|
@ -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
|
||||||
|
|
||||||
|
@ -1 +0,0 @@
|
|||||||
../../node/updater/proto_environment.mli
|
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
27
src/compiler/tezos_protocol_registerer.ml
Normal file
27
src/compiler/tezos_protocol_registerer.ml
Normal 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
|
17
src/compiler/tezos_protocol_registerer.mli
Normal file
17
src/compiler/tezos_protocol_registerer.mli
Normal 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
1
src/environment/.merlin
Normal file
@ -0,0 +1 @@
|
|||||||
|
REC
|
51
src/environment/tezos_protocol_environment_sigs_packer.ml
Normal file
51
src/environment/tezos_protocol_environment_sigs_packer.ml
Normal 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%!"
|
1
src/environment/v1/.merlin
Normal file
1
src/environment/v1/.merlin
Normal file
@ -0,0 +1 @@
|
|||||||
|
FLG -open Error_monad -open Hash -open Tezos_data
|
@ -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:
|
@ -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
|
@ -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
|
||||||
|
|
@ -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
|
@ -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
7
src/minutils/.merlin
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
REC
|
||||||
|
B .
|
||||||
|
S .
|
||||||
|
PKG cstruct
|
||||||
|
PKG lwt
|
||||||
|
PKG ocplib-json-typed.bson
|
||||||
|
PKG ocplib-resto.directory
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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) ->
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
|
@ -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)
|
|
||||||
|
@ -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
|
|
||||||
|
@ -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
|
@ -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
|
||||||
|
@ -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
|
||||||
|
67
src/packer/tezos_protocol_packer.ml
Normal file
67
src/packer/tezos_protocol_packer.ml
Normal 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))
|
12
src/packer/tezos_protocol_packer.mli
Normal file
12
src/packer/tezos_protocol_packer.mli
Normal 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
10
src/packer_main.ml
Normal 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 ()
|
@ -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
21
src/utils/.merlin
Normal 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
|
@ -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 @@
|
||||||
|
@ -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
|
||||||
|
@ -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/*/))
|
||||||
|
@ -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} \
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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 =
|
||||||
|
@ -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} \
|
||||||
|
@ -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 ;
|
||||||
|
Loading…
Reference in New Issue
Block a user