Hooks κ°λ°
μ΄λ² μ₯μμλ Hooksλ₯Ό κ°λ°νλ λ°©λ²μ λν΄ μ€λͺ ν©λλ€. μ΄λ₯Ό μν΄, λ¨Όμ Hooksλ₯Ό κ°λ°νκΈ° μν νκ²½μΈ hooks builderλ₯Ό μκ°νκ³ , κ·Έ νκ²½μμ Hooksλ₯Ό κ°λ°νλ λ°©λ²μ μ€λͺ ν©λλ€.
Hooks κ°λ°μ νμν μλ£λ€μ μ λΆ μ΄ λ§ν¬μ μμ΅λλ€.
1. Hooks Builderβ
1.1 Hooks Builderλ?β
Hooks Builderλ μΉ λΈλΌμ°μ μμμ Hookμ κ°λ°, ν μ€νΈ, λλ²κ·Έ, λ°°ν¬ν μ μλ μ¨λΌμΈ IDEμ λλ€. νΉλ³ν μ€μΉν νμ μμ΄ μΉμ΄μ λΈλ¦¬(WebAssembly) κΈ°λ°μΌλ‘ λμνλ©°, μ¬μ©μκ° μ§μ Hookμ μ²μλΆν° κ°λ°νκ±°λ μ 곡λ μμλ₯Ό νμ©ν μ μμ΅λλ€.
μ£Όμ νΉμ§:
- μ€μΉ μμ: λ³λμ μ€μΉλ μ€μ κ³Όμ μμ΄ μΉ λΈλΌμ°μ μμ μ§μ κ°λ°μ μμν μ μμ΅λλ€.
- μΉμ΄μ λΈλ¦¬ κΈ°λ°: μΉμ΄μ λΈλ¦¬ κΈ°μ μ νμ©νμ¬ λΉ λ₯΄κ³ μμ μ μΈ κ°λ° νκ²½μ μ 곡ν©λλ€.
- μ½λ νν λ° λ¬Έμ ν΅ν©: μ½λ μμ± μ μλμΌλ‘ ννΈμ λ¬Έμλ₯Ό μ 곡νμ¬ μ¬μ©μμ κ°λ° ν¨μ¨μ±μ λμ λλ€.
- Gist ν΅ν μ μ₯ λ° κ³΅μ : κ°λ°ν Hook μ½λλ₯Ό Gistλ₯Ό ν΅ν΄ μμ½κ² μ μ₯νκ³ κ³΅μ ν μ μμ΅λλ€.
- λΈλΌμ°μ λ΄ ν μ€νΈ, λλ²κ·Έ λ° λ°°ν¬: Hooks Builderλ₯Ό μ¬μ©νλ©΄ μΉ λΈλΌμ°μ μμμ μ§μ Hookμ ν μ€νΈ, λλ²κ·Έ, λ°°ν¬ κ³Όμ μ μ²λ¦¬ν μ μμ΅λλ€.
Hooks Builderλ₯Ό νμ©νλ©΄, ν μ€νΈλ·μμμ Hook κ°λ° νλ‘μΈμ€κ° λμ± κ°νΈνκ³ ν¨κ³Όμ μΌλ‘ μ§νλ©λλ€.
μ΄ λ§ν¬λ₯Ό μ΄μ©νλ©΄ hooks builderλ₯Ό μ΄μ©ν μ μμ΅λλ€.
1.2 Hooks Builder μ¬μ©λ²β
Hooks Builder μ μ
μ΄ λ§ν¬λ₯Ό ν΅ν΄ Hooks Builderμ μ μν©λλ€.
νλ‘μ νΈ μ ν
Hooks builderμμ μ 곡νλ μμ νλ‘μ νΈ μ€ νλλ₯Ό μ ννκ±°λ μλ‘μ΄ νλ‘μ νΈλ₯Ό μμ±ν©λλ€. μ νλ‘μ νΈ μμ± μμλ hookapiλ₯Ό μ¬μ©νκΈ° μν΄ starter projectλ₯Ό μ ννλ κ²μ μΆμ²ν©λλ€.
μ½λ μμ± λ° μ»΄νμΌ
Develop
νμμ Hooks Builderμμ μ 곡νλ μ½λ ννΈλ₯Ό μ°Έκ³ νμ¬ μ½λλ₯Ό μμ±ν©λλ€. μ½λ μμ±μ΄ μλ£λλ©΄,Compile
λ²νΌμ ν΄λ¦νμ¬ μ»΄νμΌμ μ§νν©λλ€.κ³μ μμ± λ° Hook Deploy
Deploy
νμμ κ³μ μ μμ±νκ±°λ import ν ν, κ³μ μμSet Hook
λ²νΌμ ν΄λ¦νμ¬ κ³μ μ Hookμ deployν©λλ€.ν μ€νΈ λ° λλ²κΉ
Test
νμμ μνλ νΈλμμ μ Hook κ³μ μΌλ‘ λ³΄λ΄ ν μ€νΈλ₯Ό μ§νν©λλ€. ν μ€νΈ κ³Όμ μμ λ°μνλ λ‘κ·Έλ₯Ό νμΈνμ¬ λλ²κΉ μ μ§νν©λλ€.
2. Hook APIβ
2.1 Hook APIλ?β
Hook APIλ Hook κ°λ°μ νμν κΈ°λ₯μ μ 곡νλ λΌμ΄λΈλ¬λ¦¬μ
λλ€. Hook APIλ₯Ό νμ©νλ©΄, Hook κ°λ° κ³Όμ μμ νμν λ€μν κΈ°λ₯μ κ°νΈνκ² μ¬μ©ν μ μμ΅λλ€. hookapiλ builderμ μμ νλ‘μ νΈλ€μ μμΌλ―λ‘ ν΄λΉ νμΌλ€μ νλ‘μ νΈ λλ ν 리μ μμΉμν¨ ν, #include "hookapi.h"
λ₯Ό ν΅ν΄ hookapiλ₯Ό μ¬μ©ν μ μμ΅λλ€.
2.2 Hook API κ·μΉ (Conventions)β
Hook APIλ₯Ό ν¨κ³Όμ μΌλ‘ μ¬μ©νλ €λ©΄ λͺ κ°μ§ ν΅μ¬ κ·μΉμ μ΄ν΄νκ³ λ°λΌμΌ ν©λλ€. μλμ μ΄ κ·μΉλ€μ κ°λ¨νκ² λμ΄νμμ΅λλ€.
λ€μ΄λ° κ·μΉ
λͺ¨λ Hook APIλ νΉμ ν λ€μ΄λ° κ·μΉμ λ°λ¦ λλ€. μ΄λ APIμ ν¨μ μ΄λ¦μ ν΅ν΄ κ·Έ κΈ°λ₯μ μ½κ² νμ ν μ μλλ‘ λμμ€λλ€.
ꡬ쑰:
namespace*[noun #1]*[verb]\_[noun #2]
- 첫 λ²μ§Έ λͺ μ¬κ° λλ½λλ©΄ λ€μμ€νμ΄μ€μ λμΌνκ² κ°μ£Όλ©λλ€.
- λμ¬κ° λλ½λλ©΄ κΈ°λ³Έμ μΌλ‘ getμΌλ‘ κ°μ£Όλ©λλ€.
μμ:
state()
λ hookμ μνλ₯Ό κ°μ Έμ¨λ€λ μλ―Έμ λλ€.state_set()
λ hook μνλ₯Ό μ€μ νλ€λ μλ―Έμ λλ€.state_foreign()
λ μΈλΆ hookμ μνλ₯Ό κ°μ Έμ¨λ€λ μλ―Έμ λλ€.
λ©λͺ¨λ¦¬ κ΄λ¦¬
κ° Hookλ λ 립μ μΈ μ€ν νλ μ λ΄μμ μ€νλ©λλ€. λ°λΌμ λͺ¨λ μμ λ©λͺ¨λ¦¬λ μ΄ μ€ν νλ μ λ΄μμ κ΄λ¦¬λμ΄μΌ ν©λλ€. νκ³Ό λμ λ©λͺ¨λ¦¬ ν λΉμ μ¬μ©ν μ μμ΅λλ€.
ν΅μ κ·μΉ
Hookμ΄ xrpldμ ν΅μ ν λλ μ μ κ°λ§ μ λ¬ν μ μμ΅λλ€. μ΄ μ μ κ°μ λμ²΄λ‘ Hookμ λ©λͺ¨λ¦¬ λ΄ ν¬μΈν°λ₯Ό λνλ λλ€.
νμ©λ ν¨μ
Hook λ΄μμλ
hook()
μcbak()
λ κ°μ§ ν¨μλ§ μ¬μ©ν μ μμ΅λλ€. λ€λ₯Έ ν¨μλ₯Ό μ¬μ©νλ €λ©΄ API λ¬Έμλ₯Ό μ°Έμ‘°νμκΈ° λ°λλλ€.맀κ°λ³μ μ λ¬
Hook API ν¨μμ μ λ¬λλ λͺ¨λ 맀κ°λ³μλ νΉμ νμ μ λ°λ₯΄λ©°, νΉλ³ν μμλ‘ λ°°μ΄λμ΄μΌ ν©λλ€.
νμ©λλ λ°μ΄ν° νμ :
uint32_t
,int32_t
,uint64_t
,int64_t
- λλΆλΆμ κ²½μ°, μ΄λ€μ Hookμ μ€ν νλ μ λ΄μ ν¬μΈν°λ λ²νΌμ κΈΈμ΄λ₯Ό λνλ λλ€.
맀κ°λ³μ μμ:
- μ°κΈ° ν¬μΈν°(μμ κ²½μ°)
- μ°κΈ° κΈΈμ΄(μμ κ²½μ°)
- μ½κΈ° ν¬μΈν°(μμ κ²½μ°)
- μ½κΈ° κΈΈμ΄(μμ κ²½μ°)
- νΉμ νλλ κΈ°ν 맀κ°λ³μ(μμ κ²½μ°)
λ°ν μ½λ
λͺ¨λ Hook APIλ signed integerλ₯Ό λ°νν©λλ€. μ΄ λ°ν μ½λλ ν¨μ νΈμΆμ μ±κ³΅ λλ μ€ν¨, κ·Έλ¦¬κ³ λ€μν μ€λ₯ μν©μ λνλ΄κΈ° μν΄ μ¬μ©λ©λλ€.
2.3 Hook API ν¨μβ
Hook APIμλ λ€μν ν¨μκ° μμ§λ§, μ¬κΈ°μλ κ·Έ μ€ ν΅μ¬μ μΈ ν¨μμ λν΄ κ°λ¨ν μκ°νκ³ μ ν©λλ€. λͺ¨λ Hook API ν¨μμ λν μμΈν λ΄μ©μ μ΄ λ§ν¬μμ νμΈν μ μμ΅λλ€.
1. hook
ν¨μβ
κ°μ:
hook
μ μ¬μ©μκ° μ μνλ μ£Όμ ν¨μλ‘, xrpldμ μν΄ νΈμΆλμ΄ hookμ μ€νμν΅λλ€.λμ λ°©μ:
hook
μ μλμ νΈλμμ μ μλ½νκ±°λ κ±°λΆνκΈ° μν΄accept
λλreject
ν¨μλ₯Ό νΈμΆν©λλ€.- ν¨μμ μ€νμ΄ λλ λκΉμ§ μ΄λ ν λ°ν κ°λ μλ€λ©΄, μμμ μΌλ‘
accept
λ‘ κ°μ£Όλ©λλ€.
μ μ:
int64_t hook (uint32_t reserved);
- μμ:
int64_t hook(uint32_t reserved)
{
return 0;
}
맀κ°λ³μ:
- μ΄λ¦:
reserved
- νμ
:
uint32_t
- μ€λͺ : ν₯ν μ¬μ©μ μν΄ μμ½λ 맀κ°λ³μ.
- νμ
:
- μ΄λ¦:
λ°ν μ½λ:
- νμ
:
int64_t
- μ€λͺ : Hookμμ λ°ννκ³ μ νλ μμμ λ°ν μ½λμ λλ€. μ΄ μ½λλ μλμ νΈλμμ λ©νλ°μ΄ν°μ ν¬ν¨λ©λλ€.
- νμ
:
μ΄ hook
ν¨μλ Hook κ°λ°μ κΈ°λ³Έμ΄ λλ μ€μν ν¨μμ
λλ€. κ°λ°μλ μ΄ ν¨μλ₯Ό ν΅ν΄ νΈλμμ
μ λμμ μ μ΄νκ³ , μνλ λ‘μ§μ λ°λΌ νΈλμμ
μ μλ½νκ±°λ κ±°λΆν μ μμ΅λλ€.
2. cbak
ν¨μβ
κ°μ:
cbak
μ μ¬μ©μκ° μ μνλ μ½λ°± ν¨μλ‘, μ΄μ μ μ μ‘λ νΈλμμ μ μνμ λν΄ hookμ μλ €μ£ΌκΈ° μν΄ xrpldμ μν΄ νΈμΆλ©λλ€.λμ λ°©μ:
cbak
μ μν λ³κ²½κ³Ό μΆκ°μ μΈemit
νΈμΆμ ν μ μμ§λ§, μ΄λ―Έ μνλ νΈλμμ μ λ‘€λ°±νλ κ²μ λΆκ°λ₯ν©λλ€.cbak
μ΄ μ€νλ λ, μ½λ°±μ΄ κ΄λ ¨λ νΈλμμ μ΄ μ΄μ μλμ νΈλμμ μΌλ‘ κ°μ£Όλ©λλ€.
μ μ:
int64_t cbak (uint32_t what);
- μμ:
int64_t cbak(uint32_t what)
{
return 0;
}
맀κ°λ³μ:
- μ΄λ¦:
what
- νμ
:
uint32_t
- μ€λͺ
:
- κ°μ΄ 0μ΄λ©΄: μ΄ μ½λ°±κ³Ό κ΄λ ¨λ μ μ‘λ νΈλμμ μ΄ μ±κ³΅μ μΌλ‘ μμ₯μ μμ©λμμ΅λλ€.
- κ°μ΄ 1μ΄λ©΄: μ½λ°±κ³Ό κ΄λ ¨λ μ μ‘λ νΈλμμ μ΄ λ§λ£λκΈ° μ μ μ±κ³΅μ μΌλ‘ μμ₯μ μμ©λμ§ μμμ΅λλ€.
- νμ
:
- μ΄λ¦:
λ°ν μ½λ:
- νμ
:
int64_t
- μ€λͺ : Hookμμ λ°ννκ³ μ νλ μμμ λ°ν μ½λμ λλ€. μ΄ μ½λλ μλμ νΈλμμ λ©νλ°μ΄ν°μ ν¬ν¨λ©λλ€.
- νμ
:
cbak
ν¨μλ₯Ό ν΅ν΄ κ°λ°μλ μ΄μ μ μ μ‘λ νΈλμμ
μ μνλ₯Ό νμ
νκ³ , κ·Έμ λ°λ₯Έ μΆκ°μ μΈ μμ
μ μνν μ μμ΅λλ€.
3. emit
ν¨μβ
κ°μ:
emit
μ hookμμ μλ‘μ΄ νΈλμμ μ μ μ‘νκΈ° μν ν¨μμ λλ€.λμ λ°©μ:
read_ptr
λ‘λΆν° νΈλμμ μ μ½μ΅λλ€.- μ μ‘ κ·μΉμ λ°λΌ νΈλμμ μ μ ν¨μ±μ κ²μ¦ν©λλ€.
- μ ν¨ν κ²½μ°, νΈλμμ μ ν©μμ ν¬ν¨μν΅λλ€.
write_ptr
μ μ κ·νλ νΈλμμ ν΄μλ₯Ό μμ±ν©λλ€.
μ μ:
int64_t emit (
uint32_t write_ptr,
uint32_t write_len,
uint32_t read_ptr,
uint32_t read_len
);
- μμ:
if (emit(tx, tx_len) < 0)
rollback("Failed to emit!", 15, 1);
맀κ°λ³μ:
- μ΄λ¦:
write_ptr
- νμ
:
uint32_t
- μ€λͺ : νΈλμμ ν΄μλ₯Ό μΈ λ²νΌμ ν¬μΈν°
- νμ
:
- μ΄λ¦:
write_len
- νμ
:
uint32_t
- μ€λͺ : νΈλμμ ν΄μλ₯Ό μΈ λ²νΌμ ν¬κΈ° (32μ΄μ΄μΌ ν©λλ€.)
- νμ
:
- μ΄λ¦:
read_ptr
- νμ
:
uint32_t
- μ€λͺ : μ μ‘ν νΈλμμ μ ν¬μΈν°
- νμ
:
- μ΄λ¦:
read_len
- νμ
:
uint32_t
- μ€λͺ : νΈλμμ μ κΈΈμ΄
- νμ
:
- μ΄λ¦:
λ°ν μ½λ:
- νμ
:
int64_t
- μ€λͺ
: μ±κ³΅μ μΈ κ²½μ°, μμ±λ νΈλμμ
ν΄μμ λ°μ΄νΈ μ(32)λ₯Ό λ°ννκ±°λ:
- μμμΈ κ²½μ°, μ€λ₯:
OUT_OF_BOUNDS
: hook λ©λͺ¨λ¦¬ λ°μ μ§μ λ ν¬μΈν°/κΈΈμ΄PREREQUISITE_NOT_MET
: λ¨Όμ emit_reserve
λ₯Ό νΈμΆν΄μΌ ν©λλ€.TOO_MANY_EMITTED_TXN
: μ΄μ μ νΈμΆλemit_reserve
μ μ½μλ κ²λ³΄λ€ μ μ‘λ νΈλμμ μ μκ° λ λ§μμ‘μ΅λλ€.EMISSION_FAILURE
: μ μ‘ κ·μΉμ λ°λΌ νΈλμμ μ΄ μλͺ» ꡬμ±λμμ΅λλ€.
- μμμΈ κ²½μ°, μ€λ₯:
- νμ
:
emit
ν¨μλ₯Ό μ¬μ©νμ¬ κ°λ°μλ νΉμ 쑰건 νμμ μλ‘μ΄ νΈλμμ
μ μ μ‘ν μ μμ΅λλ€.
4. hook_param
ν¨μβ
κ°μ:
hook_param
ν¨μλ λͺ λͺ λ hook 맀κ°λ³μμ κ°μ κ²μν©λλ€.λμ λ°©μ:
read_ptr
μ μ§μ λ λͺ λͺ λ 맀κ°λ³μμ κ°μ μ‘°νν©λλ€.- 맀κ°λ³μμ κ°μ
write_ptr
μ μμ±ν©λλ€.
μ μ:
int64_t hook_param (
uint32_t write_ptr,
uint32_t write_len,
uint32_t read_ptr,
uint32_t read_len
);
- μμ:
uint8_t pname[] = {0xCAU, 0xFEU};
uint8_t pvalue[32];
int64_t value_len =
hook_param(pvalue, 32, pname, 2);
맀κ°λ³μ:
- μ΄λ¦:
write_ptr
- νμ
:
uint32_t
- μ€λͺ : μΆλ ₯κ°μ μ μ₯νκΈ° μν μ μ ν ν¬κΈ°μ λ²νΌμ λν ν¬μΈν°. μ΅μ 32 λ°μ΄νΈμ¬μΌ ν©λλ€.
- νμ
:
- μ΄λ¦:
write_len
- νμ
:
uint32_t
- μ€λͺ : μΆλ ₯ λ²νΌμ κΈΈμ΄.
- νμ
:
- μ΄λ¦:
read_ptr
- νμ
:
uint32_t
- μ€λͺ : 맀κ°λ³μ μ΄λ¦μ΄ ν¬ν¨λ λ²νΌμ λν ν¬μΈν°.
- νμ
:
- μ΄λ¦:
read_len
- νμ
:
uint32_t
- μ€λͺ : 맀κ°λ³μ μ΄λ¦μ κΈΈμ΄.
- νμ
:
- μ΄λ¦:
λ°ν μ½λ:
- νμ
:
int64_t
- μ€λͺ
: μμ±λ λ°μ΄νΈμ μ.
- μμμΈ κ²½μ°, μ€λ₯:
OUT_OF_BOUNDS
: hook λ©λͺ¨λ¦¬ λ°μ μ§μ λ ν¬μΈν°/κΈΈμ΄.DOESNT_EXIST
: μ§μ λ 맀κ°λ³μκ° μ‘΄μ¬νμ§ μκ±°λ nullμ λλ€.TOO_SMALL
: 맀κ°λ³μ μ΄λ¦μ nullμΌ μ μμ΅λλ€.TOO_BIG
: 맀κ°λ³μ μ΄λ¦μ΄ 32 λ°μ΄νΈλ³΄λ€ ν½λλ€.
- μμμΈ κ²½μ°, μ€λ₯:
- νμ
:
hook_param
ν¨μλ₯Ό μ¬μ©νλ©΄ hookμ μ€μ λ νΉμ 맀κ°λ³μμ κ°μ μ½κ² κ²μν μ μμ΅λλ€.
5. state_set
ν¨μβ
κ°μ:
state_set
ν¨μλ μ£Όμ΄μ§ ν€μ κ°μ λν Hook μνλ₯Ό μ€μ ν©λλ€.λμ λ°©μ:
kread_ptr
μμ 32 λ°μ΄νΈ Hook μν ν€λ₯Ό μ½μ΅λλ€.read_ptr
μμ μμμ μμ λ°μ΄ν°(κ°)λ₯Ό μ½μ΅λλ€.- κ·Έ κ°μ μ¬μ©νμ¬ Hook μν ν€λ₯Ό μ λ°μ΄νΈν©λλ€.
μ μ:
int64_t state_set (
uint32_t read_ptr,
uint32_t read_len,
uint32_t kread_ptr,
uint32_t kread_len
);
- μμ:
#define SBUF(str) (uint32_t)(str), sizeof(str)
if (state_set(SBUF(vault), SBUF(vault_key)) < 0)
rollback(SBUF("Error: could not set state!"), 1);
맀κ°λ³μ:
- μ΄λ¦:
read_ptr
- νμ
:
uint32_t
- μ€λͺ : Hook μνμ μμ±ν λ°μ΄ν°(κ°)μ λν ν¬μΈν°μ λλ€. 0(null)μΈ κ²½μ° ν΄λΉ ν€μ λ°μ΄ν°λ₯Ό μμ ν©λλ€. nullμΌ μ μμ΅λλ€.
- νμ
:
- μ΄λ¦:
read_len
- νμ
:
uint32_t
- μ€λͺ : λ°μ΄ν°μ κΈΈμ΄. 0(null)μΈ κ²½μ° ν΄λΉ ν€μ λ°μ΄ν°λ₯Ό μμ ν©λλ€. nullμΌ μ μμ΅λλ€.
- νμ
:
- μ΄λ¦:
kread_ptr
- νμ
:
uint32_t
- μ€λͺ : κ°μ μ μ₯ν Hook μν ν€μ λν ν¬μΈν°.
- νμ
:
- μ΄λ¦:
kread_len
- νμ
:
uint32_t
- μ€λͺ : ν€μ κΈΈμ΄. νμ 32μ¬μΌ ν©λλ€.
- νμ
:
- μ΄λ¦:
μ£Όμ μ¬ν:
- Xrplμ λ΄λΆμ μΌλ‘ μ΅λ hook λ°μ΄ν° ν¬κΈ°λ₯Ό μ€μ ν©λλ€. μμ± μμ κ³Ό κ³΅κ° ν μ€νΈλ·μ κ²½μ° μ΄λ 128 λ°μ΄νΈλ‘ νλμ½λ© λμ΄ μμ§λ§, λ―Έλμλ κ²μ¦μκ° ν¬νν μ μλ μ«μκ° λ κ²μ λλ€.
λ°ν μ½λ:
- νμ
:
int64_t
- μ€λͺ
: Hook μνμ μμ±λ λ°μ΄νΈ μ(λ°μ΄ν°μ κΈΈμ΄).
- μμμΈ κ²½μ°, μ€λ₯:
OUT_OF_BOUNDS
: hook λ©λͺ¨λ¦¬ λ°μ μ§μ λ ν¬μΈν°/κΈΈμ΄.TOO_BIG
:kread_len
μ΄ 32λ³΄λ€ ν¬κ±°λread_len
μ΄ μ΅λ hook λ°μ΄ν° ν¬κΈ°λ³΄λ€ νΌ.TOO_SMALL
:kread_len
μ΄ 0.
- μμμΈ κ²½μ°, μ€λ₯:
- νμ
:
state_set
ν¨μλ₯Ό μ¬μ©νμ¬ Hook μνμ νΉμ ν€μ κ°μ μ€μ νκ±°λ μμ ν μ μμ΅λλ€.
6. otxn_field
ν¨μβ
κ°μ:
otxn_field
ν¨μλ μλμ νΈλμμ μμ μ§μ λ sf νλλ₯Ό μ°Ύμ μΆλ ₯ λ²νΌμ κ·Έ νλμ μ§λ ¬νλ λ²μ μ μμ±ν©λλ€.λμ λ°©μ:
- μλ νΈλμμ μμ μ§μ λ sf νλλ₯Ό μ°Ύμ΅λλ€.
- μΆλ ₯ λ²νΌμ ν΄λΉ νλμ μ§λ ¬νλ λ²μ μ μμ±ν©λλ€.
μ μ:
int64_t otxn_field (
uint32_t write_ptr,
uint32_t write_len,
uint32_t field_id
);
- μμ:
int64_t account_field_len =
otxn_field(account_field, 20, sfAccount);
맀κ°λ³μ:
μ΄λ¦:
write_ptr
- νμ
:
uint32_t
- μ€λͺ : μΆλ ₯μ μ μ₯νκΈ° μν μ μ ν ν¬κΈ°μ λ²νΌμ λν ν¬μΈν°.
- νμ
:
μ΄λ¦:
write_len
- νμ
:
uint32_t
- μ€λͺ : μΆλ ₯ λ²νΌμ κΈΈμ΄.
- νμ
:
μ΄λ¦:
field_id
νμ :
uint32_t
μ€λͺ : μ°Ύκ³ μλ νλμ sf μ½λ.
μλ₯Ό λ€λ©΄, sfEmitNonceλ μ νμ΄ 5μ΄κ³ νλκ° 11μ΄λ―λ‘ κ·Έ κ°μ 0x050BUμ λλ€.
μ£Όμ μ¬ν:
- μΆλ ₯ λ²νΌμλ νλ μ½λκ° μμ±λμ§ μμΌλ©°, νλμ νμ΄λ‘λλ§ μμ±λ©λλ€.
- Hooks Public Testnetμ μμ± μμ μμ, sfAccountμ κ°μ STI_ACCOUNT νλλ μ ν λ³μ κΈΈμ΄ λ°μ΄νΈ μμ΄ λ°νλ©λλ€.
λ°ν μ½λ:
- νμ
:
int64_t
- μ€λͺ
: μμ±λ λ°μ΄νΈ μ.
- μμμΈ κ²½μ°, μ€λ₯:
OUT_OF_BOUNDS
: hook λ©λͺ¨λ¦¬ λ°μ μ§μ λ ν¬μΈν°/κΈΈμ΄.TOO_SMALL
: μ§λ ¬νλ νλλ₯Ό μ μ₯νκΈ°μ μΆλ ₯ λ²νΌκ° μΆ©λΆν ν¬μ§ μμ.INVALID_FIELD
: sf field_idκ° μ ν¨νμ§ μμ.DOESNT_EXIST
: μλ νΈλμμ μμ ν΄λΉ νλλ₯Ό μ°Ύμ μ μμ.
- μμμΈ κ²½μ°, μ€λ₯:
- νμ
:
otxn_field
ν¨μλ₯Ό μ¬μ©νμ¬ μλμ νΈλμμ
μμ νΉμ νλλ₯Ό κ²μνκ³ κ·Έ νλμ μ§λ ¬νλ λ²μ μ κ°μ Έμ¬ μ μμ΅λλ€.