add ledger_keylet hookapi

This commit is contained in:
Richard Holland
2022-06-02 08:35:16 +00:00
parent 848097ffac
commit c87fa5210b
4 changed files with 59 additions and 2 deletions

View File

@@ -215,7 +215,8 @@ namespace hook_api
TOO_MANY_PARAMS = -36,
INVALID_TXN = -37,
RESERVE_INSUFFICIENT = -38, // setting a new state object would exceed account reserve
COMPLEX_NOT_SUPPORTED = -39
COMPLEX_NOT_SUPPORTED = -39,
DOES_NOT_MATCH = -40, // two keylets were required to be the same type but werent
};
@@ -244,6 +245,7 @@ namespace hook_api
"etxn_fee_base",
"etxn_generation",
"etxn_reserve",
"etxn_nonce",
"float_compare",
"float_divide",
"float_exponent",
@@ -271,8 +273,8 @@ namespace hook_api
"ledger_seq",
"ledger_last_hash",
"ledger_last_time",
"etxn_nonce",
"ledger_nonce",
"ledger_keylet",
"otxn_burden",
"otxn_field",
"otxn_slot",

View File

@@ -162,6 +162,9 @@ namespace hook_api
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_param_set, uint32_t read_ptr, uint32_t read_len,
uint32_t kread_ptr, uint32_t kread_len,
@@ -583,6 +586,7 @@ namespace hook
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);

View File

@@ -2938,6 +2938,48 @@ DEFINE_HOOK_FUNCTION(
return 32;
}
DEFINE_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 )
{
HOOK_SETUP();
if (NOT_IN_BOUNDS(write_ptr, write_len, memory_length) ||
NOT_IN_BOUNDS(lread_ptr, lread_len, memory_length) ||
NOT_IN_BOUNDS(hread_ptr, hread_len, memory_length))
return OUT_OF_BOUNDS;
if (lread_len < 34U || hread_len < 34U || write_len < 34U)
return TOO_SMALL;
if (lread_len > 34U || hread_len > 34U || write_len > 34U)
return TOO_BIG;
std::optional<ripple::Keylet> klLo = unserialize_keylet(memory + lread_ptr, lread_len);
if (!klLo)
return INVALID_ARGUMENT;
std::optional<ripple::Keylet> klHi = unserialize_keylet(memory + hread_ptr, hread_len);
if (!klHi)
return INVALID_ARGUMENT;
// keylets must be the same type!
if ((*klLo).type != (*klHi).type)
return DOES_NOT_MATCH;
std::optional<ripple::uint256> found =
view.succ((*klLo).key, (*klHi).key.next());
if (!found)
return DOESNT_EXIST;
Keylet kl_out{(*klLo).type, *found};
return serialize_keylet(kl_out, memory, write_ptr, write_len);
}
// Reserve one or more transactions for emission from the running hook
DEFINE_HOOK_FUNCTION(
int64_t,

View File

@@ -602,6 +602,15 @@ SetHook::preflight(PreflightContext const& ctx)
return temMALFORMED;
}
if (hookSetObj->isFieldPresent(sfCreateCode) &&
hookSetObj->getFieldVL(sfCreateCode).size() > hook::maxHookWasmSize())
{
JLOG(ctx.j.trace())
<< "HookSet(" << hook::log::WASM_TOO_BIG << ")[" << HS_ACC()
<< "]: Malformed transaction: SetHook operation would create blob larger than max";
return temMALFORMED;
}
if (hookSetObj->getCount() == 0) // skip blanks
continue;