From aa6101409d51395ae5fbd2e25bc352489854207a Mon Sep 17 00:00:00 2001 From: tequ Date: Tue, 14 Apr 2026 11:17:48 +0900 Subject: [PATCH] Add Cost mechanism for Hook APIs (set 0 now) --- include/xrpl/hook/Enum.h | 13 ++++-- include/xrpl/hook/hook_api.macro | 75 ++++++++++++++++++++++++++++++++ src/test/app/SetHook_test.cpp | 2 +- src/xrpld/app/hook/applyHook.h | 38 +++++++++++++--- 4 files changed, 118 insertions(+), 10 deletions(-) diff --git a/include/xrpl/hook/Enum.h b/include/xrpl/hook/Enum.h index ba8dd7d71..76b7c4524 100644 --- a/include/xrpl/hook/Enum.h +++ b/include/xrpl/hook/Enum.h @@ -416,7 +416,9 @@ getImportWhitelist(Rules const& rules) APIWhitelist whitelist; #pragma push_macro("HOOK_API_DEFINITION") +#pragma push_macro("HOOK_API_COST") #undef HOOK_API_DEFINITION +#undef HOOK_API_COST #define int64_t 0x7EU #define int32_t 0x7FU @@ -424,20 +426,23 @@ getImportWhitelist(Rules const& rules) #define HOOK_WRAP_PARAMS(...) __VA_ARGS__ -#define HOOK_API_DEFINITION( \ - RETURN_TYPE, FUNCTION_NAME, PARAMS_TUPLE, AMENDMENT) \ - if (AMENDMENT == uint256{} || rules.enabled(AMENDMENT)) \ - whitelist[#FUNCTION_NAME] = { \ +#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}; +#define HOOK_API_COST(FUNCTION_NAME, cost, amendment) #include "hook_api.macro" #undef HOOK_API_DEFINITION +#undef HOOK_API_COST #undef HOOK_WRAP_PARAMS #undef int64_t #undef int32_t #undef uint32_t #pragma pop_macro("HOOK_API_DEFINITION") +#pragma pop_macro("HOOK_API_COST") return whitelist; } diff --git a/include/xrpl/hook/hook_api.macro b/include/xrpl/hook/hook_api.macro index 9f92cf844..e5c7f375e 100644 --- a/include/xrpl/hook/hook_api.macro +++ b/include/xrpl/hook/hook_api.macro @@ -2,373 +2,448 @@ HOOK_API_DEFINITION( int32_t, _g, (uint32_t, uint32_t), uint256{}) +HOOK_API_COST(_g, 0, 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{}) +HOOK_API_COST(accept, 0, 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{}) +HOOK_API_COST(rollback, 0, 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{}) +HOOK_API_COST(util_raddr, 0, 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{}) +HOOK_API_COST(util_accid, 0, 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{}) +HOOK_API_COST(util_verify, 0, 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{}) +HOOK_API_COST(util_sha512h, 0, 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{}) +HOOK_API_COST(util_keylet, 0, 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{}) +HOOK_API_COST(sto_validate, 0, 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{}) +HOOK_API_COST(sto_subfield, 0, 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{}) +HOOK_API_COST(sto_subarray, 0, 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{}) +HOOK_API_COST(sto_emplace, 0, 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{}) +HOOK_API_COST(sto_erase, 0, uint256{}) // int64_t etxn_burden(); HOOK_API_DEFINITION( int64_t, etxn_burden, (), uint256{}) +HOOK_API_COST(etxn_burden, 0, 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{}) +HOOK_API_COST(etxn_details, 0, 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{}) +HOOK_API_COST(etxn_fee_base, 0, uint256{}) // int64_t etxn_reserve(uint32_t count); HOOK_API_DEFINITION( int64_t, etxn_reserve, (uint32_t), uint256{}) +HOOK_API_COST(etxn_reserve, 0, uint256{}) // int64_t etxn_generation(); HOOK_API_DEFINITION( int64_t, etxn_generation, (), uint256{}) +HOOK_API_COST(etxn_generation, 0, 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{}) +HOOK_API_COST(etxn_nonce, 0, 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{}) +HOOK_API_COST(emit, 0, uint256{}) // int64_t float_set(int32_t exponent, int64_t mantissa); HOOK_API_DEFINITION( int64_t, float_set, (int32_t, int64_t), uint256{}) +HOOK_API_COST(float_set, 0, uint256{}) // int64_t float_multiply(int64_t float1, int64_t float2); HOOK_API_DEFINITION( int64_t, float_multiply, (int64_t, int64_t), uint256{}) +HOOK_API_COST(float_multiply, 0, 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{}) +HOOK_API_COST(float_mulratio, 0, uint256{}) // int64_t float_negate(int64_t float1); HOOK_API_DEFINITION( int64_t, float_negate, (int64_t), uint256{}) +HOOK_API_COST(float_negate, 0, 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{}) +HOOK_API_COST(float_compare, 0, uint256{}) // int64_t float_sum(int64_t float1, int64_t float2); HOOK_API_DEFINITION( int64_t, float_sum, (int64_t, int64_t), uint256{}) +HOOK_API_COST(float_sum, 0, 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{}) +HOOK_API_COST(float_sto, 0, 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{}) +HOOK_API_COST(float_sto_set, 0, uint256{}) // int64_t float_invert(int64_t float1); HOOK_API_DEFINITION( int64_t, float_invert, (int64_t), uint256{}) +HOOK_API_COST(float_invert, 0, uint256{}) // int64_t float_divide(int64_t float1, int64_t float2); HOOK_API_DEFINITION( int64_t, float_divide, (int64_t, int64_t), uint256{}) +HOOK_API_COST(float_divide, 0, uint256{}) // int64_t float_one(); HOOK_API_DEFINITION( int64_t, float_one, (), uint256{}) +HOOK_API_COST(float_one, 0, uint256{}) // int64_t float_mantissa(int64_t float1); HOOK_API_DEFINITION( int64_t, float_mantissa, (int64_t), uint256{}) +HOOK_API_COST(float_mantissa, 0, uint256{}) // int64_t float_sign(int64_t float1); HOOK_API_DEFINITION( int64_t, float_sign, (int64_t), uint256{}) +HOOK_API_COST(float_sign, 0, 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{}) +HOOK_API_COST(float_int, 0, uint256{}) // int64_t float_log(int64_t float1); HOOK_API_DEFINITION( int64_t, float_log, (int64_t), uint256{}) +HOOK_API_COST(float_log, 0, uint256{}) // int64_t float_root(int64_t float1, uint32_t n); HOOK_API_DEFINITION( int64_t, float_root, (int64_t, uint32_t), uint256{}) +HOOK_API_COST(float_root, 0, uint256{}) // int64_t fee_base(); HOOK_API_DEFINITION( int64_t, fee_base, (), uint256{}) +HOOK_API_COST(fee_base, 0, uint256{}) // int64_t ledger_seq(); HOOK_API_DEFINITION( int64_t, ledger_seq, (), uint256{}) +HOOK_API_COST(ledger_seq, 0, uint256{}) // int64_t ledger_last_time(); HOOK_API_DEFINITION( int64_t, ledger_last_time, (), uint256{}) +HOOK_API_COST(ledger_last_time, 0, 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{}) +HOOK_API_COST(ledger_last_hash, 0, 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{}) +HOOK_API_COST(ledger_nonce, 0, 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{}) +HOOK_API_COST(ledger_keylet, 0, 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{}) +HOOK_API_COST(hook_account, 0, 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{}) +HOOK_API_COST(hook_hash, 0, 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{}) +HOOK_API_COST(hook_param_set, 0, 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{}) +HOOK_API_COST(hook_param, 0, uint256{}) // int64_t hook_again(); HOOK_API_DEFINITION( int64_t, hook_again, (), uint256{}) +HOOK_API_COST(hook_again, 0, 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{}) +HOOK_API_COST(hook_skip, 0, uint256{}) // int64_t hook_pos(); HOOK_API_DEFINITION( int64_t, hook_pos, (), uint256{}) +HOOK_API_COST(hook_pos, 0, 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{}) +HOOK_API_COST(slot, 0, uint256{}) // int64_t slot_clear(uint32_t slot); HOOK_API_DEFINITION( int64_t, slot_clear, (uint32_t), uint256{}) +HOOK_API_COST(slot_clear, 0, uint256{}) // int64_t slot_count(uint32_t slot); HOOK_API_DEFINITION( int64_t, slot_count, (uint32_t), uint256{}) +HOOK_API_COST(slot_count, 0, 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{}) +HOOK_API_COST(slot_set, 0, uint256{}) // int64_t slot_size(uint32_t slot); HOOK_API_DEFINITION( int64_t, slot_size, (uint32_t), uint256{}) +HOOK_API_COST(slot_size, 0, 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{}) +HOOK_API_COST(slot_subarray, 0, 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{}) +HOOK_API_COST(slot_subfield, 0, uint256{}) // int64_t slot_type(uint32_t slot_no, uint32_t flags); HOOK_API_DEFINITION( int64_t, slot_type, (uint32_t, uint32_t), uint256{}) +HOOK_API_COST(slot_type, 0, uint256{}) // int64_t slot_float(uint32_t slot_no); HOOK_API_DEFINITION( int64_t, slot_float, (uint32_t), uint256{}) +HOOK_API_COST(slot_float, 0, 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{}) +HOOK_API_COST(state_set, 0, 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{}) +HOOK_API_COST(state_foreign_set, 0, 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{}) +HOOK_API_COST(state, 0, 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{}) +HOOK_API_COST(state_foreign, 0, 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{}) +HOOK_API_COST(trace, 0, 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{}) +HOOK_API_COST(trace_num, 0, 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{}) +HOOK_API_COST(trace_float, 0, uint256{}) // int64_t otxn_burden(); HOOK_API_DEFINITION( int64_t, otxn_burden, (), uint256{}) +HOOK_API_COST(otxn_burden, 0, 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{}) +HOOK_API_COST(otxn_field, 0, uint256{}) // int64_t otxn_generation(); HOOK_API_DEFINITION( int64_t, otxn_generation, (), uint256{}) +HOOK_API_COST(otxn_generation, 0, 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{}) +HOOK_API_COST(otxn_id, 0, uint256{}) // int64_t otxn_type(); HOOK_API_DEFINITION( int64_t, otxn_type, (), uint256{}) +HOOK_API_COST(otxn_type, 0, uint256{}) // int64_t otxn_slot(uint32_t slot_no); HOOK_API_DEFINITION( int64_t, otxn_slot, (uint32_t), uint256{}) +HOOK_API_COST(otxn_slot, 0, 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{}) +HOOK_API_COST(otxn_param, 0, uint256{}) // int64_t meta_slot(uint32_t slot_no); HOOK_API_DEFINITION( int64_t, meta_slot, (uint32_t), uint256{}) +HOOK_API_COST(meta_slot, 0, 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) +HOOK_API_COST(xpop_slot, 0, uint256{}) // int64_t prepare(uint32_t write_ptr, uint32_t write_len, uint32_t read_ptr, uint32_t read_len); HOOK_API_DEFINITION( int64_t, prepare, (uint32_t, uint32_t, uint32_t, uint32_t), featureHooksUpdate2) +HOOK_API_COST(prepare, 0, uint256{}) diff --git a/src/test/app/SetHook_test.cpp b/src/test/app/SetHook_test.cpp index 315003f75..207652bc0 100644 --- a/src/test/app/SetHook_test.cpp +++ b/src/test/app/SetHook_test.cpp @@ -15929,7 +15929,7 @@ public: env.close(); env(invoke::invoke(alice), - hookgas(1000), + hookgas(10000), M("test gas type hook cbak gas invocation"), fee(XRP(1))); diff --git a/src/xrpld/app/hook/applyHook.h b/src/xrpld/app/hook/applyHook.h index ccd0ac04f..30c0f7ca9 100644 --- a/src/xrpld/app/hook/applyHook.h +++ b/src/xrpld/app/hook/applyHook.h @@ -63,18 +63,23 @@ namespace hook_api { fprintf #pragma push_macro("HOOK_API_DEFINITION") +#pragma push_macro("HOOK_API_COST") #undef HOOK_API_DEFINITION +#undef HOOK_API_COST #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); +#define HOOK_API_COST(FUNCTION_NAME, cost, amendment) #include #undef HOOK_API_DEFINITION +#undef HOOK_API_COST #undef HOOK_WRAP_PARAMS #pragma pop_macro("HOOK_API_DEFINITION") +#pragma pop_macro("HOOK_API_COST") } /* end namespace hook_api */ @@ -275,14 +280,14 @@ gatherHookParameters( beast::Journal const& j_); // RH TODO: call destruct for these on rippled shutdown -#define ADD_HOOK_FUNCTION(F, ctx) \ +#define ADD_HOOK_FUNCTION(F, ctx, cost) \ { \ WasmEdge_FunctionInstanceContext* hf = \ WasmEdge_FunctionInstanceCreate( \ hook_api::WasmFunctionType##F, \ hook_api::WasmFunction##F, \ (void*)(&ctx), \ - 0); \ + cost); \ WasmEdge_ModuleInstanceAddFunction( \ importObj, hook_api::WasmFunctionName##F, hf); \ } @@ -510,17 +515,40 @@ public: WasmEdge_LogSetDebugLevel(); #pragma push_macro("HOOK_API_DEFINITION") +#pragma push_macro("HOOK_API_COST") + + // Access rules for amendment-based cost switching + auto const& rules_ = ctx.applyCtx.view().rules(); + + // Phase 1: Declare per-function cost variables, initialized to 0 #undef HOOK_API_DEFINITION - +#undef HOOK_API_COST #define HOOK_WRAP_PARAMS(...) __VA_ARGS__ -#define HOOK_API_DEFINITION(RETURN_TYPE, FUNCTION_NAME, PARAMS_TUPLE, ...) \ - ADD_HOOK_FUNCTION(FUNCTION_NAME, ctx); +#define HOOK_API_DEFINITION(RT, FN, ...) uint64_t cost_##FN = 0; +#define HOOK_API_COST(...) +#include + // Phase 2: Set costs; amendment-gated entries override base costs +#undef HOOK_API_DEFINITION +#undef HOOK_API_COST +#define HOOK_API_DEFINITION(...) +#define HOOK_API_COST(FN, cost, AM) \ + if ((AM) == uint256{} || rules_.enabled(AM)) \ + cost_##FN = (cost); +#include + + // Phase 3: Register functions with WasmEdge using computed costs +#undef HOOK_API_DEFINITION +#undef HOOK_API_COST +#define HOOK_API_DEFINITION(RT, FN, ...) ADD_HOOK_FUNCTION(FN, ctx, cost_##FN); +#define HOOK_API_COST(...) #include #undef HOOK_API_DEFINITION +#undef HOOK_API_COST #undef HOOK_WRAP_PARAMS #pragma pop_macro("HOOK_API_DEFINITION") +#pragma pop_macro("HOOK_API_COST") WasmEdge_TableInstanceContext* hostTable = WasmEdge_TableInstanceCreate(tableType);