diff --git a/.github/workflows/verify-generated-headers.yml b/.github/workflows/verify-generated-headers.yml index 4120f7b7f9..723e7181b9 100644 --- a/.github/workflows/verify-generated-headers.yml +++ b/.github/workflows/verify-generated-headers.yml @@ -18,12 +18,23 @@ jobs: generator: bash ./hook/generate_sfcodes.sh - target: hook/tts.h generator: ./hook/generate_tts.sh - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 + env: + CLANG_VERSION: 10 name: ${{ matrix.target }} steps: - name: Checkout repository uses: actions/checkout@v4 + - name: Download and install clang-format + run: | + sudo apt-get update -y + sudo apt-get install -y libtinfo5 + curl -LO https://github.com/llvm/llvm-project/releases/download/llvmorg-10.0.1/clang+llvm-10.0.1-x86_64-linux-gnu-ubuntu-16.04.tar.xz + tar -xf clang+llvm-10.0.1-x86_64-linux-gnu-ubuntu-16.04.tar.xz + sudo mv clang+llvm-10.0.1-x86_64-linux-gnu-ubuntu-16.04 /opt/clang-10 + sudo ln -s /opt/clang-10/bin/clang-format /usr/local/bin/clang-format-10 + - name: Verify ${{ matrix.target }} run: | set -euo pipefail diff --git a/hook/extern.h b/hook/extern.h index ee34af6ff8..667cec2a4c 100644 --- a/hook/extern.h +++ b/hook/extern.h @@ -82,7 +82,7 @@ sto_erase( uint32_t field_id); extern int64_t -etxn_burden(void); +etxn_burden(); extern int64_t etxn_details(uint32_t write_ptr, uint32_t write_len); @@ -94,7 +94,7 @@ extern int64_t etxn_reserve(uint32_t count); extern int64_t -etxn_generation(void); +etxn_generation(); extern int64_t etxn_nonce(uint32_t write_ptr, uint32_t write_len); @@ -149,7 +149,7 @@ extern int64_t float_divide(int64_t float1, int64_t float2); extern int64_t -float_one(void); +float_one(); extern int64_t float_mantissa(int64_t float1); @@ -167,13 +167,13 @@ extern int64_t float_root(int64_t float1, uint32_t n); extern int64_t -fee_base(void); +fee_base(); extern int64_t -ledger_seq(void); +ledger_seq(); extern int64_t -ledger_last_time(void); +ledger_last_time(); extern int64_t ledger_last_hash(uint32_t write_ptr, uint32_t write_len); @@ -213,13 +213,13 @@ hook_param( uint32_t read_len); extern int64_t -hook_again(void); +hook_again(); extern int64_t hook_skip(uint32_t read_ptr, uint32_t read_len, uint32_t flags); extern int64_t -hook_pos(void); +hook_pos(); extern int64_t slot(uint32_t write_ptr, uint32_t write_len, uint32_t slot); @@ -299,19 +299,19 @@ extern int64_t trace_float(uint32_t read_ptr, uint32_t read_len, int64_t float1); extern int64_t -otxn_burden(void); +otxn_burden(); extern int64_t otxn_field(uint32_t write_ptr, uint32_t write_len, uint32_t field_id); extern int64_t -otxn_generation(void); +otxn_generation(); extern int64_t otxn_id(uint32_t write_ptr, uint32_t write_len, uint32_t flags); extern int64_t -otxn_type(void); +otxn_type(); extern int64_t otxn_slot(uint32_t slot_no); diff --git a/hook/generate_extern.sh b/hook/generate_extern.sh index 2e9598ad02..0f05dac523 100755 --- a/hook/generate_extern.sh +++ b/hook/generate_extern.sh @@ -4,7 +4,7 @@ set -eu SCRIPT_DIR=$(dirname "$0") SCRIPT_DIR=$(cd "$SCRIPT_DIR" && pwd) -APPLY_HOOK="$SCRIPT_DIR/../src/ripple/app/hook/applyHook.h" +APPLY_HOOK="$SCRIPT_DIR/../src/ripple/app/hook/hook_api.macro" { echo '// For documentation please see: https://xrpl-hooks.readme.io/reference/' @@ -19,127 +19,36 @@ APPLY_HOOK="$SCRIPT_DIR/../src/ripple/app/hook/applyHook.h" return s; } - function emit(ret, name, argc, argt, argn) { - attr = (name == "_g") ? " __attribute__((noduplicate))" : ""; - if (!first) - printf("\n"); - first = 0; - printf("extern %s%s\n", ret, attr); - if (argc == 0) { - printf("%s(void);\n", name); - return; - } - if (argc <= 3) { - line = argt[1] " " argn[1]; - for (i = 2; i <= argc; ++i) - line = line ", " argt[i] " " argn[i]; - printf("%s(%s);\n", name, line); - return; - } - printf("%s(\n", name); - for (i = 1; i <= argc; ++i) { - sep = (i < argc) ? "," : ");"; - printf(" %s %s%s\n", argt[i], argn[i], sep); - } - } - - function process(buffer, kind, payload, parts, n, i, arg, tokens, argc, argt, argn) { - if (kind == "func") - sub(/^DECLARE_HOOK_FUNCTION[[:space:]]*\(/, "", buffer); - else - sub(/^DECLARE_HOOK_FUNCNARG[[:space:]]*\(/, "", buffer); - buffer = trim(buffer); - sub(/\)[[:space:]]*$/, "", buffer); - n = split(buffer, parts, ","); - for (i = 1; i <= n; ++i) - parts[i] = trim(parts[i]); - ret = parts[1]; - name = parts[2]; - argc = 0; - delete argt; - delete argn; - for (i = 3; i <= n; ++i) { - arg = parts[i]; - if (arg == "") - continue; - split(arg, tokens, /[[:space:]]+/); - if (length(tokens) < 2) - continue; - ++argc; - argt[argc] = tokens[1]; - argn[argc] = tokens[2]; - } - emit(ret, name, argc, argt, argn); - } - - BEGIN { - first = 1; - in_block = 0; - in_macro = 0; - } - { line = $0; - if (in_block) { - if (line ~ /\*\//) { - sub(/.*\*\//, "", line); - in_block = 0; - } - else - next; - } - while (line ~ /\/\*/) { - if (line ~ /\/\*.*\*\//) { - gsub(/\/\*.*\*\//, "", line); - } - else { - sub(/\/\*.*/, "", line); - in_block = 1; - break; - } - } - sub(/\/\/.*$/, "", line); - line = trim(line); - if (line == "") - next; - - if (!in_macro && line ~ /^DECLARE_HOOK_FUNCTION\(/) { - buffer = line; - kind = "func"; - if (line ~ /\);[[:space:]]*$/) { - sub(/\);[[:space:]]*$/, "", buffer); - process(buffer, kind); - } - else - in_macro = 1; + + # Skip block comments + if (line ~ /\/\*/) { next; } - if (!in_macro && line ~ /^DECLARE_HOOK_FUNCNARG\(/) { - buffer = line; - kind = "narg"; - if (line ~ /\);[[:space:]]*$/) { - sub(/\);[[:space:]]*$/, "", buffer); - process(buffer, kind); + + # Look for comment lines that start with // and contain function signature + if (line ~ /^[[:space:]]*\/\/[[:space:]]*[a-zA-Z_][a-zA-Z0-9_]*[[:space:]]+[a-zA-Z_][a-zA-Z0-9_]*[[:space:]]*\(/) { + # Remove leading // and trim + sub(/^[[:space:]]*\/\/[[:space:]]*/, "", line); + line = trim(line); + + # Check if function name is "_g" to add attribute + if (line ~ /[[:space:]]+_g[[:space:]]*\(/) { + # Insert __attribute__((noduplicate)) before _g + sub(/[[:space:]]+_g/, " __attribute__((noduplicate)) _g", line); } - else - in_macro = 1; - next; + + # printf("\n"); + + printf("extern %s\n\n", line); } - if (in_macro) { - buffer = buffer " " line; - if (line ~ /\);[[:space:]]*$/) { - sub(/\);[[:space:]]*$/, "", buffer); - process(buffer, kind); - in_macro = 0; - } - } - } - - END { - printf("\n"); } ' "$APPLY_HOOK" echo '#define HOOK_EXTERN' echo '#endif // HOOK_EXTERN' -} +} | ( + cd "$SCRIPT_DIR/.." + clang-format --style=file - +) diff --git a/src/ripple/app/hook/Enum.h b/src/ripple/app/hook/Enum.h index d0ddf2fb7e..121a7f803d 100644 --- a/src/ripple/app/hook/Enum.h +++ b/src/ripple/app/hook/Enum.h @@ -371,14 +371,6 @@ const uint8_t max_emit = 255; const uint8_t max_params = 16; const double fee_base_multiplier = 1.1f; -#define I32 0x7FU -#define I64 0x7EU - -#define HOOK_WRAP_PARAMS(...) __VA_ARGS__ -#define HOOK_API_DEFINITION(RETURN_TYPE, FUNCTION_NAME, PARAMS_TUPLE, COST) \ - whitelist[FUNCTION_NAME] = { \ - {RETURN_TYPE, HOOK_WRAP_PARAMS PARAMS_TUPLE}, COST}; - using APIWhitelist = std::map, uint32_t>>; @@ -393,93 +385,68 @@ getImportWhitelist( ) { APIWhitelist whitelist; - // clang-format off - // TODO: update costs for each API - HOOK_API_DEFINITION(I32, "_g", (I32, I32), 100) - HOOK_API_DEFINITION(I64, "accept", (I32, I32, I64), 100) - HOOK_API_DEFINITION(I64, "rollback", (I32, I32, I64), 100) - HOOK_API_DEFINITION(I64, "util_raddr", (I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "util_accid", (I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "util_verify", (I32, I32, I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "util_sha512h", (I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "util_keylet", (I32, I32, I32, I32, I32, I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "sto_validate", (I32, I32), 100) - HOOK_API_DEFINITION(I64, "sto_subfield", (I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "sto_subarray", (I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "sto_emplace", (I32, I32, I32, I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "sto_erase", (I32, I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "etxn_burden", (), 100) - HOOK_API_DEFINITION(I64, "etxn_details", (I32, I32), 100) - HOOK_API_DEFINITION(I64, "etxn_fee_base", (I32, I32), 100) - HOOK_API_DEFINITION(I64, "etxn_reserve", (I32), 100) - HOOK_API_DEFINITION(I64, "etxn_generation", (), 100) - HOOK_API_DEFINITION(I64, "etxn_nonce", (I32, I32), 100) - HOOK_API_DEFINITION(I64, "emit", (I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "float_set", (I32, I64),0) - HOOK_API_DEFINITION(I64, "float_multiply", (I64, I64), 100) - HOOK_API_DEFINITION(I64, "float_mulratio", (I64, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "float_negate", (I64), 100) - HOOK_API_DEFINITION(I64, "float_compare", (I64, I64, I32), 100) - HOOK_API_DEFINITION(I64, "float_sum", (I64, I64), 100) - HOOK_API_DEFINITION(I64, "float_sto", (I32, I32, I32, I32, I32, I32, I64, I32), 100) - HOOK_API_DEFINITION(I64, "float_sto_set", (I32, I32), 100) - HOOK_API_DEFINITION(I64, "float_invert", (I64), 100) - HOOK_API_DEFINITION(I64, "float_divide", (I64, I64), 100) - HOOK_API_DEFINITION(I64, "float_one", (), 100) - HOOK_API_DEFINITION(I64, "float_mantissa", (I64), 100) - HOOK_API_DEFINITION(I64, "float_sign", (I64), 100) - HOOK_API_DEFINITION(I64, "float_int", (I64, I32, I32), 100) - HOOK_API_DEFINITION(I64, "float_log", (I64), 100) - HOOK_API_DEFINITION(I64, "float_root", (I64, I32), 100) - HOOK_API_DEFINITION(I64, "fee_base", (), 100) - HOOK_API_DEFINITION(I64, "ledger_seq", (), 100) - HOOK_API_DEFINITION(I64, "ledger_last_time", (), 100) - HOOK_API_DEFINITION(I64, "ledger_last_hash", (I32, I32), 100) - HOOK_API_DEFINITION(I64, "ledger_nonce", (I32, I32), 100) - HOOK_API_DEFINITION(I64, "ledger_keylet", (I32, I32, I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "hook_account", (I32, I32), 100) - HOOK_API_DEFINITION(I64, "hook_hash", (I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "hook_param_set", (I32, I32, I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "hook_param", (I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "hook_again", (), 100) - HOOK_API_DEFINITION(I64, "hook_skip", (I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "hook_pos", (), 100) - HOOK_API_DEFINITION(I64, "slot", (I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "slot_clear", (I32), 100) - HOOK_API_DEFINITION(I64, "slot_count", (I32), 100) - HOOK_API_DEFINITION(I64, "slot_set", (I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "slot_size", (I32), 100) - HOOK_API_DEFINITION(I64, "slot_subarray", (I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "slot_subfield", (I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "slot_type", (I32, I32), 100) - HOOK_API_DEFINITION(I64, "slot_float", (I32), 100) - HOOK_API_DEFINITION(I64, "state_set", (I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "state_foreign_set", (I32, I32, I32, I32, I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "state", (I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "state_foreign", (I32, I32, I32, I32, I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "trace", (I32, I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "trace_num", (I32, I32, I64), 100) - HOOK_API_DEFINITION(I64, "trace_float", (I32, I32, I64), 100) - HOOK_API_DEFINITION(I64, "otxn_burden", (), 100) - HOOK_API_DEFINITION(I64, "otxn_field", (I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "otxn_generation", (), 100) - HOOK_API_DEFINITION(I64, "otxn_id", (I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "otxn_type", (), 100) - HOOK_API_DEFINITION(I64, "otxn_slot", (I32), 100) - HOOK_API_DEFINITION(I64, "otxn_param", (I32, I32, I32, I32), 100) - HOOK_API_DEFINITION(I64, "meta_slot", (I32), 100) +#ifndef GUARD_CHECKER_BUILD + std::map amendments = {}; +#endif - #ifndef GUARD_CHECKER_BUILD - if (rules.enabled(featureHooksUpdate1)) - #endif - HOOK_API_DEFINITION(I64, "xpop_slot", (I32, I32), 100) +#pragma push_macro("HOOK_API_DEFINITION") +#undef HOOK_API_DEFINITION + +#define int64_t 0x7EU +#define int32_t 0x7FU +#define uint32_t 0x7FU + +#define HOOK_WRAP_PARAMS(...) __VA_ARGS__ + +#ifdef GUARD_CHECKER_BUILD +#define HOOK_API_DEFINITION( \ + RETURN_TYPE, FUNCTION_NAME, PARAMS_TUPLE, AMENDMENT, COST) \ + whitelist[#FUNCTION_NAME] = { \ + {RETURN_TYPE, HOOK_WRAP_PARAMS PARAMS_TUPLE}, COST}; +#else +#define HOOK_API_DEFINITION( \ + RETURN_TYPE, FUNCTION_NAME, PARAMS_TUPLE, AMENDMENT, COST) \ + if (AMENDMENT == uint256{} || rules.enabled(AMENDMENT)) \ + whitelist[#FUNCTION_NAME] = { \ + {RETURN_TYPE, HOOK_WRAP_PARAMS PARAMS_TUPLE}, COST}; +#endif + +#include "hook_api.macro" + +#undef HOOK_API_DEFINITION +#undef HOOK_WRAP_PARAMS +#undef int64_t +#undef int32_t +#undef uint32_t +#pragma pop_macro("HOOK_API_DEFINITION") return whitelist; - // clang-format on } #undef HOOK_API_DEFINITION #undef I32 #undef I64 + +enum GuardRulesVersion : uint64_t { + GuardRuleFix20250131 = 0x00000001, +}; + +inline uint64_t +getGuardRulesVersion( +#ifndef GUARD_CHECKER_BUILD + Rules const& rules +#endif +) +{ + uint64_t version = 0; +#ifndef GUARD_CHECKER_BUILD + if (rules.enabled(fix20250131)) + version |= GuardRuleFix20250131; +#else + version = -1; // all bits set for guard checker +#endif + return version; +} + }; // namespace hook_api #endif diff --git a/src/ripple/app/hook/Guard.h b/src/ripple/app/hook/Guard.h index b6a3cf3b9a..53b78aebcc 100644 --- a/src/ripple/app/hook/Guard.h +++ b/src/ripple/app/hook/Guard.h @@ -647,7 +647,7 @@ check_guard( } else if (fc_type == 10) // memory.copy { - if (rulesVersion & 0x02U) + if (rulesVersion & hook_api::GuardRuleFix20250131) GUARD_ERROR("Memory.copy instruction is not allowed."); REQUIRE(2); @@ -655,7 +655,7 @@ check_guard( } else if (fc_type == 11) // memory.fill { - if (rulesVersion & 0x02U) + if (rulesVersion & hook_api::GuardRuleFix20250131) GUARD_ERROR("Memory.fill instruction is not allowed."); ADVANCE(1); @@ -851,7 +851,7 @@ validateGuards( * might have unforeseen consequences, without also rolling back further * changes that are fine. */ - uint64_t rulesVersion = 0) + uint64_t rulesVersion = 0x00) { uint64_t byteCount = wasm.size(); diff --git a/src/ripple/app/hook/Macro.h b/src/ripple/app/hook/Macro.h index 5f309b2e31..153677d4b3 100644 --- a/src/ripple/app/hook/Macro.h +++ b/src/ripple/app/hook/Macro.h @@ -88,18 +88,18 @@ #define WASM_VAL_TYPE(T, b) CAT2(TYP_, T) -#define DECLARE_HOOK_FUNCTION(R, F, ...) \ - R F(hook::HookContext& hookCtx, \ - WasmEdge_CallingFrameContext const& frameCtx, \ - __VA_ARGS__); \ - extern WasmEdge_Result WasmFunction##F( \ - void* data_ptr, \ - const WasmEdge_CallingFrameContext* frameCtx, \ - const WasmEdge_Value* in, \ - WasmEdge_Value* out); \ - extern WasmEdge_ValType WasmFunctionParams##F[]; \ - extern WasmEdge_ValType WasmFunctionResult##F[]; \ - extern WasmEdge_FunctionTypeContext* WasmFunctionType##F; \ +#define DECLARE_HOOK_FUNCTION(R, F, ...) \ + R F(hook::HookContext& hookCtx, \ + WasmEdge_CallingFrameContext const& frameCtx __VA_OPT__( \ + , )##__VA_ARGS__); \ + extern WasmEdge_Result WasmFunction##F( \ + void* data_ptr, \ + const WasmEdge_CallingFrameContext* frameCtx, \ + const WasmEdge_Value* in, \ + WasmEdge_Value* out); \ + extern WasmEdge_ValType WasmFunctionParams##F[]; \ + extern WasmEdge_ValType WasmFunctionResult##F[]; \ + extern WasmEdge_FunctionTypeContext* WasmFunctionType##F; \ extern WasmEdge_String WasmFunctionName##F; #define DECLARE_HOOK_FUNCNARG(R, F) \ diff --git a/src/ripple/app/hook/applyHook.h b/src/ripple/app/hook/applyHook.h index be99d4e3d0..2054b30134 100644 --- a/src/ripple/app/hook/applyHook.h +++ b/src/ripple/app/hook/applyHook.h @@ -61,365 +61,20 @@ namespace hook_api { if (HOOK_DBG) \ fprintf -DECLARE_HOOK_FUNCTION(int32_t, _g, uint32_t guard_id, uint32_t maxiter); +#pragma push_macro("HOOK_API_DEFINITION") +#undef HOOK_API_DEFINITION -DECLARE_HOOK_FUNCTION( - int64_t, - accept, - uint32_t read_ptr, - uint32_t read_len, - int64_t error_code); -DECLARE_HOOK_FUNCTION( - int64_t, - rollback, - uint32_t read_ptr, - uint32_t read_len, - int64_t error_code); +#define HOOK_WRAP_PARAMS(...) __VA_ARGS__ +#define HOOK_API_DEFINITION(RETURN_TYPE, FUNCTION_NAME, PARAMS_TUPLE, ...) \ + DECLARE_HOOK_FUNCTION( \ + RETURN_TYPE, FUNCTION_NAME, HOOK_WRAP_PARAMS PARAMS_TUPLE); -DECLARE_HOOK_FUNCTION( - int64_t, - util_raddr, - uint32_t write_ptr, - uint32_t write_len, - uint32_t read_ptr, - uint32_t read_len); -DECLARE_HOOK_FUNCTION( - int64_t, - util_accid, - uint32_t write_ptr, - uint32_t write_len, - uint32_t read_ptr, - uint32_t read_len); -DECLARE_HOOK_FUNCTION( - int64_t, - util_verify, - uint32_t dread_ptr, - uint32_t dread_len, - uint32_t sread_ptr, - uint32_t sread_len, - uint32_t kread_ptr, - uint32_t kread_len); -DECLARE_HOOK_FUNCTION( - int64_t, - util_sha512h, - uint32_t write_ptr, - uint32_t write_len, - uint32_t read_ptr, - uint32_t read_len); -DECLARE_HOOK_FUNCTION( - int64_t, - util_keylet, - uint32_t write_ptr, - uint32_t write_len, - uint32_t keylet_type, - uint32_t a, - uint32_t b, - uint32_t c, - uint32_t d, - uint32_t e, - uint32_t f); +#include -DECLARE_HOOK_FUNCTION( - int64_t, - sto_validate, - uint32_t tread_ptr, - uint32_t tread_len); -DECLARE_HOOK_FUNCTION( - int64_t, - sto_subfield, - uint32_t read_ptr, - uint32_t read_len, - uint32_t field_id); -DECLARE_HOOK_FUNCTION( - int64_t, - sto_subarray, - uint32_t read_ptr, - uint32_t read_len, - uint32_t array_id); -DECLARE_HOOK_FUNCTION( - int64_t, - sto_emplace, - uint32_t write_ptr, - uint32_t write_len, - uint32_t sread_ptr, - uint32_t sread_len, - uint32_t fread_ptr, - uint32_t fread_len, - uint32_t field_id); -DECLARE_HOOK_FUNCTION( - int64_t, - sto_erase, - uint32_t write_ptr, - uint32_t write_len, - uint32_t read_ptr, - uint32_t read_len, - uint32_t field_id); +#undef HOOK_API_DEFINITION +#undef HOOK_WRAP_PARAMS +#pragma pop_macro("HOOK_API_DEFINITION") -DECLARE_HOOK_FUNCNARG(int64_t, etxn_burden); -DECLARE_HOOK_FUNCTION( - int64_t, - etxn_details, - uint32_t write_ptr, - uint32_t write_len); -DECLARE_HOOK_FUNCTION( - int64_t, - etxn_fee_base, - uint32_t read_ptr, - uint32_t read_len); -DECLARE_HOOK_FUNCTION(int64_t, etxn_reserve, uint32_t count); -DECLARE_HOOK_FUNCNARG(int64_t, etxn_generation); -DECLARE_HOOK_FUNCTION( - int64_t, - etxn_nonce, - uint32_t write_ptr, - uint32_t write_len); -DECLARE_HOOK_FUNCTION( - int64_t, - emit, - uint32_t write_ptr, - uint32_t write_len, - uint32_t read_ptr, - uint32_t read_len); - -DECLARE_HOOK_FUNCTION(int64_t, float_set, int32_t exponent, int64_t mantissa); -DECLARE_HOOK_FUNCTION(int64_t, float_multiply, int64_t float1, int64_t float2); -DECLARE_HOOK_FUNCTION( - int64_t, - float_mulratio, - int64_t float1, - uint32_t round_up, - uint32_t numerator, - uint32_t denominator); -DECLARE_HOOK_FUNCTION(int64_t, float_negate, int64_t float1); -DECLARE_HOOK_FUNCTION( - int64_t, - float_compare, - int64_t float1, - int64_t float2, - uint32_t mode); -DECLARE_HOOK_FUNCTION(int64_t, float_sum, int64_t float1, int64_t float2); -DECLARE_HOOK_FUNCTION( - int64_t, - float_sto, - uint32_t write_ptr, - uint32_t write_len, - uint32_t cread_ptr, - uint32_t cread_len, - uint32_t iread_ptr, - uint32_t iread_len, - int64_t float1, - uint32_t field_code); -DECLARE_HOOK_FUNCTION( - int64_t, - float_sto_set, - uint32_t read_ptr, - uint32_t read_len); -DECLARE_HOOK_FUNCTION(int64_t, float_invert, int64_t float1); -DECLARE_HOOK_FUNCTION(int64_t, float_divide, int64_t float1, int64_t float2); -DECLARE_HOOK_FUNCNARG(int64_t, float_one); -DECLARE_HOOK_FUNCTION(int64_t, float_mantissa, int64_t float1); -DECLARE_HOOK_FUNCTION(int64_t, float_sign, int64_t float1); -DECLARE_HOOK_FUNCTION( - int64_t, - float_int, - int64_t float1, - uint32_t decimal_places, - uint32_t abs); -DECLARE_HOOK_FUNCTION(int64_t, float_log, int64_t float1); -DECLARE_HOOK_FUNCTION(int64_t, float_root, int64_t float1, uint32_t n); - -DECLARE_HOOK_FUNCNARG(int64_t, fee_base); -DECLARE_HOOK_FUNCNARG(int64_t, ledger_seq); -DECLARE_HOOK_FUNCNARG(int64_t, ledger_last_time); -DECLARE_HOOK_FUNCTION( - int64_t, - ledger_last_hash, - uint32_t write_ptr, - uint32_t write_len); -DECLARE_HOOK_FUNCTION( - int64_t, - ledger_nonce, - uint32_t write_ptr, - uint32_t write_len); -DECLARE_HOOK_FUNCTION( - int64_t, - ledger_keylet, - uint32_t write_ptr, - uint32_t write_len, - uint32_t lread_ptr, - uint32_t lread_len, - uint32_t hread_ptr, - uint32_t hread_len); - -DECLARE_HOOK_FUNCTION( - int64_t, - hook_account, - uint32_t write_ptr, - uint32_t write_len); -DECLARE_HOOK_FUNCTION( - int64_t, - hook_hash, - uint32_t write_ptr, - uint32_t write_len, - int32_t hook_no); -DECLARE_HOOK_FUNCTION( - int64_t, - hook_param_set, - uint32_t read_ptr, - uint32_t read_len, - uint32_t kread_ptr, - uint32_t kread_len, - uint32_t hread_ptr, - uint32_t hread_len); -DECLARE_HOOK_FUNCTION( - int64_t, - hook_param, - uint32_t write_ptr, - uint32_t write_len, - uint32_t read_ptr, - uint32_t read_len); -DECLARE_HOOK_FUNCNARG(int64_t, hook_again); -DECLARE_HOOK_FUNCTION( - int64_t, - hook_skip, - uint32_t read_ptr, - uint32_t read_len, - uint32_t flags); -DECLARE_HOOK_FUNCNARG(int64_t, hook_pos); - -DECLARE_HOOK_FUNCTION( - int64_t, - slot, - uint32_t write_ptr, - uint32_t write_len, - uint32_t slot); -DECLARE_HOOK_FUNCTION(int64_t, slot_clear, uint32_t slot); -DECLARE_HOOK_FUNCTION(int64_t, slot_count, uint32_t slot); -DECLARE_HOOK_FUNCTION( - int64_t, - slot_set, - uint32_t read_ptr, - uint32_t read_len, - uint32_t slot); -DECLARE_HOOK_FUNCTION(int64_t, slot_size, uint32_t slot); -DECLARE_HOOK_FUNCTION( - int64_t, - slot_subarray, - uint32_t parent_slot, - uint32_t array_id, - uint32_t new_slot); -DECLARE_HOOK_FUNCTION( - int64_t, - slot_subfield, - uint32_t parent_slot, - uint32_t field_id, - uint32_t new_slot); -DECLARE_HOOK_FUNCTION(int64_t, slot_type, uint32_t slot_no, uint32_t flags); -DECLARE_HOOK_FUNCTION(int64_t, slot_float, uint32_t slot_no); - -DECLARE_HOOK_FUNCTION( - int64_t, - state_set, - uint32_t read_ptr, - uint32_t read_len, - uint32_t kread_ptr, - uint32_t kread_len); -DECLARE_HOOK_FUNCTION( - int64_t, - state_foreign_set, - uint32_t read_ptr, - uint32_t read_len, - uint32_t kread_ptr, - uint32_t kread_len, - uint32_t nread_ptr, - uint32_t nread_len, - uint32_t aread_ptr, - uint32_t aread_len); -DECLARE_HOOK_FUNCTION( - int64_t, - state, - uint32_t write_ptr, - uint32_t write_len, - uint32_t kread_ptr, - uint32_t kread_len); -DECLARE_HOOK_FUNCTION( - int64_t, - state_foreign, - uint32_t write_ptr, - uint32_t write_len, - uint32_t kread_ptr, - uint32_t kread_len, - uint32_t nread_ptr, - uint32_t nread_len, - uint32_t aread_ptr, - uint32_t aread_len); - -DECLARE_HOOK_FUNCTION( - int64_t, - trace, - uint32_t mread_ptr, - uint32_t mread_len, - uint32_t dread_ptr, - uint32_t dread_len, - uint32_t as_hex); -DECLARE_HOOK_FUNCTION( - int64_t, - trace_num, - uint32_t read_ptr, - uint32_t read_len, - int64_t number); -DECLARE_HOOK_FUNCTION( - int64_t, - trace_float, - uint32_t read_ptr, - uint32_t read_len, - int64_t float1); - -DECLARE_HOOK_FUNCNARG(int64_t, otxn_burden); -DECLARE_HOOK_FUNCTION( - int64_t, - otxn_field, - uint32_t write_ptr, - uint32_t write_len, - uint32_t field_id); -DECLARE_HOOK_FUNCNARG(int64_t, otxn_generation); -DECLARE_HOOK_FUNCTION( - int64_t, - otxn_id, - uint32_t write_ptr, - uint32_t write_len, - uint32_t flags); -DECLARE_HOOK_FUNCNARG(int64_t, otxn_type); -DECLARE_HOOK_FUNCTION(int64_t, otxn_slot, uint32_t slot_no); -DECLARE_HOOK_FUNCTION( - int64_t, - otxn_param, - uint32_t write_ptr, - uint32_t write_len, - uint32_t read_ptr, - uint32_t read_len); - -DECLARE_HOOK_FUNCTION(int64_t, meta_slot, uint32_t slot_no); -DECLARE_HOOK_FUNCTION( - int64_t, - xpop_slot, - uint32_t slot_no_tx, - uint32_t slot_no_meta); - -/* - DECLARE_HOOK_FUNCTION(int64_t, str_find, uint32_t hread_ptr, - uint32_t hread_len, uint32_t nread_ptr, uint32_t nread_len, uint32_t mode, - uint32_t n); DECLARE_HOOK_FUNCTION(int64_t, str_replace, uint32_t - write_ptr, uint32_t write_len, uint32_t hread_ptr, uint32_t hread_len, - uint32_t nread_ptr, - uint32_t nread_len, uint32_t rread_ptr, uint32_t rread_len, uint32_t mode, - uint32_t n); DECLARE_HOOK_FUNCTION(int64_t, str_compare, uint32_t - fread_ptr, uint32_t fread_len, uint32_t sread_ptr, uint32_t sread_len, - uint32_t mode); - DECLARE_HOOK_FUNCTION(int64_t, str_concat, uint32_t write_ptr, - uint32_t write_len, uint32_t read_ptr, uint32_t read_len, uint64_t operand, - uint32_t operand_type); -*/ } /* end namespace hook_api */ namespace hook { @@ -797,97 +452,18 @@ public: WasmEdge_LogSetDebugLevel(); - ADD_HOOK_FUNCTION(_g, ctx, 0); - ADD_HOOK_FUNCTION(accept, ctx, 0); - ADD_HOOK_FUNCTION(rollback, ctx, 0); - ADD_HOOK_FUNCTION(util_raddr, ctx, 0); - ADD_HOOK_FUNCTION(util_accid, ctx, 0); - ADD_HOOK_FUNCTION(util_verify, ctx, 0); - ADD_HOOK_FUNCTION(util_sha512h, ctx, 0); - ADD_HOOK_FUNCTION(sto_validate, ctx, 0); - ADD_HOOK_FUNCTION(sto_subfield, ctx, 0); - ADD_HOOK_FUNCTION(sto_subarray, ctx, 0); - ADD_HOOK_FUNCTION(sto_emplace, ctx, 0); - ADD_HOOK_FUNCTION(sto_erase, ctx, 0); - ADD_HOOK_FUNCTION(util_keylet, ctx, 0); +#pragma push_macro("HOOK_API_DEFINITION") +#undef HOOK_API_DEFINITION - ADD_HOOK_FUNCTION(emit, ctx, 0); - ADD_HOOK_FUNCTION(etxn_burden, ctx, 0); - ADD_HOOK_FUNCTION(etxn_fee_base, ctx, 0); - ADD_HOOK_FUNCTION(etxn_details, ctx, 0); - ADD_HOOK_FUNCTION(etxn_reserve, ctx, 0); - ADD_HOOK_FUNCTION(etxn_generation, ctx, 0); - ADD_HOOK_FUNCTION(etxn_nonce, ctx, 0); +#define HOOK_WRAP_PARAMS(...) __VA_ARGS__ +#define HOOK_API_DEFINITION(RETURN_TYPE, FUNCTION_NAME, PARAMS_TUPLE, ...) \ + ADD_HOOK_FUNCTION(FUNCTION_NAME, ctx, 0); - ADD_HOOK_FUNCTION(float_set, ctx, 0); - ADD_HOOK_FUNCTION(float_multiply, ctx, 0); - ADD_HOOK_FUNCTION(float_mulratio, ctx, 0); - ADD_HOOK_FUNCTION(float_negate, ctx, 0); - ADD_HOOK_FUNCTION(float_compare, ctx, 0); - ADD_HOOK_FUNCTION(float_sum, ctx, 0); - ADD_HOOK_FUNCTION(float_sto, ctx, 0); - ADD_HOOK_FUNCTION(float_sto_set, ctx, 0); - ADD_HOOK_FUNCTION(float_invert, ctx, 0); +#include - ADD_HOOK_FUNCTION(float_divide, ctx, 0); - ADD_HOOK_FUNCTION(float_one, ctx, 0); - ADD_HOOK_FUNCTION(float_mantissa, ctx, 0); - ADD_HOOK_FUNCTION(float_sign, ctx, 0); - ADD_HOOK_FUNCTION(float_int, ctx, 0); - ADD_HOOK_FUNCTION(float_log, ctx, 0); - ADD_HOOK_FUNCTION(float_root, ctx, 0); - - ADD_HOOK_FUNCTION(otxn_burden, ctx, 0); - ADD_HOOK_FUNCTION(otxn_generation, ctx, 0); - ADD_HOOK_FUNCTION(otxn_field, ctx, 0); - ADD_HOOK_FUNCTION(otxn_id, ctx, 0); - ADD_HOOK_FUNCTION(otxn_type, ctx, 0); - ADD_HOOK_FUNCTION(otxn_slot, ctx, 0); - ADD_HOOK_FUNCTION(otxn_param, ctx, 0); - - ADD_HOOK_FUNCTION(hook_account, ctx, 0); - ADD_HOOK_FUNCTION(hook_hash, ctx, 0); - ADD_HOOK_FUNCTION(hook_again, ctx, 0); - ADD_HOOK_FUNCTION(fee_base, ctx, 0); - ADD_HOOK_FUNCTION(ledger_seq, ctx, 0); - ADD_HOOK_FUNCTION(ledger_last_hash, ctx, 0); - ADD_HOOK_FUNCTION(ledger_last_time, ctx, 0); - ADD_HOOK_FUNCTION(ledger_nonce, ctx, 0); - ADD_HOOK_FUNCTION(ledger_keylet, ctx, 0); - - ADD_HOOK_FUNCTION(hook_param, ctx, 0); - ADD_HOOK_FUNCTION(hook_param_set, ctx, 0); - ADD_HOOK_FUNCTION(hook_skip, ctx, 0); - ADD_HOOK_FUNCTION(hook_pos, ctx, 0); - - ADD_HOOK_FUNCTION(state, ctx, 0); - ADD_HOOK_FUNCTION(state_foreign, ctx, 0); - ADD_HOOK_FUNCTION(state_set, ctx, 0); - ADD_HOOK_FUNCTION(state_foreign_set, ctx, 0); - - ADD_HOOK_FUNCTION(slot, ctx, 0); - ADD_HOOK_FUNCTION(slot_clear, ctx, 0); - ADD_HOOK_FUNCTION(slot_count, ctx, 0); - ADD_HOOK_FUNCTION(slot_set, ctx, 0); - ADD_HOOK_FUNCTION(slot_size, ctx, 0); - ADD_HOOK_FUNCTION(slot_subarray, ctx, 0); - ADD_HOOK_FUNCTION(slot_subfield, ctx, 0); - ADD_HOOK_FUNCTION(slot_type, ctx, 0); - ADD_HOOK_FUNCTION(slot_float, ctx, 0); - - ADD_HOOK_FUNCTION(trace, ctx, 0); - ADD_HOOK_FUNCTION(trace_num, ctx, 0); - ADD_HOOK_FUNCTION(trace_float, ctx, 0); - - ADD_HOOK_FUNCTION(meta_slot, ctx, 0); - ADD_HOOK_FUNCTION(xpop_slot, ctx, 0); - - /* - ADD_HOOK_FUNCTION(str_find, ctx, 0); - ADD_HOOK_FUNCTION(str_replace, ctx, 0); - ADD_HOOK_FUNCTION(str_compare, ctx, 0); - ADD_HOOK_FUNCTION(str_concat, ctx, 0); - */ +#undef HOOK_API_DEFINITION +#undef HOOK_WRAP_PARAMS +#pragma pop_macro("HOOK_API_DEFINITION") WasmEdge_TableInstanceContext* hostTable = WasmEdge_TableInstanceCreate(tableType); diff --git a/src/ripple/app/hook/guard_checker.cpp b/src/ripple/app/hook/guard_checker.cpp index a241ba5f63..02c8f42939 100644 --- a/src/ripple/app/hook/guard_checker.cpp +++ b/src/ripple/app/hook/guard_checker.cpp @@ -82,7 +82,12 @@ main(int argc, char** argv) close(fd); auto result = validateGuards( - hook, std::cout, "", false, hook_api::getImportWhitelist(), 3); + hook, + std::cout, + "", + false, + hook_api::getImportWhitelist(), + hook_api::getGuardRulesVersion()); if (!result) { diff --git a/src/ripple/app/hook/hook_api.macro b/src/ripple/app/hook/hook_api.macro new file mode 100644 index 0000000000..267c5ac3a1 --- /dev/null +++ b/src/ripple/app/hook/hook_api.macro @@ -0,0 +1,221 @@ +// int32_t _g(uint32_t guard_id, uint32_t maxiter); +HOOK_API_DEFINITION(int32_t, _g, (uint32_t, uint32_t), uint256{}, 100) + +// int64_t accept(uint32_t read_ptr, uint32_t read_len, int64_t error_code); +HOOK_API_DEFINITION(int64_t, accept, (uint32_t, uint32_t, int64_t), uint256{}, 100) + +// int64_t rollback(uint32_t read_ptr, uint32_t read_len, int64_t error_code); +HOOK_API_DEFINITION(int64_t, rollback, (uint32_t, uint32_t, int64_t), uint256{}, 100) + +// int64_t util_raddr(uint32_t write_ptr, uint32_t write_len, uint32_t read_ptr, uint32_t read_len); +HOOK_API_DEFINITION(int64_t, util_raddr, (uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t util_accid(uint32_t write_ptr, uint32_t write_len, uint32_t read_ptr, uint32_t read_len); +HOOK_API_DEFINITION(int64_t, util_accid, (uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t util_verify(uint32_t dread_ptr, uint32_t dread_len, uint32_t sread_ptr, uint32_t sread_len, uint32_t kread_ptr, uint32_t kread_len); +HOOK_API_DEFINITION(int64_t, util_verify, (uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t util_sha512h(uint32_t write_ptr, uint32_t write_len, uint32_t read_ptr, uint32_t read_len); +HOOK_API_DEFINITION(int64_t, util_sha512h, (uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t util_keylet(uint32_t write_ptr, uint32_t write_len, uint32_t keylet_type, uint32_t a, uint32_t b, uint32_t c, uint32_t d, uint32_t e, uint32_t f); +HOOK_API_DEFINITION(int64_t, util_keylet, (uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t sto_validate(uint32_t tread_ptr, uint32_t tread_len); +HOOK_API_DEFINITION(int64_t, sto_validate, (uint32_t, uint32_t), uint256{}, 100) + +// int64_t sto_subfield(uint32_t read_ptr, uint32_t read_len, uint32_t field_id); +HOOK_API_DEFINITION(int64_t, sto_subfield, (uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t sto_subarray(uint32_t read_ptr, uint32_t read_len, uint32_t array_id); +HOOK_API_DEFINITION(int64_t, sto_subarray, (uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t sto_emplace(uint32_t write_ptr, uint32_t write_len, uint32_t sread_ptr, uint32_t sread_len, uint32_t fread_ptr, uint32_t fread_len, uint32_t field_id); +HOOK_API_DEFINITION(int64_t, sto_emplace, (uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t sto_erase(uint32_t write_ptr, uint32_t write_len, uint32_t read_ptr, uint32_t read_len, uint32_t field_id); +HOOK_API_DEFINITION(int64_t, sto_erase, (uint32_t, uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t etxn_burden(); +HOOK_API_DEFINITION(int64_t, etxn_burden, (), uint256{}, 100) + +// int64_t etxn_details(uint32_t write_ptr, uint32_t write_len); +HOOK_API_DEFINITION(int64_t, etxn_details, (uint32_t, uint32_t), uint256{}, 100) + +// int64_t etxn_fee_base(uint32_t read_ptr, uint32_t read_len); +HOOK_API_DEFINITION(int64_t, etxn_fee_base, (uint32_t, uint32_t), uint256{}, 100) + +// int64_t etxn_reserve(uint32_t count); +HOOK_API_DEFINITION(int64_t, etxn_reserve, (uint32_t), uint256{}, 100) + +// int64_t etxn_generation(); +HOOK_API_DEFINITION(int64_t, etxn_generation, (), uint256{}, 100) + +// int64_t etxn_nonce(uint32_t write_ptr, uint32_t write_len); +HOOK_API_DEFINITION(int64_t, etxn_nonce, (uint32_t, uint32_t), uint256{}, 100) + +// int64_t emit(uint32_t write_ptr, uint32_t write_len, uint32_t read_ptr, uint32_t read_len); +HOOK_API_DEFINITION(int64_t, emit, (uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t float_set(int32_t exponent, int64_t mantissa); +HOOK_API_DEFINITION(int64_t, float_set, (int32_t, int64_t), uint256{}, 100) + +// int64_t float_multiply(int64_t float1, int64_t float2); +HOOK_API_DEFINITION(int64_t, float_multiply, (int64_t, int64_t), uint256{}, 100) + +// int64_t float_mulratio(int64_t float1, uint32_t round_up, uint32_t numerator, uint32_t denominator); +HOOK_API_DEFINITION(int64_t, float_mulratio, (int64_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t float_negate(int64_t float1); +HOOK_API_DEFINITION(int64_t, float_negate, (int64_t), uint256{}, 100) + +// int64_t float_compare(int64_t float1, int64_t float2, uint32_t mode); +HOOK_API_DEFINITION(int64_t, float_compare, (int64_t, int64_t, uint32_t), uint256{}, 100) + +// int64_t float_sum(int64_t float1, int64_t float2); +HOOK_API_DEFINITION(int64_t, float_sum, (int64_t, int64_t), uint256{}, 100) + +// int64_t float_sto(uint32_t write_ptr, uint32_t write_len, uint32_t cread_ptr, uint32_t cread_len, uint32_t iread_ptr, uint32_t iread_len, int64_t float1, uint32_t field_code); +HOOK_API_DEFINITION(int64_t, float_sto, (uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, int64_t, uint32_t), uint256{}, 100) + +// int64_t float_sto_set(uint32_t read_ptr, uint32_t read_len); +HOOK_API_DEFINITION(int64_t, float_sto_set, (uint32_t, uint32_t), uint256{}, 100) + +// int64_t float_invert(int64_t float1); +HOOK_API_DEFINITION(int64_t, float_invert, (int64_t), uint256{}, 100) + +// int64_t float_divide(int64_t float1, int64_t float2); +HOOK_API_DEFINITION(int64_t, float_divide, (int64_t, int64_t), uint256{}, 100) + +// int64_t float_one(); +HOOK_API_DEFINITION(int64_t, float_one, (), uint256{}, 100) + +// int64_t float_mantissa(int64_t float1); +HOOK_API_DEFINITION(int64_t, float_mantissa, (int64_t), uint256{}, 100) + +// int64_t float_sign(int64_t float1); +HOOK_API_DEFINITION(int64_t, float_sign, (int64_t), uint256{}, 100) + +// int64_t float_int(int64_t float1, uint32_t decimal_places, uint32_t abs); +HOOK_API_DEFINITION(int64_t, float_int, (int64_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t float_log(int64_t float1); +HOOK_API_DEFINITION(int64_t, float_log, (int64_t), uint256{}, 100) + +// int64_t float_root(int64_t float1, uint32_t n); +HOOK_API_DEFINITION(int64_t, float_root, (int64_t, uint32_t), uint256{}, 100) + +// int64_t fee_base(); +HOOK_API_DEFINITION(int64_t, fee_base, (), uint256{}, 100) + +// int64_t ledger_seq(); +HOOK_API_DEFINITION(int64_t, ledger_seq, (), uint256{}, 100) + +// int64_t ledger_last_time(); +HOOK_API_DEFINITION(int64_t, ledger_last_time, (), uint256{}, 100) + +// int64_t ledger_last_hash(uint32_t write_ptr, uint32_t write_len); +HOOK_API_DEFINITION(int64_t, ledger_last_hash, (uint32_t, uint32_t), uint256{}, 100) + +// int64_t ledger_nonce(uint32_t write_ptr, uint32_t write_len); +HOOK_API_DEFINITION(int64_t, ledger_nonce, (uint32_t, uint32_t), uint256{}, 100) + +// int64_t ledger_keylet(uint32_t write_ptr, uint32_t write_len, uint32_t lread_ptr, uint32_t lread_len, uint32_t hread_ptr, uint32_t hread_len); +HOOK_API_DEFINITION(int64_t, ledger_keylet, (uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t hook_account(uint32_t write_ptr, uint32_t write_len); +HOOK_API_DEFINITION(int64_t, hook_account, (uint32_t, uint32_t), uint256{}, 100) + +// int64_t hook_hash(uint32_t write_ptr, uint32_t write_len, int32_t hook_no); +HOOK_API_DEFINITION(int64_t, hook_hash, (uint32_t, uint32_t, int32_t), uint256{}, 100) + +// int64_t hook_param_set(uint32_t read_ptr, uint32_t read_len, uint32_t kread_ptr, uint32_t kread_len, uint32_t hread_ptr, uint32_t hread_len); +HOOK_API_DEFINITION(int64_t, hook_param_set, (uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t hook_param(uint32_t write_ptr, uint32_t write_len, uint32_t read_ptr, uint32_t read_len); +HOOK_API_DEFINITION(int64_t, hook_param, (uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t hook_again(); +HOOK_API_DEFINITION(int64_t, hook_again, (), uint256{}, 100) + +// int64_t hook_skip(uint32_t read_ptr, uint32_t read_len, uint32_t flags); +HOOK_API_DEFINITION(int64_t, hook_skip, (uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t hook_pos(); +HOOK_API_DEFINITION(int64_t, hook_pos, (), uint256{}, 100) + +// int64_t slot(uint32_t write_ptr, uint32_t write_len, uint32_t slot); +HOOK_API_DEFINITION(int64_t, slot, (uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t slot_clear(uint32_t slot); +HOOK_API_DEFINITION(int64_t, slot_clear, (uint32_t), uint256{}, 100) + +// int64_t slot_count(uint32_t slot); +HOOK_API_DEFINITION(int64_t, slot_count, (uint32_t), uint256{}, 100) + +// int64_t slot_set(uint32_t read_ptr, uint32_t read_len, uint32_t slot); +HOOK_API_DEFINITION(int64_t, slot_set, (uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t slot_size(uint32_t slot); +HOOK_API_DEFINITION(int64_t, slot_size, (uint32_t), uint256{}, 100) + +// int64_t slot_subarray(uint32_t parent_slot, uint32_t array_id, uint32_t new_slot); +HOOK_API_DEFINITION(int64_t, slot_subarray, (uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t slot_subfield(uint32_t parent_slot, uint32_t field_id, uint32_t new_slot); +HOOK_API_DEFINITION(int64_t, slot_subfield, (uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t slot_type(uint32_t slot_no, uint32_t flags); +HOOK_API_DEFINITION(int64_t, slot_type, (uint32_t, uint32_t), uint256{}, 100) + +// int64_t slot_float(uint32_t slot_no); +HOOK_API_DEFINITION(int64_t, slot_float, (uint32_t), uint256{}, 100) + +// int64_t state_set(uint32_t read_ptr, uint32_t read_len, uint32_t kread_ptr, uint32_t kread_len); +HOOK_API_DEFINITION(int64_t, state_set, (uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t state_foreign_set(uint32_t read_ptr, uint32_t read_len, uint32_t kread_ptr, uint32_t kread_len, uint32_t nread_ptr, uint32_t nread_len, uint32_t aread_ptr, uint32_t aread_len); +HOOK_API_DEFINITION(int64_t, state_foreign_set, (uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t state(uint32_t write_ptr, uint32_t write_len, uint32_t kread_ptr, uint32_t kread_len); +HOOK_API_DEFINITION(int64_t, state, (uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t state_foreign(uint32_t write_ptr, uint32_t write_len, uint32_t kread_ptr, uint32_t kread_len, uint32_t nread_ptr, uint32_t nread_len, uint32_t aread_ptr, uint32_t aread_len); +HOOK_API_DEFINITION(int64_t, state_foreign, (uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t trace(uint32_t mread_ptr, uint32_t mread_len, uint32_t dread_ptr, uint32_t dread_len, uint32_t as_hex); +HOOK_API_DEFINITION(int64_t, trace, (uint32_t, uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t trace_num(uint32_t read_ptr, uint32_t read_len, int64_t number); +HOOK_API_DEFINITION(int64_t, trace_num, (uint32_t, uint32_t, int64_t), uint256{}, 100) + +// int64_t trace_float(uint32_t read_ptr, uint32_t read_len, int64_t float1); +HOOK_API_DEFINITION(int64_t, trace_float, (uint32_t, uint32_t, int64_t), uint256{}, 100) + +// int64_t otxn_burden(); +HOOK_API_DEFINITION(int64_t, otxn_burden, (), uint256{}, 100) + +// int64_t otxn_field(uint32_t write_ptr, uint32_t write_len, uint32_t field_id); +HOOK_API_DEFINITION(int64_t, otxn_field, (uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t otxn_generation(); +HOOK_API_DEFINITION(int64_t, otxn_generation, (), uint256{}, 100) + +// int64_t otxn_id(uint32_t write_ptr, uint32_t write_len, uint32_t flags); +HOOK_API_DEFINITION(int64_t, otxn_id, (uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t otxn_type(); +HOOK_API_DEFINITION(int64_t, otxn_type, (), uint256{}, 100) + +// int64_t otxn_slot(uint32_t slot_no); +HOOK_API_DEFINITION(int64_t, otxn_slot, (uint32_t), uint256{}, 100) + +// int64_t otxn_param(uint32_t write_ptr, uint32_t write_len, uint32_t read_ptr, uint32_t read_len); +HOOK_API_DEFINITION(int64_t, otxn_param, (uint32_t, uint32_t, uint32_t, uint32_t), uint256{}, 100) + +// int64_t meta_slot(uint32_t slot_no); +HOOK_API_DEFINITION(int64_t, meta_slot, (uint32_t), uint256{}, 100) + +// int64_t xpop_slot(uint32_t slot_no_tx, uint32_t slot_no_meta); +HOOK_API_DEFINITION(int64_t, xpop_slot, (uint32_t, uint32_t), featureHooksUpdate1, 100) diff --git a/src/ripple/app/tx/impl/Change.cpp b/src/ripple/app/tx/impl/Change.cpp index 55fa12c47c..da13ebf01b 100644 --- a/src/ripple/app/tx/impl/Change.cpp +++ b/src/ripple/app/tx/impl/Change.cpp @@ -608,7 +608,7 @@ Change::activateXahauGenesis() "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", false, hook_api::getImportWhitelist(ctx_.view().rules()), - (ctx_.view().rules().enabled(fix20250131) ? 2 : 0)); + hook_api::getGuardRulesVersion(ctx_.view().rules())); if (!result) { diff --git a/src/ripple/app/tx/impl/SetHook.cpp b/src/ripple/app/tx/impl/SetHook.cpp index 10ea385e31..c91bfe74d6 100644 --- a/src/ripple/app/tx/impl/SetHook.cpp +++ b/src/ripple/app/tx/impl/SetHook.cpp @@ -492,7 +492,7 @@ SetHook::validateHookSetEntry(SetHookCtx& ctx, STObject const& hookSetObj) hsacc, ctx.rules.enabled(featureHookFeeV2), hook_api::getImportWhitelist(ctx.rules), - (ctx.rules.enabled(fix20250131) ? 2 : 0)); + hook_api::getGuardRulesVersion(ctx.rules)); if (ctx.j.trace()) { diff --git a/src/test/app/SetHook_test.cpp b/src/test/app/SetHook_test.cpp index d8caa64188..cb8bbadbd0 100644 --- a/src/test/app/SetHook_test.cpp +++ b/src/test/app/SetHook_test.cpp @@ -23,6 +23,8 @@ #include #include #include +#include "ripple/protocol/Feature.h" +#include "ripple/protocol/TER.h" #include #include #include @@ -6896,7 +6898,10 @@ public: std::vector const keys = { "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC" "1"}; - Env env{*this, network::makeNetworkVLConfig(21337, keys)}; + Env env{ + *this, + network::makeNetworkVLConfig(21337, keys), + features - featureHooksUpdate1}; auto const master = Account("masterpassphrase"); env(noop(master), fee(10'000'000'000), ter(tesSUCCESS)); @@ -6974,6 +6979,16 @@ public: } )[test.hook]"]; + // before featureHooksUpdate1 + env(ripple::test::jtx::hook(alice, {{hso(hook, overrideFlag)}}, 0), + M("set xpop_slot (disabled)"), + HSFEE, + ter(temMALFORMED)); + env.close(); + + env.enableFeature(featureHooksUpdate1); + env.close(); + // install the hook on alice env(ripple::test::jtx::hook(alice, {{hso(hook, overrideFlag)}}, 0), M("set xpop_slot"),