diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e870646..575f844 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,9 +1,8 @@ name: Build/Test/Release on: [push] env: - EMULATOR_REPOSITORY: cartesi/machine-emulator - EMULATOR_TAG: 0.15.2 - ROM_VERSION: v0.17.0 + EMULATOR_REPOSITORY: ghcr.io/cartesi/machine-emulator + EMULATOR_TAG: main KERNEL_VERSION: v0.17.0 LINUX_VERSION: 5.15.63-ctsi-2-v0.17.0 ROOTFS_VERSION: v0.18.0 @@ -141,19 +140,11 @@ jobs: tag: ${{ env.KERNEL_VERSION }} file: linux-${{ env.LINUX_VERSION }}.bin - - name: Download [rom.bin] - uses: Legion2/download-release-action@v2.1.0 - with: - repository: ${{ github.repository_owner }}/machine-emulator-rom - tag: ${{ env.ROM_VERSION }} - file: rom-${{ env.ROM_VERSION }}.bin - - name: Move images to cartesi images folder run: | mkdir -m 755 -p /tmp/cartesi-machine-images mv rom-*.bin linux-*.bin rootfs-*.ext2 ${{ env.HOST_IMAGES_PATH }} cd ${{ env.HOST_IMAGES_PATH }} && ln -s linux-${{ env.LINUX_VERSION }}.bin linux.bin - cd ${{ env.HOST_IMAGES_PATH }} && ln -s rom-${{ env.ROM_VERSION }}.bin rom.bin cd ${{ env.HOST_IMAGES_PATH }} && ln -s rootfs-${{ env.ROOTFS_VERSION }}.ext2 rootfs.ext2 - name: Run test suite inside the docker image (Linux/${{ matrix.arch }}) @@ -252,19 +243,11 @@ jobs: tag: ${{ env.KERNEL_VERSION }} file: linux-${{ env.LINUX_VERSION }}.bin - - name: Download [rom.bin] - uses: Legion2/download-release-action@v2.1.0 - with: - repository: ${{ github.repository_owner }}/machine-emulator-rom - tag: ${{ env.ROM_VERSION }} - file: rom-${{ env.ROM_VERSION }}.bin - - name: Move images to cartesi images folder run: | mkdir -m 755 -p /tmp/cartesi-machine-images mv rom-*.bin linux-*.bin rootfs-*.ext2 ${{ env.HOST_IMAGES_PATH }} cd ${{ env.HOST_IMAGES_PATH }} && ln -s linux-${{ env.LINUX_VERSION }}.bin linux.bin - cd ${{ env.HOST_IMAGES_PATH }} && ln -s rom-${{ env.ROM_VERSION }}.bin rom.bin cd ${{ env.HOST_IMAGES_PATH }} && ln -s rootfs-${{ env.ROOTFS_VERSION }}.ext2 rootfs.ext2 - name: Run test suite inside the docker image (Linux/${{ matrix.arch }}) diff --git a/.gitmodules b/.gitmodules index 008c6be..6d6d78f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ [submodule "lib/grpc-interfaces"] path = lib/grpc-interfaces url = ../grpc-interfaces.git -[submodule "lib/machine-emulator-defines"] - path = lib/machine-emulator-defines - url = ../machine-emulator-defines.git diff --git a/CHANGELOG.md b/CHANGELOG.md index 881fb92..75a6301 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed +- Updated libboost version to 1.81 +- Updated grpc-interfaces +- Updated machine-emulator-defines +- Bumped version to 0.9.0 + +### Added +- Added \-\-version command line option + ## [0.8.2] - 2023-08-21 ### Changed - Updated server-manager version to v0.8.2 diff --git a/Dockerfile b/Dockerfile index b8bcacd..7f00df1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,8 +9,8 @@ USER root RUN apt-get update && \ DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y \ build-essential wget git \ - libreadline-dev libboost-coroutine-dev libboost-context-dev \ - libboost-filesystem-dev libboost-log-dev libssl-dev libc-ares-dev zlib1g-dev \ + libreadline-dev libboost-coroutine1.81-dev libboost-context1.81-dev \ + libboost-filesystem1.81-dev libboost-log1.81-dev libssl-dev libc-ares-dev zlib1g-dev \ ca-certificates automake libtool patchelf cmake pkg-config lua5.4 liblua5.4-dev \ libgrpc++-dev libprotobuf-dev protobuf-compiler-grpc \ libcrypto++-dev clang-tidy-15 clang-format-15 && \ @@ -36,7 +36,7 @@ FROM --platform=$TARGETPLATFORM ${EMULATOR_REPOSITORY}:${EMULATOR_TAG} USER root RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y \ - libboost-log1.74.0 \ + libboost-log1.81.0 \ && rm -rf /var/lib/apt/lists/* COPY --from=installer /usr/bin/server-manager /usr/bin/server-manager diff --git a/Makefile b/Makefile index 06dbd42..bcb860c 100644 --- a/Makefile +++ b/Makefile @@ -37,8 +37,8 @@ HEALTHCHECK_PROTO := third-party/health.proto # Docker image settings TAG ?= devel -EMULATOR_TAG ?= 0.15.2 -EMULATOR_REPOSITORY ?= cartesi/machine-emulator +EMULATOR_TAG ?= main +EMULATOR_REPOSITORY ?= ghcr.io/cartesi/machine-emulator # Mac OS X specific settings ifeq ($(UNAME),Darwin) diff --git a/README.md b/README.md index f3d9ce8..f239af4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Cartesi Server-Manager -The Cartesi Server-Manager is a microservice that serves as an interface between the Remote Cartesi Machine (RCM) and other components of the Cartesi Rollup node. It is designed to simplify the communication between the RCM and the rest of the Cartesi node. It's written in C/C++ with POSIX dependencies restricted to the terminal and process facilites. Currently, it is distributed as a docker image. +The Cartesi Server-Manager is a microservice that serves as an interface between the Remote Cartesi Machine (RCM) and other components of the Cartesi Rollup node. It is designed to simplify the communication between the RCM and the rest of the Cartesi node. It's written in C/C++ with POSIX dependencies restricted to the terminal and process facilities. Currently, it is distributed as a docker image. ## Getting Started @@ -29,7 +29,7 @@ Cleaning targets: - GNU Make >= 3.81 - GRPC 1.50.0 - Lua 5.4.x -- Boost >= 1.71 +- Boost >= 1.81 Obs: Please note that Apple Clang Version number does not follow upstream LLVM/Clang. diff --git a/lib/grpc-interfaces b/lib/grpc-interfaces index cba7c3f..a602da2 160000 --- a/lib/grpc-interfaces +++ b/lib/grpc-interfaces @@ -1 +1 @@ -Subproject commit cba7c3f1c53b83bee83d8a1e5a1074591279220f +Subproject commit a602da2f52f79a982480f9f3d9e92c1ee0c7f47c diff --git a/lib/machine-emulator-defines b/lib/machine-emulator-defines deleted file mode 160000 index 4f164a7..0000000 --- a/lib/machine-emulator-defines +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4f164a788ff34b43c6c070fdc14204cd69110440 diff --git a/src/Makefile b/src/Makefile index cfe55e9..951e5ad 100644 --- a/src/Makefile +++ b/src/Makefile @@ -56,8 +56,8 @@ BOOST_INC_Darwin=-I/usr/local/opt/boost/include CRYPTOPP_LIB_Darwin:=-L/usr/local/opt/cryptopp/lib -lcryptopp CRYPTOPP_INC_Darwin:=-I/usr/local/opt/cryptopp/include else # Macports installation -BOOST_LIB_DIR_Darwin=-L/opt/local/lib -BOOST_INC_Darwin=-I/opt/local/include +BOOST_LIB_DIR_Darwin=-L/opt/local/libexec/boost/1.81/lib +BOOST_INC_Darwin=-I/opt/local/libexec/boost/1.81/include CRYPTOPP_LIB_Darwin:=-L/opt/local/lib -lcryptopp CRYPTOPP_INC_Darwin:=-I/opt/local/include endif @@ -107,7 +107,7 @@ GRPC_INC=$(GRPC_INC_$(UNAME)) PROTOBUF_LIB=$(PROTOBUF_LIB_$(UNAME)) CARTESI_EXECUTABLE_LDFLAGS=$(CARTESI_EXECUTABLE_LDFLAGS_$(UNAME)) -SERVER_MANAGER_LIBS:=$(CRYPTOPP_LIB) $(GRPC_LIB) $(BOOST_CORO_LIB) $(BOOST_LOG_LIB) -ldl +SERVER_MANAGER_LIBS:=$(CRYPTOPP_LIB) $(GRPC_LIB) $(BOOST_CORO_LIB) $(BOOST_LOG_LIB) $(BOOST_FILESYSTEM_LIB) -ldl TEST_SERVER_MANAGER_LIBS:=$(CRYPTOPP_LIB) $(GRPC_LIB) -ldl WARNS=-W -Wall -pedantic diff --git a/src/create-machines.lua b/src/create-machines.lua index 6e18efd..f20f4a6 100755 --- a/src/create-machines.lua +++ b/src/create-machines.lua @@ -123,9 +123,8 @@ function create_default_config(images_dir, command) length = 0x4000000, image_filename = images_dir .. "linux.bin", }, - rom = { - image_filename = images_dir .. "rom.bin", - bootargs = "console=hvc0 rootfstype=ext2 root=/dev/mtdblock0 rw quiet swiotlb=noforce splash=no mtdparts=flash.0:-(root) init=/opt/cartesi/bin/init " .. command, + dtb = { + bootargs = "console=hvc0 rootfstype=ext2 root=/dev/mtdblock0 rw quiet swiotlb=noforce splash=no mtdparts=flash.0:-(root) init=/opt/cartesi/bin/init random.trust_bootloader=on " .. command, }, htif = { console_getchar = false, -- default diff --git a/src/htif-defines.h b/src/htif-defines.h new file mode 100644 index 0000000..cf12b2e --- /dev/null +++ b/src/htif-defines.h @@ -0,0 +1,55 @@ +// Copyright Cartesi and individual authors (see AUTHORS) +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HTIF_DEFINES_H +#define HTIF_DEFINES_H + +#include + +/// \brief HTIF protocol shifts +enum HTIF_protocol_shift : uint64_t { HTIF_DEV_SHIFT = 56, HTIF_CMD_SHIFT = 48, HTIF_DATA_SHIFT = 0 }; + +/// \brief HTIF protocol masks +enum HTIF_protocol_mask : uint64_t { + HTIF_DEV_MASK = 0xFF00000000000000, + HTIF_CMD_MASK = 0x00FF000000000000, + HTIF_DATA_MASK = 0x0000FFFFFFFFFFFF +}; + +/// \brief HTIF device identifiers +enum HTIF_device : uint64_t { HTIF_DEVICE_HALT = 0, HTIF_DEVICE_CONSOLE = 1, HTIF_DEVICE_YIELD = 2 }; + +/// \brief HTIF device commands +enum HTIF_device_command : uint64_t { + HTIF_HALT_HALT = 0, + HTIF_CONSOLE_GETCHAR = 0, + HTIF_CONSOLE_PUTCHAR = 1, + HTIF_YIELD_AUTOMATIC = 0, + HTIF_YIELD_MANUAL = 1 +}; + +/// \brief HTIF yield reasons +enum HTIF_yield_reason : uint64_t { + HTIF_YIELD_REASON_PROGRESS = 0, + HTIF_YIELD_REASON_RX_ACCEPTED = 1, + HTIF_YIELD_REASON_RX_REJECTED = 2, + HTIF_YIELD_REASON_TX_VOUCHER = 3, + HTIF_YIELD_REASON_TX_NOTICE = 4, + HTIF_YIELD_REASON_TX_REPORT = 5, + HTIF_YIELD_REASON_TX_EXCEPTION = 6, +}; + +#endif /* end of include guard: HTIF_DEFINES_H */ diff --git a/src/server-manager.cpp b/src/server-manager.cpp index ae74c8b..912aad5 100644 --- a/src/server-manager.cpp +++ b/src/server-manager.cpp @@ -78,30 +78,18 @@ #pragma clang diagnostic pop #endif -#include - #include "complete-merkle-tree.h" +#include "htif-defines.h" #include "keccak-256-hasher.h" #include "merkle-tree-proof.h" #include "protobuf-util.h" -/// \brief HTIF yield reasons -enum HTIF_yield_reason : uint64_t { - HTIF_YIELD_REASON_PROGRESS = HTIF_YIELD_REASON_PROGRESS_DEF, - HTIF_YIELD_REASON_RX_ACCEPTED = HTIF_YIELD_REASON_RX_ACCEPTED_DEF, - HTIF_YIELD_REASON_RX_REJECTED = HTIF_YIELD_REASON_RX_REJECTED_DEF, - HTIF_YIELD_REASON_TX_VOUCHER = HTIF_YIELD_REASON_TX_VOUCHER_DEF, - HTIF_YIELD_REASON_TX_NOTICE = HTIF_YIELD_REASON_TX_NOTICE_DEF, - HTIF_YIELD_REASON_TX_REPORT = HTIF_YIELD_REASON_TX_REPORT_DEF, - HTIF_YIELD_REASON_TX_EXCEPTION = HTIF_YIELD_REASON_TX_EXCEPTION_DEF, -}; - constexpr const uint64_t ROLLUP_ADVANCE_STATE = 0; constexpr const uint64_t ROLLUP_INSPECT_STATE = 1; static constexpr uint32_t manager_version_major = 0; -static constexpr uint32_t manager_version_minor = 8; -static constexpr uint32_t manager_version_patch = 2; +static constexpr uint32_t manager_version_minor = 9; +static constexpr uint32_t manager_version_patch = 0; static constexpr const char *manager_version_pre_release = ""; static constexpr const char *manager_version_build = ""; @@ -1554,25 +1542,25 @@ void trigger_and_wait_checkin(handler_context &hctx, async_context &actx, T trig /// \param data New data field /// \return Register value with replaced data field static constexpr uint64_t htif_replace_data_field(uint64_t reg, uint64_t data) { - return (reg & (~HTIF_DATA_MASK_DEF)) | ((data << HTIF_DATA_SHIFT_DEF) & HTIF_DATA_MASK_DEF); + return (reg & (~HTIF_DATA_MASK)) | ((data << HTIF_DATA_SHIFT) & HTIF_DATA_MASK); } /// \brief Obtains the dev field in HTIF's fromhost/tohost register value /// \return Dev data field in register static constexpr uint64_t htif_dev_field(uint64_t reg) { - return (reg & HTIF_DEV_MASK_DEF) >> HTIF_DEV_SHIFT_DEF; + return (reg & HTIF_DEV_MASK) >> HTIF_DEV_SHIFT; } /// \brief Extracts the cmd field in HTIF's fromhost/tohost register value /// \return cmd data field in register static constexpr uint64_t htif_cmd_field(uint64_t reg) { - return (reg & HTIF_CMD_MASK_DEF) >> HTIF_CMD_SHIFT_DEF; + return (reg & HTIF_CMD_MASK) >> HTIF_CMD_SHIFT; } /// \brief Extracts the data field in HTIF's fromhost/tohost register value /// \return cmd data field in register static constexpr uint64_t htif_data_field(uint64_t reg) { - return (reg & HTIF_DATA_MASK_DEF) >> HTIF_DATA_SHIFT_DEF; + return (reg & HTIF_DATA_MASK) >> HTIF_DATA_SHIFT; } /// \brief Checks if HTIF's tohost/fromhost matches an yield device manual command @@ -1581,15 +1569,15 @@ static constexpr uint64_t htif_data_field(uint64_t reg) { /// \param value Register value static void check_htif_yield_manual(async_context &actx, const std::string ®name, uint64_t value) { auto dev = htif_dev_field(value); - if (dev != HTIF_DEVICE_YIELD_DEF) { + if (dev != HTIF_DEVICE_YIELD) { THROW((taint_session{actx.session, grpc::StatusCode::INTERNAL, - "invalid dev field in " + regname + " (expected " + std::to_string(HTIF_DEVICE_YIELD_DEF) + ", got " + + "invalid dev field in " + regname + " (expected " + std::to_string(HTIF_DEVICE_YIELD) + ", got " + std::to_string(dev) + ")"})); } auto cmd = htif_cmd_field(value); - if (cmd != HTIF_YIELD_MANUAL_DEF) { + if (cmd != HTIF_YIELD_MANUAL) { THROW((taint_session{actx.session, grpc::StatusCode::INTERNAL, - "invalid cmd field in " + regname + " (expected " + std::to_string(HTIF_YIELD_MANUAL_DEF) + ", got " + + "invalid cmd field in " + regname + " (expected " + std::to_string(HTIF_YIELD_MANUAL) + ", got " + std::to_string(cmd) + ")"})); } } @@ -1598,10 +1586,10 @@ static void check_htif_yield_manual(async_context &actx, const std::string ®n /// \param value Register value static void check_yield_reason_accepted(uint64_t value) { auto data = htif_data_field(value) << 16 >> 48; - if (data != HTIF_YIELD_REASON_RX_ACCEPTED_DEF) { + if (data != HTIF_YIELD_REASON_RX_ACCEPTED) { THROW((finish_error_yield_none{grpc::StatusCode::INVALID_ARGUMENT, - "invalid data field in htif.tohost (expected " + std::to_string(HTIF_YIELD_REASON_RX_ACCEPTED_DEF) + - ", got " + std::to_string(data) + ")"})); + "invalid data field in htif.tohost (expected " + std::to_string(HTIF_YIELD_REASON_RX_ACCEPTED) + ", got " + + std::to_string(data) + ")"})); } } @@ -3282,6 +3270,9 @@ where passed to the spawned remote cartesi machine default: localhost:0 + --version + prints the server version number + --help prints this message and exits @@ -3289,6 +3280,11 @@ where name); } +/// \brief Prints server_manager version +static void print_version() { + (void) fprintf(stderr, "%d.%d.%d\n", manager_version_major, manager_version_minor, manager_version_patch); +} + /// \brief Checks if string matches prefix and captures remaninder /// \param pre Prefix to match in str. /// \param str Input string @@ -3345,6 +3341,9 @@ int main(int argc, char *argv[]) try { ; } else if (stringval("--server-address=", argv[i], &server_address)) { ; + } else if (strcmp(argv[i], "--version") == 0) { + print_version(); + exit(0); } else if (strcmp(argv[i], "--help") == 0) { help(argv[0]); exit(0); diff --git a/src/test-server-manager.cpp b/src/test-server-manager.cpp index 63bced1..d3f5d94 100644 --- a/src/test-server-manager.cpp +++ b/src/test-server-manager.cpp @@ -565,12 +565,12 @@ void assert_bool(bool value, const std::string &msg, const std::string &file, in #define ASSERT_STATUS_CODE(s, f, v) assert_status_code(s, f, v, __FILE__, __LINE__) static void test_get_version(const std::function &test) { - test("The server-manager server version should be 0.8.x", [](ServerManagerClient &manager) { + test("The server-manager server version should be 0.9.x", [](ServerManagerClient &manager) { Versioning::GetVersionResponse response; Status status = manager.get_version(response); ASSERT_STATUS(status, "GetVersion", true); ASSERT((response.version().major() == 0), "Version Major should be 0"); - ASSERT((response.version().minor() == 8), "Version Minor should be 8"); + ASSERT((response.version().minor() == 9), "Version Minor should be 9"); }); }