Open3
XRPL Hooksでemitとcbakを同時に利用する
Cで記述したHookにおいてemit
とcbak
を同時に使う場合、次のようなコードだとエラーになる。
#include "hookapi.h"
int64_t hook(uint32_t reserved) {
_g(1, 1);
etxn_reserve(1);
// ...
uint8_t tx_result[32];
int64_t result = emit(SBUF(tx_result), tx, PREPARE_PAYMENT_SIMPLE_SIZE);
REQUIRE(result > 0, "failed.");
DONE("success");
return 0;
}
int64_t cbak(uint32_t what) {
return 0;
}
このエラーの原因はPREPARE_PAYMENT_SIMPLE_SIZE
の値が想定される値を呼び出していないことが原因。
#include "hookapi.h"
の前に一行#define HAS_CALLBACK
を付け加えることで解決する。
つまり次のようなコードにすれば良い。
#define HAS_CALLBACK`
#include "hookapi.h"
int64_t hook(uint32_t reserved) {
_g(1, 1);
etxn_reserve(1);
// ...
uint8_t tx_result[32];
int64_t result = emit(SBUF(tx_result), tx, PREPARE_PAYMENT_SIMPLE_SIZE);
REQUIRE(result > 0, "failed.");
DONE("success");
return 0;
}
int64_t cbak(uint32_t what) {
return 0;
}
この一行を付け加えることでPREPARE_PAYMENT_SIMPLE_SIZE
の値が248U
から270U
に変化する。
これはhookapi.h
の中で呼び出されるmacro.h
の次の箇所で分かる。
#ifdef HAS_CALLBACK
#define PREPARE_PAYMENT_SIMPLE_SIZE 270U
#else
#define PREPARE_PAYMENT_SIMPLE_SIZE 248U
#endif
PREPARE_PAYMENT_SIMPLE_SIZE
の差分はどこから生まれるのか?
それはextn_details
が関係している。
cbak
が存在している場合、extn_details
はcbak
がない場合と比べて追加で22バイトのデータを返す。
cbak
が存在する場合にのみEmitCallback
フィールドが存在することが確認できる。
cbakが存在する場合
cbakが存在しない場合