The Scilla Runtime Library provides two main functionalities
- An entry point to execute Scilla contracts. The contract to be executed must be compiled by the Scilla LLVM compiler, and linked into a shared library object.
- A collection of functions that implement various common (i.e., not specific to a contract) Scilla operations and enable the compiled binary to interact with the blockchain during execution.
Ubuntu:
sudo apt-get install build-essential clang-13 cmake libboost-dev libboost-test-dev libjsoncpp-dev libboost-filesystem-dev libboost-program-options-dev libsecp256k1-dev- Use the LLVM apt repository if clang-13 is not in your OS repository.
MacOSX:
- Requires
libboost-container-devin addition to the packages above.
We suggest building ScillaRTL in a directory that is not the source directory.
$git clone --recurse-submodules https://github.com/Zilliqa/scilla-rtl.git$cd scilla-rtl; mkdir build; cd build$cmake ..configures the project. Additional (optional) flags:-DCMAKE_INSTALL_PREFIX=/where/to/install/scilla-rtl: To specify an install directory other than the default. The default installation path typically requires root permissions.-DCMAKE_BUILD_TYPE=[Debug|Release|RelWithDebInfo|MinSizeRel]: The default build isDebug.
$makebuilds the entire project. You can find the built files inbin/andlib/.$make installinstalls the project.$make runtestsruns the testsuite. We suggest to provide your installation path as described earlier and not install in a system directory.
While ScillaRTL is intended to be primarily used as a library from the Zilliqa blockchain,
we provide two wrapper executables for development, debugging and simply trying it out.
expr-runner takes as input, a compiled pure Scilla expression and executes it, by calling
a wrapper function scilla_main generated by the compiler. If the expression is printable,
the compiler also generates a call to print it.
scilla-runner takes a compiled Scilla contract, a message JSON, an initial state for execution
and a contract info JSON (obtrained by running scilla-checker with the -contractinfo flag).
With these inputs, the transition specified in the message JSON is executed. The output state
is printed.
$build/bin/expr-runner -g 1000 testsuite/expr/lit-pair-list-int.ll
$build/bin/scilla-runner -g 10000 --input-contract testsuite/contr/simple-map.ll --message testsuite/contr/simple-map.message_Increment.json --contract-info testsuite/contr/simple-map.contrinfo.json --state testsuite/contr/simple-map.state_00.json --init testsuite/contr/empty_init.json --blockchain testsuite/contr/blockchain_default.json
All public headers are placed in include. The library implementation resides in libScillaRTL. Executable wrappers are defined in runners. The tests sources are confined to testsuite.
This project uses the LLVM coding standards.
For convenience, the naming convention is summarized below. All names (with allowed exceptions) must be in camel case
- Types (structs, classes etc), namespaces and filenames begin with a capital letter.
- Function and method names being with a small letter.
- Variable (local, global and class members) names being with a capital letter.
- Functions that serve as Scilla builtins, accessible from the JIT'ed code
must start with an
_and be in snake case.
A few other points to note
- Add function comments at declaration points rather than definition points. Definition points can have more details if necessary.
- Include system headers first, then library headers and lastly
project headers. Each category separated by a line.
clang-formattakes care of arranging them in alphabetical order. - Since this library is designed to be part of an ever running process
in the Zilliqa network, do not
abort(),exit()orassert(). Always use the providedCREATE_ERRORandCREATE_ERROR_SLOCmacros. This throws an exception (with information on where it was thrown from) and can be caught and handled by the blockchain. For assertions, useASSERTorASSERT_MSG. These useCREATE_ERRORinternally and are defined to be no-op in release builds.
To conform to the coding style and good programming practices, CMake targets clang-format
and clang-tidy are provided, which when run as make clang-format and make clang-tidy
in the build directory, will auto format all source files.
They can also be manually run from the command line:
clang-format -style=LLVM -i `find . -name "*.cpp" -o -name "*.h" | xargsclang-tidy `find . -name "*.cpp" -o -name "*.h" | xargs` -p build/
The testsuite, built by default (but not installed), is based on boost_unit_framework
and can be run from the project root as
build/testsuite/scilla-testsuite -- testsuite_dirA few command line options are provided below for quick reference.
See --help for all options provided by boost. These options must all be provided prior to -- in the command line.
--list_content: Lists the testsuite hierarchy.--run_test: Run specific tests (as listed by--list_content). See details here--log_level=all: To enable the full log to be printed.
The testsuite_dir argument following -- is a custom argument
that tells the testsuite where to find the tests and their inputs.
The custom flag --update-result can be provided to update test results instead of comparing.
For convenience a CMake target runtests has been provided to run the testsuite. This can be
executed as make runtests in the build directory.
The directory testsuite/expr contains text LLVM-IR files, all generated by expr-compiler.
We maintain the following conventions:
- Each test file has the input Scilla expression as a comment at the beginning.
Such a file can be generated using the script
scripts/gen_expr_test.shby providing the path to Scilla expression file (.scilexp) in the compiler repository testsuite. (It will implicitly look for the corresponding.goldfile already generated by the compiler in the compiler testsuite). A wrapper scriptscripts/gen_expr_tests.shis provided to update all expression tests in the testsuite, provided a path to Scilla compiler source directory. - Each test LLVM-IR file (
foo.ll) must have a correspondingfoo.ll.resultfile that contains the expected output on executing the code. The testsuite will match against it.
The directory testsuite/contr contains text LLVM-IR files, all generated by scilla-compiler.
The directory also contains the supporting JSONs required for executing transitions in these compiled contracts. Each LLVM-IR file foo.ll also has foo.dbg.ll that is
a compiled version of the same contract with debuginfo. These LLVM-IR files can be
updated from the Scilla LLVM compiler using the scripts/update_contrs.sh. This
script updates both the debug and non-debug LLVM-IR modules and also the contract info
for that contract.