From cc37a969ff32c5ee50c63bfb300bb81b469ef1c5 Mon Sep 17 00:00:00 2001 From: tequ Date: Wed, 22 Oct 2025 16:54:38 +0900 Subject: [PATCH 01/15] Refactor: Whitelisted Hook APIs --- src/ripple/app/hook/Enum.h | 179 ++++++++++++++++++++----------------- 1 file changed, 99 insertions(+), 80 deletions(-) diff --git a/src/ripple/app/hook/Enum.h b/src/ripple/app/hook/Enum.h index 19209389e5..a61553a76b 100644 --- a/src/ripple/app/hook/Enum.h +++ b/src/ripple/app/hook/Enum.h @@ -350,90 +350,109 @@ 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_API_DEFINITION(RETURN_TYPE, FUNCTION_NAME, ...) \ + { \ + FUNCTION_NAME, \ + { \ + RETURN_TYPE, __VA_ARGS__ \ + } \ + } + +using APIWhitelist = std::map>; + // RH NOTE: Find descriptions of api functions in ./impl/applyHook.cpp and // hookapi.h (include for hooks) this is a map of the api name to its return // code (vec[0] and its parameters vec[>0]) as wasm type codes -static const std::map> import_whitelist{ - {"_g", {0x7FU, 0x7FU, 0x7FU}}, - {"accept", {0x7EU, 0x7FU, 0x7FU, 0x7EU}}, - {"rollback", {0x7EU, 0x7FU, 0x7FU, 0x7EU}}, - {"util_raddr", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"util_accid", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"util_verify", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"util_sha512h", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"util_keylet", - {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"sto_validate", {0x7EU, 0x7FU, 0x7FU}}, - {"sto_subfield", {0x7EU, 0x7FU, 0x7FU, 0x7FU}}, - {"sto_subarray", {0x7EU, 0x7FU, 0x7FU, 0x7FU}}, - {"sto_emplace", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"sto_erase", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"etxn_burden", {0x7EU}}, - {"etxn_details", {0x7EU, 0x7FU, 0x7FU}}, - {"etxn_fee_base", {0x7EU, 0x7FU, 0x7FU}}, - {"etxn_reserve", {0x7EU, 0x7FU}}, - {"etxn_generation", {0x7EU}}, - {"etxn_nonce", {0x7EU, 0x7FU, 0x7FU}}, - {"emit", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"float_set", {0x7EU, 0x7FU, 0x7EU}}, - {"float_multiply", {0x7EU, 0x7EU, 0x7EU}}, - {"float_mulratio", {0x7EU, 0x7EU, 0x7FU, 0x7FU, 0x7FU}}, - {"float_negate", {0x7EU, 0x7EU}}, - {"float_compare", {0x7EU, 0x7EU, 0x7EU, 0x7FU}}, - {"float_sum", {0x7EU, 0x7EU, 0x7EU}}, - {"float_sto", - {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7EU, 0x7FU}}, - {"float_sto_set", {0x7EU, 0x7FU, 0x7FU}}, - {"float_invert", {0x7EU, 0x7EU}}, - {"float_divide", {0x7EU, 0x7EU, 0x7EU}}, - {"float_one", {0x7EU}}, - {"float_mantissa", {0x7EU, 0x7EU}}, - {"float_sign", {0x7EU, 0x7EU}}, - {"float_int", {0x7EU, 0x7EU, 0x7FU, 0x7FU}}, - {"float_log", {0x7EU, 0x7EU}}, - {"float_root", {0x7EU, 0x7EU, 0x7FU}}, - {"fee_base", {0x7EU}}, - {"ledger_seq", {0x7EU}}, - {"ledger_last_time", {0x7EU}}, - {"ledger_last_hash", {0x7EU, 0x7FU, 0x7FU}}, - {"ledger_nonce", {0x7EU, 0x7FU, 0x7FU}}, - {"ledger_keylet", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"hook_account", {0x7EU, 0x7FU, 0x7FU}}, - {"hook_hash", {0x7EU, 0x7FU, 0x7FU, 0x7FU}}, - {"hook_param_set", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"hook_param", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"hook_again", {0x7EU}}, - {"hook_skip", {0x7EU, 0x7FU, 0x7FU, 0x7FU}}, - {"hook_pos", {0x7EU}}, - {"slot", {0x7EU, 0x7FU, 0x7FU, 0x7FU}}, - {"slot_clear", {0x7EU, 0x7FU}}, - {"slot_count", {0x7EU, 0x7FU}}, - {"slot_set", {0x7EU, 0x7FU, 0x7FU, 0x7FU}}, - {"slot_size", {0x7EU, 0x7FU}}, - {"slot_subarray", {0x7EU, 0x7FU, 0x7FU, 0x7FU}}, - {"slot_subfield", {0x7EU, 0x7FU, 0x7FU, 0x7FU}}, - {"slot_type", {0x7EU, 0x7FU, 0x7FU}}, - {"slot_float", {0x7EU, 0x7FU}}, - {"state_set", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"state_foreign_set", - {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"state", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"state_foreign", - {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"trace", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"trace_num", {0x7EU, 0x7FU, 0x7FU, 0x7EU}}, - {"trace_float", {0x7EU, 0x7FU, 0x7FU, 0x7EU}}, - {"otxn_burden", {0x7EU}}, - {"otxn_field", {0x7EU, 0x7FU, 0x7FU, 0x7FU}}, - {"otxn_generation", {0x7EU}}, - {"otxn_id", {0x7EU, 0x7FU, 0x7FU, 0x7FU}}, - {"otxn_type", {0x7EU}}, - {"otxn_slot", {0x7EU, 0x7FU}}, - {"otxn_param", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}}, - {"meta_slot", {0x7EU, 0x7FU}}}; +static const APIWhitelist import_whitelist{ + // clang-format off + HOOK_API_DEFINITION(I32, "_g", I32, I32), + HOOK_API_DEFINITION(I64, "accept", I32, I32, I64), + HOOK_API_DEFINITION(I64, "rollback", I32, I32, I64), + HOOK_API_DEFINITION(I64, "util_raddr", I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "util_accid", I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "util_verify", I32, I32, I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "util_sha512h", I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "util_keylet", I32, I32, I32, I32, I32, I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "sto_validate", I32, I32), + HOOK_API_DEFINITION(I64, "sto_subfield", I32, I32, I32), + HOOK_API_DEFINITION(I64, "sto_subarray", I32, I32, I32), + HOOK_API_DEFINITION(I64, "sto_emplace", I32, I32, I32, I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "sto_erase", I32, I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "etxn_burden"), + HOOK_API_DEFINITION(I64, "etxn_details", I32, I32), + HOOK_API_DEFINITION(I64, "etxn_fee_base", I32, I32), + HOOK_API_DEFINITION(I64, "etxn_reserve", I32), + HOOK_API_DEFINITION(I64, "etxn_generation"), + HOOK_API_DEFINITION(I64, "etxn_nonce", I32, I32), + HOOK_API_DEFINITION(I64, "emit", I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "float_set", I32, I64), + HOOK_API_DEFINITION(I64, "float_multiply", I64, I64), + HOOK_API_DEFINITION(I64, "float_mulratio", I64, I32, I32, I32), + HOOK_API_DEFINITION(I64, "float_negate", I64), + HOOK_API_DEFINITION(I64, "float_compare", I64, I64, I32), + HOOK_API_DEFINITION(I64, "float_sum", I64, I64), + HOOK_API_DEFINITION(I64, "float_sto", I32, I32, I32, I32, I32, I32, I64, I32), + HOOK_API_DEFINITION(I64, "float_sto_set", I32, I32), + HOOK_API_DEFINITION(I64, "float_invert", I64), + HOOK_API_DEFINITION(I64, "float_divide", I64, I64), + HOOK_API_DEFINITION(I64, "float_one"), + HOOK_API_DEFINITION(I64, "float_mantissa", I64), + HOOK_API_DEFINITION(I64, "float_sign", I64), + HOOK_API_DEFINITION(I64, "float_int", I64, I32, I32), + HOOK_API_DEFINITION(I64, "float_log", I64), + HOOK_API_DEFINITION(I64, "float_root", I64, I32), + HOOK_API_DEFINITION(I64, "fee_base"), + HOOK_API_DEFINITION(I64, "ledger_seq"), + HOOK_API_DEFINITION(I64, "ledger_last_time"), + HOOK_API_DEFINITION(I64, "ledger_last_hash", I32, I32), + HOOK_API_DEFINITION(I64, "ledger_nonce", I32, I32), + HOOK_API_DEFINITION(I64, "ledger_keylet", I32, I32, I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "hook_account", I32, I32), + HOOK_API_DEFINITION(I64, "hook_hash", I32, I32, I32), + HOOK_API_DEFINITION(I64, "hook_param_set", I32, I32, I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "hook_param", I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "hook_again"), + HOOK_API_DEFINITION(I64, "hook_skip", I32, I32, I32), + HOOK_API_DEFINITION(I64, "hook_pos"), + HOOK_API_DEFINITION(I64, "slot", I32, I32, I32), + HOOK_API_DEFINITION(I64, "slot_clear", I32), + HOOK_API_DEFINITION(I64, "slot_count", I32), + HOOK_API_DEFINITION(I64, "slot_set", I32, I32, I32), + HOOK_API_DEFINITION(I64, "slot_size", I32), + HOOK_API_DEFINITION(I64, "slot_subarray", I32, I32, I32), + HOOK_API_DEFINITION(I64, "slot_subfield", I32, I32, I32), + HOOK_API_DEFINITION(I64, "slot_type", I32, I32), + HOOK_API_DEFINITION(I64, "slot_float", I32), + HOOK_API_DEFINITION(I64, "state_set", I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "state_foreign_set", I32, I32, I32, I32, I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "state", I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "state_foreign", I32, I32, I32, I32, I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "trace", I32, I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "trace_num", I32, I32, I64), + HOOK_API_DEFINITION(I64, "trace_float", I32, I32, I64), + HOOK_API_DEFINITION(I64, "otxn_burden"), + HOOK_API_DEFINITION(I64, "otxn_field", I32, I32, I32), + HOOK_API_DEFINITION(I64, "otxn_generation"), + HOOK_API_DEFINITION(I64, "otxn_id", I32, I32, I32), + HOOK_API_DEFINITION(I64, "otxn_type"), + HOOK_API_DEFINITION(I64, "otxn_slot", I32), + HOOK_API_DEFINITION(I64, "otxn_param", I32, I32, I32, I32), + HOOK_API_DEFINITION(I64, "meta_slot", I32), + // clang-format on +}; // featureHooks1 -static const std::map> import_whitelist_1{ - {"xpop_slot", {0x7EU, 0x7FU, 0x7FU}}}; +static const APIWhitelist import_whitelist_1{ + // clang-format off + HOOK_API_DEFINITION(I64, "xpop_slot", I32, I32) + // clang-format on +}; + +#undef HOOK_API_DEFINITION +#undef I32 +#undef I64 }; // namespace hook_api #endif From c6699843694ca8f1a5efb702966fbebc5727ec55 Mon Sep 17 00:00:00 2001 From: tequ Date: Mon, 27 Oct 2025 01:55:13 +0900 Subject: [PATCH 02/15] Allow `memory.fill` and `memory.copy` in Hook --- src/ripple/app/hook/Guard.h | 4 +- src/ripple/app/hook/applyHook.h | 2 + src/ripple/app/hook/guard_checker.cpp | 4 +- src/ripple/app/tx/impl/Change.cpp | 12 +- src/ripple/app/tx/impl/SetHook.cpp | 11 +- src/ripple/protocol/Feature.h | 3 +- src/ripple/protocol/impl/Feature.cpp | 1 + src/test/app/SetHook_test.cpp | 233 ++++++++++++++-- src/test/app/SetHook_wasm.h | 388 +++++++++++++++++++------- 9 files changed, 529 insertions(+), 129 deletions(-) diff --git a/src/ripple/app/hook/Guard.h b/src/ripple/app/hook/Guard.h index f395af4481..6a64c4679a 100644 --- a/src/ripple/app/hook/Guard.h +++ b/src/ripple/app/hook/Guard.h @@ -634,7 +634,7 @@ check_guard( } else if (fc_type == 10) // memory.copy { - if (rulesVersion & 0x02U) + if ((rulesVersion & 0x02U) && !(rulesVersion & 0x04U)) GUARD_ERROR("Memory.copy instruction is not allowed."); REQUIRE(2); @@ -642,7 +642,7 @@ check_guard( } else if (fc_type == 11) // memory.fill { - if (rulesVersion & 0x02U) + if ((rulesVersion & 0x02U) && !(rulesVersion & 0x04U)) GUARD_ERROR("Memory.fill instruction is not allowed."); ADVANCE(1); diff --git a/src/ripple/app/hook/applyHook.h b/src/ripple/app/hook/applyHook.h index 2c1f250bbf..2c56e864fd 100644 --- a/src/ripple/app/hook/applyHook.h +++ b/src/ripple/app/hook/applyHook.h @@ -658,6 +658,8 @@ class HookExecutor if (!conf) return; WasmEdge_ConfigureStatisticsSetInstructionCounting(conf, true); + WasmEdge_ConfigureSetMaxMemoryPage( + conf, 16); // 16 * 64KiB = 1024 KiB = 1MiB = 1048576 bytes ctx = WasmEdge_VMCreate(conf, NULL); } diff --git a/src/ripple/app/hook/guard_checker.cpp b/src/ripple/app/hook/guard_checker.cpp index f20d24617b..03471804a6 100644 --- a/src/ripple/app/hook/guard_checker.cpp +++ b/src/ripple/app/hook/guard_checker.cpp @@ -79,7 +79,9 @@ main(int argc, char** argv) close(fd); - auto result = validateGuards(hook, std::cout, "", 3); + uint64_t rulesVersion = 0b00000111; + + auto result = validateGuards(hook, std::cout, "", rulesVersion); if (!result) { diff --git a/src/ripple/app/tx/impl/Change.cpp b/src/ripple/app/tx/impl/Change.cpp index 37a436feea..efa813f4ba 100644 --- a/src/ripple/app/tx/impl/Change.cpp +++ b/src/ripple/app/tx/impl/Change.cpp @@ -601,12 +601,20 @@ Change::activateXahauGenesis() for (auto const& [hookOn, wasmBytes, params] : genesis_hooks) { std::ostringstream loggerStream; + + uint64_t rulesVersion = 0; + if (ctx_.view().rules().enabled(featureHooksUpdate1)) + rulesVersion |= 1; + if (ctx_.view().rules().enabled(fix20250131)) + rulesVersion |= 2; + if (ctx_.view().rules().enabled(featureHooksMemoryFillCopy)) + rulesVersion |= 4; + auto result = validateGuards( wasmBytes, // wasm to verify loggerStream, "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - (ctx_.view().rules().enabled(featureHooksUpdate1) ? 1 : 0) + - (ctx_.view().rules().enabled(fix20250131) ? 2 : 0)); + rulesVersion); if (!result) { diff --git a/src/ripple/app/tx/impl/SetHook.cpp b/src/ripple/app/tx/impl/SetHook.cpp index 9ca8295571..e39bae5e92 100644 --- a/src/ripple/app/tx/impl/SetHook.cpp +++ b/src/ripple/app/tx/impl/SetHook.cpp @@ -486,12 +486,19 @@ SetHook::validateHookSetEntry(SetHookCtx& ctx, STObject const& hookSetObj) hsacc = ss.str(); } + uint64_t rulesVersion = 0; + if (ctx.rules.enabled(featureHooksUpdate1)) + rulesVersion |= 1; + if (ctx.rules.enabled(fix20250131)) + rulesVersion |= 2; + if (ctx.rules.enabled(featureHooksMemoryFillCopy)) + rulesVersion |= 4; + auto result = validateGuards( hook, // wasm to verify logger, hsacc, - (ctx.rules.enabled(featureHooksUpdate1) ? 1 : 0) + - (ctx.rules.enabled(fix20250131) ? 2 : 0)); + rulesVersion); if (ctx.j.trace()) { diff --git a/src/ripple/protocol/Feature.h b/src/ripple/protocol/Feature.h index ed6b4e73f8..68c48fdce3 100644 --- a/src/ripple/protocol/Feature.h +++ b/src/ripple/protocol/Feature.h @@ -74,7 +74,7 @@ namespace detail { // Feature.cpp. Because it's only used to reserve storage, and determine how // large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than // the actual number of amendments. A LogicError on startup will verify this. -static constexpr std::size_t numFeatures = 88; +static constexpr std::size_t numFeatures = 89; /** Amendments that this server supports and the default voting behavior. Whether they are enabled depends on the Rules defined in the validated @@ -376,6 +376,7 @@ extern uint256 const featureIOUIssuerWeakTSH; extern uint256 const featureCron; extern uint256 const fixInvalidTxFlags; extern uint256 const featureExtendedHookState; +extern uint256 const featureHooksMemoryFillCopy; } // namespace ripple diff --git a/src/ripple/protocol/impl/Feature.cpp b/src/ripple/protocol/impl/Feature.cpp index 64d05f1342..894eba02f0 100644 --- a/src/ripple/protocol/impl/Feature.cpp +++ b/src/ripple/protocol/impl/Feature.cpp @@ -482,6 +482,7 @@ REGISTER_FEATURE(IOUIssuerWeakTSH, Supported::yes, VoteBehavior::De REGISTER_FEATURE(Cron, Supported::yes, VoteBehavior::DefaultNo); REGISTER_FIX (fixInvalidTxFlags, Supported::yes, VoteBehavior::DefaultYes); REGISTER_FEATURE(ExtendedHookState, Supported::yes, VoteBehavior::DefaultNo); +REGISTER_FEATURE(HooksMemoryFillCopy, Supported::yes, VoteBehavior::DefaultNo); // The following amendments are obsolete, but must remain supported // because they could potentially get enabled. diff --git a/src/test/app/SetHook_test.cpp b/src/test/app/SetHook_test.cpp index 8fef47656f..c1c44d3720 100644 --- a/src/test/app/SetHook_test.cpp +++ b/src/test/app/SetHook_test.cpp @@ -1298,46 +1298,225 @@ class SetHook0_test : public beast::unit_test::suite testFillCopy(FeatureBitset features) { testcase("Test fill/copy"); + using namespace jtx; + + auto const alice = Account{"alice"}; + auto const bob = Account{"bob"}; - // a hook containing memory.fill instruction - std::string hookFill = - "0061736d0100000001130360027f7f017f60037f7f7e017e60017f017e02" - "170203656e76025f67000003656e76066163636570740001030201020503" - "0100020621057f01418088040b7f004180080b7f004180080b7f00418088" - "040b7f004180080b07080104686f6f6b00020aa4800001a0800001017e23" - "01412a41e400fc0b004101410110001a41004100420010011a20010b"; - - // a hook containing memory.copy instruction - std::string hookCopy = - "0061736d0100000001130360027f7f017f60037f7f7e017e60017f017e02" - "170203656e76025f67000003656e76066163636570740001030201020503" - "0100020621057f01418088040b7f004180080b7f004180080b7f00418088" - "040b7f004180080b07080104686f6f6b00020aa5800001a1800001017e23" - "00230141e400fc0a00004101410110001a41004100420010011a20010b"; + { + // memory page size: 16 - using namespace jtx; + // 64KiB * 15 - 1024 = 982016 + // memory.fill with len=982016 works, but len=982017 traps. + // (memory 16) = 16 pages × 64KiB = 1,048,576 bytes total. + // Fill range: [1024, 1024 + len) + // len=982016 → ends at 983040 (exactly before page 15 boundary) → + // OK len=982017 → touches 983041 (first byte of page 15) → + // out-of-bounds trap. Many runtimes reserve the last 64KiB as a + // guard page for safety. Effectively only 15 pages are writable. + + // a hook containing memory.fill instruction + TestHook hookFill = wasm[R"[test.hook]( + (module + (type (;0;) (func (param i32 i32) (result i32))) + (type (;1;) (func (param i32 i32 i64) (result i64))) + (type (;2;) (func (param i32) (result i64))) + (import "env" "_g" (func (;0;) (type 0))) + (import "env" "accept" (func (;1;) (type 1))) + (func (;2;) (type 2) (param i32) (result i64) + (local i64) + global.get 1 + i32.const 42 + i32.const 982016 + memory.fill + i32.const 1 + i32.const 1 + call 0 + drop + i32.const 0 + i32.const 0 + i64.const 0 + call 1 + drop + local.get 1) + (memory (;0;) 16) + (global (;0;) (mut i32) (i32.const 66560)) + (global (;1;) i32 (i32.const 1024)) + (global (;2;) i32 (i32.const 1024)) + (global (;3;) i32 (i32.const 66560)) + (global (;4;) i32 (i32.const 1024)) + (export "hook" (func 2))) + )[test.hook]"]; + + // a hook containing memory.copy instruction + TestHook hookCopy = wasm[R"[test.hook]( + (module + (type (;0;) (func (param i32 i32) (result i32))) + (type (;1;) (func (param i32 i32 i64) (result i64))) + (type (;2;) (func (param i32) (result i64))) + (import "env" "_g" (func (;0;) (type 0))) + (import "env" "accept" (func (;1;) (type 1))) + (func (;2;) (type 2) (param i32) (result i64) + (local i64) + global.get 0 + global.get 1 + i32.const 982016 + memory.copy + i32.const 1 + i32.const 1 + call 0 + drop + i32.const 0 + i32.const 0 + i64.const 0 + call 1 + drop + local.get 1) + (memory (;0;) 16) + (global (;0;) (mut i32) (i32.const 66560)) + (global (;1;) i32 (i32.const 1024)) + (global (;2;) i32 (i32.const 1024)) + (global (;3;) i32 (i32.const 66560)) + (global (;4;) i32 (i32.const 1024)) + (export "hook" (func 2))) + )[test.hook]"]; + + for (bool withFix : {true, false}) + for (bool withFillCopy : {true, false}) + { + auto f = features; + if (!withFix) + f = f - fix20250131; + if (!withFillCopy) + f = f - featureHooksMemoryFillCopy; + Env env{*this, f}; + env.fund(XRP(10000), alice, bob); + env.close(); - for (int withFix = 0; withFix < 2; ++withFix) + auto expect = ter(tesSUCCESS); + if (withFix && !withFillCopy) + expect = ter(temMALFORMED); + if (withFillCopy) + expect = ter(tesSUCCESS); + + env(ripple::test::jtx::hook(alice, {{hso(hookFill)}}, 0), + M(withFix ? "hookFill - with fix" + : "hookFill - zonder fix"), + HSFEE, + expect); + env.close(); + + if (withFillCopy) + { + env(pay(bob, alice, XRP(1)), + fee(XRP(1)), + ter(tesSUCCESS)); + env.close(); + } + + env(ripple::test::jtx::hook(bob, {{hso(hookCopy)}}, 0), + M(withFix ? "hookCopy - with fix" + : "hookCopy - zonder fix"), + HSFEE, + expect); + env.close(); + + if (withFillCopy) + { + env(pay(bob, alice, XRP(1)), + fee(XRP(1)), + ter(tesSUCCESS)); + env.close(); + } + } + } { - auto f = withFix ? features : features - fix20250131; - Env env{*this, f}; + // Check trap + TestHook hookFill = wasm[R"[test.hook]( + (module + (type (;0;) (func (param i32 i32) (result i32))) + (type (;1;) (func (param i32 i32 i64) (result i64))) + (type (;2;) (func (param i32) (result i64))) + (import "env" "_g" (func (;0;) (type 0))) + (import "env" "accept" (func (;1;) (type 1))) + (func (;2;) (type 2) (param i32) (result i64) + (local i64) + global.get 1 + i32.const 42 + i32.const 982017 + memory.fill + i32.const 1 + i32.const 1 + call 0 + drop + i32.const 0 + i32.const 0 + i64.const 0 + call 1 + drop + local.get 1) + (memory (;0;) 2) + (global (;0;) (mut i32) (i32.const 66560)) + (global (;1;) i32 (i32.const 1024)) + (global (;2;) i32 (i32.const 1024)) + (global (;3;) i32 (i32.const 66560)) + (global (;4;) i32 (i32.const 1024)) + (export "hook" (func 2))) + )[test.hook]"]; - auto const alice = Account{"alice"}; - env.fund(XRP(10000), alice); + // a hook containing memory.copy instruction + TestHook hookCopy = wasm[R"[test.hook]( + (module + (type (;0;) (func (param i32 i32) (result i32))) + (type (;1;) (func (param i32 i32 i64) (result i64))) + (type (;2;) (func (param i32) (result i64))) + (import "env" "_g" (func (;0;) (type 0))) + (import "env" "accept" (func (;1;) (type 1))) + (func (;2;) (type 2) (param i32) (result i64) + (local i64) + global.get 0 + global.get 1 + i32.const 982017 + memory.copy + i32.const 1 + i32.const 1 + call 0 + drop + i32.const 0 + i32.const 0 + i64.const 0 + call 1 + drop + local.get 1) + (memory (;0;) 2) + (global (;0;) (mut i32) (i32.const 66560)) + (global (;1;) i32 (i32.const 1024)) + (global (;2;) i32 (i32.const 1024)) + (global (;3;) i32 (i32.const 66560)) + (global (;4;) i32 (i32.const 1024)) + (export "hook" (func 2))) + )[test.hook]"]; - auto const bob = Account{"bob"}; - env.fund(XRP(10000), bob); + Env env{*this, features | featureHooksMemoryFillCopy}; + env.fund(XRP(10000), alice, bob); + env.close(); env(ripple::test::jtx::hook(alice, {{hso(hookFill)}}, 0), - M(withFix ? "hookFill - with fix" : "hookFill - zonder fix"), + M("hookFill - page cap exceeded"), HSFEE, - withFix ? ter(temMALFORMED) : ter(tesSUCCESS)); + ter(tesSUCCESS)); + env.close(); + + env(pay(bob, alice, XRP(1)), fee(XRP(1)), ter(tecHOOK_REJECTED)); + env.close(); env(ripple::test::jtx::hook(bob, {{hso(hookCopy)}}, 0), - M(withFix ? "hookCopy - with fix" : "hookCopy - zonder fix"), + M("hookCopy - page cap exceeded"), HSFEE, - withFix ? ter(temMALFORMED) : ter(tesSUCCESS)); + ter(tesSUCCESS)); + env.close(); + env(pay(bob, alice, XRP(1)), fee(XRP(1)), ter(tecHOOK_REJECTED)); env.close(); } } diff --git a/src/test/app/SetHook_wasm.h b/src/test/app/SetHook_wasm.h index 626e4a849a..c7bcd44c66 100644 --- a/src/test/app/SetHook_wasm.h +++ b/src/test/app/SetHook_wasm.h @@ -191,6 +191,206 @@ std::map> wasm = { }}, /* ==== WASM: 1 ==== */ + {R"[test.hook]( + (module + (type (;0;) (func (param i32 i32) (result i32))) + (type (;1;) (func (param i32 i32 i64) (result i64))) + (type (;2;) (func (param i32) (result i64))) + (import "env" "_g" (func (;0;) (type 0))) + (import "env" "accept" (func (;1;) (type 1))) + (func (;2;) (type 2) (param i32) (result i64) + (local i64) + global.get 1 + i32.const 42 + i32.const 982016 + memory.fill + i32.const 1 + i32.const 1 + call 0 + drop + i32.const 0 + i32.const 0 + i64.const 0 + call 1 + drop + local.get 1) + (memory (;0;) 16) + (global (;0;) (mut i32) (i32.const 66560)) + (global (;1;) i32 (i32.const 1024)) + (global (;2;) i32 (i32.const 1024)) + (global (;3;) i32 (i32.const 66560)) + (global (;4;) i32 (i32.const 1024)) + (export "hook" (func 2))) + )[test.hook]", + { + 0x00U, 0x61U, 0x73U, 0x6DU, 0x01U, 0x00U, 0x00U, 0x00U, 0x01U, 0x13U, + 0x03U, 0x60U, 0x02U, 0x7FU, 0x7FU, 0x01U, 0x7FU, 0x60U, 0x03U, 0x7FU, + 0x7FU, 0x7EU, 0x01U, 0x7EU, 0x60U, 0x01U, 0x7FU, 0x01U, 0x7EU, 0x02U, + 0x17U, 0x02U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x02U, 0x5FU, 0x67U, 0x00U, + 0x00U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x06U, 0x61U, 0x63U, 0x63U, 0x65U, + 0x70U, 0x74U, 0x00U, 0x01U, 0x03U, 0x02U, 0x01U, 0x02U, 0x05U, 0x03U, + 0x01U, 0x00U, 0x10U, 0x06U, 0x21U, 0x05U, 0x7FU, 0x01U, 0x41U, 0x80U, + 0x88U, 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, + 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x88U, + 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x07U, 0x08U, + 0x01U, 0x04U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x02U, 0x0AU, 0x23U, + 0x01U, 0x21U, 0x01U, 0x01U, 0x7EU, 0x23U, 0x01U, 0x41U, 0x2AU, 0x41U, + 0x80U, 0xF8U, 0x3BU, 0xFCU, 0x0BU, 0x00U, 0x41U, 0x01U, 0x41U, 0x01U, + 0x10U, 0x00U, 0x1AU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, 0x10U, + 0x01U, 0x1AU, 0x20U, 0x01U, 0x0BU, + }}, + + /* ==== WASM: 2 ==== */ + {R"[test.hook]( + (module + (type (;0;) (func (param i32 i32) (result i32))) + (type (;1;) (func (param i32 i32 i64) (result i64))) + (type (;2;) (func (param i32) (result i64))) + (import "env" "_g" (func (;0;) (type 0))) + (import "env" "accept" (func (;1;) (type 1))) + (func (;2;) (type 2) (param i32) (result i64) + (local i64) + global.get 0 + global.get 1 + i32.const 982016 + memory.copy + i32.const 1 + i32.const 1 + call 0 + drop + i32.const 0 + i32.const 0 + i64.const 0 + call 1 + drop + local.get 1) + (memory (;0;) 16) + (global (;0;) (mut i32) (i32.const 66560)) + (global (;1;) i32 (i32.const 1024)) + (global (;2;) i32 (i32.const 1024)) + (global (;3;) i32 (i32.const 66560)) + (global (;4;) i32 (i32.const 1024)) + (export "hook" (func 2))) + )[test.hook]", + { + 0x00U, 0x61U, 0x73U, 0x6DU, 0x01U, 0x00U, 0x00U, 0x00U, 0x01U, 0x13U, + 0x03U, 0x60U, 0x02U, 0x7FU, 0x7FU, 0x01U, 0x7FU, 0x60U, 0x03U, 0x7FU, + 0x7FU, 0x7EU, 0x01U, 0x7EU, 0x60U, 0x01U, 0x7FU, 0x01U, 0x7EU, 0x02U, + 0x17U, 0x02U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x02U, 0x5FU, 0x67U, 0x00U, + 0x00U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x06U, 0x61U, 0x63U, 0x63U, 0x65U, + 0x70U, 0x74U, 0x00U, 0x01U, 0x03U, 0x02U, 0x01U, 0x02U, 0x05U, 0x03U, + 0x01U, 0x00U, 0x10U, 0x06U, 0x21U, 0x05U, 0x7FU, 0x01U, 0x41U, 0x80U, + 0x88U, 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, + 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x88U, + 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x07U, 0x08U, + 0x01U, 0x04U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x02U, 0x0AU, 0x24U, + 0x01U, 0x22U, 0x01U, 0x01U, 0x7EU, 0x23U, 0x00U, 0x23U, 0x01U, 0x41U, + 0x80U, 0xF8U, 0x3BU, 0xFCU, 0x0AU, 0x00U, 0x00U, 0x41U, 0x01U, 0x41U, + 0x01U, 0x10U, 0x00U, 0x1AU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, + 0x10U, 0x01U, 0x1AU, 0x20U, 0x01U, 0x0BU, + }}, + + /* ==== WASM: 3 ==== */ + {R"[test.hook]( + (module + (type (;0;) (func (param i32 i32) (result i32))) + (type (;1;) (func (param i32 i32 i64) (result i64))) + (type (;2;) (func (param i32) (result i64))) + (import "env" "_g" (func (;0;) (type 0))) + (import "env" "accept" (func (;1;) (type 1))) + (func (;2;) (type 2) (param i32) (result i64) + (local i64) + global.get 1 + i32.const 42 + i32.const 982017 + memory.fill + i32.const 1 + i32.const 1 + call 0 + drop + i32.const 0 + i32.const 0 + i64.const 0 + call 1 + drop + local.get 1) + (memory (;0;) 2) + (global (;0;) (mut i32) (i32.const 66560)) + (global (;1;) i32 (i32.const 1024)) + (global (;2;) i32 (i32.const 1024)) + (global (;3;) i32 (i32.const 66560)) + (global (;4;) i32 (i32.const 1024)) + (export "hook" (func 2))) + )[test.hook]", + { + 0x00U, 0x61U, 0x73U, 0x6DU, 0x01U, 0x00U, 0x00U, 0x00U, 0x01U, 0x13U, + 0x03U, 0x60U, 0x02U, 0x7FU, 0x7FU, 0x01U, 0x7FU, 0x60U, 0x03U, 0x7FU, + 0x7FU, 0x7EU, 0x01U, 0x7EU, 0x60U, 0x01U, 0x7FU, 0x01U, 0x7EU, 0x02U, + 0x17U, 0x02U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x02U, 0x5FU, 0x67U, 0x00U, + 0x00U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x06U, 0x61U, 0x63U, 0x63U, 0x65U, + 0x70U, 0x74U, 0x00U, 0x01U, 0x03U, 0x02U, 0x01U, 0x02U, 0x05U, 0x03U, + 0x01U, 0x00U, 0x02U, 0x06U, 0x21U, 0x05U, 0x7FU, 0x01U, 0x41U, 0x80U, + 0x88U, 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, + 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x88U, + 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x07U, 0x08U, + 0x01U, 0x04U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x02U, 0x0AU, 0x23U, + 0x01U, 0x21U, 0x01U, 0x01U, 0x7EU, 0x23U, 0x01U, 0x41U, 0x2AU, 0x41U, + 0x81U, 0xF8U, 0x3BU, 0xFCU, 0x0BU, 0x00U, 0x41U, 0x01U, 0x41U, 0x01U, + 0x10U, 0x00U, 0x1AU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, 0x10U, + 0x01U, 0x1AU, 0x20U, 0x01U, 0x0BU, + }}, + + /* ==== WASM: 4 ==== */ + {R"[test.hook]( + (module + (type (;0;) (func (param i32 i32) (result i32))) + (type (;1;) (func (param i32 i32 i64) (result i64))) + (type (;2;) (func (param i32) (result i64))) + (import "env" "_g" (func (;0;) (type 0))) + (import "env" "accept" (func (;1;) (type 1))) + (func (;2;) (type 2) (param i32) (result i64) + (local i64) + global.get 0 + global.get 1 + i32.const 982017 + memory.copy + i32.const 1 + i32.const 1 + call 0 + drop + i32.const 0 + i32.const 0 + i64.const 0 + call 1 + drop + local.get 1) + (memory (;0;) 2) + (global (;0;) (mut i32) (i32.const 66560)) + (global (;1;) i32 (i32.const 1024)) + (global (;2;) i32 (i32.const 1024)) + (global (;3;) i32 (i32.const 66560)) + (global (;4;) i32 (i32.const 1024)) + (export "hook" (func 2))) + )[test.hook]", + { + 0x00U, 0x61U, 0x73U, 0x6DU, 0x01U, 0x00U, 0x00U, 0x00U, 0x01U, 0x13U, + 0x03U, 0x60U, 0x02U, 0x7FU, 0x7FU, 0x01U, 0x7FU, 0x60U, 0x03U, 0x7FU, + 0x7FU, 0x7EU, 0x01U, 0x7EU, 0x60U, 0x01U, 0x7FU, 0x01U, 0x7EU, 0x02U, + 0x17U, 0x02U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x02U, 0x5FU, 0x67U, 0x00U, + 0x00U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x06U, 0x61U, 0x63U, 0x63U, 0x65U, + 0x70U, 0x74U, 0x00U, 0x01U, 0x03U, 0x02U, 0x01U, 0x02U, 0x05U, 0x03U, + 0x01U, 0x00U, 0x02U, 0x06U, 0x21U, 0x05U, 0x7FU, 0x01U, 0x41U, 0x80U, + 0x88U, 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, + 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x88U, + 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x07U, 0x08U, + 0x01U, 0x04U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x02U, 0x0AU, 0x24U, + 0x01U, 0x22U, 0x01U, 0x01U, 0x7EU, 0x23U, 0x00U, 0x23U, 0x01U, 0x41U, + 0x81U, 0xF8U, 0x3BU, 0xFCU, 0x0AU, 0x00U, 0x00U, 0x41U, 0x01U, 0x41U, + 0x01U, 0x10U, 0x00U, 0x1AU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, + 0x10U, 0x01U, 0x1AU, 0x20U, 0x01U, 0x0BU, + }}, + + /* ==== WASM: 5 ==== */ {R"[test.hook]( (module (type (;0;) (func (param i32 i32) (result i64))) @@ -240,7 +440,7 @@ std::map> wasm = { 0x0BU, }}, - /* ==== WASM: 2 ==== */ + /* ==== WASM: 6 ==== */ {R"[test.hook]( (module (type (;0;) (func (param i32 i32) (result i64))) @@ -294,7 +494,7 @@ std::map> wasm = { 0x14U, 0x10U, 0x00U, 0x1AU, 0x0CU, 0x00U, 0x0BU, 0x0BU, }}, - /* ==== WASM: 3 ==== */ + /* ==== WASM: 7 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -361,7 +561,7 @@ std::map> wasm = { 0x80U, 0x80U, 0x00U, 0x20U, 0x02U, 0x0BU, }}, - /* ==== WASM: 4 ==== */ + /* ==== WASM: 8 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -467,7 +667,7 @@ std::map> wasm = { 0x6AU, 0x24U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x20U, 0x03U, 0x0BU, }}, - /* ==== WASM: 5 ==== */ + /* ==== WASM: 9 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -542,7 +742,7 @@ std::map> wasm = { 0x6AU, 0x24U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x20U, 0x05U, 0x0BU, }}, - /* ==== WASM: 6 ==== */ + /* ==== WASM: 10 ==== */ {R"[test.hook]( #include extern int32_t _g(uint32_t, uint32_t); @@ -1159,7 +1359,7 @@ std::map> wasm = { 0x78U, 0x29U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x33U, 0x32U, 0x00U, }}, - /* ==== WASM: 7 ==== */ + /* ==== WASM: 11 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -1264,7 +1464,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 8 ==== */ + /* ==== WASM: 12 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -1361,7 +1561,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 9 ==== */ + /* ==== WASM: 13 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -1484,7 +1684,7 @@ std::map> wasm = { 0x4EU, 0x59U, 0x5FU, 0x4EU, 0x4FU, 0x4EU, 0x43U, 0x45U, 0x53U, 0x00U, }}, - /* ==== WASM: 10 ==== */ + /* ==== WASM: 14 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -1564,7 +1764,7 @@ std::map> wasm = { 0x54U, 0x00U, }}, - /* ==== WASM: 11 ==== */ + /* ==== WASM: 15 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -1609,7 +1809,7 @@ std::map> wasm = { 0x30U, 0x00U, }}, - /* ==== WASM: 12 ==== */ + /* ==== WASM: 16 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -1928,7 +2128,7 @@ std::map> wasm = { 0x80U, 0x80U, 0x80U, 0x00U, 0x0BU, }}, - /* ==== WASM: 13 ==== */ + /* ==== WASM: 17 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -2714,7 +2914,7 @@ std::map> wasm = { 0x37U, 0x36U, 0x33U, 0x4CU, 0x4CU, 0x20U, 0x29U, 0x00U, }}, - /* ==== WASM: 14 ==== */ + /* ==== WASM: 18 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -3104,7 +3304,7 @@ std::map> wasm = { 0x80U, 0x80U, 0x80U, 0x00U, 0x0BU, }}, - /* ==== WASM: 15 ==== */ + /* ==== WASM: 19 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -3285,7 +3485,7 @@ std::map> wasm = { 0x38U, 0x4CU, 0x4CU, 0x29U, 0x00U, }}, - /* ==== WASM: 16 ==== */ + /* ==== WASM: 20 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -3474,7 +3674,7 @@ std::map> wasm = { 0x29U, 0x00U, }}, - /* ==== WASM: 17 ==== */ + /* ==== WASM: 21 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -3713,7 +3913,7 @@ std::map> wasm = { 0x00U, 0x42U, 0x00U, 0x10U, 0x85U, 0x80U, 0x80U, 0x80U, 0x00U, 0x0BU, }}, - /* ==== WASM: 18 ==== */ + /* ==== WASM: 22 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -4415,7 +4615,7 @@ std::map> wasm = { 0x38U, 0x35U, 0x35U, 0x32U, 0x55U, 0x29U, 0x00U, }}, - /* ==== WASM: 19 ==== */ + /* ==== WASM: 23 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -5760,7 +5960,7 @@ std::map> wasm = { 0x20U, 0x29U, 0x00U, }}, - /* ==== WASM: 20 ==== */ + /* ==== WASM: 24 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -5862,7 +6062,7 @@ std::map> wasm = { 0x84U, 0x80U, 0x80U, 0x80U, 0x00U, 0x0BU, }}, - /* ==== WASM: 21 ==== */ + /* ==== WASM: 25 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -5905,7 +6105,7 @@ std::map> wasm = { 0x00U, 0x0BU, }}, - /* ==== WASM: 22 ==== */ + /* ==== WASM: 26 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -6053,7 +6253,7 @@ std::map> wasm = { 0x34U, 0x34U, 0x4CU, 0x4CU, 0x2CU, 0x20U, 0x33U, 0x29U, 0x00U, }}, - /* ==== WASM: 23 ==== */ + /* ==== WASM: 27 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -6381,7 +6581,7 @@ std::map> wasm = { 0x38U, 0x34U, 0x39U, 0x30U, 0x4CU, 0x4CU, 0x00U, }}, - /* ==== WASM: 24 ==== */ + /* ==== WASM: 28 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -6586,7 +6786,7 @@ std::map> wasm = { 0x10U, 0x85U, 0x80U, 0x80U, 0x80U, 0x00U, 0x0BU, }}, - /* ==== WASM: 25 ==== */ + /* ==== WASM: 29 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -7270,7 +7470,7 @@ std::map> wasm = { 0x20U, 0x3DU, 0x3DU, 0x20U, 0x30U, 0x00U, }}, - /* ==== WASM: 26 ==== */ + /* ==== WASM: 30 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -7565,7 +7765,7 @@ std::map> wasm = { 0x32U, 0x34U, 0x31U, 0x36U, 0x55U, 0x4CU, 0x4CU, 0x00U, }}, - /* ==== WASM: 27 ==== */ + /* ==== WASM: 31 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -8278,7 +8478,7 @@ std::map> wasm = { 0x31U, 0x33U, 0x33U, 0x38U, 0x20U, 0x29U, 0x00U, }}, - /* ==== WASM: 28 ==== */ + /* ==== WASM: 32 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -8363,7 +8563,7 @@ std::map> wasm = { 0x30U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x32U, 0x30U, 0x00U, }}, - /* ==== WASM: 29 ==== */ + /* ==== WASM: 33 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -8425,7 +8625,7 @@ std::map> wasm = { 0x80U, 0x80U, 0x00U, 0x0BU, }}, - /* ==== WASM: 30 ==== */ + /* ==== WASM: 34 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -8502,7 +8702,7 @@ std::map> wasm = { 0x31U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x33U, 0x32U, 0x00U, }}, - /* ==== WASM: 31 ==== */ + /* ==== WASM: 35 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -8579,7 +8779,7 @@ std::map> wasm = { 0x31U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x33U, 0x32U, 0x00U, }}, - /* ==== WASM: 32 ==== */ + /* ==== WASM: 36 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -8836,7 +9036,7 @@ std::map> wasm = { 0x00U, 0x00U, }}, - /* ==== WASM: 33 ==== */ + /* ==== WASM: 37 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -8994,7 +9194,7 @@ std::map> wasm = { 0x04U, 0x00U, 0x00U, }}, - /* ==== WASM: 34 ==== */ + /* ==== WASM: 38 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -9347,7 +9547,7 @@ std::map> wasm = { 0x00U, 0x2AU, 0x04U, 0x00U, 0x00U, 0x31U, 0x04U, 0x00U, 0x00U, }}, - /* ==== WASM: 35 ==== */ + /* ==== WASM: 39 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -9380,7 +9580,7 @@ std::map> wasm = { 0x82U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x20U, 0x01U, 0x0BU, }}, - /* ==== WASM: 36 ==== */ + /* ==== WASM: 40 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -9607,7 +9807,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 37 ==== */ + /* ==== WASM: 41 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -9638,7 +9838,7 @@ std::map> wasm = { 0x80U, 0x80U, 0x00U, 0x1AU, 0x20U, 0x01U, 0x0BU, }}, - /* ==== WASM: 38 ==== */ + /* ==== WASM: 42 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -9949,7 +10149,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 39 ==== */ + /* ==== WASM: 43 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10026,7 +10226,7 @@ std::map> wasm = { 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x33U, 0x32U, 0x00U, }}, - /* ==== WASM: 40 ==== */ + /* ==== WASM: 44 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10060,7 +10260,7 @@ std::map> wasm = { 0x80U, 0x80U, 0x00U, 0x1AU, 0x20U, 0x01U, 0x0BU, }}, - /* ==== WASM: 41 ==== */ + /* ==== WASM: 45 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10147,7 +10347,7 @@ std::map> wasm = { 0x32U, 0x00U, }}, - /* ==== WASM: 42 ==== */ + /* ==== WASM: 46 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10181,7 +10381,7 @@ std::map> wasm = { 0x0BU, }}, - /* ==== WASM: 43 ==== */ + /* ==== WASM: 47 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10321,7 +10521,7 @@ std::map> wasm = { 0x54U, 0x5FU, 0x4DU, 0x45U, 0x54U, 0x00U, }}, - /* ==== WASM: 44 ==== */ + /* ==== WASM: 48 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10511,7 +10711,7 @@ std::map> wasm = { 0x31U, 0x34U, 0x00U, }}, - /* ==== WASM: 45 ==== */ + /* ==== WASM: 49 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10665,7 +10865,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 46 ==== */ + /* ==== WASM: 50 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10826,7 +11026,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 47 ==== */ + /* ==== WASM: 51 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10983,7 +11183,7 @@ std::map> wasm = { 0x53U, 0x4CU, 0x4FU, 0x54U, 0x53U, 0x00U, }}, - /* ==== WASM: 48 ==== */ + /* ==== WASM: 52 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11068,7 +11268,7 @@ std::map> wasm = { 0x74U, 0x79U, 0x70U, 0x65U, 0x28U, 0x29U, 0x00U, }}, - /* ==== WASM: 49 ==== */ + /* ==== WASM: 53 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11325,7 +11525,7 @@ std::map> wasm = { 0x00U, 0x00U, }}, - /* ==== WASM: 50 ==== */ + /* ==== WASM: 54 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11563,7 +11763,7 @@ std::map> wasm = { 0x3EU, 0x20U, 0x30U, 0x00U, }}, - /* ==== WASM: 51 ==== */ + /* ==== WASM: 55 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11659,7 +11859,7 @@ std::map> wasm = { 0x53U, 0x54U, 0x00U, }}, - /* ==== WASM: 52 ==== */ + /* ==== WASM: 56 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11769,7 +11969,7 @@ std::map> wasm = { 0x20U, 0x31U, 0x00U, }}, - /* ==== WASM: 53 ==== */ + /* ==== WASM: 57 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11899,7 +12099,7 @@ std::map> wasm = { 0x30U, 0x30U, 0x30U, 0x4CU, 0x4CU, 0x00U, }}, - /* ==== WASM: 54 ==== */ + /* ==== WASM: 58 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -12173,7 +12373,7 @@ std::map> wasm = { 0x30U, 0x00U, }}, - /* ==== WASM: 55 ==== */ + /* ==== WASM: 59 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -12310,7 +12510,7 @@ std::map> wasm = { 0x2CU, 0x20U, 0x73U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x31U, 0x00U, }}, - /* ==== WASM: 56 ==== */ + /* ==== WASM: 60 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -12604,7 +12804,7 @@ std::map> wasm = { 0x5FU, 0x53U, 0x4CU, 0x4FU, 0x54U, 0x53U, 0x00U, }}, - /* ==== WASM: 57 ==== */ + /* ==== WASM: 61 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -12838,7 +13038,7 @@ std::map> wasm = { 0x5FU, 0x53U, 0x4CU, 0x4FU, 0x54U, 0x53U, 0x00U, }}, - /* ==== WASM: 58 ==== */ + /* ==== WASM: 62 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -13134,7 +13334,7 @@ std::map> wasm = { 0x2CU, 0x20U, 0x31U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x30U, 0x00U, }}, - /* ==== WASM: 59 ==== */ + /* ==== WASM: 63 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -13338,7 +13538,7 @@ std::map> wasm = { 0x6EU, 0x74U, 0x32U, 0x22U, 0x20U, 0x2BU, 0x20U, 0x69U, 0x29U, 0x00U, }}, - /* ==== WASM: 60 ==== */ + /* ==== WASM: 64 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -13455,7 +13655,7 @@ std::map> wasm = { 0x69U, 0x29U, 0x00U, }}, - /* ==== WASM: 61 ==== */ + /* ==== WASM: 65 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -13564,7 +13764,7 @@ std::map> wasm = { 0x6EU, 0x74U, 0x65U, 0x6EU, 0x74U, 0x32U, 0x22U, 0x29U, 0x00U, }}, - /* ==== WASM: 62 ==== */ + /* ==== WASM: 66 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -13837,7 +14037,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 63 ==== */ + /* ==== WASM: 67 ==== */ {R"[test.hook]( #include #define sfInvoiceID ((5U << 16U) + 17U) @@ -14056,7 +14256,7 @@ std::map> wasm = { 0x30U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x33U, 0x32U, 0x00U, }}, - /* ==== WASM: 64 ==== */ + /* ==== WASM: 68 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -14168,7 +14368,7 @@ std::map> wasm = { 0x58U, 0x49U, 0x53U, 0x54U, 0x00U, }}, - /* ==== WASM: 65 ==== */ + /* ==== WASM: 69 ==== */ {R"[test.hook]( #include #define sfInvoiceID ((5U << 16U) + 17U) @@ -14304,7 +14504,7 @@ std::map> wasm = { 0x3DU, 0x20U, 0x33U, 0x32U, 0x00U, }}, - /* ==== WASM: 66 ==== */ + /* ==== WASM: 70 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -14440,7 +14640,7 @@ std::map> wasm = { 0x49U, 0x47U, 0x00U, }}, - /* ==== WASM: 67 ==== */ + /* ==== WASM: 71 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -14579,7 +14779,7 @@ std::map> wasm = { 0x66U, 0x28U, 0x64U, 0x61U, 0x74U, 0x61U, 0x32U, 0x29U, 0x00U, }}, - /* ==== WASM: 68 ==== */ + /* ==== WASM: 72 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -14691,7 +14891,7 @@ std::map> wasm = { 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x30U, 0x00U, }}, - /* ==== WASM: 69 ==== */ + /* ==== WASM: 73 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -14785,7 +14985,7 @@ std::map> wasm = { 0x61U, 0x64U, 0x5BU, 0x69U, 0x5DU, 0x00U, }}, - /* ==== WASM: 70 ==== */ + /* ==== WASM: 74 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -14918,7 +15118,7 @@ std::map> wasm = { 0x64U, 0x5BU, 0x69U, 0x5DU, 0x00U, }}, - /* ==== WASM: 71 ==== */ + /* ==== WASM: 75 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -15006,7 +15206,7 @@ std::map> wasm = { 0x61U, 0x74U, 0x61U, 0x29U, 0x00U, }}, - /* ==== WASM: 72 ==== */ + /* ==== WASM: 76 ==== */ {R"[test.hook]( #include #define sfInvoiceID ((5U << 16U) + 17U) @@ -15117,7 +15317,7 @@ std::map> wasm = { 0x20U, 0x33U, 0x32U, 0x00U, }}, - /* ==== WASM: 73 ==== */ + /* ==== WASM: 77 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -15328,7 +15528,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 74 ==== */ + /* ==== WASM: 78 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -15436,7 +15636,7 @@ std::map> wasm = { 0x20U, 0x22U, 0x32U, 0x22U, 0x2CU, 0x20U, 0x31U, 0x29U, 0x00U, }}, - /* ==== WASM: 75 ==== */ + /* ==== WASM: 79 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -16048,7 +16248,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 76 ==== */ + /* ==== WASM: 80 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -16398,7 +16598,7 @@ std::map> wasm = { 0x20U, 0x30U, 0x00U, }}, - /* ==== WASM: 77 ==== */ + /* ==== WASM: 81 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -16534,7 +16734,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 78 ==== */ + /* ==== WASM: 82 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -16707,7 +16907,7 @@ std::map> wasm = { 0x54U, 0x5FU, 0x45U, 0x58U, 0x49U, 0x53U, 0x54U, 0x00U, }}, - /* ==== WASM: 79 ==== */ + /* ==== WASM: 83 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -16855,7 +17055,7 @@ std::map> wasm = { 0x30U, 0x00U, 0x22U, 0x00U, 0x00U, 0x00U, 0x00U, }}, - /* ==== WASM: 80 ==== */ + /* ==== WASM: 84 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -16952,7 +17152,7 @@ std::map> wasm = { 0x3DU, 0x20U, 0x30U, 0x00U, }}, - /* ==== WASM: 81 ==== */ + /* ==== WASM: 85 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -17011,7 +17211,7 @@ std::map> wasm = { 0x4FU, 0x46U, 0x5FU, 0x42U, 0x4FU, 0x55U, 0x4EU, 0x44U, 0x53U, 0x00U, }}, - /* ==== WASM: 82 ==== */ + /* ==== WASM: 86 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -17070,7 +17270,7 @@ std::map> wasm = { 0x4EU, 0x44U, 0x53U, 0x00U, }}, - /* ==== WASM: 83 ==== */ + /* ==== WASM: 87 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -18899,7 +19099,7 @@ std::map> wasm = { 0x53U, 0x4DU, 0x41U, 0x4CU, 0x4CU, 0x00U, }}, - /* ==== WASM: 84 ==== */ + /* ==== WASM: 88 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -20179,7 +20379,7 @@ std::map> wasm = { 0x29U, 0x2CU, 0x20U, 0x30U, 0x2CU, 0x30U, 0x20U, 0x29U, 0x29U, 0x00U, }}, - /* ==== WASM: 85 ==== */ + /* ==== WASM: 89 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -23112,7 +23312,7 @@ std::map> wasm = { 0x4FU, 0x4FU, 0x5FU, 0x53U, 0x4DU, 0x41U, 0x4CU, 0x4CU, 0x00U, }}, - /* ==== WASM: 86 ==== */ + /* ==== WASM: 90 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -25077,7 +25277,7 @@ std::map> wasm = { 0x54U, 0x4FU, 0x4FU, 0x5FU, 0x53U, 0x4DU, 0x41U, 0x4CU, 0x4CU, 0x00U, }}, - /* ==== WASM: 87 ==== */ + /* ==== WASM: 91 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -25362,7 +25562,7 @@ std::map> wasm = { 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x30U, 0x00U, }}, - /* ==== WASM: 88 ==== */ + /* ==== WASM: 92 ==== */ {R"[test.hook]( #include extern int32_t _g(uint32_t, uint32_t); @@ -25949,7 +26149,7 @@ std::map> wasm = { 0x4EU, 0x5FU, 0x46U, 0x41U, 0x49U, 0x4CU, 0x55U, 0x52U, 0x45U, 0x00U, }}, - /* ==== WASM: 89 ==== */ + /* ==== WASM: 93 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -25978,7 +26178,7 @@ std::map> wasm = { 0x0BU, }}, - /* ==== WASM: 90 ==== */ + /* ==== WASM: 94 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -26010,7 +26210,7 @@ std::map> wasm = { 0x20U, 0x52U, 0x65U, 0x6AU, 0x65U, 0x63U, 0x74U, 0x65U, 0x64U, 0x00U, }}, - /* ==== WASM: 91 ==== */ + /* ==== WASM: 95 ==== */ {R"[test.hook]( (module (type (;0;) (func (param i32 i32 i64) (result i64))) @@ -26037,7 +26237,7 @@ std::map> wasm = { 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, 0x10U, 0x00U, 0x0BU, }}, - /* ==== WASM: 92 ==== */ + /* ==== WASM: 96 ==== */ {R"[test.hook]( (module (type (;0;) (func (param i32 i32) (result i32))) @@ -26090,7 +26290,7 @@ std::map> wasm = { 0x00U, 0x1AU, 0x0BU, }}, - /* ==== WASM: 93 ==== */ + /* ==== WASM: 97 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -32733,7 +32933,7 @@ std::map> wasm = { 0x39U, 0x30U, 0x31U, 0x32U, 0x33U, 0x00U, }}, - /* ==== WASM: 94 ==== */ + /* ==== WASM: 98 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -32779,7 +32979,7 @@ std::map> wasm = { 0x0BU, 0x06U, 0x76U, 0x61U, 0x6CU, 0x75U, 0x65U, 0x00U, }}, - /* ==== WASM: 95 ==== */ + /* ==== WASM: 99 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); From 4269ef736b596ebb1fe06962bdec2d0a4be715f8 Mon Sep 17 00:00:00 2001 From: tequ Date: Thu, 30 Oct 2025 21:02:06 +0900 Subject: [PATCH 03/15] additional refactor --- src/ripple/app/hook/Enum.h | 165 +++++++++++++++++++------------------ 1 file changed, 85 insertions(+), 80 deletions(-) diff --git a/src/ripple/app/hook/Enum.h b/src/ripple/app/hook/Enum.h index 3af3d0cc75..06501fbbdb 100644 --- a/src/ripple/app/hook/Enum.h +++ b/src/ripple/app/hook/Enum.h @@ -1,3 +1,7 @@ +#ifndef GUARD_CHECKER_BUILD +#include +#include +#endif #include #include #include @@ -371,12 +375,13 @@ const double fee_base_multiplier = 1.1f; #define I32 0x7FU #define I64 0x7EU -#define HOOK_API_DEFINITION(RETURN_TYPE, FUNCTION_NAME, ...) \ - { \ - FUNCTION_NAME, \ - { \ - RETURN_TYPE, __VA_ARGS__ \ - } \ +#define HOOK_WRAP_PARAMS(...) __VA_ARGS__ +#define HOOK_API_DEFINITION(RETURN_TYPE, FUNCTION_NAME, PARAMS_TUPLE) \ + { \ +#FUNCTION_NAME, \ + { \ + RETURN_TYPE, HOOK_WRAP_PARAMS PARAMS_TUPLE \ + } \ } using APIWhitelist = std::map>; @@ -386,86 +391,86 @@ using APIWhitelist = std::map>; // code (vec[0] and its parameters vec[>0]) as wasm type codes static const APIWhitelist import_whitelist{ // clang-format off - HOOK_API_DEFINITION(I32, "_g", I32, I32), - HOOK_API_DEFINITION(I64, "accept", I32, I32, I64), - HOOK_API_DEFINITION(I64, "rollback", I32, I32, I64), - HOOK_API_DEFINITION(I64, "util_raddr", I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "util_accid", I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "util_verify", I32, I32, I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "util_sha512h", I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "util_keylet", I32, I32, I32, I32, I32, I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "sto_validate", I32, I32), - HOOK_API_DEFINITION(I64, "sto_subfield", I32, I32, I32), - HOOK_API_DEFINITION(I64, "sto_subarray", I32, I32, I32), - HOOK_API_DEFINITION(I64, "sto_emplace", I32, I32, I32, I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "sto_erase", I32, I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "etxn_burden"), - HOOK_API_DEFINITION(I64, "etxn_details", I32, I32), - HOOK_API_DEFINITION(I64, "etxn_fee_base", I32, I32), - HOOK_API_DEFINITION(I64, "etxn_reserve", I32), - HOOK_API_DEFINITION(I64, "etxn_generation"), - HOOK_API_DEFINITION(I64, "etxn_nonce", I32, I32), - HOOK_API_DEFINITION(I64, "emit", I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "float_set", I32, I64), - HOOK_API_DEFINITION(I64, "float_multiply", I64, I64), - HOOK_API_DEFINITION(I64, "float_mulratio", I64, I32, I32, I32), - HOOK_API_DEFINITION(I64, "float_negate", I64), - HOOK_API_DEFINITION(I64, "float_compare", I64, I64, I32), - HOOK_API_DEFINITION(I64, "float_sum", I64, I64), - HOOK_API_DEFINITION(I64, "float_sto", I32, I32, I32, I32, I32, I32, I64, I32), - HOOK_API_DEFINITION(I64, "float_sto_set", I32, I32), - HOOK_API_DEFINITION(I64, "float_invert", I64), - HOOK_API_DEFINITION(I64, "float_divide", I64, I64), - HOOK_API_DEFINITION(I64, "float_one"), - HOOK_API_DEFINITION(I64, "float_mantissa", I64), - HOOK_API_DEFINITION(I64, "float_sign", I64), - HOOK_API_DEFINITION(I64, "float_int", I64, I32, I32), - HOOK_API_DEFINITION(I64, "float_log", I64), - HOOK_API_DEFINITION(I64, "float_root", I64, I32), - HOOK_API_DEFINITION(I64, "fee_base"), - HOOK_API_DEFINITION(I64, "ledger_seq"), - HOOK_API_DEFINITION(I64, "ledger_last_time"), - HOOK_API_DEFINITION(I64, "ledger_last_hash", I32, I32), - HOOK_API_DEFINITION(I64, "ledger_nonce", I32, I32), - HOOK_API_DEFINITION(I64, "ledger_keylet", I32, I32, I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "hook_account", I32, I32), - HOOK_API_DEFINITION(I64, "hook_hash", I32, I32, I32), - HOOK_API_DEFINITION(I64, "hook_param_set", I32, I32, I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "hook_param", I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "hook_again"), - HOOK_API_DEFINITION(I64, "hook_skip", I32, I32, I32), - HOOK_API_DEFINITION(I64, "hook_pos"), - HOOK_API_DEFINITION(I64, "slot", I32, I32, I32), - HOOK_API_DEFINITION(I64, "slot_clear", I32), - HOOK_API_DEFINITION(I64, "slot_count", I32), - HOOK_API_DEFINITION(I64, "slot_set", I32, I32, I32), - HOOK_API_DEFINITION(I64, "slot_size", I32), - HOOK_API_DEFINITION(I64, "slot_subarray", I32, I32, I32), - HOOK_API_DEFINITION(I64, "slot_subfield", I32, I32, I32), - HOOK_API_DEFINITION(I64, "slot_type", I32, I32), - HOOK_API_DEFINITION(I64, "slot_float", I32), - HOOK_API_DEFINITION(I64, "state_set", I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "state_foreign_set", I32, I32, I32, I32, I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "state", I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "state_foreign", I32, I32, I32, I32, I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "trace", I32, I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "trace_num", I32, I32, I64), - HOOK_API_DEFINITION(I64, "trace_float", I32, I32, I64), - HOOK_API_DEFINITION(I64, "otxn_burden"), - HOOK_API_DEFINITION(I64, "otxn_field", I32, I32, I32), - HOOK_API_DEFINITION(I64, "otxn_generation"), - HOOK_API_DEFINITION(I64, "otxn_id", I32, I32, I32), - HOOK_API_DEFINITION(I64, "otxn_type"), - HOOK_API_DEFINITION(I64, "otxn_slot", I32), - HOOK_API_DEFINITION(I64, "otxn_param", I32, I32, I32, I32), - HOOK_API_DEFINITION(I64, "meta_slot", I32), + HOOK_API_DEFINITION(I32, _g, (I32, I32)), + HOOK_API_DEFINITION(I64, accept, (I32, I32, I64)), + HOOK_API_DEFINITION(I64, rollback, (I32, I32, I64)), + HOOK_API_DEFINITION(I64, util_raddr, (I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, util_accid, (I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, util_verify, (I32, I32, I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, util_sha512h, (I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, util_keylet, (I32, I32, I32, I32, I32, I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, sto_validate, (I32, I32)), + HOOK_API_DEFINITION(I64, sto_subfield, (I32, I32, I32)), + HOOK_API_DEFINITION(I64, sto_subarray, (I32, I32, I32)), + HOOK_API_DEFINITION(I64, sto_emplace, (I32, I32, I32, I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, sto_erase, (I32, I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, etxn_burden, ()), + HOOK_API_DEFINITION(I64, etxn_details, (I32, I32)), + HOOK_API_DEFINITION(I64, etxn_fee_base, (I32, I32)), + HOOK_API_DEFINITION(I64, etxn_reserve, (I32)), + HOOK_API_DEFINITION(I64, etxn_generation, ()), + HOOK_API_DEFINITION(I64, etxn_nonce, (I32, I32)), + HOOK_API_DEFINITION(I64, emit, (I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, float_set, (I32, I64)), + HOOK_API_DEFINITION(I64, float_multiply, (I64, I64)), + HOOK_API_DEFINITION(I64, float_mulratio, (I64, I32, I32, I32)), + HOOK_API_DEFINITION(I64, float_negate, (I64)), + HOOK_API_DEFINITION(I64, float_compare, (I64, I64, I32)), + HOOK_API_DEFINITION(I64, float_sum, (I64, I64)), + HOOK_API_DEFINITION(I64, float_sto, (I32, I32, I32, I32, I32, I32, I64, I32)), + HOOK_API_DEFINITION(I64, float_sto_set, (I32, I32)), + HOOK_API_DEFINITION(I64, float_invert, (I64)), + HOOK_API_DEFINITION(I64, float_divide, (I64, I64)), + HOOK_API_DEFINITION(I64, float_one, ()), + HOOK_API_DEFINITION(I64, float_mantissa, (I64)), + HOOK_API_DEFINITION(I64, float_sign, (I64)), + HOOK_API_DEFINITION(I64, float_int, (I64, I32, I32)), + HOOK_API_DEFINITION(I64, float_log, (I64)), + HOOK_API_DEFINITION(I64, float_root, (I64, I32)), + HOOK_API_DEFINITION(I64, fee_base, ()), + HOOK_API_DEFINITION(I64, ledger_seq, ()), + HOOK_API_DEFINITION(I64, ledger_last_time, ()), + HOOK_API_DEFINITION(I64, ledger_last_hash, (I32, I32)), + HOOK_API_DEFINITION(I64, ledger_nonce, (I32, I32)), + HOOK_API_DEFINITION(I64, ledger_keylet, (I32, I32, I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, hook_account, (I32, I32)), + HOOK_API_DEFINITION(I64, hook_hash, (I32, I32, I32)), + HOOK_API_DEFINITION(I64, hook_param_set, (I32, I32, I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, hook_param, (I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, hook_again, ()), + HOOK_API_DEFINITION(I64, hook_skip, (I32, I32, I32)), + HOOK_API_DEFINITION(I64, hook_pos, ()), + HOOK_API_DEFINITION(I64, slot, (I32, I32, I32)), + HOOK_API_DEFINITION(I64, slot_clear, (I32)), + HOOK_API_DEFINITION(I64, slot_count, (I32)), + HOOK_API_DEFINITION(I64, slot_set, (I32, I32, I32)), + HOOK_API_DEFINITION(I64, slot_size, (I32)), + HOOK_API_DEFINITION(I64, slot_subarray, (I32, I32, I32)), + HOOK_API_DEFINITION(I64, slot_subfield, (I32, I32, I32)), + HOOK_API_DEFINITION(I64, slot_type, (I32, I32)), + HOOK_API_DEFINITION(I64, slot_float, (I32)), + HOOK_API_DEFINITION(I64, state_set, (I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, state_foreign_set, (I32, I32, I32, I32, I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, state, (I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, state_foreign, (I32, I32, I32, I32, I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, trace, (I32, I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, trace_num, (I32, I32, I64)), + HOOK_API_DEFINITION(I64, trace_float, (I32, I32, I64)), + HOOK_API_DEFINITION(I64, otxn_burden, ()), + HOOK_API_DEFINITION(I64, otxn_field, (I32, I32, I32)), + HOOK_API_DEFINITION(I64, otxn_generation, ()), + HOOK_API_DEFINITION(I64, otxn_id, (I32, I32, I32)), + HOOK_API_DEFINITION(I64, otxn_type, ()), + HOOK_API_DEFINITION(I64, otxn_slot, (I32)), + HOOK_API_DEFINITION(I64, otxn_param, (I32, I32, I32, I32)), + HOOK_API_DEFINITION(I64, meta_slot, (I32)), // clang-format on }; // featureHooks1 static const APIWhitelist import_whitelist_1{ // clang-format off - HOOK_API_DEFINITION(I64, "xpop_slot", I32, I32) + HOOK_API_DEFINITION(I64, xpop_slot, (I32, I32)), // clang-format on }; From 9c0feaf6c75de95f3c73ed6c82479a0a2f58ba40 Mon Sep 17 00:00:00 2001 From: tequ Date: Thu, 30 Oct 2025 22:06:53 +0900 Subject: [PATCH 04/15] fix --- src/ripple/app/hook/Enum.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/ripple/app/hook/Enum.h b/src/ripple/app/hook/Enum.h index 06501fbbdb..5a19dedd81 100644 --- a/src/ripple/app/hook/Enum.h +++ b/src/ripple/app/hook/Enum.h @@ -1,7 +1,3 @@ -#ifndef GUARD_CHECKER_BUILD -#include -#include -#endif #include #include #include From 24e18c9766f3d3b1277b6d2868e7ebb210c47f6e Mon Sep 17 00:00:00 2001 From: tequ Date: Thu, 30 Oct 2025 22:18:10 +0900 Subject: [PATCH 05/15] Refactor2: Hook APIs Amendment Guards --- src/ripple/app/hook/Enum.h | 176 +++++++++++++------------- src/ripple/app/hook/Guard.h | 40 +++--- src/ripple/app/hook/guard_checker.cpp | 5 +- src/ripple/app/tx/impl/Change.cpp | 5 +- src/ripple/app/tx/impl/SetHook.cpp | 4 +- 5 files changed, 113 insertions(+), 117 deletions(-) diff --git a/src/ripple/app/hook/Enum.h b/src/ripple/app/hook/Enum.h index 5a19dedd81..0083745d78 100644 --- a/src/ripple/app/hook/Enum.h +++ b/src/ripple/app/hook/Enum.h @@ -373,102 +373,104 @@ const double fee_base_multiplier = 1.1f; #define HOOK_WRAP_PARAMS(...) __VA_ARGS__ #define HOOK_API_DEFINITION(RETURN_TYPE, FUNCTION_NAME, PARAMS_TUPLE) \ - { \ -#FUNCTION_NAME, \ - { \ - RETURN_TYPE, HOOK_WRAP_PARAMS PARAMS_TUPLE \ - } \ - } + whitelist[#FUNCTION_NAME] = {RETURN_TYPE, HOOK_WRAP_PARAMS PARAMS_TUPLE}; using APIWhitelist = std::map>; // RH NOTE: Find descriptions of api functions in ./impl/applyHook.cpp and // hookapi.h (include for hooks) this is a map of the api name to its return // code (vec[0] and its parameters vec[>0]) as wasm type codes -static const APIWhitelist import_whitelist{ +inline APIWhitelist +getImportWhitelist( +#ifndef GUARD_CHECKER_BUILD + Rules const& rules +#endif +) +{ + APIWhitelist whitelist; // clang-format off - HOOK_API_DEFINITION(I32, _g, (I32, I32)), - HOOK_API_DEFINITION(I64, accept, (I32, I32, I64)), - HOOK_API_DEFINITION(I64, rollback, (I32, I32, I64)), - HOOK_API_DEFINITION(I64, util_raddr, (I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, util_accid, (I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, util_verify, (I32, I32, I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, util_sha512h, (I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, util_keylet, (I32, I32, I32, I32, I32, I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, sto_validate, (I32, I32)), - HOOK_API_DEFINITION(I64, sto_subfield, (I32, I32, I32)), - HOOK_API_DEFINITION(I64, sto_subarray, (I32, I32, I32)), - HOOK_API_DEFINITION(I64, sto_emplace, (I32, I32, I32, I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, sto_erase, (I32, I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, etxn_burden, ()), - HOOK_API_DEFINITION(I64, etxn_details, (I32, I32)), - HOOK_API_DEFINITION(I64, etxn_fee_base, (I32, I32)), - HOOK_API_DEFINITION(I64, etxn_reserve, (I32)), - HOOK_API_DEFINITION(I64, etxn_generation, ()), - HOOK_API_DEFINITION(I64, etxn_nonce, (I32, I32)), - HOOK_API_DEFINITION(I64, emit, (I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, float_set, (I32, I64)), - HOOK_API_DEFINITION(I64, float_multiply, (I64, I64)), - HOOK_API_DEFINITION(I64, float_mulratio, (I64, I32, I32, I32)), - HOOK_API_DEFINITION(I64, float_negate, (I64)), - HOOK_API_DEFINITION(I64, float_compare, (I64, I64, I32)), - HOOK_API_DEFINITION(I64, float_sum, (I64, I64)), - HOOK_API_DEFINITION(I64, float_sto, (I32, I32, I32, I32, I32, I32, I64, I32)), - HOOK_API_DEFINITION(I64, float_sto_set, (I32, I32)), - HOOK_API_DEFINITION(I64, float_invert, (I64)), - HOOK_API_DEFINITION(I64, float_divide, (I64, I64)), - HOOK_API_DEFINITION(I64, float_one, ()), - HOOK_API_DEFINITION(I64, float_mantissa, (I64)), - HOOK_API_DEFINITION(I64, float_sign, (I64)), - HOOK_API_DEFINITION(I64, float_int, (I64, I32, I32)), - HOOK_API_DEFINITION(I64, float_log, (I64)), - HOOK_API_DEFINITION(I64, float_root, (I64, I32)), - HOOK_API_DEFINITION(I64, fee_base, ()), - HOOK_API_DEFINITION(I64, ledger_seq, ()), - HOOK_API_DEFINITION(I64, ledger_last_time, ()), - HOOK_API_DEFINITION(I64, ledger_last_hash, (I32, I32)), - HOOK_API_DEFINITION(I64, ledger_nonce, (I32, I32)), - HOOK_API_DEFINITION(I64, ledger_keylet, (I32, I32, I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, hook_account, (I32, I32)), - HOOK_API_DEFINITION(I64, hook_hash, (I32, I32, I32)), - HOOK_API_DEFINITION(I64, hook_param_set, (I32, I32, I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, hook_param, (I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, hook_again, ()), - HOOK_API_DEFINITION(I64, hook_skip, (I32, I32, I32)), - HOOK_API_DEFINITION(I64, hook_pos, ()), - HOOK_API_DEFINITION(I64, slot, (I32, I32, I32)), - HOOK_API_DEFINITION(I64, slot_clear, (I32)), - HOOK_API_DEFINITION(I64, slot_count, (I32)), - HOOK_API_DEFINITION(I64, slot_set, (I32, I32, I32)), - HOOK_API_DEFINITION(I64, slot_size, (I32)), - HOOK_API_DEFINITION(I64, slot_subarray, (I32, I32, I32)), - HOOK_API_DEFINITION(I64, slot_subfield, (I32, I32, I32)), - HOOK_API_DEFINITION(I64, slot_type, (I32, I32)), - HOOK_API_DEFINITION(I64, slot_float, (I32)), - HOOK_API_DEFINITION(I64, state_set, (I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, state_foreign_set, (I32, I32, I32, I32, I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, state, (I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, state_foreign, (I32, I32, I32, I32, I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, trace, (I32, I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, trace_num, (I32, I32, I64)), - HOOK_API_DEFINITION(I64, trace_float, (I32, I32, I64)), - HOOK_API_DEFINITION(I64, otxn_burden, ()), - HOOK_API_DEFINITION(I64, otxn_field, (I32, I32, I32)), - HOOK_API_DEFINITION(I64, otxn_generation, ()), - HOOK_API_DEFINITION(I64, otxn_id, (I32, I32, I32)), - HOOK_API_DEFINITION(I64, otxn_type, ()), - HOOK_API_DEFINITION(I64, otxn_slot, (I32)), - HOOK_API_DEFINITION(I64, otxn_param, (I32, I32, I32, I32)), - HOOK_API_DEFINITION(I64, meta_slot, (I32)), - // clang-format on -}; + HOOK_API_DEFINITION(I32, _g, (I32, I32)) + HOOK_API_DEFINITION(I64, accept, (I32, I32, I64)) + HOOK_API_DEFINITION(I64, rollback, (I32, I32, I64)) + HOOK_API_DEFINITION(I64, util_raddr, (I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, util_accid, (I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, util_verify, (I32, I32, I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, util_sha512h, (I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, util_keylet, (I32, I32, I32, I32, I32, I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, sto_validate, (I32, I32)) + HOOK_API_DEFINITION(I64, sto_subfield, (I32, I32, I32)) + HOOK_API_DEFINITION(I64, sto_subarray, (I32, I32, I32)) + HOOK_API_DEFINITION(I64, sto_emplace, (I32, I32, I32, I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, sto_erase, (I32, I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, etxn_burden, ()) + HOOK_API_DEFINITION(I64, etxn_details, (I32, I32)) + HOOK_API_DEFINITION(I64, etxn_fee_base, (I32, I32)) + HOOK_API_DEFINITION(I64, etxn_reserve, (I32)) + HOOK_API_DEFINITION(I64, etxn_generation, ()) + HOOK_API_DEFINITION(I64, etxn_nonce, (I32, I32)) + HOOK_API_DEFINITION(I64, emit, (I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, float_set, (I32, I64)) + HOOK_API_DEFINITION(I64, float_multiply, (I64, I64)) + HOOK_API_DEFINITION(I64, float_mulratio, (I64, I32, I32, I32)) + HOOK_API_DEFINITION(I64, float_negate, (I64)) + HOOK_API_DEFINITION(I64, float_compare, (I64, I64, I32)) + HOOK_API_DEFINITION(I64, float_sum, (I64, I64)) + HOOK_API_DEFINITION(I64, float_sto, (I32, I32, I32, I32, I32, I32, I64, I32)) + HOOK_API_DEFINITION(I64, float_sto_set, (I32, I32)) + HOOK_API_DEFINITION(I64, float_invert, (I64)) + HOOK_API_DEFINITION(I64, float_divide, (I64, I64)) + HOOK_API_DEFINITION(I64, float_one, ()) + HOOK_API_DEFINITION(I64, float_mantissa, (I64)) + HOOK_API_DEFINITION(I64, float_sign, (I64)) + HOOK_API_DEFINITION(I64, float_int, (I64, I32, I32)) + HOOK_API_DEFINITION(I64, float_log, (I64)) + HOOK_API_DEFINITION(I64, float_root, (I64, I32)) + HOOK_API_DEFINITION(I64, fee_base, ()) + HOOK_API_DEFINITION(I64, ledger_seq, ()) + HOOK_API_DEFINITION(I64, ledger_last_time, ()) + HOOK_API_DEFINITION(I64, ledger_last_hash, (I32, I32)) + HOOK_API_DEFINITION(I64, ledger_nonce, (I32, I32)) + HOOK_API_DEFINITION(I64, ledger_keylet, (I32, I32, I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, hook_account, (I32, I32)) + HOOK_API_DEFINITION(I64, hook_hash, (I32, I32, I32)) + HOOK_API_DEFINITION(I64, hook_param_set, (I32, I32, I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, hook_param, (I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, hook_again, ()) + HOOK_API_DEFINITION(I64, hook_skip, (I32, I32, I32)) + HOOK_API_DEFINITION(I64, hook_pos, ()) + HOOK_API_DEFINITION(I64, slot, (I32, I32, I32)) + HOOK_API_DEFINITION(I64, slot_clear, (I32)) + HOOK_API_DEFINITION(I64, slot_count, (I32)) + HOOK_API_DEFINITION(I64, slot_set, (I32, I32, I32)) + HOOK_API_DEFINITION(I64, slot_size, (I32)) + HOOK_API_DEFINITION(I64, slot_subarray, (I32, I32, I32)) + HOOK_API_DEFINITION(I64, slot_subfield, (I32, I32, I32)) + HOOK_API_DEFINITION(I64, slot_type, (I32, I32)) + HOOK_API_DEFINITION(I64, slot_float, (I32)) + HOOK_API_DEFINITION(I64, state_set, (I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, state_foreign_set, (I32, I32, I32, I32, I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, state, (I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, state_foreign, (I32, I32, I32, I32, I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, trace, (I32, I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, trace_num, (I32, I32, I64)) + HOOK_API_DEFINITION(I64, trace_float, (I32, I32, I64)) + HOOK_API_DEFINITION(I64, otxn_burden, ()) + HOOK_API_DEFINITION(I64, otxn_field, (I32, I32, I32)) + HOOK_API_DEFINITION(I64, otxn_generation, ()) + HOOK_API_DEFINITION(I64, otxn_id, (I32, I32, I32)) + HOOK_API_DEFINITION(I64, otxn_type, ()) + HOOK_API_DEFINITION(I64, otxn_slot, (I32)) + HOOK_API_DEFINITION(I64, otxn_param, (I32, I32, I32, I32)) + HOOK_API_DEFINITION(I64, meta_slot, (I32)) -// featureHooks1 -static const APIWhitelist import_whitelist_1{ - // clang-format off - HOOK_API_DEFINITION(I64, xpop_slot, (I32, I32)), + #ifndef GUARD_CHECKER_BUILD + if (rules.enabled(featureHooksUpdate1)) + #endif + HOOK_API_DEFINITION(I64, xpop_slot, (I32, I32)) + + return whitelist; // clang-format on -}; +} #undef HOOK_API_DEFINITION #undef I32 diff --git a/src/ripple/app/hook/Guard.h b/src/ripple/app/hook/Guard.h index f395af4481..09e5509a81 100644 --- a/src/ripple/app/hook/Guard.h +++ b/src/ripple/app/hook/Guard.h @@ -826,6 +826,7 @@ validateGuards( std::vector const& wasm, GuardLog guardLog, std::string guardLogAccStr, + hook_api::APIWhitelist const import_whitelist, /* RH NOTE: * rules version is a bit field, so rule update 1 is 0x01, update 2 is 0x02 * and update 3 is 0x04 ideally at rule version 3 all bits so far are set @@ -1020,31 +1021,24 @@ validateGuards( int type_idx = parseLeb128(wasm, i, &i); CHECK_SHORT_HOOK(); + auto it = import_whitelist.find(import_name); + auto it_end = import_whitelist.end(); + bool found_in_whitelist = (it != it_end); + if (import_name == "_g") { guard_import_number = func_upto; } - else if ( - hook_api::import_whitelist.find(import_name) == - hook_api::import_whitelist.end()) + if (!found_in_whitelist) { - if (rulesVersion > 0 && - hook_api::import_whitelist_1.find(import_name) != - hook_api::import_whitelist_1.end()) - { - // PASS, this is a version 1 api - } - else - { - GUARDLOG(hook::log::IMPORT_ILLEGAL) - << "Malformed transaction. " - << "Hook attempted to import a function that does " - "not " - << "appear in the hook_api function set: `" - << import_name << "`" - << "\n"; - return {}; - } + GUARDLOG(hook::log::IMPORT_ILLEGAL) + << "Malformed transaction. " + << "Hook attempted to import a function that does " + "not " + << "appear in the hook_api function set: `" + << import_name << "`" + << "\n"; + return {}; } // add to import map @@ -1259,11 +1253,7 @@ validateGuards( for (auto const& [import_idx, api_name] : usage->second) { auto const& api_signature = - hook_api::import_whitelist.find(api_name) != - hook_api::import_whitelist.end() - ? hook_api::import_whitelist.find(api_name)->second - : hook_api::import_whitelist_1.find(api_name) - ->second; + import_whitelist.find(api_name)->second; if (!first_signature) { diff --git a/src/ripple/app/hook/guard_checker.cpp b/src/ripple/app/hook/guard_checker.cpp index f20d24617b..adcfc79070 100644 --- a/src/ripple/app/hook/guard_checker.cpp +++ b/src/ripple/app/hook/guard_checker.cpp @@ -1,3 +1,5 @@ +#define GUARD_CHECKER_BUILD +#include "Enum.h" #include "Guard.h" #include #include @@ -79,7 +81,8 @@ main(int argc, char** argv) close(fd); - auto result = validateGuards(hook, std::cout, "", 3); + auto result = + validateGuards(hook, std::cout, "", hook_api::getImportWhitelist(), 3); if (!result) { diff --git a/src/ripple/app/tx/impl/Change.cpp b/src/ripple/app/tx/impl/Change.cpp index 37a436feea..3c64c065a1 100644 --- a/src/ripple/app/tx/impl/Change.cpp +++ b/src/ripple/app/tx/impl/Change.cpp @@ -17,6 +17,7 @@ */ //============================================================================== +#include #include #include #include @@ -605,8 +606,8 @@ Change::activateXahauGenesis() wasmBytes, // wasm to verify loggerStream, "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - (ctx_.view().rules().enabled(featureHooksUpdate1) ? 1 : 0) + - (ctx_.view().rules().enabled(fix20250131) ? 2 : 0)); + hook_api::getImportWhitelist(ctx_.view().rules()), + (ctx_.view().rules().enabled(fix20250131) ? 2 : 0)); if (!result) { diff --git a/src/ripple/app/tx/impl/SetHook.cpp b/src/ripple/app/tx/impl/SetHook.cpp index 9ca8295571..8b32a6fc25 100644 --- a/src/ripple/app/tx/impl/SetHook.cpp +++ b/src/ripple/app/tx/impl/SetHook.cpp @@ -490,8 +490,8 @@ SetHook::validateHookSetEntry(SetHookCtx& ctx, STObject const& hookSetObj) hook, // wasm to verify logger, hsacc, - (ctx.rules.enabled(featureHooksUpdate1) ? 1 : 0) + - (ctx.rules.enabled(fix20250131) ? 2 : 0)); + hook_api::getImportWhitelist(ctx.rules), + (ctx.rules.enabled(fix20250131) ? 2 : 0)); if (ctx.j.trace()) { From adebc3cb8dd9d684cc497063bdc6547264bc1309 Mon Sep 17 00:00:00 2001 From: tequ Date: Thu, 30 Oct 2025 22:18:10 +0900 Subject: [PATCH 06/15] refactor: rulesVersion --- src/ripple/app/hook/Enum.h | 22 ++++++++++++++++++++++ src/ripple/app/hook/Guard.h | 6 +++--- src/ripple/app/hook/guard_checker.cpp | 8 ++++++-- src/ripple/app/tx/impl/Change.cpp | 2 +- src/ripple/app/tx/impl/SetHook.cpp | 2 +- 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/ripple/app/hook/Enum.h b/src/ripple/app/hook/Enum.h index 0083745d78..cded5a2749 100644 --- a/src/ripple/app/hook/Enum.h +++ b/src/ripple/app/hook/Enum.h @@ -475,5 +475,27 @@ getImportWhitelist( #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 09e5509a81..051d82128b 100644 --- a/src/ripple/app/hook/Guard.h +++ b/src/ripple/app/hook/Guard.h @@ -634,7 +634,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); @@ -642,7 +642,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); @@ -836,7 +836,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/guard_checker.cpp b/src/ripple/app/hook/guard_checker.cpp index adcfc79070..f40f4c7eaf 100644 --- a/src/ripple/app/hook/guard_checker.cpp +++ b/src/ripple/app/hook/guard_checker.cpp @@ -81,8 +81,12 @@ main(int argc, char** argv) close(fd); - auto result = - validateGuards(hook, std::cout, "", hook_api::getImportWhitelist(), 3); + auto result = validateGuards( + hook, + std::cout, + "", + hook_api::getImportWhitelist(), + hook_api::getGuardRulesVersion()); if (!result) { diff --git a/src/ripple/app/tx/impl/Change.cpp b/src/ripple/app/tx/impl/Change.cpp index 3c64c065a1..1a78e0815c 100644 --- a/src/ripple/app/tx/impl/Change.cpp +++ b/src/ripple/app/tx/impl/Change.cpp @@ -607,7 +607,7 @@ Change::activateXahauGenesis() loggerStream, "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", 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 8b32a6fc25..2b35f2a592 100644 --- a/src/ripple/app/tx/impl/SetHook.cpp +++ b/src/ripple/app/tx/impl/SetHook.cpp @@ -491,7 +491,7 @@ SetHook::validateHookSetEntry(SetHookCtx& ctx, STObject const& hookSetObj) logger, hsacc, hook_api::getImportWhitelist(ctx.rules), - (ctx.rules.enabled(fix20250131) ? 2 : 0)); + hook_api::getGuardRulesVersion(ctx.rules)); if (ctx.j.trace()) { From c89967e2742e7bee7922304decfcf920536f21fc Mon Sep 17 00:00:00 2001 From: tequ Date: Thu, 30 Oct 2025 22:19:44 +0900 Subject: [PATCH 07/15] bad merge --- src/ripple/app/hook/Enum.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ripple/app/hook/Enum.h b/src/ripple/app/hook/Enum.h index cded5a2749..000afeffe6 100644 --- a/src/ripple/app/hook/Enum.h +++ b/src/ripple/app/hook/Enum.h @@ -1,3 +1,7 @@ +#ifndef GUARD_CHECKER_BUILD +#include +#include +#endif #include #include #include From fce6cedec159445bd3a6c16745f2fce6bb83a37c Mon Sep 17 00:00:00 2001 From: tequ Date: Fri, 31 Oct 2025 15:53:59 +0900 Subject: [PATCH 08/15] Refactor3: Consolidate the Hook API definitions from Enum.h and ApplyHook.h into a single file. --- src/ripple/app/hook/Enum.h | 120 ++------ src/ripple/app/hook/Macro.h | 24 +- src/ripple/app/hook/applyHook.h | 476 ++--------------------------- src/ripple/app/hook/hook_api.macro | 221 ++++++++++++++ 4 files changed, 292 insertions(+), 549 deletions(-) create mode 100644 src/ripple/app/hook/hook_api.macro diff --git a/src/ripple/app/hook/Enum.h b/src/ripple/app/hook/Enum.h index ddb87bf6cb..6c50ff62e6 100644 --- a/src/ripple/app/hook/Enum.h +++ b/src/ripple/app/hook/Enum.h @@ -1,4 +1,5 @@ #ifndef GUARD_CHECKER_BUILD +#include #include #include #endif @@ -371,13 +372,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) \ - whitelist[#FUNCTION_NAME] = {RETURN_TYPE, HOOK_WRAP_PARAMS PARAMS_TUPLE}; - using APIWhitelist = std::map>; // RH NOTE: Find descriptions of api functions in ./impl/applyHook.cpp and @@ -391,88 +385,40 @@ getImportWhitelist( ) { APIWhitelist whitelist; - // clang-format off - HOOK_API_DEFINITION(I32, _g, (I32, I32)) - HOOK_API_DEFINITION(I64, accept, (I32, I32, I64)) - HOOK_API_DEFINITION(I64, rollback, (I32, I32, I64)) - HOOK_API_DEFINITION(I64, util_raddr, (I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, util_accid, (I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, util_verify, (I32, I32, I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, util_sha512h, (I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, util_keylet, (I32, I32, I32, I32, I32, I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, sto_validate, (I32, I32)) - HOOK_API_DEFINITION(I64, sto_subfield, (I32, I32, I32)) - HOOK_API_DEFINITION(I64, sto_subarray, (I32, I32, I32)) - HOOK_API_DEFINITION(I64, sto_emplace, (I32, I32, I32, I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, sto_erase, (I32, I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, etxn_burden, ()) - HOOK_API_DEFINITION(I64, etxn_details, (I32, I32)) - HOOK_API_DEFINITION(I64, etxn_fee_base, (I32, I32)) - HOOK_API_DEFINITION(I64, etxn_reserve, (I32)) - HOOK_API_DEFINITION(I64, etxn_generation, ()) - HOOK_API_DEFINITION(I64, etxn_nonce, (I32, I32)) - HOOK_API_DEFINITION(I64, emit, (I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, float_set, (I32, I64)) - HOOK_API_DEFINITION(I64, float_multiply, (I64, I64)) - HOOK_API_DEFINITION(I64, float_mulratio, (I64, I32, I32, I32)) - HOOK_API_DEFINITION(I64, float_negate, (I64)) - HOOK_API_DEFINITION(I64, float_compare, (I64, I64, I32)) - HOOK_API_DEFINITION(I64, float_sum, (I64, I64)) - HOOK_API_DEFINITION(I64, float_sto, (I32, I32, I32, I32, I32, I32, I64, I32)) - HOOK_API_DEFINITION(I64, float_sto_set, (I32, I32)) - HOOK_API_DEFINITION(I64, float_invert, (I64)) - HOOK_API_DEFINITION(I64, float_divide, (I64, I64)) - HOOK_API_DEFINITION(I64, float_one, ()) - HOOK_API_DEFINITION(I64, float_mantissa, (I64)) - HOOK_API_DEFINITION(I64, float_sign, (I64)) - HOOK_API_DEFINITION(I64, float_int, (I64, I32, I32)) - HOOK_API_DEFINITION(I64, float_log, (I64)) - HOOK_API_DEFINITION(I64, float_root, (I64, I32)) - HOOK_API_DEFINITION(I64, fee_base, ()) - HOOK_API_DEFINITION(I64, ledger_seq, ()) - HOOK_API_DEFINITION(I64, ledger_last_time, ()) - HOOK_API_DEFINITION(I64, ledger_last_hash, (I32, I32)) - HOOK_API_DEFINITION(I64, ledger_nonce, (I32, I32)) - HOOK_API_DEFINITION(I64, ledger_keylet, (I32, I32, I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, hook_account, (I32, I32)) - HOOK_API_DEFINITION(I64, hook_hash, (I32, I32, I32)) - HOOK_API_DEFINITION(I64, hook_param_set, (I32, I32, I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, hook_param, (I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, hook_again, ()) - HOOK_API_DEFINITION(I64, hook_skip, (I32, I32, I32)) - HOOK_API_DEFINITION(I64, hook_pos, ()) - HOOK_API_DEFINITION(I64, slot, (I32, I32, I32)) - HOOK_API_DEFINITION(I64, slot_clear, (I32)) - HOOK_API_DEFINITION(I64, slot_count, (I32)) - HOOK_API_DEFINITION(I64, slot_set, (I32, I32, I32)) - HOOK_API_DEFINITION(I64, slot_size, (I32)) - HOOK_API_DEFINITION(I64, slot_subarray, (I32, I32, I32)) - HOOK_API_DEFINITION(I64, slot_subfield, (I32, I32, I32)) - HOOK_API_DEFINITION(I64, slot_type, (I32, I32)) - HOOK_API_DEFINITION(I64, slot_float, (I32)) - HOOK_API_DEFINITION(I64, state_set, (I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, state_foreign_set, (I32, I32, I32, I32, I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, state, (I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, state_foreign, (I32, I32, I32, I32, I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, trace, (I32, I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, trace_num, (I32, I32, I64)) - HOOK_API_DEFINITION(I64, trace_float, (I32, I32, I64)) - HOOK_API_DEFINITION(I64, otxn_burden, ()) - HOOK_API_DEFINITION(I64, otxn_field, (I32, I32, I32)) - HOOK_API_DEFINITION(I64, otxn_generation, ()) - HOOK_API_DEFINITION(I64, otxn_id, (I32, I32, I32)) - HOOK_API_DEFINITION(I64, otxn_type, ()) - HOOK_API_DEFINITION(I64, otxn_slot, (I32)) - HOOK_API_DEFINITION(I64, otxn_param, (I32, I32, I32, I32)) - HOOK_API_DEFINITION(I64, meta_slot, (I32)) - - #ifndef GUARD_CHECKER_BUILD - if (rules.enabled(featureHooksUpdate1)) - #endif - HOOK_API_DEFINITION(I64, xpop_slot, (I32, I32)) +#ifndef GUARD_CHECKER_BUILD + std::map amendments = {}; +#endif + +#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, ...) \ + whitelist[#FUNCTION_NAME] = {RETURN_TYPE, HOOK_WRAP_PARAMS PARAMS_TUPLE}; +#else +#define HOOK_API_DEFINITION( \ + RETURN_TYPE, FUNCTION_NAME, PARAMS_TUPLE, AMENDMENT) \ + if (AMENDMENT == uint256{} || rules.enabled(AMENDMENT)) \ + whitelist[#FUNCTION_NAME] = { \ + RETURN_TYPE, HOOK_WRAP_PARAMS PARAMS_TUPLE}; +#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 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 2c1f250bbf..3fa02cbe63 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); - -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); - -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); - -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); - -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); -*/ +#pragma push_macro("HOOK_API_DEFINITION") +#undef HOOK_API_DEFINITION + +#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); + +#include + +#undef HOOK_API_DEFINITION +#undef HOOK_WRAP_PARAMS +#pragma pop_macro("HOOK_API_DEFINITION") + } /* end namespace hook_api */ namespace hook { @@ -792,97 +447,18 @@ class HookExecutor WasmEdge_LogSetDebugLevel(); - ADD_HOOK_FUNCTION(_g, ctx); - ADD_HOOK_FUNCTION(accept, ctx); - ADD_HOOK_FUNCTION(rollback, ctx); - ADD_HOOK_FUNCTION(util_raddr, ctx); - ADD_HOOK_FUNCTION(util_accid, ctx); - ADD_HOOK_FUNCTION(util_verify, ctx); - ADD_HOOK_FUNCTION(util_sha512h, ctx); - ADD_HOOK_FUNCTION(sto_validate, ctx); - ADD_HOOK_FUNCTION(sto_subfield, ctx); - ADD_HOOK_FUNCTION(sto_subarray, ctx); - ADD_HOOK_FUNCTION(sto_emplace, ctx); - ADD_HOOK_FUNCTION(sto_erase, ctx); - ADD_HOOK_FUNCTION(util_keylet, ctx); - - ADD_HOOK_FUNCTION(emit, ctx); - ADD_HOOK_FUNCTION(etxn_burden, ctx); - ADD_HOOK_FUNCTION(etxn_fee_base, ctx); - ADD_HOOK_FUNCTION(etxn_details, ctx); - ADD_HOOK_FUNCTION(etxn_reserve, ctx); - ADD_HOOK_FUNCTION(etxn_generation, ctx); - ADD_HOOK_FUNCTION(etxn_nonce, ctx); - - ADD_HOOK_FUNCTION(float_set, ctx); - ADD_HOOK_FUNCTION(float_multiply, ctx); - ADD_HOOK_FUNCTION(float_mulratio, ctx); - ADD_HOOK_FUNCTION(float_negate, ctx); - ADD_HOOK_FUNCTION(float_compare, ctx); - ADD_HOOK_FUNCTION(float_sum, ctx); - ADD_HOOK_FUNCTION(float_sto, ctx); - ADD_HOOK_FUNCTION(float_sto_set, ctx); - ADD_HOOK_FUNCTION(float_invert, ctx); - - ADD_HOOK_FUNCTION(float_divide, ctx); - ADD_HOOK_FUNCTION(float_one, ctx); - ADD_HOOK_FUNCTION(float_mantissa, ctx); - ADD_HOOK_FUNCTION(float_sign, ctx); - ADD_HOOK_FUNCTION(float_int, ctx); - ADD_HOOK_FUNCTION(float_log, ctx); - ADD_HOOK_FUNCTION(float_root, ctx); - - ADD_HOOK_FUNCTION(otxn_burden, ctx); - ADD_HOOK_FUNCTION(otxn_generation, ctx); - ADD_HOOK_FUNCTION(otxn_field, ctx); - ADD_HOOK_FUNCTION(otxn_id, ctx); - ADD_HOOK_FUNCTION(otxn_type, ctx); - ADD_HOOK_FUNCTION(otxn_slot, ctx); - ADD_HOOK_FUNCTION(otxn_param, ctx); - - ADD_HOOK_FUNCTION(hook_account, ctx); - ADD_HOOK_FUNCTION(hook_hash, ctx); - ADD_HOOK_FUNCTION(hook_again, ctx); - ADD_HOOK_FUNCTION(fee_base, ctx); - ADD_HOOK_FUNCTION(ledger_seq, ctx); - ADD_HOOK_FUNCTION(ledger_last_hash, ctx); - ADD_HOOK_FUNCTION(ledger_last_time, ctx); - ADD_HOOK_FUNCTION(ledger_nonce, ctx); - ADD_HOOK_FUNCTION(ledger_keylet, ctx); - - ADD_HOOK_FUNCTION(hook_param, ctx); - ADD_HOOK_FUNCTION(hook_param_set, ctx); - ADD_HOOK_FUNCTION(hook_skip, ctx); - ADD_HOOK_FUNCTION(hook_pos, ctx); - - ADD_HOOK_FUNCTION(state, ctx); - ADD_HOOK_FUNCTION(state_foreign, ctx); - ADD_HOOK_FUNCTION(state_set, ctx); - ADD_HOOK_FUNCTION(state_foreign_set, ctx); - - ADD_HOOK_FUNCTION(slot, ctx); - ADD_HOOK_FUNCTION(slot_clear, ctx); - ADD_HOOK_FUNCTION(slot_count, ctx); - ADD_HOOK_FUNCTION(slot_set, ctx); - ADD_HOOK_FUNCTION(slot_size, ctx); - ADD_HOOK_FUNCTION(slot_subarray, ctx); - ADD_HOOK_FUNCTION(slot_subfield, ctx); - ADD_HOOK_FUNCTION(slot_type, ctx); - ADD_HOOK_FUNCTION(slot_float, ctx); - - ADD_HOOK_FUNCTION(trace, ctx); - ADD_HOOK_FUNCTION(trace_num, ctx); - ADD_HOOK_FUNCTION(trace_float, ctx); - - ADD_HOOK_FUNCTION(meta_slot, ctx); - ADD_HOOK_FUNCTION(xpop_slot, ctx); - - /* - ADD_HOOK_FUNCTION(str_find, ctx); - ADD_HOOK_FUNCTION(str_replace, ctx); - ADD_HOOK_FUNCTION(str_compare, ctx); - ADD_HOOK_FUNCTION(str_concat, ctx); - */ +#pragma push_macro("HOOK_API_DEFINITION") +#undef HOOK_API_DEFINITION + +#define HOOK_WRAP_PARAMS(...) __VA_ARGS__ +#define HOOK_API_DEFINITION(RETURN_TYPE, FUNCTION_NAME, PARAMS_TUPLE, ...) \ + ADD_HOOK_FUNCTION(FUNCTION_NAME, ctx); + +#include + +#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/hook_api.macro b/src/ripple/app/hook/hook_api.macro new file mode 100644 index 0000000000..fa9683e2af --- /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{}) + +// 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{}) + +// 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{}) + +// 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{}) + +// 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{}) + +// 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{}) + +// 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{}) + +// 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{}) + +// int64_t sto_validate(uint32_t tread_ptr, uint32_t tread_len) +HOOK_API_DEFINITION(int64_t, sto_validate, (uint32_t, uint32_t), uint256{}) + +// 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{}) + +// 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{}) + +// 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{}) + +// 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{}) + +// int64_t etxn_burden() +HOOK_API_DEFINITION(int64_t, etxn_burden, (), uint256{}) + +// int64_t etxn_details(uint32_t write_ptr, uint32_t write_len) +HOOK_API_DEFINITION(int64_t, etxn_details, (uint32_t, uint32_t), uint256{}) + +// 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{}) + +// int64_t etxn_reserve(uint32_t count) +HOOK_API_DEFINITION(int64_t, etxn_reserve, (uint32_t), uint256{}) + +// int64_t etxn_generation() +HOOK_API_DEFINITION(int64_t, etxn_generation, (), uint256{}) + +// int64_t etxn_nonce(uint32_t write_ptr, uint32_t write_len) +HOOK_API_DEFINITION(int64_t, etxn_nonce, (uint32_t, uint32_t), uint256{}) + +// 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{}) + +// int64_t float_set(int32_t exponent, int64_t mantissa) +HOOK_API_DEFINITION(int64_t, float_set, (int32_t, int64_t), uint256{}) + +// int64_t float_multiply(int64_t float1, int64_t float2) +HOOK_API_DEFINITION(int64_t, float_multiply, (int64_t, int64_t), uint256{}) + +// 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{}) + +// int64_t float_negate(int64_t float1) +HOOK_API_DEFINITION(int64_t, float_negate, (int64_t), uint256{}) + +// 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{}) + +// int64_t float_sum(int64_t float1, int64_t float2) +HOOK_API_DEFINITION(int64_t, float_sum, (int64_t, int64_t), uint256{}) + +// 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{}) + +// 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{}) + +// int64_t float_invert(int64_t float1) +HOOK_API_DEFINITION(int64_t, float_invert, (int64_t), uint256{}) + +// int64_t float_divide(int64_t float1, int64_t float2) +HOOK_API_DEFINITION(int64_t, float_divide, (int64_t, int64_t), uint256{}) + +// int64_t float_one() +HOOK_API_DEFINITION(int64_t, float_one, (), uint256{}) + +// int64_t float_mantissa(int64_t float1) +HOOK_API_DEFINITION(int64_t, float_mantissa, (int64_t), uint256{}) + +// int64_t float_sign(int64_t float1) +HOOK_API_DEFINITION(int64_t, float_sign, (int64_t), uint256{}) + +// 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{}) + +// int64_t float_log(int64_t float1) +HOOK_API_DEFINITION(int64_t, float_log, (int64_t), uint256{}) + +// int64_t float_root(int64_t float1, uint32_t n) +HOOK_API_DEFINITION(int64_t, float_root, (int64_t, uint32_t), uint256{}) + +// int64_t fee_base() +HOOK_API_DEFINITION(int64_t, fee_base, (), uint256{}) + +// int64_t ledger_seq() +HOOK_API_DEFINITION(int64_t, ledger_seq, (), uint256{}) + +// int64_t ledger_last_time() +HOOK_API_DEFINITION(int64_t, ledger_last_time, (), uint256{}) + +// 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{}) + +// int64_t ledger_nonce(uint32_t write_ptr, uint32_t write_len) +HOOK_API_DEFINITION(int64_t, ledger_nonce, (uint32_t, uint32_t), uint256{}) + +// 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{}) + +// int64_t hook_account(uint32_t write_ptr, uint32_t write_len) +HOOK_API_DEFINITION(int64_t, hook_account, (uint32_t, uint32_t), uint256{}) + +// 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{}) + +// 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{}) + +// 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{}) + +// int64_t hook_again() +HOOK_API_DEFINITION(int64_t, hook_again, (), uint256{}) + +// 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{}) + +// int64_t hook_pos() +HOOK_API_DEFINITION(int64_t, hook_pos, (), uint256{}) + +// 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{}) + +// int64_t slot_clear(uint32_t slot) +HOOK_API_DEFINITION(int64_t, slot_clear, (uint32_t), uint256{}) + +// int64_t slot_count(uint32_t slot) +HOOK_API_DEFINITION(int64_t, slot_count, (uint32_t), uint256{}) + +// 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{}) + +// int64_t slot_size(uint32_t slot) +HOOK_API_DEFINITION(int64_t, slot_size, (uint32_t), uint256{}) + +// 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{}) + +// 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{}) + +// int64_t slot_type(uint32_t slot_no, uint32_t flags) +HOOK_API_DEFINITION(int64_t, slot_type, (uint32_t, uint32_t), uint256{}) + +// int64_t slot_float(uint32_t slot_no) +HOOK_API_DEFINITION(int64_t, slot_float, (uint32_t), uint256{}) + +// 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{}) + +// 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{}) + +// 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{}) + +// 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{}) + +// 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{}) + +// 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{}) + +// 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{}) + +// int64_t otxn_burden() +HOOK_API_DEFINITION(int64_t, otxn_burden, (), uint256{}) + +// 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{}) + +// int64_t otxn_generation() +HOOK_API_DEFINITION(int64_t, otxn_generation, (), uint256{}) + +// 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{}) + +// int64_t otxn_type() +HOOK_API_DEFINITION(int64_t, otxn_type, (), uint256{}) + +// int64_t otxn_slot(uint32_t slot_no) +HOOK_API_DEFINITION(int64_t, otxn_slot, (uint32_t), uint256{}) + +// 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{}) + +// int64_t meta_slot(uint32_t slot_no) +HOOK_API_DEFINITION(int64_t, meta_slot, (uint32_t), uint256{}) + +// 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) From e92b99362a65c41b932651f7142195113b8521ba Mon Sep 17 00:00:00 2001 From: tequ Date: Fri, 31 Oct 2025 16:45:14 +0900 Subject: [PATCH 09/15] add `xpop_slot` test before featureHooksUpdate1 --- src/test/app/SetHook_test.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/test/app/SetHook_test.cpp b/src/test/app/SetHook_test.cpp index 3efe5c5c8c..29b0cc0b55 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 @@ -6828,7 +6830,10 @@ class SetHook0_test : public beast::unit_test::suite 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)); @@ -6906,6 +6911,16 @@ class SetHook0_test : public beast::unit_test::suite } )[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"), From 047b7139f78ea11c19e1731a0dd5eca867459e3e Mon Sep 17 00:00:00 2001 From: tequ Date: Tue, 4 Nov 2025 14:01:37 +0900 Subject: [PATCH 10/15] update generate_extern.sh --- .../workflows/verify-generated-headers.yml | 9 ++ hook/extern.h | 22 +-- hook/generate_extern.sh | 140 +++-------------- src/ripple/app/hook/hook_api.macro | 148 +++++++++--------- 4 files changed, 120 insertions(+), 199 deletions(-) diff --git a/.github/workflows/verify-generated-headers.yml b/.github/workflows/verify-generated-headers.yml index 4120f7b7f9..ce4d382ed5 100644 --- a/.github/workflows/verify-generated-headers.yml +++ b/.github/workflows/verify-generated-headers.yml @@ -24,6 +24,15 @@ jobs: - 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..7a6a2f9ea1 100755 --- a/hook/generate_extern.sh +++ b/hook/generate_extern.sh @@ -4,7 +4,9 @@ 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" +TMPFILE=$(mktemp) +TMPFILE=$(cd "$(dirname "$TMPFILE")" && pwd)/$(basename "$TMPFILE") { echo '// For documentation please see: https://xrpl-hooks.readme.io/reference/' @@ -19,127 +21,37 @@ 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); - } - else - in_macro = 1; - next; - } - if (in_macro) { - buffer = buffer " " line; - if (line ~ /\);[[:space:]]*$/) { - sub(/\);[[:space:]]*$/, "", buffer); - process(buffer, kind); - in_macro = 0; + + # 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); } + + # printf("\n"); + + printf("extern %s\n\n", line); } } - - END { - printf("\n"); - } ' "$APPLY_HOOK" echo '#define HOOK_EXTERN' echo '#endif // HOOK_EXTERN' -} +} > "$TMPFILE" + +cd "$SCRIPT_DIR/.." +clang-format --style=file "$TMPFILE" +rm "$TMPFILE" diff --git a/src/ripple/app/hook/hook_api.macro b/src/ripple/app/hook/hook_api.macro index fa9683e2af..d0d479a547 100644 --- a/src/ripple/app/hook/hook_api.macro +++ b/src/ripple/app/hook/hook_api.macro @@ -1,221 +1,221 @@ -// int32_t _g(uint32_t guard_id, uint32_t maxiter) +// int32_t _g(uint32_t guard_id, uint32_t maxiter); HOOK_API_DEFINITION(int32_t, _g, (uint32_t, uint32_t), uint256{}) -// int64_t accept(uint32_t read_ptr, uint32_t read_len, int64_t error_code) +// 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{}) -// int64_t rollback(uint32_t read_ptr, uint32_t read_len, int64_t error_code) +// 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{}) -// int64_t util_raddr(uint32_t write_ptr, uint32_t write_len, uint32_t read_ptr, uint32_t read_len) +// 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{}) -// int64_t util_accid(uint32_t write_ptr, uint32_t write_len, uint32_t read_ptr, uint32_t read_len) +// 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{}) -// 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) +// 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{}) -// int64_t util_sha512h(uint32_t write_ptr, uint32_t write_len, uint32_t read_ptr, uint32_t read_len) +// 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{}) -// 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) +// 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{}) -// int64_t sto_validate(uint32_t tread_ptr, uint32_t tread_len) +// int64_t sto_validate(uint32_t tread_ptr, uint32_t tread_len); HOOK_API_DEFINITION(int64_t, sto_validate, (uint32_t, uint32_t), uint256{}) -// int64_t sto_subfield(uint32_t read_ptr, uint32_t read_len, uint32_t field_id) +// 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{}) -// int64_t sto_subarray(uint32_t read_ptr, uint32_t read_len, uint32_t array_id) +// 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{}) -// 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) +// 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{}) -// int64_t sto_erase(uint32_t write_ptr, uint32_t write_len, uint32_t read_ptr, uint32_t read_len, uint32_t field_id) +// 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{}) -// int64_t etxn_burden() +// int64_t etxn_burden(); HOOK_API_DEFINITION(int64_t, etxn_burden, (), uint256{}) -// int64_t etxn_details(uint32_t write_ptr, uint32_t write_len) +// int64_t etxn_details(uint32_t write_ptr, uint32_t write_len); HOOK_API_DEFINITION(int64_t, etxn_details, (uint32_t, uint32_t), uint256{}) -// int64_t etxn_fee_base(uint32_t read_ptr, uint32_t read_len) +// 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{}) -// int64_t etxn_reserve(uint32_t count) +// int64_t etxn_reserve(uint32_t count); HOOK_API_DEFINITION(int64_t, etxn_reserve, (uint32_t), uint256{}) -// int64_t etxn_generation() +// int64_t etxn_generation(); HOOK_API_DEFINITION(int64_t, etxn_generation, (), uint256{}) -// int64_t etxn_nonce(uint32_t write_ptr, uint32_t write_len) +// int64_t etxn_nonce(uint32_t write_ptr, uint32_t write_len); HOOK_API_DEFINITION(int64_t, etxn_nonce, (uint32_t, uint32_t), uint256{}) -// int64_t emit(uint32_t write_ptr, uint32_t write_len, uint32_t read_ptr, uint32_t read_len) +// 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{}) -// int64_t float_set(int32_t exponent, int64_t mantissa) +// int64_t float_set(int32_t exponent, int64_t mantissa); HOOK_API_DEFINITION(int64_t, float_set, (int32_t, int64_t), uint256{}) -// int64_t float_multiply(int64_t float1, int64_t float2) +// int64_t float_multiply(int64_t float1, int64_t float2); HOOK_API_DEFINITION(int64_t, float_multiply, (int64_t, int64_t), uint256{}) -// int64_t float_mulratio(int64_t float1, uint32_t round_up, uint32_t numerator, uint32_t denominator) +// 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{}) -// int64_t float_negate(int64_t float1) +// int64_t float_negate(int64_t float1); HOOK_API_DEFINITION(int64_t, float_negate, (int64_t), uint256{}) -// int64_t float_compare(int64_t float1, int64_t float2, uint32_t mode) +// 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{}) -// int64_t float_sum(int64_t float1, int64_t float2) +// int64_t float_sum(int64_t float1, int64_t float2); HOOK_API_DEFINITION(int64_t, float_sum, (int64_t, int64_t), uint256{}) -// 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) +// 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{}) -// int64_t float_sto_set(uint32_t read_ptr, uint32_t read_len) +// 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{}) -// int64_t float_invert(int64_t float1) +// int64_t float_invert(int64_t float1); HOOK_API_DEFINITION(int64_t, float_invert, (int64_t), uint256{}) -// int64_t float_divide(int64_t float1, int64_t float2) +// int64_t float_divide(int64_t float1, int64_t float2); HOOK_API_DEFINITION(int64_t, float_divide, (int64_t, int64_t), uint256{}) -// int64_t float_one() +// int64_t float_one(); HOOK_API_DEFINITION(int64_t, float_one, (), uint256{}) -// int64_t float_mantissa(int64_t float1) +// int64_t float_mantissa(int64_t float1); HOOK_API_DEFINITION(int64_t, float_mantissa, (int64_t), uint256{}) -// int64_t float_sign(int64_t float1) +// int64_t float_sign(int64_t float1); HOOK_API_DEFINITION(int64_t, float_sign, (int64_t), uint256{}) -// int64_t float_int(int64_t float1, uint32_t decimal_places, uint32_t abs) +// 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{}) -// int64_t float_log(int64_t float1) +// int64_t float_log(int64_t float1); HOOK_API_DEFINITION(int64_t, float_log, (int64_t), uint256{}) -// int64_t float_root(int64_t float1, uint32_t n) +// int64_t float_root(int64_t float1, uint32_t n); HOOK_API_DEFINITION(int64_t, float_root, (int64_t, uint32_t), uint256{}) -// int64_t fee_base() +// int64_t fee_base(); HOOK_API_DEFINITION(int64_t, fee_base, (), uint256{}) -// int64_t ledger_seq() +// int64_t ledger_seq(); HOOK_API_DEFINITION(int64_t, ledger_seq, (), uint256{}) -// int64_t ledger_last_time() +// int64_t ledger_last_time(); HOOK_API_DEFINITION(int64_t, ledger_last_time, (), uint256{}) -// int64_t ledger_last_hash(uint32_t write_ptr, uint32_t write_len) +// 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{}) -// int64_t ledger_nonce(uint32_t write_ptr, uint32_t write_len) +// int64_t ledger_nonce(uint32_t write_ptr, uint32_t write_len); HOOK_API_DEFINITION(int64_t, ledger_nonce, (uint32_t, uint32_t), uint256{}) -// 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) +// 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{}) -// int64_t hook_account(uint32_t write_ptr, uint32_t write_len) +// int64_t hook_account(uint32_t write_ptr, uint32_t write_len); HOOK_API_DEFINITION(int64_t, hook_account, (uint32_t, uint32_t), uint256{}) -// int64_t hook_hash(uint32_t write_ptr, uint32_t write_len, int32_t hook_no) +// 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{}) -// 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) +// 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{}) -// int64_t hook_param(uint32_t write_ptr, uint32_t write_len, uint32_t read_ptr, uint32_t read_len) +// 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{}) -// int64_t hook_again() +// int64_t hook_again(); HOOK_API_DEFINITION(int64_t, hook_again, (), uint256{}) -// int64_t hook_skip(uint32_t read_ptr, uint32_t read_len, uint32_t flags) +// 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{}) -// int64_t hook_pos() +// int64_t hook_pos(); HOOK_API_DEFINITION(int64_t, hook_pos, (), uint256{}) -// int64_t slot(uint32_t write_ptr, uint32_t write_len, uint32_t slot) +// 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{}) -// int64_t slot_clear(uint32_t slot) +// int64_t slot_clear(uint32_t slot); HOOK_API_DEFINITION(int64_t, slot_clear, (uint32_t), uint256{}) -// int64_t slot_count(uint32_t slot) +// int64_t slot_count(uint32_t slot); HOOK_API_DEFINITION(int64_t, slot_count, (uint32_t), uint256{}) -// int64_t slot_set(uint32_t read_ptr, uint32_t read_len, uint32_t slot) +// 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{}) -// int64_t slot_size(uint32_t slot) +// int64_t slot_size(uint32_t slot); HOOK_API_DEFINITION(int64_t, slot_size, (uint32_t), uint256{}) -// int64_t slot_subarray(uint32_t parent_slot, uint32_t array_id, uint32_t new_slot) +// 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{}) -// int64_t slot_subfield(uint32_t parent_slot, uint32_t field_id, uint32_t new_slot) +// 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{}) -// int64_t slot_type(uint32_t slot_no, uint32_t flags) +// int64_t slot_type(uint32_t slot_no, uint32_t flags); HOOK_API_DEFINITION(int64_t, slot_type, (uint32_t, uint32_t), uint256{}) -// int64_t slot_float(uint32_t slot_no) +// int64_t slot_float(uint32_t slot_no); HOOK_API_DEFINITION(int64_t, slot_float, (uint32_t), uint256{}) -// int64_t state_set(uint32_t read_ptr, uint32_t read_len, uint32_t kread_ptr, uint32_t kread_len) +// 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{}) -// 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) +// 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{}) -// int64_t state(uint32_t write_ptr, uint32_t write_len, uint32_t kread_ptr, uint32_t kread_len) +// 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{}) -// 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) +// 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{}) -// int64_t trace(uint32_t mread_ptr, uint32_t mread_len, uint32_t dread_ptr, uint32_t dread_len, uint32_t as_hex) +// 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{}) -// int64_t trace_num(uint32_t read_ptr, uint32_t read_len, int64_t number) +// 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{}) -// int64_t trace_float(uint32_t read_ptr, uint32_t read_len, int64_t float1) +// 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{}) -// int64_t otxn_burden() +// int64_t otxn_burden(); HOOK_API_DEFINITION(int64_t, otxn_burden, (), uint256{}) -// int64_t otxn_field(uint32_t write_ptr, uint32_t write_len, uint32_t field_id) +// 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{}) -// int64_t otxn_generation() +// int64_t otxn_generation(); HOOK_API_DEFINITION(int64_t, otxn_generation, (), uint256{}) -// int64_t otxn_id(uint32_t write_ptr, uint32_t write_len, uint32_t flags) +// 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{}) -// int64_t otxn_type() +// int64_t otxn_type(); HOOK_API_DEFINITION(int64_t, otxn_type, (), uint256{}) -// int64_t otxn_slot(uint32_t slot_no) +// int64_t otxn_slot(uint32_t slot_no); HOOK_API_DEFINITION(int64_t, otxn_slot, (uint32_t), uint256{}) -// int64_t otxn_param(uint32_t write_ptr, uint32_t write_len, uint32_t read_ptr, uint32_t read_len) +// 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{}) -// int64_t meta_slot(uint32_t slot_no) +// int64_t meta_slot(uint32_t slot_no); HOOK_API_DEFINITION(int64_t, meta_slot, (uint32_t), uint256{}) -// int64_t xpop_slot(uint32_t slot_no_tx, uint32_t slot_no_meta) +// 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) From 0955ab28ac70e967aa69a31aa33445f171871e9d Mon Sep 17 00:00:00 2001 From: tequ Date: Tue, 4 Nov 2025 14:50:21 +0900 Subject: [PATCH 11/15] fix workflow --- .github/workflows/verify-generated-headers.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/verify-generated-headers.yml b/.github/workflows/verify-generated-headers.yml index ce4d382ed5..723e7181b9 100644 --- a/.github/workflows/verify-generated-headers.yml +++ b/.github/workflows/verify-generated-headers.yml @@ -18,7 +18,9 @@ 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 From cdf3008d9dd4ca23c2559ede4cfdbfdca5e03412 Mon Sep 17 00:00:00 2001 From: tequ Date: Tue, 4 Nov 2025 14:59:15 +0900 Subject: [PATCH 12/15] fix script --- hook/generate_extern.sh | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/hook/generate_extern.sh b/hook/generate_extern.sh index 7a6a2f9ea1..0f05dac523 100755 --- a/hook/generate_extern.sh +++ b/hook/generate_extern.sh @@ -5,8 +5,6 @@ SCRIPT_DIR=$(dirname "$0") SCRIPT_DIR=$(cd "$SCRIPT_DIR" && pwd) APPLY_HOOK="$SCRIPT_DIR/../src/ripple/app/hook/hook_api.macro" -TMPFILE=$(mktemp) -TMPFILE=$(cd "$(dirname "$TMPFILE")" && pwd)/$(basename "$TMPFILE") { echo '// For documentation please see: https://xrpl-hooks.readme.io/reference/' @@ -50,8 +48,7 @@ TMPFILE=$(cd "$(dirname "$TMPFILE")" && pwd)/$(basename "$TMPFILE") echo '#define HOOK_EXTERN' echo '#endif // HOOK_EXTERN' -} > "$TMPFILE" - -cd "$SCRIPT_DIR/.." -clang-format --style=file "$TMPFILE" -rm "$TMPFILE" +} | ( + cd "$SCRIPT_DIR/.." + clang-format --style=file - +) From 5e60bdfbaf1d9aad8eb1b12f1db84d82363115d1 Mon Sep 17 00:00:00 2001 From: tequ Date: Wed, 5 Nov 2025 13:21:49 +0900 Subject: [PATCH 13/15] fix --- src/test/app/SetHook_test.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/app/SetHook_test.cpp b/src/test/app/SetHook_test.cpp index 29b0cc0b55..55f5dcebef 100644 --- a/src/test/app/SetHook_test.cpp +++ b/src/test/app/SetHook_test.cpp @@ -23,8 +23,6 @@ #include #include #include -#include "ripple/protocol/Feature.h" -#include "ripple/protocol/TER.h" #include #include #include From c8b617c166d904fbea83f099e94cd74a508bd4c6 Mon Sep 17 00:00:00 2001 From: tequ Date: Thu, 6 Nov 2025 11:25:40 +0900 Subject: [PATCH 14/15] memory page size 2 --- src/ripple/app/hook/applyHook.h | 4 +- src/test/app/SetHook_test.cpp | 94 ++++++++--- src/test/app/SetHook_wasm.h | 290 +++++++++++++++++++------------- 3 files changed, 247 insertions(+), 141 deletions(-) diff --git a/src/ripple/app/hook/applyHook.h b/src/ripple/app/hook/applyHook.h index 2c56e864fd..a7d19d7672 100644 --- a/src/ripple/app/hook/applyHook.h +++ b/src/ripple/app/hook/applyHook.h @@ -658,8 +658,8 @@ class HookExecutor if (!conf) return; WasmEdge_ConfigureStatisticsSetInstructionCounting(conf, true); - WasmEdge_ConfigureSetMaxMemoryPage( - conf, 16); // 16 * 64KiB = 1024 KiB = 1MiB = 1048576 bytes + // TODO: TEQU + WasmEdge_ConfigureSetMaxMemoryPage(conf, 2); // 2 * 64KiB = 128KiB ctx = WasmEdge_VMCreate(conf, NULL); } diff --git a/src/test/app/SetHook_test.cpp b/src/test/app/SetHook_test.cpp index 9e5c88344b..e1a5030f54 100644 --- a/src/test/app/SetHook_test.cpp +++ b/src/test/app/SetHook_test.cpp @@ -1304,16 +1304,17 @@ class SetHook0_test : public beast::unit_test::suite auto const bob = Account{"bob"}; { - // memory page size: 16 + // memory page size: 2 - // 64KiB * 15 - 1024 = 982016 - // memory.fill with len=982016 works, but len=982017 traps. - // (memory 16) = 16 pages × 64KiB = 1,048,576 bytes total. + // 64KiB * (2-1) - 1024 = 64512 + // memory.fill with len=64512 works, but len=64513 traps. + // (memory 2) = 2 pages × 64KiB = 128KiB total. // Fill range: [1024, 1024 + len) - // len=982016 → ends at 983040 (exactly before page 15 boundary) → - // OK len=982017 → touches 983041 (first byte of page 15) → - // out-of-bounds trap. Many runtimes reserve the last 64KiB as a - // guard page for safety. Effectively only 15 pages are writable. + // len=64512 → ends at 65536 (exactly before page 1 boundary) → OK + // len=64513 → touches 65537 (first byte of page 2) → out-of-bounds + // trap. + // Many runtimes reserve the last 64KiB as a guard page for safety. + // guard page for safety. Effectively only 1 page is writable. // a hook containing memory.fill instruction TestHook hookFill = wasm[R"[test.hook]( @@ -1327,7 +1328,7 @@ class SetHook0_test : public beast::unit_test::suite (local i64) global.get 1 i32.const 42 - i32.const 982016 + i32.const 130047 memory.fill i32.const 1 i32.const 1 @@ -1339,7 +1340,7 @@ class SetHook0_test : public beast::unit_test::suite call 1 drop local.get 1) - (memory (;0;) 16) + (memory (;0;) 2) (global (;0;) (mut i32) (i32.const 66560)) (global (;1;) i32 (i32.const 1024)) (global (;2;) i32 (i32.const 1024)) @@ -1360,7 +1361,7 @@ class SetHook0_test : public beast::unit_test::suite (local i64) global.get 0 global.get 1 - i32.const 982016 + i32.const 130047 memory.copy i32.const 1 i32.const 1 @@ -1372,8 +1373,8 @@ class SetHook0_test : public beast::unit_test::suite call 1 drop local.get 1) - (memory (;0;) 16) - (global (;0;) (mut i32) (i32.const 66560)) + (memory (;0;) 2) + (global (;0;) (mut i32) (i32.const 1024)) (global (;1;) i32 (i32.const 1024)) (global (;2;) i32 (i32.const 1024)) (global (;3;) i32 (i32.const 66560)) @@ -1443,7 +1444,7 @@ class SetHook0_test : public beast::unit_test::suite (local i64) global.get 1 i32.const 42 - i32.const 982017 + i32.const 130049 memory.fill i32.const 1 i32.const 1 @@ -1476,7 +1477,7 @@ class SetHook0_test : public beast::unit_test::suite (local i64) global.get 0 global.get 1 - i32.const 982017 + i32.const 130049 memory.copy i32.const 1 i32.const 1 @@ -1489,7 +1490,7 @@ class SetHook0_test : public beast::unit_test::suite drop local.get 1) (memory (;0;) 2) - (global (;0;) (mut i32) (i32.const 66560)) + (global (;0;) (mut i32) (i32.const 1024)) (global (;1;) i32 (i32.const 1024)) (global (;2;) i32 (i32.const 1024)) (global (;3;) i32 (i32.const 66560)) @@ -1502,21 +1503,76 @@ class SetHook0_test : public beast::unit_test::suite env.close(); env(ripple::test::jtx::hook(alice, {{hso(hookFill)}}, 0), - M("hookFill - page cap exceeded"), HSFEE, ter(tesSUCCESS)); env.close(); - env(pay(bob, alice, XRP(1)), fee(XRP(1)), ter(tecHOOK_REJECTED)); + env(pay(bob, alice, XRP(1)), + fee(XRP(1)), + M("hookFill - page cap exceeded"), + ter(tecHOOK_REJECTED)); env.close(); env(ripple::test::jtx::hook(bob, {{hso(hookCopy)}}, 0), + HSFEE, + ter(tesSUCCESS)); + env.close(); + + env(pay(bob, alice, XRP(1)), + fee(XRP(1)), M("hookCopy - page cap exceeded"), + ter(tecHOOK_REJECTED)); + env.close(); + } + + { + TestHook hook = wasm[R"[test.hook]( + (module + (type (;0;) (func (param i32 i32) (result i32))) + (type (;1;) (func (param i32 i32 i64) (result i64))) + (type (;2;) (func (param i32) (result i64))) + (import "env" "_g" (func (;0;) (type 0))) + (import "env" "accept" (func (;1;) (type 1))) + (func (;2;) (type 2) (param i32) (result i64) + (local i64) + global.get 1 + i32.const 42 + i32.const 130047 + memory.fill + i32.const 1 + i32.const 1 + call 0 + drop + i32.const 0 + i32.const 0 + i64.const 0 + call 1 + drop + local.get 1) + (memory (;0;) 3) + (global (;0;) (mut i32) (i32.const 66560)) + (global (;1;) i32 (i32.const 1024)) + (global (;2;) i32 (i32.const 1024)) + (global (;3;) i32 (i32.const 66560)) + (global (;4;) i32 (i32.const 1024)) + (export "hook" (func 2))) + )[test.hook]"]; + + Env env{*this, features | featureHooksMemoryFillCopy}; + env.fund(XRP(10000), alice, bob); + env.close(); + + env(ripple::test::jtx::hook(alice, {{hso(hook)}}, 0), HSFEE, ter(tesSUCCESS)); env.close(); - env(pay(bob, alice, XRP(1)), fee(XRP(1)), ter(tecHOOK_REJECTED)); + // TODO: TEQU error handling + + env(pay(bob, alice, XRP(1)), + fee(XRP(1)), + M("hookFill - page out of bounds"), + ter(tecHOOK_REJECTED)); env.close(); } } diff --git a/src/test/app/SetHook_wasm.h b/src/test/app/SetHook_wasm.h index 61bee7d563..da1a4499a2 100644 --- a/src/test/app/SetHook_wasm.h +++ b/src/test/app/SetHook_wasm.h @@ -202,7 +202,7 @@ std::map> wasm = { (local i64) global.get 1 i32.const 42 - i32.const 982016 + i32.const 130047 memory.fill i32.const 1 i32.const 1 @@ -214,7 +214,7 @@ std::map> wasm = { call 1 drop local.get 1) - (memory (;0;) 16) + (memory (;0;) 2) (global (;0;) (mut i32) (i32.const 66560)) (global (;1;) i32 (i32.const 1024)) (global (;2;) i32 (i32.const 1024)) @@ -229,13 +229,13 @@ std::map> wasm = { 0x17U, 0x02U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x02U, 0x5FU, 0x67U, 0x00U, 0x00U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x06U, 0x61U, 0x63U, 0x63U, 0x65U, 0x70U, 0x74U, 0x00U, 0x01U, 0x03U, 0x02U, 0x01U, 0x02U, 0x05U, 0x03U, - 0x01U, 0x00U, 0x10U, 0x06U, 0x21U, 0x05U, 0x7FU, 0x01U, 0x41U, 0x80U, + 0x01U, 0x00U, 0x02U, 0x06U, 0x21U, 0x05U, 0x7FU, 0x01U, 0x41U, 0x80U, 0x88U, 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x88U, 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x07U, 0x08U, 0x01U, 0x04U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x02U, 0x0AU, 0x23U, 0x01U, 0x21U, 0x01U, 0x01U, 0x7EU, 0x23U, 0x01U, 0x41U, 0x2AU, 0x41U, - 0x80U, 0xF8U, 0x3BU, 0xFCU, 0x0BU, 0x00U, 0x41U, 0x01U, 0x41U, 0x01U, + 0xFFU, 0xF7U, 0x07U, 0xFCU, 0x0BU, 0x00U, 0x41U, 0x01U, 0x41U, 0x01U, 0x10U, 0x00U, 0x1AU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, 0x10U, 0x01U, 0x1AU, 0x20U, 0x01U, 0x0BU, }}, @@ -252,7 +252,7 @@ std::map> wasm = { (local i64) global.get 0 global.get 1 - i32.const 982016 + i32.const 130047 memory.copy i32.const 1 i32.const 1 @@ -264,8 +264,8 @@ std::map> wasm = { call 1 drop local.get 1) - (memory (;0;) 16) - (global (;0;) (mut i32) (i32.const 66560)) + (memory (;0;) 2) + (global (;0;) (mut i32) (i32.const 1024)) (global (;1;) i32 (i32.const 1024)) (global (;2;) i32 (i32.const 1024)) (global (;3;) i32 (i32.const 66560)) @@ -279,15 +279,15 @@ std::map> wasm = { 0x17U, 0x02U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x02U, 0x5FU, 0x67U, 0x00U, 0x00U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x06U, 0x61U, 0x63U, 0x63U, 0x65U, 0x70U, 0x74U, 0x00U, 0x01U, 0x03U, 0x02U, 0x01U, 0x02U, 0x05U, 0x03U, - 0x01U, 0x00U, 0x10U, 0x06U, 0x21U, 0x05U, 0x7FU, 0x01U, 0x41U, 0x80U, - 0x88U, 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, - 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x88U, - 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x07U, 0x08U, - 0x01U, 0x04U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x02U, 0x0AU, 0x24U, - 0x01U, 0x22U, 0x01U, 0x01U, 0x7EU, 0x23U, 0x00U, 0x23U, 0x01U, 0x41U, - 0x80U, 0xF8U, 0x3BU, 0xFCU, 0x0AU, 0x00U, 0x00U, 0x41U, 0x01U, 0x41U, - 0x01U, 0x10U, 0x00U, 0x1AU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, - 0x10U, 0x01U, 0x1AU, 0x20U, 0x01U, 0x0BU, + 0x01U, 0x00U, 0x02U, 0x06U, 0x20U, 0x05U, 0x7FU, 0x01U, 0x41U, 0x80U, + 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, + 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x88U, 0x04U, + 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x07U, 0x08U, 0x01U, + 0x04U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x02U, 0x0AU, 0x24U, 0x01U, + 0x22U, 0x01U, 0x01U, 0x7EU, 0x23U, 0x00U, 0x23U, 0x01U, 0x41U, 0xFFU, + 0xF7U, 0x07U, 0xFCU, 0x0AU, 0x00U, 0x00U, 0x41U, 0x01U, 0x41U, 0x01U, + 0x10U, 0x00U, 0x1AU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, 0x10U, + 0x01U, 0x1AU, 0x20U, 0x01U, 0x0BU, }}, /* ==== WASM: 3 ==== */ @@ -302,7 +302,7 @@ std::map> wasm = { (local i64) global.get 1 i32.const 42 - i32.const 982017 + i32.const 130049 memory.fill i32.const 1 i32.const 1 @@ -335,7 +335,7 @@ std::map> wasm = { 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x07U, 0x08U, 0x01U, 0x04U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x02U, 0x0AU, 0x23U, 0x01U, 0x21U, 0x01U, 0x01U, 0x7EU, 0x23U, 0x01U, 0x41U, 0x2AU, 0x41U, - 0x81U, 0xF8U, 0x3BU, 0xFCU, 0x0BU, 0x00U, 0x41U, 0x01U, 0x41U, 0x01U, + 0x81U, 0xF8U, 0x07U, 0xFCU, 0x0BU, 0x00U, 0x41U, 0x01U, 0x41U, 0x01U, 0x10U, 0x00U, 0x1AU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, 0x10U, 0x01U, 0x1AU, 0x20U, 0x01U, 0x0BU, }}, @@ -352,7 +352,7 @@ std::map> wasm = { (local i64) global.get 0 global.get 1 - i32.const 982017 + i32.const 130049 memory.copy i32.const 1 i32.const 1 @@ -365,6 +365,56 @@ std::map> wasm = { drop local.get 1) (memory (;0;) 2) + (global (;0;) (mut i32) (i32.const 1024)) + (global (;1;) i32 (i32.const 1024)) + (global (;2;) i32 (i32.const 1024)) + (global (;3;) i32 (i32.const 66560)) + (global (;4;) i32 (i32.const 1024)) + (export "hook" (func 2))) + )[test.hook]", + { + 0x00U, 0x61U, 0x73U, 0x6DU, 0x01U, 0x00U, 0x00U, 0x00U, 0x01U, 0x13U, + 0x03U, 0x60U, 0x02U, 0x7FU, 0x7FU, 0x01U, 0x7FU, 0x60U, 0x03U, 0x7FU, + 0x7FU, 0x7EU, 0x01U, 0x7EU, 0x60U, 0x01U, 0x7FU, 0x01U, 0x7EU, 0x02U, + 0x17U, 0x02U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x02U, 0x5FU, 0x67U, 0x00U, + 0x00U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x06U, 0x61U, 0x63U, 0x63U, 0x65U, + 0x70U, 0x74U, 0x00U, 0x01U, 0x03U, 0x02U, 0x01U, 0x02U, 0x05U, 0x03U, + 0x01U, 0x00U, 0x02U, 0x06U, 0x20U, 0x05U, 0x7FU, 0x01U, 0x41U, 0x80U, + 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, + 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x88U, 0x04U, + 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x07U, 0x08U, 0x01U, + 0x04U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x02U, 0x0AU, 0x24U, 0x01U, + 0x22U, 0x01U, 0x01U, 0x7EU, 0x23U, 0x00U, 0x23U, 0x01U, 0x41U, 0x81U, + 0xF8U, 0x07U, 0xFCU, 0x0AU, 0x00U, 0x00U, 0x41U, 0x01U, 0x41U, 0x01U, + 0x10U, 0x00U, 0x1AU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, 0x10U, + 0x01U, 0x1AU, 0x20U, 0x01U, 0x0BU, + }}, + + /* ==== WASM: 5 ==== */ + {R"[test.hook]( + (module + (type (;0;) (func (param i32 i32) (result i32))) + (type (;1;) (func (param i32 i32 i64) (result i64))) + (type (;2;) (func (param i32) (result i64))) + (import "env" "_g" (func (;0;) (type 0))) + (import "env" "accept" (func (;1;) (type 1))) + (func (;2;) (type 2) (param i32) (result i64) + (local i64) + global.get 1 + i32.const 42 + i32.const 130047 + memory.fill + i32.const 1 + i32.const 1 + call 0 + drop + i32.const 0 + i32.const 0 + i64.const 0 + call 1 + drop + local.get 1) + (memory (;0;) 3) (global (;0;) (mut i32) (i32.const 66560)) (global (;1;) i32 (i32.const 1024)) (global (;2;) i32 (i32.const 1024)) @@ -379,18 +429,18 @@ std::map> wasm = { 0x17U, 0x02U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x02U, 0x5FU, 0x67U, 0x00U, 0x00U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x06U, 0x61U, 0x63U, 0x63U, 0x65U, 0x70U, 0x74U, 0x00U, 0x01U, 0x03U, 0x02U, 0x01U, 0x02U, 0x05U, 0x03U, - 0x01U, 0x00U, 0x02U, 0x06U, 0x21U, 0x05U, 0x7FU, 0x01U, 0x41U, 0x80U, + 0x01U, 0x00U, 0x03U, 0x06U, 0x21U, 0x05U, 0x7FU, 0x01U, 0x41U, 0x80U, 0x88U, 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x88U, 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x07U, 0x08U, - 0x01U, 0x04U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x02U, 0x0AU, 0x24U, - 0x01U, 0x22U, 0x01U, 0x01U, 0x7EU, 0x23U, 0x00U, 0x23U, 0x01U, 0x41U, - 0x81U, 0xF8U, 0x3BU, 0xFCU, 0x0AU, 0x00U, 0x00U, 0x41U, 0x01U, 0x41U, - 0x01U, 0x10U, 0x00U, 0x1AU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, - 0x10U, 0x01U, 0x1AU, 0x20U, 0x01U, 0x0BU, + 0x01U, 0x04U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x02U, 0x0AU, 0x23U, + 0x01U, 0x21U, 0x01U, 0x01U, 0x7EU, 0x23U, 0x01U, 0x41U, 0x2AU, 0x41U, + 0xFFU, 0xF7U, 0x07U, 0xFCU, 0x0BU, 0x00U, 0x41U, 0x01U, 0x41U, 0x01U, + 0x10U, 0x00U, 0x1AU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, 0x10U, + 0x01U, 0x1AU, 0x20U, 0x01U, 0x0BU, }}, - /* ==== WASM: 5 ==== */ + /* ==== WASM: 6 ==== */ {R"[test.hook]( (module (type (;0;) (func (param i32 i32) (result i64))) @@ -440,7 +490,7 @@ std::map> wasm = { 0x0BU, }}, - /* ==== WASM: 6 ==== */ + /* ==== WASM: 7 ==== */ {R"[test.hook]( (module (type (;0;) (func (param i32 i32) (result i64))) @@ -494,7 +544,7 @@ std::map> wasm = { 0x14U, 0x10U, 0x00U, 0x1AU, 0x0CU, 0x00U, 0x0BU, 0x0BU, }}, - /* ==== WASM: 7 ==== */ + /* ==== WASM: 8 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -561,7 +611,7 @@ std::map> wasm = { 0x80U, 0x80U, 0x00U, 0x20U, 0x02U, 0x0BU, }}, - /* ==== WASM: 8 ==== */ + /* ==== WASM: 9 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -667,7 +717,7 @@ std::map> wasm = { 0x6AU, 0x24U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x20U, 0x03U, 0x0BU, }}, - /* ==== WASM: 9 ==== */ + /* ==== WASM: 10 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -742,7 +792,7 @@ std::map> wasm = { 0x6AU, 0x24U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x20U, 0x05U, 0x0BU, }}, - /* ==== WASM: 10 ==== */ + /* ==== WASM: 11 ==== */ {R"[test.hook]( #include extern int32_t _g(uint32_t, uint32_t); @@ -1359,7 +1409,7 @@ std::map> wasm = { 0x78U, 0x29U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x33U, 0x32U, 0x00U, }}, - /* ==== WASM: 11 ==== */ + /* ==== WASM: 12 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -1464,7 +1514,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 12 ==== */ + /* ==== WASM: 13 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -1561,7 +1611,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 13 ==== */ + /* ==== WASM: 14 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -1684,7 +1734,7 @@ std::map> wasm = { 0x4EU, 0x59U, 0x5FU, 0x4EU, 0x4FU, 0x4EU, 0x43U, 0x45U, 0x53U, 0x00U, }}, - /* ==== WASM: 14 ==== */ + /* ==== WASM: 15 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -1764,7 +1814,7 @@ std::map> wasm = { 0x54U, 0x00U, }}, - /* ==== WASM: 15 ==== */ + /* ==== WASM: 16 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -1809,7 +1859,7 @@ std::map> wasm = { 0x30U, 0x00U, }}, - /* ==== WASM: 16 ==== */ + /* ==== WASM: 17 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -2128,7 +2178,7 @@ std::map> wasm = { 0x80U, 0x80U, 0x80U, 0x00U, 0x0BU, }}, - /* ==== WASM: 17 ==== */ + /* ==== WASM: 18 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -2914,7 +2964,7 @@ std::map> wasm = { 0x37U, 0x36U, 0x33U, 0x4CU, 0x4CU, 0x20U, 0x29U, 0x00U, }}, - /* ==== WASM: 18 ==== */ + /* ==== WASM: 19 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -3304,7 +3354,7 @@ std::map> wasm = { 0x80U, 0x80U, 0x80U, 0x00U, 0x0BU, }}, - /* ==== WASM: 19 ==== */ + /* ==== WASM: 20 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -3485,7 +3535,7 @@ std::map> wasm = { 0x38U, 0x4CU, 0x4CU, 0x29U, 0x00U, }}, - /* ==== WASM: 20 ==== */ + /* ==== WASM: 21 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -3674,7 +3724,7 @@ std::map> wasm = { 0x29U, 0x00U, }}, - /* ==== WASM: 21 ==== */ + /* ==== WASM: 22 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -3913,7 +3963,7 @@ std::map> wasm = { 0x00U, 0x42U, 0x00U, 0x10U, 0x85U, 0x80U, 0x80U, 0x80U, 0x00U, 0x0BU, }}, - /* ==== WASM: 22 ==== */ + /* ==== WASM: 23 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -4615,7 +4665,7 @@ std::map> wasm = { 0x38U, 0x35U, 0x35U, 0x32U, 0x55U, 0x29U, 0x00U, }}, - /* ==== WASM: 23 ==== */ + /* ==== WASM: 24 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -5960,7 +6010,7 @@ std::map> wasm = { 0x20U, 0x29U, 0x00U, }}, - /* ==== WASM: 24 ==== */ + /* ==== WASM: 25 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -6062,7 +6112,7 @@ std::map> wasm = { 0x84U, 0x80U, 0x80U, 0x80U, 0x00U, 0x0BU, }}, - /* ==== WASM: 25 ==== */ + /* ==== WASM: 26 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -6105,7 +6155,7 @@ std::map> wasm = { 0x00U, 0x0BU, }}, - /* ==== WASM: 26 ==== */ + /* ==== WASM: 27 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -6253,7 +6303,7 @@ std::map> wasm = { 0x34U, 0x34U, 0x4CU, 0x4CU, 0x2CU, 0x20U, 0x33U, 0x29U, 0x00U, }}, - /* ==== WASM: 27 ==== */ + /* ==== WASM: 28 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -6581,7 +6631,7 @@ std::map> wasm = { 0x38U, 0x34U, 0x39U, 0x30U, 0x4CU, 0x4CU, 0x00U, }}, - /* ==== WASM: 28 ==== */ + /* ==== WASM: 29 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -6786,7 +6836,7 @@ std::map> wasm = { 0x10U, 0x85U, 0x80U, 0x80U, 0x80U, 0x00U, 0x0BU, }}, - /* ==== WASM: 29 ==== */ + /* ==== WASM: 30 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -7470,7 +7520,7 @@ std::map> wasm = { 0x20U, 0x3DU, 0x3DU, 0x20U, 0x30U, 0x00U, }}, - /* ==== WASM: 30 ==== */ + /* ==== WASM: 31 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -7765,7 +7815,7 @@ std::map> wasm = { 0x32U, 0x34U, 0x31U, 0x36U, 0x55U, 0x4CU, 0x4CU, 0x00U, }}, - /* ==== WASM: 31 ==== */ + /* ==== WASM: 32 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -8478,7 +8528,7 @@ std::map> wasm = { 0x31U, 0x33U, 0x33U, 0x38U, 0x20U, 0x29U, 0x00U, }}, - /* ==== WASM: 32 ==== */ + /* ==== WASM: 33 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -8563,7 +8613,7 @@ std::map> wasm = { 0x30U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x32U, 0x30U, 0x00U, }}, - /* ==== WASM: 33 ==== */ + /* ==== WASM: 34 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -8625,7 +8675,7 @@ std::map> wasm = { 0x80U, 0x80U, 0x00U, 0x0BU, }}, - /* ==== WASM: 34 ==== */ + /* ==== WASM: 35 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -8702,7 +8752,7 @@ std::map> wasm = { 0x31U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x33U, 0x32U, 0x00U, }}, - /* ==== WASM: 35 ==== */ + /* ==== WASM: 36 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -8779,7 +8829,7 @@ std::map> wasm = { 0x31U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x33U, 0x32U, 0x00U, }}, - /* ==== WASM: 36 ==== */ + /* ==== WASM: 37 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -9036,7 +9086,7 @@ std::map> wasm = { 0x00U, 0x00U, }}, - /* ==== WASM: 37 ==== */ + /* ==== WASM: 38 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -9194,7 +9244,7 @@ std::map> wasm = { 0x04U, 0x00U, 0x00U, }}, - /* ==== WASM: 38 ==== */ + /* ==== WASM: 39 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -9547,7 +9597,7 @@ std::map> wasm = { 0x00U, 0x2AU, 0x04U, 0x00U, 0x00U, 0x31U, 0x04U, 0x00U, 0x00U, }}, - /* ==== WASM: 39 ==== */ + /* ==== WASM: 40 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -9580,7 +9630,7 @@ std::map> wasm = { 0x82U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x20U, 0x01U, 0x0BU, }}, - /* ==== WASM: 40 ==== */ + /* ==== WASM: 41 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -9807,7 +9857,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 41 ==== */ + /* ==== WASM: 42 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -9838,7 +9888,7 @@ std::map> wasm = { 0x80U, 0x80U, 0x00U, 0x1AU, 0x20U, 0x01U, 0x0BU, }}, - /* ==== WASM: 42 ==== */ + /* ==== WASM: 43 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10149,7 +10199,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 43 ==== */ + /* ==== WASM: 44 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10226,7 +10276,7 @@ std::map> wasm = { 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x33U, 0x32U, 0x00U, }}, - /* ==== WASM: 44 ==== */ + /* ==== WASM: 45 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10260,7 +10310,7 @@ std::map> wasm = { 0x80U, 0x80U, 0x00U, 0x1AU, 0x20U, 0x01U, 0x0BU, }}, - /* ==== WASM: 45 ==== */ + /* ==== WASM: 46 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10347,7 +10397,7 @@ std::map> wasm = { 0x32U, 0x00U, }}, - /* ==== WASM: 46 ==== */ + /* ==== WASM: 47 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10381,7 +10431,7 @@ std::map> wasm = { 0x0BU, }}, - /* ==== WASM: 47 ==== */ + /* ==== WASM: 48 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10521,7 +10571,7 @@ std::map> wasm = { 0x54U, 0x5FU, 0x4DU, 0x45U, 0x54U, 0x00U, }}, - /* ==== WASM: 48 ==== */ + /* ==== WASM: 49 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10711,7 +10761,7 @@ std::map> wasm = { 0x31U, 0x34U, 0x00U, }}, - /* ==== WASM: 49 ==== */ + /* ==== WASM: 50 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10865,7 +10915,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 50 ==== */ + /* ==== WASM: 51 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11026,7 +11076,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 51 ==== */ + /* ==== WASM: 52 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11183,7 +11233,7 @@ std::map> wasm = { 0x53U, 0x4CU, 0x4FU, 0x54U, 0x53U, 0x00U, }}, - /* ==== WASM: 52 ==== */ + /* ==== WASM: 53 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11268,7 +11318,7 @@ std::map> wasm = { 0x74U, 0x79U, 0x70U, 0x65U, 0x28U, 0x29U, 0x00U, }}, - /* ==== WASM: 53 ==== */ + /* ==== WASM: 54 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11525,7 +11575,7 @@ std::map> wasm = { 0x00U, 0x00U, }}, - /* ==== WASM: 54 ==== */ + /* ==== WASM: 55 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11763,7 +11813,7 @@ std::map> wasm = { 0x3EU, 0x20U, 0x30U, 0x00U, }}, - /* ==== WASM: 55 ==== */ + /* ==== WASM: 56 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11859,7 +11909,7 @@ std::map> wasm = { 0x53U, 0x54U, 0x00U, }}, - /* ==== WASM: 56 ==== */ + /* ==== WASM: 57 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11969,7 +12019,7 @@ std::map> wasm = { 0x20U, 0x31U, 0x00U, }}, - /* ==== WASM: 57 ==== */ + /* ==== WASM: 58 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -12099,7 +12149,7 @@ std::map> wasm = { 0x30U, 0x30U, 0x30U, 0x4CU, 0x4CU, 0x00U, }}, - /* ==== WASM: 58 ==== */ + /* ==== WASM: 59 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -12373,7 +12423,7 @@ std::map> wasm = { 0x30U, 0x00U, }}, - /* ==== WASM: 59 ==== */ + /* ==== WASM: 60 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -12510,7 +12560,7 @@ std::map> wasm = { 0x2CU, 0x20U, 0x73U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x31U, 0x00U, }}, - /* ==== WASM: 60 ==== */ + /* ==== WASM: 61 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -12804,7 +12854,7 @@ std::map> wasm = { 0x5FU, 0x53U, 0x4CU, 0x4FU, 0x54U, 0x53U, 0x00U, }}, - /* ==== WASM: 61 ==== */ + /* ==== WASM: 62 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -13038,7 +13088,7 @@ std::map> wasm = { 0x5FU, 0x53U, 0x4CU, 0x4FU, 0x54U, 0x53U, 0x00U, }}, - /* ==== WASM: 62 ==== */ + /* ==== WASM: 63 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -13334,7 +13384,7 @@ std::map> wasm = { 0x2CU, 0x20U, 0x31U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x30U, 0x00U, }}, - /* ==== WASM: 63 ==== */ + /* ==== WASM: 64 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -13538,7 +13588,7 @@ std::map> wasm = { 0x6EU, 0x74U, 0x32U, 0x22U, 0x20U, 0x2BU, 0x20U, 0x69U, 0x29U, 0x00U, }}, - /* ==== WASM: 64 ==== */ + /* ==== WASM: 65 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -13655,7 +13705,7 @@ std::map> wasm = { 0x69U, 0x29U, 0x00U, }}, - /* ==== WASM: 65 ==== */ + /* ==== WASM: 66 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -13764,7 +13814,7 @@ std::map> wasm = { 0x6EU, 0x74U, 0x65U, 0x6EU, 0x74U, 0x32U, 0x22U, 0x29U, 0x00U, }}, - /* ==== WASM: 66 ==== */ + /* ==== WASM: 67 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -14037,7 +14087,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 67 ==== */ + /* ==== WASM: 68 ==== */ {R"[test.hook]( #include #define sfInvoiceID ((5U << 16U) + 17U) @@ -14256,7 +14306,7 @@ std::map> wasm = { 0x30U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x33U, 0x32U, 0x00U, }}, - /* ==== WASM: 68 ==== */ + /* ==== WASM: 69 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -14368,7 +14418,7 @@ std::map> wasm = { 0x58U, 0x49U, 0x53U, 0x54U, 0x00U, }}, - /* ==== WASM: 69 ==== */ + /* ==== WASM: 70 ==== */ {R"[test.hook]( #include #define sfInvoiceID ((5U << 16U) + 17U) @@ -14504,7 +14554,7 @@ std::map> wasm = { 0x3DU, 0x20U, 0x33U, 0x32U, 0x00U, }}, - /* ==== WASM: 70 ==== */ + /* ==== WASM: 71 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -14640,7 +14690,7 @@ std::map> wasm = { 0x49U, 0x47U, 0x00U, }}, - /* ==== WASM: 71 ==== */ + /* ==== WASM: 72 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -14779,7 +14829,7 @@ std::map> wasm = { 0x66U, 0x28U, 0x64U, 0x61U, 0x74U, 0x61U, 0x32U, 0x29U, 0x00U, }}, - /* ==== WASM: 72 ==== */ + /* ==== WASM: 73 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -14891,7 +14941,7 @@ std::map> wasm = { 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x30U, 0x00U, }}, - /* ==== WASM: 73 ==== */ + /* ==== WASM: 74 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -14985,7 +15035,7 @@ std::map> wasm = { 0x61U, 0x64U, 0x5BU, 0x69U, 0x5DU, 0x00U, }}, - /* ==== WASM: 74 ==== */ + /* ==== WASM: 75 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -15118,7 +15168,7 @@ std::map> wasm = { 0x64U, 0x5BU, 0x69U, 0x5DU, 0x00U, }}, - /* ==== WASM: 75 ==== */ + /* ==== WASM: 76 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -15206,7 +15256,7 @@ std::map> wasm = { 0x61U, 0x74U, 0x61U, 0x29U, 0x00U, }}, - /* ==== WASM: 76 ==== */ + /* ==== WASM: 77 ==== */ {R"[test.hook]( #include #define sfInvoiceID ((5U << 16U) + 17U) @@ -15317,7 +15367,7 @@ std::map> wasm = { 0x20U, 0x33U, 0x32U, 0x00U, }}, - /* ==== WASM: 77 ==== */ + /* ==== WASM: 78 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -15528,7 +15578,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 78 ==== */ + /* ==== WASM: 79 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -15636,7 +15686,7 @@ std::map> wasm = { 0x20U, 0x22U, 0x32U, 0x22U, 0x2CU, 0x20U, 0x31U, 0x29U, 0x00U, }}, - /* ==== WASM: 79 ==== */ + /* ==== WASM: 80 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -16248,7 +16298,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 80 ==== */ + /* ==== WASM: 81 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -16598,7 +16648,7 @@ std::map> wasm = { 0x20U, 0x30U, 0x00U, }}, - /* ==== WASM: 81 ==== */ + /* ==== WASM: 82 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -16734,7 +16784,7 @@ std::map> wasm = { 0x00U, }}, - /* ==== WASM: 82 ==== */ + /* ==== WASM: 83 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -16907,7 +16957,7 @@ std::map> wasm = { 0x54U, 0x5FU, 0x45U, 0x58U, 0x49U, 0x53U, 0x54U, 0x00U, }}, - /* ==== WASM: 83 ==== */ + /* ==== WASM: 84 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -17055,7 +17105,7 @@ std::map> wasm = { 0x30U, 0x00U, 0x22U, 0x00U, 0x00U, 0x00U, 0x00U, }}, - /* ==== WASM: 84 ==== */ + /* ==== WASM: 85 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -17152,7 +17202,7 @@ std::map> wasm = { 0x3DU, 0x20U, 0x30U, 0x00U, }}, - /* ==== WASM: 85 ==== */ + /* ==== WASM: 86 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -17211,7 +17261,7 @@ std::map> wasm = { 0x4FU, 0x46U, 0x5FU, 0x42U, 0x4FU, 0x55U, 0x4EU, 0x44U, 0x53U, 0x00U, }}, - /* ==== WASM: 86 ==== */ + /* ==== WASM: 87 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -17270,7 +17320,7 @@ std::map> wasm = { 0x4EU, 0x44U, 0x53U, 0x00U, }}, - /* ==== WASM: 87 ==== */ + /* ==== WASM: 88 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -19099,7 +19149,7 @@ std::map> wasm = { 0x53U, 0x4DU, 0x41U, 0x4CU, 0x4CU, 0x00U, }}, - /* ==== WASM: 88 ==== */ + /* ==== WASM: 89 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -20441,7 +20491,7 @@ std::map> wasm = { 0x20U, 0x30U, 0x2CU, 0x20U, 0x30U, 0x29U, 0x29U, 0x00U, }}, - /* ==== WASM: 89 ==== */ + /* ==== WASM: 90 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -23374,7 +23424,7 @@ std::map> wasm = { 0x4FU, 0x4FU, 0x5FU, 0x53U, 0x4DU, 0x41U, 0x4CU, 0x4CU, 0x00U, }}, - /* ==== WASM: 90 ==== */ + /* ==== WASM: 91 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -25339,7 +25389,7 @@ std::map> wasm = { 0x54U, 0x4FU, 0x4FU, 0x5FU, 0x53U, 0x4DU, 0x41U, 0x4CU, 0x4CU, 0x00U, }}, - /* ==== WASM: 91 ==== */ + /* ==== WASM: 92 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -25624,7 +25674,7 @@ std::map> wasm = { 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x30U, 0x00U, }}, - /* ==== WASM: 92 ==== */ + /* ==== WASM: 93 ==== */ {R"[test.hook]( #include extern int32_t _g(uint32_t, uint32_t); @@ -26211,7 +26261,7 @@ std::map> wasm = { 0x4EU, 0x5FU, 0x46U, 0x41U, 0x49U, 0x4CU, 0x55U, 0x52U, 0x45U, 0x00U, }}, - /* ==== WASM: 93 ==== */ + /* ==== WASM: 94 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -26240,7 +26290,7 @@ std::map> wasm = { 0x0BU, }}, - /* ==== WASM: 94 ==== */ + /* ==== WASM: 95 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -26272,7 +26322,7 @@ std::map> wasm = { 0x20U, 0x52U, 0x65U, 0x6AU, 0x65U, 0x63U, 0x74U, 0x65U, 0x64U, 0x00U, }}, - /* ==== WASM: 95 ==== */ + /* ==== WASM: 96 ==== */ {R"[test.hook]( (module (type (;0;) (func (param i32 i32 i64) (result i64))) @@ -26299,7 +26349,7 @@ std::map> wasm = { 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, 0x10U, 0x00U, 0x0BU, }}, - /* ==== WASM: 96 ==== */ + /* ==== WASM: 97 ==== */ {R"[test.hook]( (module (type (;0;) (func (param i32 i32) (result i32))) @@ -26352,7 +26402,7 @@ std::map> wasm = { 0x00U, 0x1AU, 0x0BU, }}, - /* ==== WASM: 97 ==== */ + /* ==== WASM: 98 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -32995,7 +33045,7 @@ std::map> wasm = { 0x39U, 0x30U, 0x31U, 0x32U, 0x33U, 0x00U, }}, - /* ==== WASM: 98 ==== */ + /* ==== WASM: 99 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -33041,7 +33091,7 @@ std::map> wasm = { 0x0BU, 0x06U, 0x76U, 0x61U, 0x6CU, 0x75U, 0x65U, 0x00U, }}, - /* ==== WASM: 99 ==== */ + /* ==== WASM: 100 ==== */ {R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); From 1cd3eb654cfcfb49219680f4ed671ff13602a07a Mon Sep 17 00:00:00 2001 From: tequ Date: Thu, 6 Nov 2025 13:19:51 +0900 Subject: [PATCH 15/15] Add memory section validation and remove max memory page configuration --- src/ripple/app/hook/Enum.h | 6 ++-- src/ripple/app/hook/Guard.h | 59 +++++++++++++++++++++++++++++++++ src/ripple/app/hook/applyHook.h | 2 -- src/test/app/SetHook_test.cpp | 36 ++++++++++---------- src/test/app/SetHook_wasm.h | 13 +++----- 5 files changed, 86 insertions(+), 30 deletions(-) diff --git a/src/ripple/app/hook/Enum.h b/src/ripple/app/hook/Enum.h index 3324613e5a..7c726f926a 100644 --- a/src/ripple/app/hook/Enum.h +++ b/src/ripple/app/hook/Enum.h @@ -246,8 +246,10 @@ enum hook_log_code : uint16_t { SECTIONS_OUT_OF_SEQUENCE = 85, // the wasm contained sections out of sequence CUSTOM_SECTION_DISALLOWED = - 86, // the wasm contained a custom section (id=0) - INTERNAL_ERROR = 87, // an internal error described by the log text + 86, // the wasm contained a custom section (id=0) + INTERNAL_ERROR = 87, // an internal error described by the log text + MEMORY_MISSING = 88, // hook did not establish any memory section + MEMORY_MAX_PAGES = 89, // hook memory section maximum pages is not allowed // RH NOTE: only HookSet msgs got log codes, possibly all Hook log lines // should get a code? }; diff --git a/src/ripple/app/hook/Guard.h b/src/ripple/app/hook/Guard.h index eb500810aa..d0cc646d7e 100644 --- a/src/ripple/app/hook/Guard.h +++ b/src/ripple/app/hook/Guard.h @@ -1176,6 +1176,65 @@ validateGuards( func_type_map[j] = type_idx; } } + else if ( + section_type == 5 && + (rulesVersion & + hook_api::GuardRuleFeatureHooksMemoryFillCopy)) // memory section + { + int memory_count = parseLeb128(wasm, i, &i); + CHECK_SHORT_HOOK(); + if (memory_count <= 0) + { + GUARDLOG(hook::log::MEMORY_MISSING) + << "Malformed transaction. " + << "Hook did not establish any memory section." + << "\n"; + return {}; + } + + // check the initial number of pages for each memory + for (int j = 0; j < memory_count; ++j) + { + // read the limits flag (0x00 = no max, 0x01 = has max) + if (i >= wasm.size()) + { + GUARDLOG(hook::log::SHORT_HOOK) + << "Malformed transaction. " + << "Hook memory section ended abruptly." + << "\n"; + return {}; + } + uint8_t limits = wasm[i++]; + + // read the minimum number of pages + int min_pages = parseLeb128(wasm, i, &i); + CHECK_SHORT_HOOK(); + + // limit the initial number of pages to 2 or less + if (min_pages > 2) + { + GUARDLOG(hook::log::WASM_VALIDATION) + << "Malformed transaction. " + << "Hook memory initial pages (" << min_pages + << ") exceeds maximum allowed (2)." + << "\n"; + return {}; + } + + // if the maximum number of pages is specified, reject it + if (limits == 0x01) + { + int max_pages = parseLeb128(wasm, i, &i); + CHECK_SHORT_HOOK(); + GUARDLOG(hook::log::MEMORY_MAX_PAGES) + << "Malformed transaction. " + << "Hook memory maximum pages (" << max_pages + << ") is not allowed." + << "\n"; + return {}; + } + } + } i = next_section; continue; diff --git a/src/ripple/app/hook/applyHook.h b/src/ripple/app/hook/applyHook.h index da088c5506..3fa02cbe63 100644 --- a/src/ripple/app/hook/applyHook.h +++ b/src/ripple/app/hook/applyHook.h @@ -313,8 +313,6 @@ class HookExecutor if (!conf) return; WasmEdge_ConfigureStatisticsSetInstructionCounting(conf, true); - // TODO: TEQU - WasmEdge_ConfigureSetMaxMemoryPage(conf, 2); // 2 * 64KiB = 128KiB ctx = WasmEdge_VMCreate(conf, NULL); } diff --git a/src/test/app/SetHook_test.cpp b/src/test/app/SetHook_test.cpp index 30b4adf14a..6818aef836 100644 --- a/src/test/app/SetHook_test.cpp +++ b/src/test/app/SetHook_test.cpp @@ -1535,10 +1535,6 @@ class SetHook0_test : public beast::unit_test::suite (import "env" "accept" (func (;1;) (type 1))) (func (;2;) (type 2) (param i32) (result i64) (local i64) - global.get 1 - i32.const 42 - i32.const 130047 - memory.fill i32.const 1 i32.const 1 call 0 @@ -1558,22 +1554,28 @@ class SetHook0_test : public beast::unit_test::suite (export "hook" (func 2))) )[test.hook]"]; - Env env{*this, features | featureHooksMemoryFillCopy}; - env.fund(XRP(10000), alice, bob); - env.close(); + for (bool withFillCopy : {true, false}) + { + auto f = features; + if (!withFillCopy) + f = f - featureHooksMemoryFillCopy; - env(ripple::test::jtx::hook(alice, {{hso(hook)}}, 0), - HSFEE, - ter(tesSUCCESS)); - env.close(); + Env env{*this, f}; + env.fund(XRP(10000), alice, bob); + env.close(); - // TODO: TEQU error handling + env(ripple::test::jtx::hook(alice, {{hso(hook)}}, 0), + HSFEE, + M("hookFill - page out of bounds"), + withFillCopy ? ter(temMALFORMED) : ter(tesSUCCESS)); + env.close(); - env(pay(bob, alice, XRP(1)), - fee(XRP(1)), - M("hookFill - page out of bounds"), - ter(tecHOOK_REJECTED)); - env.close(); + if (!withFillCopy) + { + env(pay(bob, alice, XRP(1)), fee(XRP(1)), ter(tesSUCCESS)); + env.close(); + } + } } } diff --git a/src/test/app/SetHook_wasm.h b/src/test/app/SetHook_wasm.h index da1a4499a2..ec106c9793 100644 --- a/src/test/app/SetHook_wasm.h +++ b/src/test/app/SetHook_wasm.h @@ -400,10 +400,6 @@ std::map> wasm = { (import "env" "accept" (func (;1;) (type 1))) (func (;2;) (type 2) (param i32) (result i64) (local i64) - global.get 1 - i32.const 42 - i32.const 130047 - memory.fill i32.const 1 i32.const 1 call 0 @@ -433,11 +429,10 @@ std::map> wasm = { 0x88U, 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x88U, 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x07U, 0x08U, - 0x01U, 0x04U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x02U, 0x0AU, 0x23U, - 0x01U, 0x21U, 0x01U, 0x01U, 0x7EU, 0x23U, 0x01U, 0x41U, 0x2AU, 0x41U, - 0xFFU, 0xF7U, 0x07U, 0xFCU, 0x0BU, 0x00U, 0x41U, 0x01U, 0x41U, 0x01U, - 0x10U, 0x00U, 0x1AU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, 0x10U, - 0x01U, 0x1AU, 0x20U, 0x01U, 0x0BU, + 0x01U, 0x04U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x02U, 0x0AU, 0x18U, + 0x01U, 0x16U, 0x01U, 0x01U, 0x7EU, 0x41U, 0x01U, 0x41U, 0x01U, 0x10U, + 0x00U, 0x1AU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, 0x10U, 0x01U, + 0x1AU, 0x20U, 0x01U, 0x0BU, }}, /* ==== WASM: 6 ==== */