mirror of
https://github.com/Xahau/xahaud.git
synced 2026-02-15 11:22:24 +00:00
Compare commits
5 Commits
hook-helpe
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d209272379 | ||
|
|
fb7a0d71de | ||
|
|
9120fffd95 | ||
|
|
12e1afb694 | ||
|
|
c355ad9971 |
15
.github/actions/xahau-ga-dependencies/action.yml
vendored
15
.github/actions/xahau-ga-dependencies/action.yml
vendored
@@ -134,10 +134,17 @@ runs:
|
|||||||
- name: Export custom recipes
|
- name: Export custom recipes
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
conan export external/snappy --version 1.1.10 --user xahaud --channel stable
|
# Export snappy if not already exported
|
||||||
conan export external/soci --version 4.0.3 --user xahaud --channel stable
|
conan list snappy/1.1.10@xahaud/stable 2>/dev/null | (grep -q "not found" && exit 1 || exit 0) || \
|
||||||
conan export external/wasmedge --version 0.11.2 --user xahaud --channel stable
|
conan export external/snappy --version 1.1.10 --user xahaud --channel stable
|
||||||
|
|
||||||
|
# Export soci if not already exported
|
||||||
|
conan list soci/4.0.3@xahaud/stable 2>/dev/null | (grep -q "not found" && exit 1 || exit 0) || \
|
||||||
|
conan export external/soci --version 4.0.3 --user xahaud --channel stable
|
||||||
|
|
||||||
|
# Export wasmedge if not already exported
|
||||||
|
conan list wasmedge/0.11.2@xahaud/stable 2>/dev/null | (grep -q "not found" && exit 1 || exit 0) || \
|
||||||
|
conan export external/wasmedge --version 0.11.2 --user xahaud --channel stable
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
env:
|
env:
|
||||||
|
|||||||
13
.github/workflows/verify-generated-headers.yml
vendored
13
.github/workflows/verify-generated-headers.yml
vendored
@@ -18,12 +18,23 @@ jobs:
|
|||||||
generator: bash ./hook/generate_sfcodes.sh
|
generator: bash ./hook/generate_sfcodes.sh
|
||||||
- target: hook/tts.h
|
- target: hook/tts.h
|
||||||
generator: ./hook/generate_tts.sh
|
generator: ./hook/generate_tts.sh
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
|
env:
|
||||||
|
CLANG_VERSION: 10
|
||||||
name: ${{ matrix.target }}
|
name: ${{ matrix.target }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
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 }}
|
- name: Verify ${{ matrix.target }}
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|||||||
12
.github/workflows/xahau-ga-macos.yml
vendored
12
.github/workflows/xahau-ga-macos.yml
vendored
@@ -43,14 +43,22 @@ jobs:
|
|||||||
# To isolate environments for each Runner, instead of installing globally with brew,
|
# To isolate environments for each Runner, instead of installing globally with brew,
|
||||||
# use mise to isolate environments for each Runner directory.
|
# use mise to isolate environments for each Runner directory.
|
||||||
- name: Setup toolchain (mise)
|
- name: Setup toolchain (mise)
|
||||||
uses: jdx/mise-action@v2
|
uses: jdx/mise-action@v3.6.1
|
||||||
with:
|
with:
|
||||||
|
cache: false
|
||||||
install: true
|
install: true
|
||||||
|
mise_toml: |
|
||||||
|
[tools]
|
||||||
|
cmake = "3.23.1"
|
||||||
|
python = "3.12"
|
||||||
|
pipx = "latest"
|
||||||
|
conan = "2"
|
||||||
|
ninja = "latest"
|
||||||
|
ccache = "latest"
|
||||||
|
|
||||||
- name: Install tools via mise
|
- name: Install tools via mise
|
||||||
run: |
|
run: |
|
||||||
mise install
|
mise install
|
||||||
mise use cmake@3.23.1 python@3.12 pipx@latest conan@2 ninja@latest ccache@latest
|
|
||||||
mise reshim
|
mise reshim
|
||||||
echo "$HOME/.local/share/mise/shims" >> "$GITHUB_PATH"
|
echo "$HOME/.local/share/mise/shims" >> "$GITHUB_PATH"
|
||||||
|
|
||||||
|
|||||||
@@ -488,6 +488,7 @@ target_sources (rippled PRIVATE
|
|||||||
src/ripple/app/tx/impl/apply.cpp
|
src/ripple/app/tx/impl/apply.cpp
|
||||||
src/ripple/app/tx/impl/applySteps.cpp
|
src/ripple/app/tx/impl/applySteps.cpp
|
||||||
src/ripple/app/hook/impl/applyHook.cpp
|
src/ripple/app/hook/impl/applyHook.cpp
|
||||||
|
src/ripple/app/hook/impl/HookAPI.cpp
|
||||||
src/ripple/app/tx/impl/details/NFTokenUtils.cpp
|
src/ripple/app/tx/impl/details/NFTokenUtils.cpp
|
||||||
#[===============================[
|
#[===============================[
|
||||||
main sources:
|
main sources:
|
||||||
@@ -749,6 +750,7 @@ if (tests)
|
|||||||
src/test/app/Freeze_test.cpp
|
src/test/app/Freeze_test.cpp
|
||||||
src/test/app/GenesisMint_test.cpp
|
src/test/app/GenesisMint_test.cpp
|
||||||
src/test/app/HashRouter_test.cpp
|
src/test/app/HashRouter_test.cpp
|
||||||
|
src/test/app/HookAPI_test.cpp
|
||||||
src/test/app/Import_test.cpp
|
src/test/app/Import_test.cpp
|
||||||
src/test/app/Invoke_test.cpp
|
src/test/app/Invoke_test.cpp
|
||||||
src/test/app/LedgerHistory_test.cpp
|
src/test/app/LedgerHistory_test.cpp
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ sto_erase(
|
|||||||
uint32_t field_id);
|
uint32_t field_id);
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
etxn_burden(void);
|
etxn_burden();
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
etxn_details(uint32_t write_ptr, uint32_t write_len);
|
etxn_details(uint32_t write_ptr, uint32_t write_len);
|
||||||
@@ -94,7 +94,7 @@ extern int64_t
|
|||||||
etxn_reserve(uint32_t count);
|
etxn_reserve(uint32_t count);
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
etxn_generation(void);
|
etxn_generation();
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
etxn_nonce(uint32_t write_ptr, uint32_t write_len);
|
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);
|
float_divide(int64_t float1, int64_t float2);
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
float_one(void);
|
float_one();
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
float_mantissa(int64_t float1);
|
float_mantissa(int64_t float1);
|
||||||
@@ -167,13 +167,13 @@ extern int64_t
|
|||||||
float_root(int64_t float1, uint32_t n);
|
float_root(int64_t float1, uint32_t n);
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
fee_base(void);
|
fee_base();
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
ledger_seq(void);
|
ledger_seq();
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
ledger_last_time(void);
|
ledger_last_time();
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
ledger_last_hash(uint32_t write_ptr, uint32_t write_len);
|
ledger_last_hash(uint32_t write_ptr, uint32_t write_len);
|
||||||
@@ -213,13 +213,13 @@ hook_param(
|
|||||||
uint32_t read_len);
|
uint32_t read_len);
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
hook_again(void);
|
hook_again();
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
hook_skip(uint32_t read_ptr, uint32_t read_len, uint32_t flags);
|
hook_skip(uint32_t read_ptr, uint32_t read_len, uint32_t flags);
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
hook_pos(void);
|
hook_pos();
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
slot(uint32_t write_ptr, uint32_t write_len, uint32_t slot);
|
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);
|
trace_float(uint32_t read_ptr, uint32_t read_len, int64_t float1);
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
otxn_burden(void);
|
otxn_burden();
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
otxn_field(uint32_t write_ptr, uint32_t write_len, uint32_t field_id);
|
otxn_field(uint32_t write_ptr, uint32_t write_len, uint32_t field_id);
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
otxn_generation(void);
|
otxn_generation();
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
otxn_id(uint32_t write_ptr, uint32_t write_len, uint32_t flags);
|
otxn_id(uint32_t write_ptr, uint32_t write_len, uint32_t flags);
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
otxn_type(void);
|
otxn_type();
|
||||||
|
|
||||||
extern int64_t
|
extern int64_t
|
||||||
otxn_slot(uint32_t slot_no);
|
otxn_slot(uint32_t slot_no);
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ set -eu
|
|||||||
SCRIPT_DIR=$(dirname "$0")
|
SCRIPT_DIR=$(dirname "$0")
|
||||||
SCRIPT_DIR=$(cd "$SCRIPT_DIR" && pwd)
|
SCRIPT_DIR=$(cd "$SCRIPT_DIR" && pwd)
|
||||||
|
|
||||||
APPLY_HOOK="$SCRIPT_DIR/../src/ripple/app/hook/applyHook.h"
|
APPLY_HOOK="$SCRIPT_DIR/../src/ripple/app/hook/hook_api.macro"
|
||||||
|
|
||||||
{
|
{
|
||||||
echo '// For documentation please see: https://xrpl-hooks.readme.io/reference/'
|
echo '// For documentation please see: https://xrpl-hooks.readme.io/reference/'
|
||||||
@@ -19,127 +19,36 @@ APPLY_HOOK="$SCRIPT_DIR/../src/ripple/app/hook/applyHook.h"
|
|||||||
return s;
|
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;
|
line = $0;
|
||||||
if (in_block) {
|
|
||||||
if (line ~ /\*\//) {
|
# Skip block comments
|
||||||
sub(/.*\*\//, "", line);
|
if (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;
|
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
if (!in_macro && line ~ /^DECLARE_HOOK_FUNCNARG\(/) {
|
|
||||||
buffer = line;
|
# Look for comment lines that start with // and contain function signature
|
||||||
kind = "narg";
|
if (line ~ /^[[:space:]]*\/\/[[:space:]]*[a-zA-Z_][a-zA-Z0-9_]*[[:space:]]+[a-zA-Z_][a-zA-Z0-9_]*[[:space:]]*\(/) {
|
||||||
if (line ~ /\);[[:space:]]*$/) {
|
# Remove leading // and trim
|
||||||
sub(/\);[[:space:]]*$/, "", buffer);
|
sub(/^[[:space:]]*\/\/[[:space:]]*/, "", line);
|
||||||
process(buffer, kind);
|
line = trim(line);
|
||||||
|
|
||||||
|
# Check if function name is "_g" to add attribute
|
||||||
|
if (line ~ /[[:space:]]+_g[[:space:]]*\(/) {
|
||||||
|
# Insert __attribute__((noduplicate)) before _g
|
||||||
|
sub(/[[:space:]]+_g/, " __attribute__((noduplicate)) _g", line);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
in_macro = 1;
|
# printf("\n");
|
||||||
next;
|
|
||||||
|
printf("extern %s\n\n", line);
|
||||||
}
|
}
|
||||||
if (in_macro) {
|
|
||||||
buffer = buffer " " line;
|
|
||||||
if (line ~ /\);[[:space:]]*$/) {
|
|
||||||
sub(/\);[[:space:]]*$/, "", buffer);
|
|
||||||
process(buffer, kind);
|
|
||||||
in_macro = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
END {
|
|
||||||
printf("\n");
|
|
||||||
}
|
}
|
||||||
' "$APPLY_HOOK"
|
' "$APPLY_HOOK"
|
||||||
|
|
||||||
echo '#define HOOK_EXTERN'
|
echo '#define HOOK_EXTERN'
|
||||||
echo '#endif // HOOK_EXTERN'
|
echo '#endif // HOOK_EXTERN'
|
||||||
}
|
} | (
|
||||||
|
cd "$SCRIPT_DIR/.."
|
||||||
|
clang-format --style=file -
|
||||||
|
)
|
||||||
|
|||||||
@@ -5,6 +5,28 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#ifndef HOOKENUM_INCLUDED
|
#ifndef HOOKENUM_INCLUDED
|
||||||
#define HOOKENUM_INCLUDED 1
|
#define HOOKENUM_INCLUDED 1
|
||||||
|
|
||||||
|
#ifndef GUARD_CHECKER_BUILD
|
||||||
|
#include <ripple/basics/base_uint.h>
|
||||||
|
#include <ripple/protocol/Feature.h>
|
||||||
|
#include <ripple/protocol/Rules.h>
|
||||||
|
#else
|
||||||
|
// Override uint256, Feature and Rules for guard checker build
|
||||||
|
#define uint256 std::string
|
||||||
|
#define featureHooksUpdate1 "1"
|
||||||
|
#define fix20250131 "1"
|
||||||
|
namespace hook_api {
|
||||||
|
struct Rules
|
||||||
|
{
|
||||||
|
constexpr bool
|
||||||
|
enabled(const uint256& feature) const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace hook_api
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
enum HookSetOperation : int8_t {
|
enum HookSetOperation : int8_t {
|
||||||
hsoINVALID = -1,
|
hsoINVALID = -1,
|
||||||
@@ -367,110 +389,59 @@ const uint8_t max_emit = 255;
|
|||||||
const uint8_t max_params = 16;
|
const uint8_t max_params = 16;
|
||||||
const double fee_base_multiplier = 1.1f;
|
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) \
|
|
||||||
{ \
|
|
||||||
#FUNCTION_NAME, \
|
|
||||||
{ \
|
|
||||||
RETURN_TYPE, HOOK_WRAP_PARAMS PARAMS_TUPLE \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
using APIWhitelist = std::map<std::string, std::vector<uint8_t>>;
|
using APIWhitelist = std::map<std::string, std::vector<uint8_t>>;
|
||||||
|
|
||||||
// RH NOTE: Find descriptions of api functions in ./impl/applyHook.cpp and
|
// 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
|
// 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
|
// code (vec[0] and its parameters vec[>0]) as wasm type codes
|
||||||
static const APIWhitelist import_whitelist{
|
inline APIWhitelist
|
||||||
// clang-format off
|
getImportWhitelist(Rules const& rules)
|
||||||
HOOK_API_DEFINITION(I32, _g, (I32, I32)),
|
{
|
||||||
HOOK_API_DEFINITION(I64, accept, (I32, I32, I64)),
|
APIWhitelist whitelist;
|
||||||
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
|
#pragma push_macro("HOOK_API_DEFINITION")
|
||||||
static const APIWhitelist import_whitelist_1{
|
#undef HOOK_API_DEFINITION
|
||||||
// clang-format off
|
|
||||||
HOOK_API_DEFINITION(I64, xpop_slot, (I32, I32)),
|
#define int64_t 0x7EU
|
||||||
// clang-format on
|
#define int32_t 0x7FU
|
||||||
};
|
#define uint32_t 0x7FU
|
||||||
|
|
||||||
|
#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] = { \
|
||||||
|
RETURN_TYPE, HOOK_WRAP_PARAMS PARAMS_TUPLE};
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|
||||||
#undef HOOK_API_DEFINITION
|
#undef HOOK_API_DEFINITION
|
||||||
#undef I32
|
#undef I32
|
||||||
#undef I64
|
#undef I64
|
||||||
|
|
||||||
|
enum GuardRulesVersion : uint64_t {
|
||||||
|
GuardRuleFix20250131 = 0x00000001,
|
||||||
|
};
|
||||||
|
|
||||||
|
inline uint64_t
|
||||||
|
getGuardRulesVersion(Rules const& rules)
|
||||||
|
{
|
||||||
|
uint64_t version = 0;
|
||||||
|
if (rules.enabled(fix20250131))
|
||||||
|
version |= GuardRuleFix20250131;
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
}; // namespace hook_api
|
}; // namespace hook_api
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -634,7 +634,7 @@ check_guard(
|
|||||||
}
|
}
|
||||||
else if (fc_type == 10) // memory.copy
|
else if (fc_type == 10) // memory.copy
|
||||||
{
|
{
|
||||||
if (rulesVersion & 0x02U)
|
if (rulesVersion & hook_api::GuardRuleFix20250131)
|
||||||
GUARD_ERROR("Memory.copy instruction is not allowed.");
|
GUARD_ERROR("Memory.copy instruction is not allowed.");
|
||||||
|
|
||||||
REQUIRE(2);
|
REQUIRE(2);
|
||||||
@@ -642,7 +642,7 @@ check_guard(
|
|||||||
}
|
}
|
||||||
else if (fc_type == 11) // memory.fill
|
else if (fc_type == 11) // memory.fill
|
||||||
{
|
{
|
||||||
if (rulesVersion & 0x02U)
|
if (rulesVersion & hook_api::GuardRuleFix20250131)
|
||||||
GUARD_ERROR("Memory.fill instruction is not allowed.");
|
GUARD_ERROR("Memory.fill instruction is not allowed.");
|
||||||
|
|
||||||
ADVANCE(1);
|
ADVANCE(1);
|
||||||
@@ -826,6 +826,7 @@ validateGuards(
|
|||||||
std::vector<uint8_t> const& wasm,
|
std::vector<uint8_t> const& wasm,
|
||||||
GuardLog guardLog,
|
GuardLog guardLog,
|
||||||
std::string guardLogAccStr,
|
std::string guardLogAccStr,
|
||||||
|
hook_api::APIWhitelist const import_whitelist,
|
||||||
/* RH NOTE:
|
/* RH NOTE:
|
||||||
* rules version is a bit field, so rule update 1 is 0x01, update 2 is 0x02
|
* 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
|
* and update 3 is 0x04 ideally at rule version 3 all bits so far are set
|
||||||
@@ -835,7 +836,7 @@ validateGuards(
|
|||||||
* might have unforeseen consequences, without also rolling back further
|
* might have unforeseen consequences, without also rolling back further
|
||||||
* changes that are fine.
|
* changes that are fine.
|
||||||
*/
|
*/
|
||||||
uint64_t rulesVersion = 0)
|
uint64_t rulesVersion = 0x00)
|
||||||
{
|
{
|
||||||
uint64_t byteCount = wasm.size();
|
uint64_t byteCount = wasm.size();
|
||||||
|
|
||||||
@@ -1020,31 +1021,24 @@ validateGuards(
|
|||||||
int type_idx = parseLeb128(wasm, i, &i);
|
int type_idx = parseLeb128(wasm, i, &i);
|
||||||
CHECK_SHORT_HOOK();
|
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")
|
if (import_name == "_g")
|
||||||
{
|
{
|
||||||
guard_import_number = func_upto;
|
guard_import_number = func_upto;
|
||||||
}
|
}
|
||||||
else if (
|
if (!found_in_whitelist)
|
||||||
hook_api::import_whitelist.find(import_name) ==
|
|
||||||
hook_api::import_whitelist.end())
|
|
||||||
{
|
{
|
||||||
if (rulesVersion > 0 &&
|
GUARDLOG(hook::log::IMPORT_ILLEGAL)
|
||||||
hook_api::import_whitelist_1.find(import_name) !=
|
<< "Malformed transaction. "
|
||||||
hook_api::import_whitelist_1.end())
|
<< "Hook attempted to import a function that does "
|
||||||
{
|
"not "
|
||||||
// PASS, this is a version 1 api
|
<< "appear in the hook_api function set: `"
|
||||||
}
|
<< import_name << "`"
|
||||||
else
|
<< "\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
|
// add to import map
|
||||||
@@ -1259,11 +1253,7 @@ validateGuards(
|
|||||||
for (auto const& [import_idx, api_name] : usage->second)
|
for (auto const& [import_idx, api_name] : usage->second)
|
||||||
{
|
{
|
||||||
auto const& api_signature =
|
auto const& api_signature =
|
||||||
hook_api::import_whitelist.find(api_name) !=
|
import_whitelist.find(api_name)->second;
|
||||||
hook_api::import_whitelist.end()
|
|
||||||
? hook_api::import_whitelist.find(api_name)->second
|
|
||||||
: hook_api::import_whitelist_1.find(api_name)
|
|
||||||
->second;
|
|
||||||
|
|
||||||
if (!first_signature)
|
if (!first_signature)
|
||||||
{
|
{
|
||||||
|
|||||||
346
src/ripple/app/hook/HookAPI.h
Normal file
346
src/ripple/app/hook/HookAPI.h
Normal file
@@ -0,0 +1,346 @@
|
|||||||
|
#ifndef HOOK_API_INCLUDED
|
||||||
|
#define HOOK_API_INCLUDED 1
|
||||||
|
|
||||||
|
#include <ripple/app/hook/Enum.h>
|
||||||
|
#include <ripple/app/misc/Transaction.h>
|
||||||
|
|
||||||
|
namespace hook {
|
||||||
|
using namespace ripple;
|
||||||
|
using HookReturnCode = hook_api::hook_return_code;
|
||||||
|
|
||||||
|
using Bytes = std::vector<std::uint8_t>;
|
||||||
|
|
||||||
|
struct HookContext; // defined in applyHook.h
|
||||||
|
|
||||||
|
class HookAPI
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit HookAPI(HookContext& ctx) : hookCtx(ctx)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// control APIs
|
||||||
|
// _g
|
||||||
|
// accept
|
||||||
|
// rollback
|
||||||
|
|
||||||
|
/// util APIs
|
||||||
|
Expected<std::string, HookReturnCode>
|
||||||
|
util_raddr(Bytes const& accountID) const;
|
||||||
|
|
||||||
|
Expected<Bytes, HookReturnCode>
|
||||||
|
util_accid(std::string raddress) const;
|
||||||
|
|
||||||
|
Expected<bool, HookReturnCode>
|
||||||
|
util_verify(Slice const& data, Slice const& sig, Slice const& key) const;
|
||||||
|
|
||||||
|
uint256
|
||||||
|
util_sha512h(Slice const& data) const;
|
||||||
|
|
||||||
|
// util_keylet()
|
||||||
|
|
||||||
|
/// sto APIs
|
||||||
|
Expected<bool, HookReturnCode>
|
||||||
|
sto_validate(Bytes const& data) const;
|
||||||
|
|
||||||
|
Expected<std::pair<uint32_t, uint32_t>, HookReturnCode>
|
||||||
|
sto_subfield(Bytes const& data, uint32_t field_id) const;
|
||||||
|
|
||||||
|
Expected<std::pair<uint32_t, uint32_t>, HookReturnCode>
|
||||||
|
sto_subarray(Bytes const& data, uint32_t index_id) const;
|
||||||
|
|
||||||
|
Expected<Bytes, HookReturnCode>
|
||||||
|
sto_emplace(
|
||||||
|
Bytes const& source_object,
|
||||||
|
std::optional<Bytes> const& field_object,
|
||||||
|
uint32_t field_id) const;
|
||||||
|
|
||||||
|
// sto_erase(): same as sto_emplace with field_object = nullopt
|
||||||
|
|
||||||
|
/// etxn APIs
|
||||||
|
Expected<std::shared_ptr<Transaction>, HookReturnCode>
|
||||||
|
emit(Slice const& txBlob) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
etxn_burden() const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
etxn_fee_base(Slice const& txBlob) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
etxn_details(uint8_t* out_ptr) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
etxn_reserve(uint64_t count) const;
|
||||||
|
|
||||||
|
uint32_t
|
||||||
|
etxn_generation() const;
|
||||||
|
|
||||||
|
Expected<uint256, HookReturnCode>
|
||||||
|
etxn_nonce() const;
|
||||||
|
|
||||||
|
/// float APIs
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
float_set(int32_t exponent, int64_t mantissa) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
float_multiply(uint64_t float1, uint64_t float2) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
float_mulratio(
|
||||||
|
uint64_t float1,
|
||||||
|
uint32_t round_up,
|
||||||
|
uint32_t numerator,
|
||||||
|
uint32_t denominator) const;
|
||||||
|
|
||||||
|
uint64_t
|
||||||
|
float_negate(uint64_t float1) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
float_compare(uint64_t float1, uint64_t float2, uint32_t mode) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
float_sum(uint64_t float1, uint64_t float2) const;
|
||||||
|
|
||||||
|
Expected<Bytes, HookReturnCode>
|
||||||
|
float_sto(
|
||||||
|
std::optional<Currency> currency,
|
||||||
|
std::optional<AccountID> issuer,
|
||||||
|
uint64_t float1,
|
||||||
|
uint32_t field_code,
|
||||||
|
uint32_t write_len) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
float_sto_set(Bytes const& data) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
float_invert(uint64_t float1) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
float_divide(uint64_t float1, uint64_t float2) const;
|
||||||
|
|
||||||
|
uint64_t
|
||||||
|
float_one() const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
float_mantissa(uint64_t float1) const;
|
||||||
|
|
||||||
|
uint64_t
|
||||||
|
float_sign(uint64_t float1) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
float_int(uint64_t float1, uint32_t decimal_places, uint32_t absolute)
|
||||||
|
const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
float_log(uint64_t float1) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
float_root(uint64_t float1, uint32_t n) const;
|
||||||
|
|
||||||
|
/// otxn APIs
|
||||||
|
uint64_t
|
||||||
|
otxn_burden() const;
|
||||||
|
|
||||||
|
uint32_t
|
||||||
|
otxn_generation() const;
|
||||||
|
|
||||||
|
Expected<const STBase*, HookReturnCode>
|
||||||
|
otxn_field(uint32_t field_id) const;
|
||||||
|
|
||||||
|
Expected<uint256, HookReturnCode>
|
||||||
|
otxn_id(uint32_t flags) const;
|
||||||
|
|
||||||
|
TxType
|
||||||
|
otxn_type() const;
|
||||||
|
|
||||||
|
Expected<uint32_t, HookReturnCode>
|
||||||
|
otxn_slot(uint32_t slot_into) const;
|
||||||
|
|
||||||
|
Expected<Blob, HookReturnCode>
|
||||||
|
otxn_param(Bytes const& param_name) const;
|
||||||
|
|
||||||
|
/// hook APIs
|
||||||
|
AccountID
|
||||||
|
hook_account() const;
|
||||||
|
|
||||||
|
Expected<ripple::uint256, HookReturnCode>
|
||||||
|
hook_hash(int32_t hook_no) const;
|
||||||
|
|
||||||
|
Expected<int64_t, HookReturnCode>
|
||||||
|
hook_again() const;
|
||||||
|
|
||||||
|
Expected<Blob, HookReturnCode>
|
||||||
|
hook_param(Bytes const& paramName) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
hook_param_set(
|
||||||
|
uint256 const& hash,
|
||||||
|
Bytes const& paramName,
|
||||||
|
Bytes const& paramValue) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
hook_skip(uint256 const& hash, uint32_t flags) const;
|
||||||
|
|
||||||
|
uint8_t
|
||||||
|
hook_pos() const;
|
||||||
|
|
||||||
|
/// ledger APIs
|
||||||
|
uint64_t
|
||||||
|
fee_base() const;
|
||||||
|
|
||||||
|
uint32_t
|
||||||
|
ledger_seq() const;
|
||||||
|
|
||||||
|
uint256
|
||||||
|
ledger_last_hash() const;
|
||||||
|
|
||||||
|
uint64_t
|
||||||
|
ledger_last_time() const;
|
||||||
|
|
||||||
|
Expected<uint256, HookReturnCode>
|
||||||
|
ledger_nonce() const;
|
||||||
|
|
||||||
|
Expected<Keylet, HookReturnCode>
|
||||||
|
ledger_keylet(Keylet const& klLo, Keylet const& klHi) const;
|
||||||
|
|
||||||
|
/// state APIs
|
||||||
|
|
||||||
|
// state(): same as state_foreign with ns = 0 and account = hook_account()
|
||||||
|
|
||||||
|
Expected<Bytes, HookReturnCode>
|
||||||
|
state_foreign(
|
||||||
|
uint256 const& key,
|
||||||
|
uint256 const& ns,
|
||||||
|
AccountID const& account) const;
|
||||||
|
|
||||||
|
// state_set(): same as state_foreign_set with ns = 0 and account =
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
state_foreign_set(
|
||||||
|
uint256 const& key,
|
||||||
|
uint256 const& ns,
|
||||||
|
AccountID const& account,
|
||||||
|
Bytes& data) const;
|
||||||
|
|
||||||
|
/// slot APIs
|
||||||
|
Expected<const STBase*, HookReturnCode>
|
||||||
|
slot(uint32_t slot_no) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
slot_clear(uint32_t slot_no) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
slot_count(uint32_t slot_no) const;
|
||||||
|
|
||||||
|
Expected<uint32_t, HookReturnCode>
|
||||||
|
slot_set(Bytes const& data, uint32_t slot_no) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
slot_size(uint32_t slot_no) const;
|
||||||
|
|
||||||
|
Expected<uint32_t, HookReturnCode>
|
||||||
|
slot_subarray(uint32_t parent_slot, uint32_t array_id, uint32_t new_slot)
|
||||||
|
const;
|
||||||
|
|
||||||
|
Expected<uint32_t, HookReturnCode>
|
||||||
|
slot_subfield(uint32_t parent_slot, uint32_t field_id, uint32_t new_slot)
|
||||||
|
const;
|
||||||
|
|
||||||
|
Expected<std::variant<STBase, STAmount>, HookReturnCode>
|
||||||
|
slot_type(uint32_t slot_no, uint32_t flags) const;
|
||||||
|
|
||||||
|
Expected<uint64_t, HookReturnCode>
|
||||||
|
slot_float(uint32_t slot_no) const;
|
||||||
|
|
||||||
|
/// trace APIs
|
||||||
|
// trace
|
||||||
|
// trace_num
|
||||||
|
// trace_float
|
||||||
|
|
||||||
|
Expected<uint32_t, HookReturnCode>
|
||||||
|
meta_slot(uint32_t slot_into) const;
|
||||||
|
|
||||||
|
Expected<std::pair<uint32_t, uint32_t>, HookReturnCode>
|
||||||
|
xpop_slot(uint32_t slot_into_tx, uint32_t slot_into_meta) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
HookContext& hookCtx;
|
||||||
|
|
||||||
|
inline int32_t
|
||||||
|
no_free_slots() const;
|
||||||
|
|
||||||
|
inline std::optional<int32_t>
|
||||||
|
get_free_slot() const;
|
||||||
|
|
||||||
|
inline Expected<uint64_t, HookReturnCode>
|
||||||
|
float_multiply_internal_parts(
|
||||||
|
uint64_t man1,
|
||||||
|
int32_t exp1,
|
||||||
|
bool neg1,
|
||||||
|
uint64_t man2,
|
||||||
|
int32_t exp2,
|
||||||
|
bool neg2) const;
|
||||||
|
|
||||||
|
inline Expected<uint64_t, HookReturnCode>
|
||||||
|
mulratio_internal(
|
||||||
|
int64_t& man1,
|
||||||
|
int32_t& exp1,
|
||||||
|
bool round_up,
|
||||||
|
uint32_t numerator,
|
||||||
|
uint32_t denominator) const;
|
||||||
|
|
||||||
|
inline Expected<uint64_t, HookReturnCode>
|
||||||
|
float_divide_internal(uint64_t float1, uint64_t float2) const;
|
||||||
|
|
||||||
|
inline Expected<uint64_t, HookReturnCode>
|
||||||
|
double_to_xfl(double x) const;
|
||||||
|
|
||||||
|
std::optional<ripple::Keylet>
|
||||||
|
unserialize_keylet(Bytes const& data) const;
|
||||||
|
|
||||||
|
// update the state cache
|
||||||
|
inline std::optional<
|
||||||
|
std::reference_wrapper<std::pair<bool, ripple::Blob> const>>
|
||||||
|
lookup_state_cache(
|
||||||
|
AccountID const& acc,
|
||||||
|
uint256 const& ns,
|
||||||
|
uint256 const& key) const;
|
||||||
|
|
||||||
|
// check the state cache
|
||||||
|
inline Expected<uint64_t, HookReturnCode>
|
||||||
|
set_state_cache(
|
||||||
|
AccountID const& acc,
|
||||||
|
uint256 const& ns,
|
||||||
|
uint256 const& key,
|
||||||
|
Bytes const& data,
|
||||||
|
bool modified) const;
|
||||||
|
|
||||||
|
// these are only used by get_stobject_length below
|
||||||
|
enum parse_error {
|
||||||
|
pe_unexpected_end = -1,
|
||||||
|
pe_unknown_type_early = -2, // detected early
|
||||||
|
pe_unknown_type_late = -3, // end of function
|
||||||
|
pe_excessive_nesting = -4,
|
||||||
|
pe_excessive_size = -5
|
||||||
|
};
|
||||||
|
|
||||||
|
inline Expected<
|
||||||
|
int32_t,
|
||||||
|
parse_error>
|
||||||
|
get_stobject_length(
|
||||||
|
unsigned char* start, // in - begin iterator
|
||||||
|
unsigned char* maxptr, // in - end iterator
|
||||||
|
int& type, // out - populated by serialized type code
|
||||||
|
int& field, // out - populated by serialized field code
|
||||||
|
int& payload_start, // out - the start of actual payload data for
|
||||||
|
// this type
|
||||||
|
int& payload_length, // out - the length of actual payload data for
|
||||||
|
// this type
|
||||||
|
int recursion_depth = 0) // used internally
|
||||||
|
const;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace hook
|
||||||
|
|
||||||
|
#endif // HOOK_API_INCLUDED
|
||||||
@@ -25,7 +25,8 @@
|
|||||||
_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, N, ...) \
|
_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, N, ...) \
|
||||||
N
|
N
|
||||||
#define VA_NARGS(__drop, ...) \
|
#define VA_NARGS(__drop, ...) \
|
||||||
VA_NARGS_IMPL(__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
|
VA_NARGS_IMPL( \
|
||||||
|
__VA_OPT__(__VA_ARGS__, ) 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
|
||||||
#define FIRST(a, b) a
|
#define FIRST(a, b) a
|
||||||
#define SECOND(a, b) b
|
#define SECOND(a, b) b
|
||||||
#define STRIP_TYPES(...) FOR_VARS(SECOND, 0, __VA_ARGS__)
|
#define STRIP_TYPES(...) FOR_VARS(SECOND, 0, __VA_ARGS__)
|
||||||
@@ -88,30 +89,18 @@
|
|||||||
|
|
||||||
#define WASM_VAL_TYPE(T, b) CAT2(TYP_, T)
|
#define WASM_VAL_TYPE(T, b) CAT2(TYP_, T)
|
||||||
|
|
||||||
#define DECLARE_HOOK_FUNCTION(R, F, ...) \
|
#define DECLARE_HOOK_FUNCTION(R, F, ...) \
|
||||||
R F(hook::HookContext& hookCtx, \
|
R F(hook::HookContext& hookCtx, \
|
||||||
WasmEdge_CallingFrameContext const& frameCtx, \
|
WasmEdge_CallingFrameContext const& frameCtx __VA_OPT__( \
|
||||||
__VA_ARGS__); \
|
COMMA __VA_ARGS__)); \
|
||||||
extern WasmEdge_Result WasmFunction##F( \
|
extern WasmEdge_Result WasmFunction##F( \
|
||||||
void* data_ptr, \
|
void* data_ptr, \
|
||||||
const WasmEdge_CallingFrameContext* frameCtx, \
|
const WasmEdge_CallingFrameContext* frameCtx, \
|
||||||
const WasmEdge_Value* in, \
|
const WasmEdge_Value* in, \
|
||||||
WasmEdge_Value* out); \
|
WasmEdge_Value* out); \
|
||||||
extern WasmEdge_ValType WasmFunctionParams##F[]; \
|
extern WasmEdge_ValType WasmFunctionParams##F[]; \
|
||||||
extern WasmEdge_ValType WasmFunctionResult##F[]; \
|
extern WasmEdge_ValType WasmFunctionResult##F[]; \
|
||||||
extern WasmEdge_FunctionTypeContext* WasmFunctionType##F; \
|
extern WasmEdge_FunctionTypeContext* WasmFunctionType##F; \
|
||||||
extern WasmEdge_String WasmFunctionName##F;
|
|
||||||
|
|
||||||
#define DECLARE_HOOK_FUNCNARG(R, F) \
|
|
||||||
R F(hook::HookContext& hookCtx, \
|
|
||||||
WasmEdge_CallingFrameContext const& frameCtx); \
|
|
||||||
extern WasmEdge_Result WasmFunction##F( \
|
|
||||||
void* data_ptr, \
|
|
||||||
const WasmEdge_CallingFrameContext* frameCtx, \
|
|
||||||
const WasmEdge_Value* in, \
|
|
||||||
WasmEdge_Value* out); \
|
|
||||||
extern WasmEdge_ValType WasmFunctionResult##F[]; \
|
|
||||||
extern WasmEdge_FunctionTypeContext* WasmFunctionType##F; \
|
|
||||||
extern WasmEdge_String WasmFunctionName##F;
|
extern WasmEdge_String WasmFunctionName##F;
|
||||||
|
|
||||||
#define DEFINE_HOOK_FUNCTION(R, F, ...) \
|
#define DEFINE_HOOK_FUNCTION(R, F, ...) \
|
||||||
@@ -121,61 +110,35 @@
|
|||||||
const WasmEdge_Value* in, \
|
const WasmEdge_Value* in, \
|
||||||
WasmEdge_Value* out) \
|
WasmEdge_Value* out) \
|
||||||
{ \
|
{ \
|
||||||
int _stack = 0; \
|
__VA_OPT__(int _stack = 0;) \
|
||||||
FOR_VARS(VAR_ASSIGN, 2, __VA_ARGS__); \
|
__VA_OPT__(FOR_VARS(VAR_ASSIGN, 2, __VA_ARGS__);) \
|
||||||
hook::HookContext* hookCtx = \
|
hook::HookContext* hookCtx = \
|
||||||
reinterpret_cast<hook::HookContext*>(data_ptr); \
|
reinterpret_cast<hook::HookContext*>(data_ptr); \
|
||||||
R return_code = hook_api::F( \
|
R return_code = hook_api::F( \
|
||||||
*hookCtx, \
|
*hookCtx, \
|
||||||
*const_cast<WasmEdge_CallingFrameContext*>(frameCtx), \
|
*const_cast<WasmEdge_CallingFrameContext*>(frameCtx) \
|
||||||
STRIP_TYPES(__VA_ARGS__)); \
|
__VA_OPT__(COMMA STRIP_TYPES(__VA_ARGS__))); \
|
||||||
if (return_code == RC_ROLLBACK || return_code == RC_ACCEPT) \
|
if (return_code == RC_ROLLBACK || return_code == RC_ACCEPT) \
|
||||||
return WasmEdge_Result_Terminate; \
|
return WasmEdge_Result_Terminate; \
|
||||||
out[0] = RET_ASSIGN(R, return_code); \
|
out[0] = RET_ASSIGN(R, return_code); \
|
||||||
return WasmEdge_Result_Success; \
|
return WasmEdge_Result_Success; \
|
||||||
}; \
|
}; \
|
||||||
WasmEdge_ValType hook_api::WasmFunctionParams##F[] = { \
|
WasmEdge_ValType hook_api::WasmFunctionParams##F[] = { \
|
||||||
FOR_VARS(WASM_VAL_TYPE, 0, __VA_ARGS__)}; \
|
__VA_OPT__(FOR_VARS(WASM_VAL_TYPE, 0, __VA_ARGS__))}; \
|
||||||
WasmEdge_ValType hook_api::WasmFunctionResult##F[1] = { \
|
WasmEdge_ValType hook_api::WasmFunctionResult##F[1] = { \
|
||||||
WASM_VAL_TYPE(R, dummy)}; \
|
WASM_VAL_TYPE(R, dummy)}; \
|
||||||
WasmEdge_FunctionTypeContext* hook_api::WasmFunctionType##F = \
|
WasmEdge_FunctionTypeContext* hook_api::WasmFunctionType##F = \
|
||||||
WasmEdge_FunctionTypeCreate( \
|
WasmEdge_FunctionTypeCreate( \
|
||||||
WasmFunctionParams##F, \
|
WasmFunctionParams##F, \
|
||||||
VA_NARGS(NULL, __VA_ARGS__), \
|
VA_NARGS(NULL __VA_OPT__(, __VA_ARGS__)), \
|
||||||
WasmFunctionResult##F, \
|
WasmFunctionResult##F, \
|
||||||
1); \
|
1); \
|
||||||
WasmEdge_String hook_api::WasmFunctionName##F = \
|
WasmEdge_String hook_api::WasmFunctionName##F = \
|
||||||
WasmEdge_StringCreateByCString(#F); \
|
WasmEdge_StringCreateByCString(#F); \
|
||||||
R hook_api::F( \
|
R hook_api::F( \
|
||||||
hook::HookContext& hookCtx, \
|
hook::HookContext& hookCtx, \
|
||||||
WasmEdge_CallingFrameContext const& frameCtx, \
|
WasmEdge_CallingFrameContext const& frameCtx __VA_OPT__( \
|
||||||
__VA_ARGS__)
|
COMMA __VA_ARGS__))
|
||||||
|
|
||||||
#define DEFINE_HOOK_FUNCNARG(R, F) \
|
|
||||||
WasmEdge_Result hook_api::WasmFunction##F( \
|
|
||||||
void* data_ptr, \
|
|
||||||
const WasmEdge_CallingFrameContext* frameCtx, \
|
|
||||||
const WasmEdge_Value* in, \
|
|
||||||
WasmEdge_Value* out) \
|
|
||||||
{ \
|
|
||||||
hook::HookContext* hookCtx = \
|
|
||||||
reinterpret_cast<hook::HookContext*>(data_ptr); \
|
|
||||||
R return_code = hook_api::F( \
|
|
||||||
*hookCtx, *const_cast<WasmEdge_CallingFrameContext*>(frameCtx)); \
|
|
||||||
if (return_code == RC_ROLLBACK || return_code == RC_ACCEPT) \
|
|
||||||
return WasmEdge_Result_Terminate; \
|
|
||||||
out[0] = CAT2(RET_, R(return_code)); \
|
|
||||||
return WasmEdge_Result_Success; \
|
|
||||||
}; \
|
|
||||||
WasmEdge_ValType hook_api::WasmFunctionResult##F[1] = { \
|
|
||||||
WASM_VAL_TYPE(R, dummy)}; \
|
|
||||||
WasmEdge_FunctionTypeContext* hook_api::WasmFunctionType##F = \
|
|
||||||
WasmEdge_FunctionTypeCreate({}, 0, WasmFunctionResult##F, 1); \
|
|
||||||
WasmEdge_String hook_api::WasmFunctionName##F = \
|
|
||||||
WasmEdge_StringCreateByCString(#F); \
|
|
||||||
R hook_api::F( \
|
|
||||||
hook::HookContext& hookCtx, \
|
|
||||||
WasmEdge_CallingFrameContext const& frameCtx)
|
|
||||||
|
|
||||||
#define HOOK_SETUP() \
|
#define HOOK_SETUP() \
|
||||||
try \
|
try \
|
||||||
@@ -190,6 +153,7 @@
|
|||||||
[[maybe_unused]] const uint64_t memory_length = \
|
[[maybe_unused]] const uint64_t memory_length = \
|
||||||
WasmEdge_MemoryInstanceGetPageSize(memoryCtx) * \
|
WasmEdge_MemoryInstanceGetPageSize(memoryCtx) * \
|
||||||
WasmEdge_kPageSize; \
|
WasmEdge_kPageSize; \
|
||||||
|
[[maybe_unused]] auto& api = hookCtx.api(); \
|
||||||
if (!memoryCtx || !memory || !memory_length) \
|
if (!memoryCtx || !memory || !memory_length) \
|
||||||
return INTERNAL_ERROR;
|
return INTERNAL_ERROR;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#ifndef APPLY_HOOK_INCLUDED
|
#ifndef APPLY_HOOK_INCLUDED
|
||||||
#define APPLY_HOOK_INCLUDED 1
|
#define APPLY_HOOK_INCLUDED 1
|
||||||
#include <ripple/app/hook/Enum.h>
|
#include <ripple/app/hook/Enum.h>
|
||||||
|
#include <ripple/app/hook/HookAPI.h>
|
||||||
#include <ripple/app/hook/Macro.h>
|
#include <ripple/app/hook/Macro.h>
|
||||||
#include <ripple/app/hook/Misc.h>
|
#include <ripple/app/hook/Misc.h>
|
||||||
#include <ripple/app/misc/Transaction.h>
|
#include <ripple/app/misc/Transaction.h>
|
||||||
@@ -61,365 +62,20 @@ namespace hook_api {
|
|||||||
if (HOOK_DBG) \
|
if (HOOK_DBG) \
|
||||||
fprintf
|
fprintf
|
||||||
|
|
||||||
DECLARE_HOOK_FUNCTION(int32_t, _g, uint32_t guard_id, uint32_t maxiter);
|
#pragma push_macro("HOOK_API_DEFINITION")
|
||||||
|
#undef HOOK_API_DEFINITION
|
||||||
|
|
||||||
DECLARE_HOOK_FUNCTION(
|
#define HOOK_WRAP_PARAMS(...) __VA_ARGS__
|
||||||
int64_t,
|
#define HOOK_API_DEFINITION(RETURN_TYPE, FUNCTION_NAME, PARAMS_TUPLE, ...) \
|
||||||
accept,
|
DECLARE_HOOK_FUNCTION( \
|
||||||
uint32_t read_ptr,
|
RETURN_TYPE, FUNCTION_NAME, HOOK_WRAP_PARAMS PARAMS_TUPLE);
|
||||||
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(
|
#include <ripple/app/hook/hook_api.macro>
|
||||||
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(
|
#undef HOOK_API_DEFINITION
|
||||||
int64_t,
|
#undef HOOK_WRAP_PARAMS
|
||||||
sto_validate,
|
#pragma pop_macro("HOOK_API_DEFINITION")
|
||||||
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);
|
|
||||||
*/
|
|
||||||
} /* end namespace hook_api */
|
} /* end namespace hook_api */
|
||||||
|
|
||||||
namespace hook {
|
namespace hook {
|
||||||
@@ -477,7 +133,6 @@ struct HookResult
|
|||||||
ripple::uint256 const hookHash;
|
ripple::uint256 const hookHash;
|
||||||
ripple::uint256 const hookCanEmit;
|
ripple::uint256 const hookCanEmit;
|
||||||
ripple::Keylet const accountKeylet;
|
ripple::Keylet const accountKeylet;
|
||||||
ripple::Keylet const ownerDirKeylet;
|
|
||||||
ripple::Keylet const hookKeylet;
|
ripple::Keylet const hookKeylet;
|
||||||
ripple::AccountID const account;
|
ripple::AccountID const account;
|
||||||
ripple::AccountID const otxnAccount;
|
ripple::AccountID const otxnAccount;
|
||||||
@@ -554,6 +209,18 @@ struct HookContext
|
|||||||
// emitted txn then this optional becomes
|
// emitted txn then this optional becomes
|
||||||
// populated with the SLE
|
// populated with the SLE
|
||||||
const HookExecutor* module = 0;
|
const HookExecutor* module = 0;
|
||||||
|
|
||||||
|
// Lazy-initialized HookAPI member
|
||||||
|
mutable std::unique_ptr<HookAPI> api_;
|
||||||
|
|
||||||
|
// Access the HookAPI instance (lazy initialization)
|
||||||
|
HookAPI&
|
||||||
|
api() const
|
||||||
|
{
|
||||||
|
if (!api_)
|
||||||
|
api_ = std::make_unique<HookAPI>(const_cast<HookContext&>(*this));
|
||||||
|
return *api_;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@@ -792,97 +459,18 @@ public:
|
|||||||
|
|
||||||
WasmEdge_LogSetDebugLevel();
|
WasmEdge_LogSetDebugLevel();
|
||||||
|
|
||||||
ADD_HOOK_FUNCTION(_g, ctx);
|
#pragma push_macro("HOOK_API_DEFINITION")
|
||||||
ADD_HOOK_FUNCTION(accept, ctx);
|
#undef HOOK_API_DEFINITION
|
||||||
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);
|
#define HOOK_WRAP_PARAMS(...) __VA_ARGS__
|
||||||
ADD_HOOK_FUNCTION(etxn_burden, ctx);
|
#define HOOK_API_DEFINITION(RETURN_TYPE, FUNCTION_NAME, PARAMS_TUPLE, ...) \
|
||||||
ADD_HOOK_FUNCTION(etxn_fee_base, ctx);
|
ADD_HOOK_FUNCTION(FUNCTION_NAME, 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);
|
#include <ripple/app/hook/hook_api.macro>
|
||||||
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);
|
#undef HOOK_API_DEFINITION
|
||||||
ADD_HOOK_FUNCTION(float_one, ctx);
|
#undef HOOK_WRAP_PARAMS
|
||||||
ADD_HOOK_FUNCTION(float_mantissa, ctx);
|
#pragma pop_macro("HOOK_API_DEFINITION")
|
||||||
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);
|
|
||||||
*/
|
|
||||||
|
|
||||||
WasmEdge_TableInstanceContext* hostTable =
|
WasmEdge_TableInstanceContext* hostTable =
|
||||||
WasmEdge_TableInstanceCreate(tableType);
|
WasmEdge_TableInstanceCreate(tableType);
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
#define GUARD_CHECKER_BUILD
|
||||||
|
#include "Enum.h"
|
||||||
#include "Guard.h"
|
#include "Guard.h"
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@@ -79,7 +81,15 @@ main(int argc, char** argv)
|
|||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
auto result = validateGuards(hook, std::cout, "", 3);
|
// Dummy rules for guard checker build
|
||||||
|
hook_api::Rules rules;
|
||||||
|
|
||||||
|
auto result = validateGuards(
|
||||||
|
hook,
|
||||||
|
std::cout,
|
||||||
|
"",
|
||||||
|
hook_api::getImportWhitelist(rules),
|
||||||
|
hook_api::getGuardRulesVersion(rules));
|
||||||
|
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
|
|||||||
369
src/ripple/app/hook/hook_api.macro
Normal file
369
src/ripple/app/hook/hook_api.macro
Normal file
@@ -0,0 +1,369 @@
|
|||||||
|
// 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)
|
||||||
3197
src/ripple/app/hook/impl/HookAPI.cpp
Normal file
3197
src/ripple/app/hook/impl/HookAPI.cpp
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -17,6 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
|
||||||
|
#include <ripple/app/hook/Enum.h>
|
||||||
#include <ripple/app/hook/Guard.h>
|
#include <ripple/app/hook/Guard.h>
|
||||||
#include <ripple/app/hook/applyHook.h>
|
#include <ripple/app/hook/applyHook.h>
|
||||||
#include <ripple/app/ledger/Ledger.h>
|
#include <ripple/app/ledger/Ledger.h>
|
||||||
@@ -605,8 +606,8 @@ Change::activateXahauGenesis()
|
|||||||
wasmBytes, // wasm to verify
|
wasmBytes, // wasm to verify
|
||||||
loggerStream,
|
loggerStream,
|
||||||
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||||
(ctx_.view().rules().enabled(featureHooksUpdate1) ? 1 : 0) +
|
hook_api::getImportWhitelist(ctx_.view().rules()),
|
||||||
(ctx_.view().rules().enabled(fix20250131) ? 2 : 0));
|
hook_api::getGuardRulesVersion(ctx_.view().rules()));
|
||||||
|
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -490,8 +490,8 @@ SetHook::validateHookSetEntry(SetHookCtx& ctx, STObject const& hookSetObj)
|
|||||||
hook, // wasm to verify
|
hook, // wasm to verify
|
||||||
logger,
|
logger,
|
||||||
hsacc,
|
hsacc,
|
||||||
(ctx.rules.enabled(featureHooksUpdate1) ? 1 : 0) +
|
hook_api::getImportWhitelist(ctx.rules),
|
||||||
(ctx.rules.enabled(fix20250131) ? 2 : 0));
|
hook_api::getGuardRulesVersion(ctx.rules));
|
||||||
|
|
||||||
if (ctx.j.trace())
|
if (ctx.j.trace())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -137,14 +137,14 @@ class [[nodiscard]] Expected
|
|||||||
public:
|
public:
|
||||||
template <typename U>
|
template <typename U>
|
||||||
requires std::convertible_to<U, T> constexpr Expected(U && r)
|
requires std::convertible_to<U, T> constexpr Expected(U && r)
|
||||||
: Base(T(std::forward<U>(r)))
|
: Base(boost::outcome_v2::success(T(std::forward<U>(r))))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename U>
|
template <typename U>
|
||||||
requires std::convertible_to<U, E> &&
|
requires std::convertible_to<U, E> &&
|
||||||
(!std::is_reference_v<U>)constexpr Expected(Unexpected<U> e)
|
(!std::is_reference_v<U>)constexpr Expected(Unexpected<U> e)
|
||||||
: Base(E(std::move(e.value())))
|
: Base(boost::outcome_v2::failure(E(std::move(e.value()))))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,7 +220,7 @@ public:
|
|||||||
template <typename U>
|
template <typename U>
|
||||||
requires std::convertible_to<U, E> &&
|
requires std::convertible_to<U, E> &&
|
||||||
(!std::is_reference_v<U>)constexpr Expected(Unexpected<U> e)
|
(!std::is_reference_v<U>)constexpr Expected(Unexpected<U> e)
|
||||||
: Base(E(std::move(e.value())))
|
: Base(boost::outcome_v2::failure(E(std::move(e.value()))))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
4543
src/test/app/HookAPI_test.cpp
Normal file
4543
src/test/app/HookAPI_test.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@@ -2579,6 +2579,7 @@ public:
|
|||||||
|
|
||||||
auto const alice = Account{"alice"};
|
auto const alice = Account{"alice"};
|
||||||
auto const bob = Account{"bob"};
|
auto const bob = Account{"bob"};
|
||||||
|
|
||||||
env.fund(XRP(10000), alice);
|
env.fund(XRP(10000), alice);
|
||||||
env.fund(XRP(10000), bob);
|
env.fund(XRP(10000), bob);
|
||||||
|
|
||||||
@@ -3094,6 +3095,7 @@ public:
|
|||||||
extern int64_t rollback (uint32_t read_ptr, uint32_t read_len, int64_t error_code);
|
extern int64_t rollback (uint32_t read_ptr, uint32_t read_len, int64_t error_code);
|
||||||
extern int64_t etxn_details (uint32_t, uint32_t);
|
extern int64_t etxn_details (uint32_t, uint32_t);
|
||||||
extern int64_t etxn_reserve(uint32_t);
|
extern int64_t etxn_reserve(uint32_t);
|
||||||
|
extern int64_t hook_hash (uint32_t, uint32_t, int32_t);
|
||||||
#define TOO_SMALL -4
|
#define TOO_SMALL -4
|
||||||
#define OUT_OF_BOUNDS -1
|
#define OUT_OF_BOUNDS -1
|
||||||
#define PREREQUISITE_NOT_MET -9
|
#define PREREQUISITE_NOT_MET -9
|
||||||
@@ -3116,6 +3118,45 @@ public:
|
|||||||
etxn_reserve(1);
|
etxn_reserve(1);
|
||||||
ASSERT(etxn_details((uint32_t)det, 116) == 116);
|
ASSERT(etxn_details((uint32_t)det, 116) == 116);
|
||||||
|
|
||||||
|
uint8_t expected1[49] = {
|
||||||
|
0xEDU, 0x20U, 0x2EU, 0x00U, 0x00U, 0x00U, 0x01U, 0x3DU, 0x00U, 0x00U,
|
||||||
|
0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x01U, 0x5BU, 0xB8U, 0x05U, 0xD6U,
|
||||||
|
0xC3U, 0x52U, 0xDFU, 0x7AU, 0x27U, 0x76U, 0x6DU, 0xC0U, 0x20U, 0x47U,
|
||||||
|
0xB7U, 0x64U, 0x22U, 0x5AU, 0xB7U, 0x5DU, 0xF3U, 0xFAU, 0x0DU, 0xE3U,
|
||||||
|
0xBDU, 0xC6U, 0x40U, 0xBAU, 0xD0U, 0x0AU, 0x66U, 0xEBU, 0x68U,
|
||||||
|
};
|
||||||
|
// 0x5CU
|
||||||
|
// EmitNonce 32bytes
|
||||||
|
uint8_t expected_emit_nonce[32] = {
|
||||||
|
0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU,
|
||||||
|
0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU,
|
||||||
|
0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU,
|
||||||
|
0xFFU, 0xFFU
|
||||||
|
};
|
||||||
|
// 0x5DU,
|
||||||
|
// EmitHookHash
|
||||||
|
uint8_t expected_hook_hash[32] = {
|
||||||
|
0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU,
|
||||||
|
0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU,
|
||||||
|
0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU,
|
||||||
|
0xFFU, 0xFFU,
|
||||||
|
};
|
||||||
|
// 0xE1U
|
||||||
|
|
||||||
|
// current hook hash
|
||||||
|
ASSERT(hook_hash((uint32_t)expected_hook_hash, 32, -1) == 32);
|
||||||
|
|
||||||
|
for (int i = 0; GUARD(49), i < sizeof(expected1); ++i)
|
||||||
|
ASSERT(det[i] == expected1[i]);
|
||||||
|
ASSERT(det[49] == 0x5CU);
|
||||||
|
// TODO: need to test this
|
||||||
|
// for (int i = 0; GUARD(32), i < sizeof(expected_emit_nonce); ++i)
|
||||||
|
// ASSERT(det[50 + i] == expected_emit_nonce[i]);
|
||||||
|
ASSERT(det[82] == 0x5DU);
|
||||||
|
for (int i = 0; GUARD(32), i < sizeof(expected_hook_hash); ++i)
|
||||||
|
ASSERT(det[83 + i] == expected_hook_hash[i]);
|
||||||
|
ASSERT(det[115] == 0xE1);
|
||||||
|
|
||||||
return accept(0,0,0);
|
return accept(0,0,0);
|
||||||
}
|
}
|
||||||
)[test.hook]"];
|
)[test.hook]"];
|
||||||
@@ -3280,6 +3321,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(etxn_nonce((uint32_t)nonce, 116) == TOO_MANY_NONCES);
|
ASSERT(etxn_nonce((uint32_t)nonce, 116) == TOO_MANY_NONCES);
|
||||||
|
ASSERT(etxn_nonce((uint32_t)nonce, 31) == TOO_MANY_NONCES);
|
||||||
|
|
||||||
return accept(0,0,0);
|
return accept(0,0,0);
|
||||||
}
|
}
|
||||||
@@ -6872,7 +6914,10 @@ public:
|
|||||||
std::vector<std::string> const keys = {
|
std::vector<std::string> const keys = {
|
||||||
"ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC"
|
"ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC"
|
||||||
"1"};
|
"1"};
|
||||||
Env env{*this, network::makeNetworkVLConfig(21337, keys)};
|
Env env{
|
||||||
|
*this,
|
||||||
|
network::makeNetworkVLConfig(21337, keys),
|
||||||
|
features - featureHooksUpdate1};
|
||||||
|
|
||||||
auto const master = Account("masterpassphrase");
|
auto const master = Account("masterpassphrase");
|
||||||
env(noop(master), fee(10'000'000'000), ter(tesSUCCESS));
|
env(noop(master), fee(10'000'000'000), ter(tesSUCCESS));
|
||||||
@@ -6950,6 +6995,16 @@ public:
|
|||||||
}
|
}
|
||||||
)[test.hook]"];
|
)[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
|
// install the hook on alice
|
||||||
env(ripple::test::jtx::hook(alice, {{hso(hook, overrideFlag)}}, 0),
|
env(ripple::test::jtx::hook(alice, {{hso(hook, overrideFlag)}}, 0),
|
||||||
M("set xpop_slot"),
|
M("set xpop_slot"),
|
||||||
|
|||||||
@@ -1168,6 +1168,7 @@ std::map<std::string, std::vector<uint8_t>> wasm = {
|
|||||||
extern int64_t rollback (uint32_t read_ptr, uint32_t read_len, int64_t error_code);
|
extern int64_t rollback (uint32_t read_ptr, uint32_t read_len, int64_t error_code);
|
||||||
extern int64_t etxn_details (uint32_t, uint32_t);
|
extern int64_t etxn_details (uint32_t, uint32_t);
|
||||||
extern int64_t etxn_reserve(uint32_t);
|
extern int64_t etxn_reserve(uint32_t);
|
||||||
|
extern int64_t hook_hash (uint32_t, uint32_t, int32_t);
|
||||||
#define TOO_SMALL -4
|
#define TOO_SMALL -4
|
||||||
#define OUT_OF_BOUNDS -1
|
#define OUT_OF_BOUNDS -1
|
||||||
#define PREREQUISITE_NOT_MET -9
|
#define PREREQUISITE_NOT_MET -9
|
||||||
@@ -1190,78 +1191,178 @@ std::map<std::string, std::vector<uint8_t>> wasm = {
|
|||||||
etxn_reserve(1);
|
etxn_reserve(1);
|
||||||
ASSERT(etxn_details((uint32_t)det, 116) == 116);
|
ASSERT(etxn_details((uint32_t)det, 116) == 116);
|
||||||
|
|
||||||
|
uint8_t expected1[49] = {
|
||||||
|
0xEDU, 0x20U, 0x2EU, 0x00U, 0x00U, 0x00U, 0x01U, 0x3DU, 0x00U, 0x00U,
|
||||||
|
0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x01U, 0x5BU, 0xB8U, 0x05U, 0xD6U,
|
||||||
|
0xC3U, 0x52U, 0xDFU, 0x7AU, 0x27U, 0x76U, 0x6DU, 0xC0U, 0x20U, 0x47U,
|
||||||
|
0xB7U, 0x64U, 0x22U, 0x5AU, 0xB7U, 0x5DU, 0xF3U, 0xFAU, 0x0DU, 0xE3U,
|
||||||
|
0xBDU, 0xC6U, 0x40U, 0xBAU, 0xD0U, 0x0AU, 0x66U, 0xEBU, 0x68U,
|
||||||
|
};
|
||||||
|
// 0x5CU
|
||||||
|
// EmitNonce 32bytes
|
||||||
|
uint8_t expected_emit_nonce[32] = {
|
||||||
|
0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU,
|
||||||
|
0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU,
|
||||||
|
0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU,
|
||||||
|
0xFFU, 0xFFU
|
||||||
|
};
|
||||||
|
// 0x5DU,
|
||||||
|
// EmitHookHash
|
||||||
|
uint8_t expected_hook_hash[32] = {
|
||||||
|
0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU,
|
||||||
|
0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU,
|
||||||
|
0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU,
|
||||||
|
0xFFU, 0xFFU,
|
||||||
|
};
|
||||||
|
// 0xE1U
|
||||||
|
|
||||||
|
// current hook hash
|
||||||
|
ASSERT(hook_hash((uint32_t)expected_hook_hash, 32, -1) == 32);
|
||||||
|
|
||||||
|
for (int i = 0; GUARD(49), i < sizeof(expected1); ++i)
|
||||||
|
ASSERT(det[i] == expected1[i]);
|
||||||
|
ASSERT(det[49] == 0x5CU);
|
||||||
|
// TODO: need to test this
|
||||||
|
// for (int i = 0; GUARD(32), i < sizeof(expected_emit_nonce); ++i)
|
||||||
|
// ASSERT(det[50 + i] == expected_emit_nonce[i]);
|
||||||
|
ASSERT(det[82] == 0x5DU);
|
||||||
|
for (int i = 0; GUARD(32), i < sizeof(expected_hook_hash); ++i)
|
||||||
|
ASSERT(det[83 + i] == expected_hook_hash[i]);
|
||||||
|
ASSERT(det[115] == 0xE1);
|
||||||
|
|
||||||
return accept(0,0,0);
|
return accept(0,0,0);
|
||||||
}
|
}
|
||||||
)[test.hook]",
|
)[test.hook]",
|
||||||
{
|
{
|
||||||
0x00U, 0x61U, 0x73U, 0x6DU, 0x01U, 0x00U, 0x00U, 0x00U, 0x01U, 0x19U,
|
0x00U, 0x61U, 0x73U, 0x6DU, 0x01U, 0x00U, 0x00U, 0x00U, 0x01U, 0x20U,
|
||||||
0x04U, 0x60U, 0x02U, 0x7FU, 0x7FU, 0x01U, 0x7FU, 0x60U, 0x02U, 0x7FU,
|
0x05U, 0x60U, 0x02U, 0x7FU, 0x7FU, 0x01U, 0x7FU, 0x60U, 0x02U, 0x7FU,
|
||||||
0x7FU, 0x01U, 0x7EU, 0x60U, 0x03U, 0x7FU, 0x7FU, 0x7EU, 0x01U, 0x7EU,
|
0x7FU, 0x01U, 0x7EU, 0x60U, 0x03U, 0x7FU, 0x7FU, 0x7EU, 0x01U, 0x7EU,
|
||||||
0x60U, 0x01U, 0x7FU, 0x01U, 0x7EU, 0x02U, 0x4CU, 0x05U, 0x03U, 0x65U,
|
0x60U, 0x01U, 0x7FU, 0x01U, 0x7EU, 0x60U, 0x03U, 0x7FU, 0x7FU, 0x7FU,
|
||||||
0x6EU, 0x76U, 0x02U, 0x5FU, 0x67U, 0x00U, 0x00U, 0x03U, 0x65U, 0x6EU,
|
0x01U, 0x7EU, 0x02U, 0x5CU, 0x06U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x02U,
|
||||||
0x76U, 0x0CU, 0x65U, 0x74U, 0x78U, 0x6EU, 0x5FU, 0x64U, 0x65U, 0x74U,
|
0x5FU, 0x67U, 0x00U, 0x00U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x0CU, 0x65U,
|
||||||
0x61U, 0x69U, 0x6CU, 0x73U, 0x00U, 0x01U, 0x03U, 0x65U, 0x6EU, 0x76U,
|
0x74U, 0x78U, 0x6EU, 0x5FU, 0x64U, 0x65U, 0x74U, 0x61U, 0x69U, 0x6CU,
|
||||||
0x08U, 0x72U, 0x6FU, 0x6CU, 0x6CU, 0x62U, 0x61U, 0x63U, 0x6BU, 0x00U,
|
0x73U, 0x00U, 0x01U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x08U, 0x72U, 0x6FU,
|
||||||
0x02U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x0CU, 0x65U, 0x74U, 0x78U, 0x6EU,
|
0x6CU, 0x6CU, 0x62U, 0x61U, 0x63U, 0x6BU, 0x00U, 0x02U, 0x03U, 0x65U,
|
||||||
0x5FU, 0x72U, 0x65U, 0x73U, 0x65U, 0x72U, 0x76U, 0x65U, 0x00U, 0x03U,
|
0x6EU, 0x76U, 0x0CU, 0x65U, 0x74U, 0x78U, 0x6EU, 0x5FU, 0x72U, 0x65U,
|
||||||
0x03U, 0x65U, 0x6EU, 0x76U, 0x06U, 0x61U, 0x63U, 0x63U, 0x65U, 0x70U,
|
0x73U, 0x65U, 0x72U, 0x76U, 0x65U, 0x00U, 0x03U, 0x03U, 0x65U, 0x6EU,
|
||||||
0x74U, 0x00U, 0x02U, 0x03U, 0x02U, 0x01U, 0x03U, 0x05U, 0x03U, 0x01U,
|
0x76U, 0x09U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x5FU, 0x68U, 0x61U, 0x73U,
|
||||||
0x00U, 0x02U, 0x06U, 0x21U, 0x05U, 0x7FU, 0x01U, 0x41U, 0xF0U, 0x89U,
|
0x68U, 0x00U, 0x04U, 0x03U, 0x65U, 0x6EU, 0x76U, 0x06U, 0x61U, 0x63U,
|
||||||
0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0xE5U, 0x09U, 0x0BU, 0x7FU, 0x00U,
|
0x63U, 0x65U, 0x70U, 0x74U, 0x00U, 0x02U, 0x03U, 0x02U, 0x01U, 0x03U,
|
||||||
0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0xF0U, 0x89U, 0x04U,
|
0x05U, 0x03U, 0x01U, 0x00U, 0x02U, 0x06U, 0x21U, 0x05U, 0x7FU, 0x01U,
|
||||||
0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x07U, 0x08U, 0x01U,
|
0x41U, 0xD0U, 0x8BU, 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0xC6U, 0x0BU,
|
||||||
0x04U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x05U, 0x0AU, 0x84U, 0x82U,
|
0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U,
|
||||||
0x00U, 0x01U, 0x80U, 0x82U, 0x00U, 0x02U, 0x01U, 0x7FU, 0x01U, 0x7EU,
|
0xD0U, 0x8BU, 0x04U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU,
|
||||||
0x23U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x41U, 0x80U, 0x01U, 0x6BU,
|
0x07U, 0x08U, 0x01U, 0x04U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x06U,
|
||||||
0x22U, 0x01U, 0x24U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x41U, 0x01U,
|
0x0AU, 0xF4U, 0x84U, 0x00U, 0x01U, 0xF0U, 0x84U, 0x00U, 0x02U, 0x03U,
|
||||||
0x41U, 0x01U, 0x10U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x02U,
|
0x7FU, 0x01U, 0x7EU, 0x23U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x41U,
|
||||||
0x40U, 0x41U, 0xC0U, 0x84U, 0x3DU, 0x41U, 0xF4U, 0x00U, 0x10U, 0x81U,
|
0xA0U, 0x01U, 0x6BU, 0x22U, 0x01U, 0x24U, 0x80U, 0x80U, 0x80U, 0x80U,
|
||||||
|
0x00U, 0x41U, 0x01U, 0x41U, 0x01U, 0x10U, 0x80U, 0x80U, 0x80U, 0x80U,
|
||||||
|
0x00U, 0x1AU, 0x02U, 0x40U, 0x41U, 0xC0U, 0x84U, 0x3DU, 0x41U, 0xF4U,
|
||||||
|
0x00U, 0x10U, 0x81U, 0x80U, 0x80U, 0x80U, 0x00U, 0x42U, 0x7FU, 0x51U,
|
||||||
|
0x0DU, 0x00U, 0x41U, 0x80U, 0x88U, 0x80U, 0x80U, 0x00U, 0x41U, 0x2CU,
|
||||||
|
0x42U, 0x16U, 0x10U, 0x82U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x0BU,
|
||||||
|
0x02U, 0x40U, 0x41U, 0x00U, 0x41U, 0xC0U, 0x84U, 0x3DU, 0x10U, 0x81U,
|
||||||
0x80U, 0x80U, 0x80U, 0x00U, 0x42U, 0x7FU, 0x51U, 0x0DU, 0x00U, 0x41U,
|
0x80U, 0x80U, 0x80U, 0x00U, 0x42U, 0x7FU, 0x51U, 0x0DU, 0x00U, 0x41U,
|
||||||
0x80U, 0x88U, 0x80U, 0x80U, 0x00U, 0x41U, 0x2CU, 0x42U, 0x15U, 0x10U,
|
0xACU, 0x88U, 0x80U, 0x80U, 0x00U, 0x41U, 0x2AU, 0x42U, 0x17U, 0x10U,
|
||||||
0x82U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x0BU, 0x02U, 0x40U, 0x41U,
|
0x82U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x0BU, 0x02U, 0x40U, 0x20U,
|
||||||
0x00U, 0x41U, 0xC0U, 0x84U, 0x3DU, 0x10U, 0x81U, 0x80U, 0x80U, 0x80U,
|
0x01U, 0x41U, 0x20U, 0x6AU, 0x41U, 0xF3U, 0x00U, 0x10U, 0x81U, 0x80U,
|
||||||
0x00U, 0x42U, 0x7FU, 0x51U, 0x0DU, 0x00U, 0x41U, 0xACU, 0x88U, 0x80U,
|
0x80U, 0x80U, 0x00U, 0x42U, 0x7CU, 0x51U, 0x0DU, 0x00U, 0x41U, 0xD6U,
|
||||||
0x80U, 0x00U, 0x41U, 0x2AU, 0x42U, 0x16U, 0x10U, 0x82U, 0x80U, 0x80U,
|
0x88U, 0x80U, 0x80U, 0x00U, 0x41U, 0x2EU, 0x42U, 0x19U, 0x10U, 0x82U,
|
||||||
0x80U, 0x00U, 0x1AU, 0x0BU, 0x02U, 0x40U, 0x20U, 0x01U, 0x41U, 0xF3U,
|
0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x0BU, 0x02U, 0x40U, 0x20U, 0x01U,
|
||||||
0x00U, 0x10U, 0x81U, 0x80U, 0x80U, 0x80U, 0x00U, 0x42U, 0x7CU, 0x51U,
|
0x41U, 0x20U, 0x6AU, 0x41U, 0xF4U, 0x00U, 0x10U, 0x81U, 0x80U, 0x80U,
|
||||||
0x0DU, 0x00U, 0x41U, 0xD6U, 0x88U, 0x80U, 0x80U, 0x00U, 0x41U, 0x2EU,
|
0x80U, 0x00U, 0x42U, 0x77U, 0x51U, 0x0DU, 0x00U, 0x41U, 0x84U, 0x89U,
|
||||||
0x42U, 0x18U, 0x10U, 0x82U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x0BU,
|
0x80U, 0x80U, 0x00U, 0x41U, 0x39U, 0x42U, 0x1BU, 0x10U, 0x82U, 0x80U,
|
||||||
0x02U, 0x40U, 0x20U, 0x01U, 0x41U, 0xF4U, 0x00U, 0x10U, 0x81U, 0x80U,
|
0x80U, 0x80U, 0x00U, 0x1AU, 0x0BU, 0x41U, 0x01U, 0x10U, 0x83U, 0x80U,
|
||||||
0x80U, 0x80U, 0x00U, 0x42U, 0x77U, 0x51U, 0x0DU, 0x00U, 0x41U, 0x84U,
|
0x80U, 0x80U, 0x00U, 0x1AU, 0x02U, 0x40U, 0x20U, 0x01U, 0x41U, 0x20U,
|
||||||
0x89U, 0x80U, 0x80U, 0x00U, 0x41U, 0x39U, 0x42U, 0x1AU, 0x10U, 0x82U,
|
0x6AU, 0x41U, 0xF4U, 0x00U, 0x10U, 0x81U, 0x80U, 0x80U, 0x80U, 0x00U,
|
||||||
0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x0BU, 0x41U, 0x01U, 0x10U, 0x83U,
|
0x42U, 0xF4U, 0x00U, 0x51U, 0x0DU, 0x00U, 0x41U, 0xBDU, 0x89U, 0x80U,
|
||||||
0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x02U, 0x40U, 0x20U, 0x01U, 0x41U,
|
0x80U, 0x00U, 0x41U, 0x28U, 0x42U, 0x1EU, 0x10U, 0x82U, 0x80U, 0x80U,
|
||||||
0xF4U, 0x00U, 0x10U, 0x81U, 0x80U, 0x80U, 0x80U, 0x00U, 0x42U, 0xF4U,
|
0x80U, 0x00U, 0x1AU, 0x0BU, 0x20U, 0x01U, 0x41U, 0x18U, 0x6AU, 0x42U,
|
||||||
0x00U, 0x51U, 0x0DU, 0x00U, 0x41U, 0xBDU, 0x89U, 0x80U, 0x80U, 0x00U,
|
0x7FU, 0x37U, 0x03U, 0x00U, 0x20U, 0x01U, 0x41U, 0x10U, 0x6AU, 0x42U,
|
||||||
0x41U, 0x28U, 0x42U, 0x1DU, 0x10U, 0x82U, 0x80U, 0x80U, 0x80U, 0x00U,
|
0x7FU, 0x37U, 0x03U, 0x00U, 0x20U, 0x01U, 0x42U, 0x7FU, 0x37U, 0x03U,
|
||||||
0x1AU, 0x0BU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, 0x10U, 0x84U,
|
0x08U, 0x20U, 0x01U, 0x42U, 0x7FU, 0x37U, 0x03U, 0x00U, 0x02U, 0x40U,
|
||||||
0x80U, 0x80U, 0x80U, 0x00U, 0x21U, 0x02U, 0x20U, 0x01U, 0x41U, 0x80U,
|
0x20U, 0x01U, 0x41U, 0x20U, 0x41U, 0x7FU, 0x10U, 0x84U, 0x80U, 0x80U,
|
||||||
0x01U, 0x6AU, 0x24U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x20U, 0x02U,
|
0x80U, 0x00U, 0x42U, 0x20U, 0x51U, 0x0DU, 0x00U, 0x41U, 0xA1U, 0x8AU,
|
||||||
0x0BU, 0x0BU, 0xEDU, 0x01U, 0x01U, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU,
|
0x80U, 0x80U, 0x00U, 0x41U, 0x36U, 0x42U, 0x3AU, 0x10U, 0x82U, 0x80U,
|
||||||
0xE5U, 0x01U, 0x65U, 0x74U, 0x78U, 0x6EU, 0x5FU, 0x64U, 0x65U, 0x74U,
|
0x80U, 0x80U, 0x00U, 0x1AU, 0x0BU, 0x41U, 0xBCU, 0x80U, 0x80U, 0x80U,
|
||||||
0x61U, 0x69U, 0x6CU, 0x73U, 0x28U, 0x31U, 0x30U, 0x30U, 0x30U, 0x30U,
|
0x78U, 0x41U, 0x32U, 0x10U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU,
|
||||||
0x30U, 0x30U, 0x2CU, 0x20U, 0x31U, 0x31U, 0x36U, 0x29U, 0x20U, 0x3DU,
|
0x41U, 0x00U, 0x21U, 0x02U, 0x03U, 0x40U, 0x41U, 0xBCU, 0x80U, 0x80U,
|
||||||
0x3DU, 0x20U, 0x4FU, 0x55U, 0x54U, 0x5FU, 0x4FU, 0x46U, 0x5FU, 0x42U,
|
0x80U, 0x78U, 0x41U, 0x32U, 0x10U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U,
|
||||||
0x4FU, 0x55U, 0x4EU, 0x44U, 0x53U, 0x00U, 0x65U, 0x74U, 0x78U, 0x6EU,
|
0x1AU, 0x02U, 0x40U, 0x20U, 0x01U, 0x41U, 0x20U, 0x6AU, 0x20U, 0x02U,
|
||||||
0x5FU, 0x64U, 0x65U, 0x74U, 0x61U, 0x69U, 0x6CU, 0x73U, 0x28U, 0x30U,
|
0x6AU, 0x2DU, 0x00U, 0x00U, 0x20U, 0x02U, 0x41U, 0xF0U, 0x89U, 0x80U,
|
||||||
0x2CU, 0x20U, 0x31U, 0x30U, 0x30U, 0x30U, 0x30U, 0x30U, 0x30U, 0x29U,
|
0x80U, 0x00U, 0x6AU, 0x2DU, 0x00U, 0x00U, 0x46U, 0x0DU, 0x00U, 0x41U,
|
||||||
0x20U, 0x3DU, 0x3DU, 0x20U, 0x4FU, 0x55U, 0x54U, 0x5FU, 0x4FU, 0x46U,
|
0xD7U, 0x8AU, 0x80U, 0x80U, 0x00U, 0x41U, 0x17U, 0x42U, 0x3DU, 0x10U,
|
||||||
0x5FU, 0x42U, 0x4FU, 0x55U, 0x4EU, 0x44U, 0x53U, 0x00U, 0x65U, 0x74U,
|
0x82U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x0BU, 0x20U, 0x02U, 0x41U,
|
||||||
0x78U, 0x6EU, 0x5FU, 0x64U, 0x65U, 0x74U, 0x61U, 0x69U, 0x6CU, 0x73U,
|
0x01U, 0x6AU, 0x22U, 0x02U, 0x41U, 0x31U, 0x47U, 0x0DU, 0x00U, 0x0BU,
|
||||||
0x28U, 0x28U, 0x75U, 0x69U, 0x6EU, 0x74U, 0x33U, 0x32U, 0x5FU, 0x74U,
|
0x02U, 0x40U, 0x20U, 0x01U, 0x2DU, 0x00U, 0x51U, 0x41U, 0xDCU, 0x00U,
|
||||||
0x29U, 0x64U, 0x65U, 0x74U, 0x2CU, 0x20U, 0x31U, 0x31U, 0x35U, 0x29U,
|
0x46U, 0x0DU, 0x00U, 0x41U, 0xEEU, 0x8AU, 0x80U, 0x80U, 0x00U, 0x41U,
|
||||||
0x20U, 0x3DU, 0x3DU, 0x20U, 0x54U, 0x4FU, 0x4FU, 0x5FU, 0x53U, 0x4DU,
|
0x11U, 0x42U, 0x3EU, 0x10U, 0x82U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU,
|
||||||
0x41U, 0x4CU, 0x4CU, 0x00U, 0x65U, 0x74U, 0x78U, 0x6EU, 0x5FU, 0x64U,
|
0x0BU, 0x02U, 0x40U, 0x20U, 0x01U, 0x2DU, 0x00U, 0x72U, 0x41U, 0xDDU,
|
||||||
0x65U, 0x74U, 0x61U, 0x69U, 0x6CU, 0x73U, 0x28U, 0x28U, 0x75U, 0x69U,
|
0x00U, 0x46U, 0x0DU, 0x00U, 0x41U, 0xFFU, 0x8AU, 0x80U, 0x80U, 0x00U,
|
||||||
0x6EU, 0x74U, 0x33U, 0x32U, 0x5FU, 0x74U, 0x29U, 0x64U, 0x65U, 0x74U,
|
0x41U, 0x11U, 0x42U, 0xC2U, 0x00U, 0x10U, 0x82U, 0x80U, 0x80U, 0x80U,
|
||||||
0x2CU, 0x20U, 0x31U, 0x31U, 0x36U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U,
|
0x00U, 0x1AU, 0x0BU, 0x41U, 0xC3U, 0x80U, 0x80U, 0x80U, 0x78U, 0x41U,
|
||||||
0x50U, 0x52U, 0x45U, 0x52U, 0x45U, 0x51U, 0x55U, 0x49U, 0x53U, 0x49U,
|
0x21U, 0x10U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x20U, 0x01U,
|
||||||
0x54U, 0x45U, 0x5FU, 0x4EU, 0x4FU, 0x54U, 0x5FU, 0x4DU, 0x45U, 0x54U,
|
0x41U, 0xF3U, 0x00U, 0x6AU, 0x21U, 0x03U, 0x41U, 0x00U, 0x21U, 0x02U,
|
||||||
0x00U, 0x65U, 0x74U, 0x78U, 0x6EU, 0x5FU, 0x64U, 0x65U, 0x74U, 0x61U,
|
0x03U, 0x40U, 0x41U, 0xC3U, 0x80U, 0x80U, 0x80U, 0x78U, 0x41U, 0x21U,
|
||||||
0x69U, 0x6CU, 0x73U, 0x28U, 0x28U, 0x75U, 0x69U, 0x6EU, 0x74U, 0x33U,
|
0x10U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x02U, 0x40U, 0x20U,
|
||||||
0x32U, 0x5FU, 0x74U, 0x29U, 0x64U, 0x65U, 0x74U, 0x2CU, 0x20U, 0x31U,
|
0x03U, 0x20U, 0x02U, 0x6AU, 0x2DU, 0x00U, 0x00U, 0x20U, 0x01U, 0x20U,
|
||||||
0x31U, 0x36U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x31U, 0x31U, 0x36U,
|
0x02U, 0x6AU, 0x2DU, 0x00U, 0x00U, 0x46U, 0x0DU, 0x00U, 0x41U, 0x90U,
|
||||||
0x00U,
|
0x8BU, 0x80U, 0x80U, 0x00U, 0x41U, 0x25U, 0x42U, 0xC4U, 0x00U, 0x10U,
|
||||||
|
0x82U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x0BU, 0x20U, 0x02U, 0x41U,
|
||||||
|
0x01U, 0x6AU, 0x22U, 0x02U, 0x41U, 0x20U, 0x47U, 0x0DU, 0x00U, 0x0BU,
|
||||||
|
0x02U, 0x40U, 0x20U, 0x01U, 0x2DU, 0x00U, 0x93U, 0x01U, 0x41U, 0xE1U,
|
||||||
|
0x01U, 0x46U, 0x0DU, 0x00U, 0x41U, 0xB5U, 0x8BU, 0x80U, 0x80U, 0x00U,
|
||||||
|
0x41U, 0x11U, 0x42U, 0xC5U, 0x00U, 0x10U, 0x82U, 0x80U, 0x80U, 0x80U,
|
||||||
|
0x00U, 0x1AU, 0x0BU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U, 0x10U,
|
||||||
|
0x85U, 0x80U, 0x80U, 0x80U, 0x00U, 0x21U, 0x04U, 0x20U, 0x01U, 0x41U,
|
||||||
|
0xA0U, 0x01U, 0x6AU, 0x24U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x20U,
|
||||||
|
0x04U, 0x0BU, 0x0BU, 0xCEU, 0x03U, 0x01U, 0x00U, 0x41U, 0x80U, 0x08U,
|
||||||
|
0x0BU, 0xC6U, 0x03U, 0x65U, 0x74U, 0x78U, 0x6EU, 0x5FU, 0x64U, 0x65U,
|
||||||
|
0x74U, 0x61U, 0x69U, 0x6CU, 0x73U, 0x28U, 0x31U, 0x30U, 0x30U, 0x30U,
|
||||||
|
0x30U, 0x30U, 0x30U, 0x2CU, 0x20U, 0x31U, 0x31U, 0x36U, 0x29U, 0x20U,
|
||||||
|
0x3DU, 0x3DU, 0x20U, 0x4FU, 0x55U, 0x54U, 0x5FU, 0x4FU, 0x46U, 0x5FU,
|
||||||
|
0x42U, 0x4FU, 0x55U, 0x4EU, 0x44U, 0x53U, 0x00U, 0x65U, 0x74U, 0x78U,
|
||||||
|
0x6EU, 0x5FU, 0x64U, 0x65U, 0x74U, 0x61U, 0x69U, 0x6CU, 0x73U, 0x28U,
|
||||||
|
0x30U, 0x2CU, 0x20U, 0x31U, 0x30U, 0x30U, 0x30U, 0x30U, 0x30U, 0x30U,
|
||||||
|
0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x4FU, 0x55U, 0x54U, 0x5FU, 0x4FU,
|
||||||
|
0x46U, 0x5FU, 0x42U, 0x4FU, 0x55U, 0x4EU, 0x44U, 0x53U, 0x00U, 0x65U,
|
||||||
|
0x74U, 0x78U, 0x6EU, 0x5FU, 0x64U, 0x65U, 0x74U, 0x61U, 0x69U, 0x6CU,
|
||||||
|
0x73U, 0x28U, 0x28U, 0x75U, 0x69U, 0x6EU, 0x74U, 0x33U, 0x32U, 0x5FU,
|
||||||
|
0x74U, 0x29U, 0x64U, 0x65U, 0x74U, 0x2CU, 0x20U, 0x31U, 0x31U, 0x35U,
|
||||||
|
0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x54U, 0x4FU, 0x4FU, 0x5FU, 0x53U,
|
||||||
|
0x4DU, 0x41U, 0x4CU, 0x4CU, 0x00U, 0x65U, 0x74U, 0x78U, 0x6EU, 0x5FU,
|
||||||
|
0x64U, 0x65U, 0x74U, 0x61U, 0x69U, 0x6CU, 0x73U, 0x28U, 0x28U, 0x75U,
|
||||||
|
0x69U, 0x6EU, 0x74U, 0x33U, 0x32U, 0x5FU, 0x74U, 0x29U, 0x64U, 0x65U,
|
||||||
|
0x74U, 0x2CU, 0x20U, 0x31U, 0x31U, 0x36U, 0x29U, 0x20U, 0x3DU, 0x3DU,
|
||||||
|
0x20U, 0x50U, 0x52U, 0x45U, 0x52U, 0x45U, 0x51U, 0x55U, 0x49U, 0x53U,
|
||||||
|
0x49U, 0x54U, 0x45U, 0x5FU, 0x4EU, 0x4FU, 0x54U, 0x5FU, 0x4DU, 0x45U,
|
||||||
|
0x54U, 0x00U, 0x65U, 0x74U, 0x78U, 0x6EU, 0x5FU, 0x64U, 0x65U, 0x74U,
|
||||||
|
0x61U, 0x69U, 0x6CU, 0x73U, 0x28U, 0x28U, 0x75U, 0x69U, 0x6EU, 0x74U,
|
||||||
|
0x33U, 0x32U, 0x5FU, 0x74U, 0x29U, 0x64U, 0x65U, 0x74U, 0x2CU, 0x20U,
|
||||||
|
0x31U, 0x31U, 0x36U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x31U, 0x31U,
|
||||||
|
0x36U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U,
|
||||||
|
0x00U, 0x00U, 0x00U, 0xEDU, 0x20U, 0x2EU, 0x00U, 0x00U, 0x00U, 0x01U,
|
||||||
|
0x3DU, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x01U, 0x5BU,
|
||||||
|
0xB8U, 0x05U, 0xD6U, 0xC3U, 0x52U, 0xDFU, 0x7AU, 0x27U, 0x76U, 0x6DU,
|
||||||
|
0xC0U, 0x20U, 0x47U, 0xB7U, 0x64U, 0x22U, 0x5AU, 0xB7U, 0x5DU, 0xF3U,
|
||||||
|
0xFAU, 0x0DU, 0xE3U, 0xBDU, 0xC6U, 0x40U, 0xBAU, 0xD0U, 0x0AU, 0x66U,
|
||||||
|
0xEBU, 0x68U, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x5FU, 0x68U, 0x61U, 0x73U,
|
||||||
|
0x68U, 0x28U, 0x28U, 0x75U, 0x69U, 0x6EU, 0x74U, 0x33U, 0x32U, 0x5FU,
|
||||||
|
0x74U, 0x29U, 0x65U, 0x78U, 0x70U, 0x65U, 0x63U, 0x74U, 0x65U, 0x64U,
|
||||||
|
0x5FU, 0x68U, 0x6FU, 0x6FU, 0x6BU, 0x5FU, 0x68U, 0x61U, 0x73U, 0x68U,
|
||||||
|
0x2CU, 0x20U, 0x33U, 0x32U, 0x2CU, 0x20U, 0x2DU, 0x31U, 0x29U, 0x20U,
|
||||||
|
0x3DU, 0x3DU, 0x20U, 0x33U, 0x32U, 0x00U, 0x64U, 0x65U, 0x74U, 0x5BU,
|
||||||
|
0x69U, 0x5DU, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x65U, 0x78U, 0x70U, 0x65U,
|
||||||
|
0x63U, 0x74U, 0x65U, 0x64U, 0x31U, 0x5BU, 0x69U, 0x5DU, 0x00U, 0x64U,
|
||||||
|
0x65U, 0x74U, 0x5BU, 0x34U, 0x39U, 0x5DU, 0x20U, 0x3DU, 0x3DU, 0x20U,
|
||||||
|
0x30U, 0x78U, 0x35U, 0x43U, 0x55U, 0x00U, 0x64U, 0x65U, 0x74U, 0x5BU,
|
||||||
|
0x38U, 0x32U, 0x5DU, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x30U, 0x78U, 0x35U,
|
||||||
|
0x44U, 0x55U, 0x00U, 0x64U, 0x65U, 0x74U, 0x5BU, 0x38U, 0x33U, 0x20U,
|
||||||
|
0x2BU, 0x20U, 0x69U, 0x5DU, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x65U, 0x78U,
|
||||||
|
0x70U, 0x65U, 0x63U, 0x74U, 0x65U, 0x64U, 0x5FU, 0x68U, 0x6FU, 0x6FU,
|
||||||
|
0x6BU, 0x5FU, 0x68U, 0x61U, 0x73U, 0x68U, 0x5BU, 0x69U, 0x5DU, 0x00U,
|
||||||
|
0x64U, 0x65U, 0x74U, 0x5BU, 0x31U, 0x31U, 0x35U, 0x5DU, 0x20U, 0x3DU,
|
||||||
|
0x3DU, 0x20U, 0x30U, 0x78U, 0x45U, 0x31U, 0x00U,
|
||||||
}},
|
}},
|
||||||
|
|
||||||
/* ==== WASM: 8 ==== */
|
/* ==== WASM: 8 ==== */
|
||||||
@@ -1422,6 +1523,7 @@ std::map<std::string, std::vector<uint8_t>> wasm = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(etxn_nonce((uint32_t)nonce, 116) == TOO_MANY_NONCES);
|
ASSERT(etxn_nonce((uint32_t)nonce, 116) == TOO_MANY_NONCES);
|
||||||
|
ASSERT(etxn_nonce((uint32_t)nonce, 31) == TOO_MANY_NONCES);
|
||||||
|
|
||||||
return accept(0,0,0);
|
return accept(0,0,0);
|
||||||
}
|
}
|
||||||
@@ -1437,12 +1539,12 @@ std::map<std::string, std::vector<uint8_t>> wasm = {
|
|||||||
0x6FU, 0x6CU, 0x6CU, 0x62U, 0x61U, 0x63U, 0x6BU, 0x00U, 0x02U, 0x03U,
|
0x6FU, 0x6CU, 0x6CU, 0x62U, 0x61U, 0x63U, 0x6BU, 0x00U, 0x02U, 0x03U,
|
||||||
0x65U, 0x6EU, 0x76U, 0x06U, 0x61U, 0x63U, 0x63U, 0x65U, 0x70U, 0x74U,
|
0x65U, 0x6EU, 0x76U, 0x06U, 0x61U, 0x63U, 0x63U, 0x65U, 0x70U, 0x74U,
|
||||||
0x00U, 0x02U, 0x03U, 0x02U, 0x01U, 0x03U, 0x05U, 0x03U, 0x01U, 0x00U,
|
0x00U, 0x02U, 0x03U, 0x02U, 0x01U, 0x03U, 0x05U, 0x03U, 0x01U, 0x00U,
|
||||||
0x02U, 0x06U, 0x21U, 0x05U, 0x7FU, 0x01U, 0x41U, 0xA0U, 0x8AU, 0x04U,
|
0x02U, 0x06U, 0x21U, 0x05U, 0x7FU, 0x01U, 0x41U, 0xE0U, 0x8AU, 0x04U,
|
||||||
0x0BU, 0x7FU, 0x00U, 0x41U, 0x9EU, 0x0AU, 0x0BU, 0x7FU, 0x00U, 0x41U,
|
0x0BU, 0x7FU, 0x00U, 0x41U, 0xD1U, 0x0AU, 0x0BU, 0x7FU, 0x00U, 0x41U,
|
||||||
0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0xA0U, 0x8AU, 0x04U, 0x0BU,
|
0x80U, 0x08U, 0x0BU, 0x7FU, 0x00U, 0x41U, 0xE0U, 0x8AU, 0x04U, 0x0BU,
|
||||||
0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x07U, 0x08U, 0x01U, 0x04U,
|
0x7FU, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0x07U, 0x08U, 0x01U, 0x04U,
|
||||||
0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x04U, 0x0AU, 0xE1U, 0x82U, 0x00U,
|
0x68U, 0x6FU, 0x6FU, 0x6BU, 0x00U, 0x04U, 0x0AU, 0x84U, 0x83U, 0x00U,
|
||||||
0x01U, 0xDDU, 0x82U, 0x00U, 0x02U, 0x02U, 0x7FU, 0x01U, 0x7EU, 0x23U,
|
0x01U, 0x80U, 0x83U, 0x00U, 0x02U, 0x02U, 0x7FU, 0x01U, 0x7EU, 0x23U,
|
||||||
0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x41U, 0xC0U, 0x00U, 0x6BU, 0x22U,
|
0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x41U, 0xC0U, 0x00U, 0x6BU, 0x22U,
|
||||||
0x01U, 0x24U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x41U, 0x01U, 0x41U,
|
0x01U, 0x24U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x41U, 0x01U, 0x41U,
|
||||||
0x01U, 0x10U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x02U, 0x40U,
|
0x01U, 0x10U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x02U, 0x40U,
|
||||||
@@ -1474,39 +1576,48 @@ std::map<std::string, std::vector<uint8_t>> wasm = {
|
|||||||
0x20U, 0x01U, 0x41U, 0xF4U, 0x00U, 0x10U, 0x81U, 0x80U, 0x80U, 0x80U,
|
0x20U, 0x01U, 0x41U, 0xF4U, 0x00U, 0x10U, 0x81U, 0x80U, 0x80U, 0x80U,
|
||||||
0x00U, 0x42U, 0x74U, 0x51U, 0x0DU, 0x00U, 0x41U, 0xEAU, 0x89U, 0x80U,
|
0x00U, 0x42U, 0x74U, 0x51U, 0x0DU, 0x00U, 0x41U, 0xEAU, 0x89U, 0x80U,
|
||||||
0x80U, 0x00U, 0x41U, 0x34U, 0x42U, 0x23U, 0x10U, 0x82U, 0x80U, 0x80U,
|
0x80U, 0x00U, 0x41U, 0x34U, 0x42U, 0x23U, 0x10U, 0x82U, 0x80U, 0x80U,
|
||||||
0x80U, 0x00U, 0x1AU, 0x0BU, 0x41U, 0x00U, 0x41U, 0x00U, 0x42U, 0x00U,
|
0x80U, 0x00U, 0x1AU, 0x0BU, 0x02U, 0x40U, 0x20U, 0x01U, 0x41U, 0x1FU,
|
||||||
0x10U, 0x83U, 0x80U, 0x80U, 0x80U, 0x00U, 0x21U, 0x03U, 0x20U, 0x01U,
|
0x10U, 0x81U, 0x80U, 0x80U, 0x80U, 0x00U, 0x42U, 0x74U, 0x51U, 0x0DU,
|
||||||
0x41U, 0xC0U, 0x00U, 0x6AU, 0x24U, 0x80U, 0x80U, 0x80U, 0x80U, 0x00U,
|
0x00U, 0x41U, 0x9EU, 0x8AU, 0x80U, 0x80U, 0x00U, 0x41U, 0x33U, 0x42U,
|
||||||
0x20U, 0x03U, 0x0BU, 0x0BU, 0xA6U, 0x02U, 0x01U, 0x00U, 0x41U, 0x80U,
|
0x24U, 0x10U, 0x82U, 0x80U, 0x80U, 0x80U, 0x00U, 0x1AU, 0x0BU, 0x41U,
|
||||||
0x08U, 0x0BU, 0x9EU, 0x02U, 0x65U, 0x74U, 0x78U, 0x6EU, 0x5FU, 0x6EU,
|
0x00U, 0x41U, 0x00U, 0x42U, 0x00U, 0x10U, 0x83U, 0x80U, 0x80U, 0x80U,
|
||||||
0x6FU, 0x6EU, 0x63U, 0x65U, 0x28U, 0x31U, 0x30U, 0x30U, 0x30U, 0x30U,
|
0x00U, 0x21U, 0x03U, 0x20U, 0x01U, 0x41U, 0xC0U, 0x00U, 0x6AU, 0x24U,
|
||||||
0x30U, 0x30U, 0x2CU, 0x20U, 0x31U, 0x31U, 0x36U, 0x29U, 0x20U, 0x3DU,
|
0x80U, 0x80U, 0x80U, 0x80U, 0x00U, 0x20U, 0x03U, 0x0BU, 0x0BU, 0xD9U,
|
||||||
0x3DU, 0x20U, 0x4FU, 0x55U, 0x54U, 0x5FU, 0x4FU, 0x46U, 0x5FU, 0x42U,
|
0x02U, 0x01U, 0x00U, 0x41U, 0x80U, 0x08U, 0x0BU, 0xD1U, 0x02U, 0x65U,
|
||||||
0x4FU, 0x55U, 0x4EU, 0x44U, 0x53U, 0x00U, 0x65U, 0x74U, 0x78U, 0x6EU,
|
0x74U, 0x78U, 0x6EU, 0x5FU, 0x6EU, 0x6FU, 0x6EU, 0x63U, 0x65U, 0x28U,
|
||||||
0x5FU, 0x6EU, 0x6FU, 0x6EU, 0x63U, 0x65U, 0x28U, 0x30U, 0x2CU, 0x20U,
|
0x31U, 0x30U, 0x30U, 0x30U, 0x30U, 0x30U, 0x30U, 0x2CU, 0x20U, 0x31U,
|
||||||
0x31U, 0x30U, 0x30U, 0x30U, 0x30U, 0x30U, 0x30U, 0x29U, 0x20U, 0x3DU,
|
0x31U, 0x36U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x4FU, 0x55U, 0x54U,
|
||||||
0x3DU, 0x20U, 0x4FU, 0x55U, 0x54U, 0x5FU, 0x4FU, 0x46U, 0x5FU, 0x42U,
|
0x5FU, 0x4FU, 0x46U, 0x5FU, 0x42U, 0x4FU, 0x55U, 0x4EU, 0x44U, 0x53U,
|
||||||
0x4FU, 0x55U, 0x4EU, 0x44U, 0x53U, 0x00U, 0x65U, 0x74U, 0x78U, 0x6EU,
|
0x00U, 0x65U, 0x74U, 0x78U, 0x6EU, 0x5FU, 0x6EU, 0x6FU, 0x6EU, 0x63U,
|
||||||
0x5FU, 0x6EU, 0x6FU, 0x6EU, 0x63U, 0x65U, 0x28U, 0x28U, 0x75U, 0x69U,
|
0x65U, 0x28U, 0x30U, 0x2CU, 0x20U, 0x31U, 0x30U, 0x30U, 0x30U, 0x30U,
|
||||||
0x6EU, 0x74U, 0x33U, 0x32U, 0x5FU, 0x74U, 0x29U, 0x6EU, 0x6FU, 0x6EU,
|
0x30U, 0x30U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x4FU, 0x55U, 0x54U,
|
||||||
0x63U, 0x65U, 0x2CU, 0x20U, 0x33U, 0x31U, 0x29U, 0x20U, 0x3DU, 0x3DU,
|
0x5FU, 0x4FU, 0x46U, 0x5FU, 0x42U, 0x4FU, 0x55U, 0x4EU, 0x44U, 0x53U,
|
||||||
0x20U, 0x54U, 0x4FU, 0x4FU, 0x5FU, 0x53U, 0x4DU, 0x41U, 0x4CU, 0x4CU,
|
|
||||||
0x00U, 0x65U, 0x74U, 0x78U, 0x6EU, 0x5FU, 0x6EU, 0x6FU, 0x6EU, 0x63U,
|
0x00U, 0x65U, 0x74U, 0x78U, 0x6EU, 0x5FU, 0x6EU, 0x6FU, 0x6EU, 0x63U,
|
||||||
0x65U, 0x28U, 0x28U, 0x75U, 0x69U, 0x6EU, 0x74U, 0x33U, 0x32U, 0x5FU,
|
0x65U, 0x28U, 0x28U, 0x75U, 0x69U, 0x6EU, 0x74U, 0x33U, 0x32U, 0x5FU,
|
||||||
0x74U, 0x29U, 0x6EU, 0x6FU, 0x6EU, 0x63U, 0x65U, 0x20U, 0x2BU, 0x20U,
|
0x74U, 0x29U, 0x6EU, 0x6FU, 0x6EU, 0x63U, 0x65U, 0x2CU, 0x20U, 0x33U,
|
||||||
0x28U, 0x28U, 0x69U, 0x20U, 0x25U, 0x20U, 0x32U, 0x29U, 0x20U, 0x2AU,
|
0x31U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x54U, 0x4FU, 0x4FU, 0x5FU,
|
||||||
0x20U, 0x33U, 0x32U, 0x29U, 0x2CU, 0x20U, 0x33U, 0x32U, 0x29U, 0x20U,
|
0x53U, 0x4DU, 0x41U, 0x4CU, 0x4CU, 0x00U, 0x65U, 0x74U, 0x78U, 0x6EU,
|
||||||
0x3DU, 0x3DU, 0x20U, 0x33U, 0x32U, 0x00U, 0x21U, 0x28U, 0x2AU, 0x28U,
|
0x5FU, 0x6EU, 0x6FU, 0x6EU, 0x63U, 0x65U, 0x28U, 0x28U, 0x75U, 0x69U,
|
||||||
0x6EU, 0x31U, 0x20U, 0x2BU, 0x20U, 0x30U, 0x29U, 0x20U, 0x3DU, 0x3DU,
|
0x6EU, 0x74U, 0x33U, 0x32U, 0x5FU, 0x74U, 0x29U, 0x6EU, 0x6FU, 0x6EU,
|
||||||
0x20U, 0x2AU, 0x28U, 0x6EU, 0x32U, 0x20U, 0x2BU, 0x20U, 0x30U, 0x29U,
|
0x63U, 0x65U, 0x20U, 0x2BU, 0x20U, 0x28U, 0x28U, 0x69U, 0x20U, 0x25U,
|
||||||
0x20U, 0x26U, 0x26U, 0x20U, 0x2AU, 0x28U, 0x6EU, 0x31U, 0x20U, 0x2BU,
|
0x20U, 0x32U, 0x29U, 0x20U, 0x2AU, 0x20U, 0x33U, 0x32U, 0x29U, 0x2CU,
|
||||||
0x20U, 0x31U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x2AU, 0x28U, 0x6EU,
|
0x20U, 0x33U, 0x32U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x33U, 0x32U,
|
||||||
0x32U, 0x20U, 0x2BU, 0x20U, 0x31U, 0x29U, 0x29U, 0x00U, 0x65U, 0x74U,
|
0x00U, 0x21U, 0x28U, 0x2AU, 0x28U, 0x6EU, 0x31U, 0x20U, 0x2BU, 0x20U,
|
||||||
0x78U, 0x6EU, 0x5FU, 0x6EU, 0x6FU, 0x6EU, 0x63U, 0x65U, 0x28U, 0x28U,
|
0x30U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x2AU, 0x28U, 0x6EU, 0x32U,
|
||||||
0x75U, 0x69U, 0x6EU, 0x74U, 0x33U, 0x32U, 0x5FU, 0x74U, 0x29U, 0x6EU,
|
0x20U, 0x2BU, 0x20U, 0x30U, 0x29U, 0x20U, 0x26U, 0x26U, 0x20U, 0x2AU,
|
||||||
0x6FU, 0x6EU, 0x63U, 0x65U, 0x2CU, 0x20U, 0x31U, 0x31U, 0x36U, 0x29U,
|
0x28U, 0x6EU, 0x31U, 0x20U, 0x2BU, 0x20U, 0x31U, 0x29U, 0x20U, 0x3DU,
|
||||||
0x20U, 0x3DU, 0x3DU, 0x20U, 0x54U, 0x4FU, 0x4FU, 0x5FU, 0x4DU, 0x41U,
|
0x3DU, 0x20U, 0x2AU, 0x28U, 0x6EU, 0x32U, 0x20U, 0x2BU, 0x20U, 0x31U,
|
||||||
0x4EU, 0x59U, 0x5FU, 0x4EU, 0x4FU, 0x4EU, 0x43U, 0x45U, 0x53U, 0x00U,
|
0x29U, 0x29U, 0x00U, 0x65U, 0x74U, 0x78U, 0x6EU, 0x5FU, 0x6EU, 0x6FU,
|
||||||
|
0x6EU, 0x63U, 0x65U, 0x28U, 0x28U, 0x75U, 0x69U, 0x6EU, 0x74U, 0x33U,
|
||||||
|
0x32U, 0x5FU, 0x74U, 0x29U, 0x6EU, 0x6FU, 0x6EU, 0x63U, 0x65U, 0x2CU,
|
||||||
|
0x20U, 0x31U, 0x31U, 0x36U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U, 0x54U,
|
||||||
|
0x4FU, 0x4FU, 0x5FU, 0x4DU, 0x41U, 0x4EU, 0x59U, 0x5FU, 0x4EU, 0x4FU,
|
||||||
|
0x4EU, 0x43U, 0x45U, 0x53U, 0x00U, 0x65U, 0x74U, 0x78U, 0x6EU, 0x5FU,
|
||||||
|
0x6EU, 0x6FU, 0x6EU, 0x63U, 0x65U, 0x28U, 0x28U, 0x75U, 0x69U, 0x6EU,
|
||||||
|
0x74U, 0x33U, 0x32U, 0x5FU, 0x74U, 0x29U, 0x6EU, 0x6FU, 0x6EU, 0x63U,
|
||||||
|
0x65U, 0x2CU, 0x20U, 0x33U, 0x31U, 0x29U, 0x20U, 0x3DU, 0x3DU, 0x20U,
|
||||||
|
0x54U, 0x4FU, 0x4FU, 0x5FU, 0x4DU, 0x41U, 0x4EU, 0x59U, 0x5FU, 0x4EU,
|
||||||
|
0x4FU, 0x4EU, 0x43U, 0x45U, 0x53U, 0x00U,
|
||||||
}},
|
}},
|
||||||
|
|
||||||
/* ==== WASM: 10 ==== */
|
/* ==== WASM: 10 ==== */
|
||||||
|
|||||||
@@ -20,9 +20,13 @@
|
|||||||
#ifndef RIPPLE_TEST_JTX_HOOK_H_INCLUDED
|
#ifndef RIPPLE_TEST_JTX_HOOK_H_INCLUDED
|
||||||
#define RIPPLE_TEST_JTX_HOOK_H_INCLUDED
|
#define RIPPLE_TEST_JTX_HOOK_H_INCLUDED
|
||||||
|
|
||||||
|
#include <ripple/app/hook/applyHook.h>
|
||||||
#include <ripple/json/json_value.h>
|
#include <ripple/json/json_value.h>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <map>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <test/jtx/Account.h>
|
#include <test/jtx/Account.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
namespace test {
|
namespace test {
|
||||||
@@ -43,6 +47,75 @@ hso(std::string const& wasmHex, void (*f)(Json::Value& jv) = 0);
|
|||||||
Json::Value
|
Json::Value
|
||||||
hso_delete(void (*f)(Json::Value& jv) = 0);
|
hso_delete(void (*f)(Json::Value& jv) = 0);
|
||||||
|
|
||||||
|
struct StubHookResult
|
||||||
|
{
|
||||||
|
ripple::uint256 const hookSetTxnID = ripple::uint256();
|
||||||
|
ripple::uint256 const hookHash = ripple::uint256();
|
||||||
|
ripple::uint256 const hookCanEmit = ripple::uint256();
|
||||||
|
ripple::uint256 const hookNamespace = ripple::uint256();
|
||||||
|
|
||||||
|
std::queue<std::shared_ptr<ripple::Transaction>> emittedTxn{};
|
||||||
|
std::optional<hook::HookStateMap> stateMap = std::nullopt;
|
||||||
|
uint16_t changedStateCount = 0;
|
||||||
|
std::map<
|
||||||
|
ripple::uint256, // hook hash
|
||||||
|
std::map<
|
||||||
|
std::vector<uint8_t>, // hook param name
|
||||||
|
std::vector<uint8_t> // hook param value
|
||||||
|
>>
|
||||||
|
hookParamOverrides = {};
|
||||||
|
|
||||||
|
std::optional<std::map<std::vector<uint8_t>, std::vector<uint8_t>>>
|
||||||
|
hookParams = std::nullopt;
|
||||||
|
std::set<ripple::uint256> hookSkips = {};
|
||||||
|
hook_api::ExitType exitType = hook_api::ExitType::ROLLBACK;
|
||||||
|
std::string exitReason{""};
|
||||||
|
int64_t exitCode{-1};
|
||||||
|
uint64_t instructionCount{0};
|
||||||
|
bool hasCallback = false;
|
||||||
|
bool isCallback = false;
|
||||||
|
bool isStrong = false;
|
||||||
|
uint32_t wasmParam = 0;
|
||||||
|
uint32_t overrideCount = 0;
|
||||||
|
uint8_t hookChainPosition = 0;
|
||||||
|
bool foreignStateSetDisabled = false;
|
||||||
|
bool executeAgainAsWeak = false;
|
||||||
|
std::shared_ptr<STObject const> provisionalMeta = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct StubHookContext
|
||||||
|
{
|
||||||
|
std::map<uint32_t, hook::SlotEntry> slot{};
|
||||||
|
std::queue<uint32_t> slot_free{};
|
||||||
|
uint32_t slot_counter{0};
|
||||||
|
uint16_t emit_nonce_counter{0};
|
||||||
|
uint16_t ledger_nonce_counter{0};
|
||||||
|
int64_t expected_etxn_count{-1};
|
||||||
|
std::map<ripple::uint256, bool> nonce_used{};
|
||||||
|
uint32_t generation = 0;
|
||||||
|
uint64_t burden = 0;
|
||||||
|
std::map<uint32_t, uint32_t> guard_map{};
|
||||||
|
StubHookResult result = {};
|
||||||
|
std::optional<ripple::STObject> emitFailure = std::nullopt;
|
||||||
|
const hook::HookExecutor* module = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Overload that takes external stateMap to avoid dangling reference
|
||||||
|
hook::HookContext
|
||||||
|
makeStubHookContext(
|
||||||
|
ripple::ApplyContext& applyCtx,
|
||||||
|
ripple::AccountID const& hookAccount,
|
||||||
|
ripple::AccountID const& otxnAccount,
|
||||||
|
StubHookContext const& stubHookContext,
|
||||||
|
hook::HookStateMap& stateMap);
|
||||||
|
|
||||||
|
hook::HookContext
|
||||||
|
makeStubHookContext(
|
||||||
|
ripple::ApplyContext& applyCtx,
|
||||||
|
ripple::AccountID const& hookAccount,
|
||||||
|
ripple::AccountID const& otxnAccount,
|
||||||
|
StubHookContext const& stubHookContext);
|
||||||
|
|
||||||
} // namespace jtx
|
} // namespace jtx
|
||||||
} // namespace test
|
} // namespace test
|
||||||
} // namespace ripple
|
} // namespace ripple
|
||||||
|
|||||||
@@ -18,7 +18,9 @@
|
|||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
|
||||||
#include <ripple/app/hook/Enum.h>
|
#include <ripple/app/hook/Enum.h>
|
||||||
|
#include <ripple/app/hook/applyHook.h>
|
||||||
#include <ripple/basics/contract.h>
|
#include <ripple/basics/contract.h>
|
||||||
|
#include <ripple/protocol/Keylet.h>
|
||||||
#include <ripple/protocol/jss.h>
|
#include <ripple/protocol/jss.h>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <test/jtx/hook.h>
|
#include <test/jtx/hook.h>
|
||||||
@@ -102,6 +104,81 @@ hso(std::string const& wasmHex, void (*f)(Json::Value& jv))
|
|||||||
return jv;
|
return jv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Helper function to create HookContext with external stateMap
|
||||||
|
hook::HookContext
|
||||||
|
makeStubHookContext(
|
||||||
|
ripple::ApplyContext& applyCtx,
|
||||||
|
ripple::AccountID const& hookAccount,
|
||||||
|
ripple::AccountID const& otxnAccount,
|
||||||
|
StubHookContext const& stubHookContext,
|
||||||
|
hook::HookStateMap& stateMap)
|
||||||
|
{
|
||||||
|
auto& result = stubHookContext.result;
|
||||||
|
auto hookParams = result.hookParams.value_or(
|
||||||
|
std::map<std::vector<uint8_t>, std::vector<uint8_t>>{});
|
||||||
|
return hook::HookContext{
|
||||||
|
.applyCtx = applyCtx,
|
||||||
|
.slot = stubHookContext.slot,
|
||||||
|
.slot_free = stubHookContext.slot_free,
|
||||||
|
.slot_counter = stubHookContext.slot_counter,
|
||||||
|
.emit_nonce_counter = stubHookContext.emit_nonce_counter,
|
||||||
|
.ledger_nonce_counter = stubHookContext.ledger_nonce_counter,
|
||||||
|
.expected_etxn_count = stubHookContext.expected_etxn_count,
|
||||||
|
.nonce_used = stubHookContext.nonce_used,
|
||||||
|
.generation = stubHookContext.generation,
|
||||||
|
.burden = stubHookContext.burden,
|
||||||
|
.guard_map = stubHookContext.guard_map,
|
||||||
|
.result =
|
||||||
|
{
|
||||||
|
.hookSetTxnID = result.hookSetTxnID,
|
||||||
|
.hookHash = result.hookHash,
|
||||||
|
.hookCanEmit = result.hookCanEmit,
|
||||||
|
.accountKeylet = keylet::account(hookAccount),
|
||||||
|
.hookKeylet = keylet::hook(hookAccount),
|
||||||
|
.account = hookAccount,
|
||||||
|
.otxnAccount = otxnAccount,
|
||||||
|
.hookNamespace = result.hookNamespace,
|
||||||
|
.emittedTxn = result.emittedTxn,
|
||||||
|
.stateMap = stateMap,
|
||||||
|
.changedStateCount = result.changedStateCount,
|
||||||
|
.hookParamOverrides = result.hookParamOverrides,
|
||||||
|
.hookParams = hookParams,
|
||||||
|
.hookSkips = result.hookSkips,
|
||||||
|
.exitType = result.exitType,
|
||||||
|
.exitReason = result.exitReason,
|
||||||
|
.exitCode = result.exitCode,
|
||||||
|
.instructionCount = result.instructionCount,
|
||||||
|
.hasCallback = result.hasCallback,
|
||||||
|
.isCallback = result.isCallback,
|
||||||
|
.isStrong = result.isStrong,
|
||||||
|
.wasmParam = result.wasmParam,
|
||||||
|
.overrideCount = result.overrideCount,
|
||||||
|
.hookChainPosition = result.hookChainPosition,
|
||||||
|
.foreignStateSetDisabled = result.foreignStateSetDisabled,
|
||||||
|
.executeAgainAsWeak = result.executeAgainAsWeak,
|
||||||
|
.provisionalMeta = result.provisionalMeta,
|
||||||
|
},
|
||||||
|
.emitFailure = stubHookContext.emitFailure,
|
||||||
|
.module = nullptr};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Original function - WARNING: stateMap reference may become dangling
|
||||||
|
// Only use when stateMap access is not needed after HookContext creation
|
||||||
|
hook::HookContext
|
||||||
|
makeStubHookContext(
|
||||||
|
ripple::ApplyContext& applyCtx,
|
||||||
|
ripple::AccountID const& hookAccount,
|
||||||
|
ripple::AccountID const& otxnAccount,
|
||||||
|
StubHookContext const& stubHookContext)
|
||||||
|
{
|
||||||
|
// Use thread_local to keep stateMap alive
|
||||||
|
// Note: This is a workaround; each call resets the stateMap
|
||||||
|
thread_local hook::HookStateMap stateMap;
|
||||||
|
stateMap = stubHookContext.result.stateMap.value_or(hook::HookStateMap{});
|
||||||
|
return makeStubHookContext(
|
||||||
|
applyCtx, hookAccount, otxnAccount, stubHookContext, stateMap);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace jtx
|
} // namespace jtx
|
||||||
} // namespace test
|
} // namespace test
|
||||||
} // namespace ripple
|
} // namespace ripple
|
||||||
|
|||||||
Reference in New Issue
Block a user