mirror of
https://github.com/Xahau/xahaud.git
synced 2026-07-23 15:10:10 +00:00
Add Wasmtime v44.0.1 as a second WebAssembly execution engine, selectable at runtime via the new featureWasmtimeEngine Amendment. When the Amendment is enabled, hook execution and WASM validation switch from WasmEdge to Wasmtime. sfHookInstructionCount changes semantics to fuel consumed (initial budget: 10,000,000,000 units); fee calculation is redefined accordingly. New files: - external/wasmtime/conanfile.py + conandata.yml — prebuilt C API binary package (macOS arm64, Linux x86_64; SHA256-pinned at v44.0.1) - cmake/deps/Wasmtime.cmake — find_package(wasmtime REQUIRED) - src/.../WasmtimeEngine.h/.cpp — IWasmEngine implementation Build system changes: - CMakeLists.txt, conanfile.py: with_wasmtime option (default on) - cmake/RippledCore.cmake: link wasmtime::wasmtime alongside wasmedge::wasmedge Protocol changes: - features.macro: XRPL_FEATURE(WasmtimeEngine, Supported::yes, DefaultNo) - WasmEngine.h: constexpr kWasmtimeInitialFuel = 10'000'000'000ULL (consensus-fixed) - applyHook.cpp, SetHook.cpp, Change.cpp: engine selected by featureWasmtimeEngine Implementation notes: - Consensus-fixed config: consume_fuel=true, wasm_simd=true, relaxed_simd=false, reference_types=true, bulk_memory=true, multi_value=false, nan_canonicalization=true - Termination ABI: accept/rollback sets ExecState::terminated flag then returns a wasm_trap_t* to unwind the guest; execute() checks the flag before inspecting callErr to distinguish clean termination from errors - Memory access workaround (ensureMemoryExported): Wasmtime lacks an index-based memory accessor equivalent to WasmEdge_CallingFrameGetMemoryInstance. The binary is patched before instantiation to inject a "memory" export when the module owns memory without exporting it, enabling wasmtime_caller_export_get() inside host callbacks.
230 lines
6.1 KiB
CMake
230 lines
6.1 KiB
CMake
#[===================================================================[
|
|
Exported targets.
|
|
#]===================================================================]
|
|
|
|
include(target_protobuf_sources)
|
|
|
|
# Protocol buffers cannot participate in a unity build,
|
|
# because all the generated sources
|
|
# define a bunch of `static const` variables with the same names,
|
|
# so we just build them as a separate library.
|
|
add_library(xrpl.libpb)
|
|
set_target_properties(xrpl.libpb PROPERTIES UNITY_BUILD OFF)
|
|
target_protobuf_sources(xrpl.libpb xrpl/proto
|
|
LANGUAGE cpp
|
|
IMPORT_DIRS include/xrpl/proto
|
|
PROTOS include/xrpl/proto/ripple.proto
|
|
)
|
|
|
|
file(GLOB_RECURSE protos "include/xrpl/proto/org/*.proto")
|
|
target_protobuf_sources(xrpl.libpb xrpl/proto
|
|
LANGUAGE cpp
|
|
IMPORT_DIRS include/xrpl/proto
|
|
PROTOS "${protos}"
|
|
)
|
|
target_protobuf_sources(xrpl.libpb xrpl/proto
|
|
LANGUAGE grpc
|
|
IMPORT_DIRS include/xrpl/proto
|
|
PROTOS "${protos}"
|
|
PLUGIN protoc-gen-grpc=$<TARGET_FILE:gRPC::grpc_cpp_plugin>
|
|
GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc
|
|
)
|
|
|
|
target_compile_options(xrpl.libpb
|
|
PUBLIC
|
|
$<$<BOOL:${MSVC}>:-wd4996>
|
|
$<$<BOOL:${XCODE}>:
|
|
--system-header-prefix="google/protobuf"
|
|
-Wno-deprecated-dynamic-exception-spec
|
|
>
|
|
PRIVATE
|
|
$<$<BOOL:${MSVC}>:-wd4065>
|
|
$<$<NOT:$<BOOL:${MSVC}>>:-Wno-deprecated-declarations>
|
|
)
|
|
|
|
target_link_libraries(xrpl.libpb
|
|
PUBLIC
|
|
protobuf::libprotobuf
|
|
gRPC::grpc++
|
|
)
|
|
|
|
# TODO: Clean up the number of library targets later.
|
|
add_library(xrpl.imports.main INTERFACE)
|
|
|
|
target_link_libraries(xrpl.imports.main
|
|
INTERFACE
|
|
LibArchive::LibArchive
|
|
magic_enum::magic_enum
|
|
OpenSSL::Crypto
|
|
Ripple::boost
|
|
wasmedge::wasmedge
|
|
wasmtime::wasmtime
|
|
Ripple::opts
|
|
Ripple::syslibs
|
|
absl::random_random
|
|
date::date
|
|
ed25519::ed25519
|
|
secp256k1::secp256k1
|
|
xrpl.libpb
|
|
xxHash::xxhash
|
|
$<$<BOOL:${voidstar}>:antithesis-sdk-cpp>
|
|
)
|
|
|
|
# date-tz for enhanced logging (always linked, code is #ifdef guarded)
|
|
if(TARGET date::date-tz)
|
|
target_link_libraries(xrpl.imports.main INTERFACE date::date-tz)
|
|
endif()
|
|
|
|
# BEAST_ENHANCED_LOGGING: enable for Debug builds OR when explicitly requested
|
|
# Uses generator expression so it works with multi-config generators (Xcode, VS, Ninja Multi-Config)
|
|
target_compile_definitions(xrpl.imports.main INTERFACE
|
|
$<$<OR:$<CONFIG:Debug>,$<BOOL:${BEAST_ENHANCED_LOGGING}>>:BEAST_ENHANCED_LOGGING=1>
|
|
)
|
|
|
|
include(add_module)
|
|
include(target_link_modules)
|
|
|
|
# Level 01
|
|
add_module(xrpl beast)
|
|
target_link_libraries(xrpl.libxrpl.beast PUBLIC
|
|
xrpl.imports.main
|
|
xrpl.libpb
|
|
)
|
|
|
|
# Level 02
|
|
add_module(xrpl basics)
|
|
target_link_libraries(xrpl.libxrpl.basics PUBLIC xrpl.libxrpl.beast)
|
|
|
|
# Level 03
|
|
add_module(xrpl json)
|
|
target_link_libraries(xrpl.libxrpl.json PUBLIC xrpl.libxrpl.basics)
|
|
|
|
add_module(xrpl crypto)
|
|
target_link_libraries(xrpl.libxrpl.crypto PUBLIC xrpl.libxrpl.basics)
|
|
|
|
add_module(xrpl hook)
|
|
target_link_libraries(xrpl.libxrpl.hook PUBLIC xrpl.libxrpl.basics)
|
|
|
|
# Level 04
|
|
add_module(xrpl protocol)
|
|
target_link_libraries(xrpl.libxrpl.protocol PUBLIC
|
|
xrpl.libxrpl.crypto
|
|
xrpl.libxrpl.hook
|
|
xrpl.libxrpl.json
|
|
)
|
|
|
|
# Level 05
|
|
add_module(xrpl resource)
|
|
target_link_libraries(xrpl.libxrpl.resource PUBLIC xrpl.libxrpl.protocol)
|
|
|
|
add_module(xrpl server)
|
|
target_link_libraries(xrpl.libxrpl.server PUBLIC xrpl.libxrpl.protocol)
|
|
|
|
|
|
add_library(xrpl.libxrpl)
|
|
set_target_properties(xrpl.libxrpl PROPERTIES OUTPUT_NAME xrpl)
|
|
|
|
# Try to find the ACL library
|
|
find_library(ACL_LIBRARY NAMES acl)
|
|
|
|
# Check if ACL was found
|
|
if(ACL_LIBRARY)
|
|
message(STATUS "Found ACL: ${ACL_LIBRARY}")
|
|
else()
|
|
message(STATUS "ACL not found, continuing without ACL support")
|
|
endif()
|
|
|
|
add_library(xrpl::libxrpl ALIAS xrpl.libxrpl)
|
|
|
|
file(GLOB_RECURSE sources CONFIGURE_DEPENDS
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/libxrpl/*.cpp"
|
|
)
|
|
target_sources(xrpl.libxrpl PRIVATE ${sources})
|
|
|
|
target_link_modules(xrpl PUBLIC
|
|
basics
|
|
beast
|
|
crypto
|
|
hook
|
|
json
|
|
protocol
|
|
resource
|
|
server
|
|
)
|
|
|
|
# All headers in libxrpl are in modules.
|
|
# Uncomment this stanza if you have not yet moved new headers into a module.
|
|
# target_include_directories(xrpl.libxrpl
|
|
# PRIVATE
|
|
# $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
|
|
# PUBLIC
|
|
# $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
|
# $<INSTALL_INTERFACE:include>)
|
|
|
|
if(xrpld)
|
|
add_executable(rippled)
|
|
if(tests)
|
|
target_compile_definitions(rippled PUBLIC ENABLE_TESTS)
|
|
endif()
|
|
target_include_directories(rippled
|
|
PRIVATE
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
|
|
)
|
|
|
|
file(GLOB_RECURSE sources CONFIGURE_DEPENDS
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/xrpld/*.cpp"
|
|
)
|
|
target_sources(rippled PRIVATE ${sources})
|
|
|
|
if(tests)
|
|
file(GLOB_RECURSE sources CONFIGURE_DEPENDS
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test/*.cpp"
|
|
)
|
|
target_sources(rippled PRIVATE ${sources})
|
|
endif()
|
|
|
|
target_link_libraries(rippled
|
|
Ripple::boost
|
|
Ripple::opts
|
|
Ripple::libs
|
|
xrpl.libxrpl
|
|
# Workaround for a Conan 1.x bug that prevents static linking of libstdc++
|
|
# when a dependency (snappy) modifies system_libs. See the comment in
|
|
# external/snappy/conanfile.py for a full explanation.
|
|
# This is likely not strictly necessary, but listed explicitly as a good practice.
|
|
m
|
|
)
|
|
exclude_if_included(rippled)
|
|
# define a macro for tests that might need to
|
|
# be exluded or run differently in CI environment
|
|
if(is_ci)
|
|
target_compile_definitions(rippled PRIVATE RIPPLED_RUNNING_IN_CI)
|
|
endif ()
|
|
|
|
if(voidstar)
|
|
target_compile_options(rippled
|
|
PRIVATE
|
|
-fsanitize-coverage=trace-pc-guard
|
|
)
|
|
# rippled requires access to antithesis-sdk-cpp implementation file
|
|
# antithesis_instrumentation.h, which is not exported as INTERFACE
|
|
target_include_directories(rippled
|
|
PRIVATE
|
|
${CMAKE_SOURCE_DIR}/external/antithesis-sdk
|
|
)
|
|
endif()
|
|
|
|
# any files that don't play well with unity should be added here
|
|
if(tests)
|
|
set_source_files_properties(
|
|
# these two seem to produce conflicts in beast teardown template methods
|
|
src/test/rpc/ValidatorRPC_test.cpp
|
|
src/test/ledger/Invariants_test.cpp
|
|
PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE)
|
|
endif()
|
|
endif()
|
|
|
|
if(ACL_LIBRARY)
|
|
target_link_libraries(rippled ${ACL_LIBRARY})
|
|
endif()
|