Hooks ๊ณ ๊ธ
์ด๋ฒ ์ฅ์์๋ Hooks์ ๋ํด ๋ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
1. Hook ์์ ์ฃผ๊ธฐ (Life Cycle)โ
์ค๋ช ์ถ๊ฐ
1.1. ์์ฑ (Creation)โ
Hook์ ์์ฑํ๊ณ , ๊ณ์ ์ ์ฐ๊ฒฐํ๊ธฐ ์ํด์๋ ๋ค์์ ์ธ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํฉ๋๋ค. ๋จผ์ , Hook ์ฝ๋๋ฅผ ์์ฑํ๊ณ WASM ๋ฐ์ดํธ์ฝ๋๋ก ์ปดํ์ผํฉ๋๋ค. ๊ทธ ๋ค์, SetHook ํธ๋์ญ์ ์ ์ํ๋ Hook parameter๋ฅผ ์ ๋ ฅํ์ฌ ํด๋น Hook์ ๊ณ์ ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์์ธํ ์ ์ฐจ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1.1.1. Hook ์ปดํ์ผโ
์ปดํ์ผ ์ ์ฐจ
- Hook๋ ์ปดํ์ผ ์
.wasm
์ด์ง ํ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค. - Hook๋ฅผ ์ปดํ์ผํ๊ธฐ ์ํด
wasmcc
๋ฅผ ์ฌ์ฉํ ์ ์๊ณ ,wasm2wat
๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ง ํ์์ ์ฌ๋์ด ์ฝ์ ์ ์๋ ์น์ด์ ๋ธ๋ฆฌ ํ์์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค.
- Hook๋ ์ปดํ์ผ ์
์ปดํ์ผ ์ค ์ค์ํ ์ฌํญ
- Hook๋ Hooks API์์๋ง ํจ์๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ๋์
cbak
๋ฐhook
ํจ์๋ง ๋ด๋ณด๋ด์ผ ํฉ๋๋ค. - ๋๋ถ๋ถ์ ์น์ด์ ๋ธ๋ฆฌ ์ปดํ์ผ๋ฌ๋ ๋งํน์ ์ํด ์ถ๊ฐ export๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฐ ๋ถํ์ํ export๊ฐ ์์ผ๋ฉด ์ ํจํ Hook๋ ๊ฑฐ๋ถ๋ ์ํ์ด ์์ต๋๋ค.
- Hook๋ฅผ ์ปดํ์ผ ํ ํ Hook Cleaner Utility๋ฅผ ์ฌ์ฉํ์ฌ ๋ถํ์ํ export๋ฅผ ์ ๊ฑฐํด์ผ ํฉ๋๋ค.
- Hook๋ Hooks API์์๋ง ํจ์๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ๋์
1.1.2. Hook ๋งค๊ฐ๋ณ์ (Parameters)โ
Hook ๋งค๊ฐ๋ณ์ ์ ์
- Hook ๊ฐ๋ฐ์๋ Hook์ ์ค์น ์๊ฐ ๋งค๊ฐ๋ณ์(Hook ๋งค๊ฐ๋ณ์๋ผ๊ณ ํจ)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ด๋ฌํ ๋งค๊ฐ๋ณ์๋ ํค-๊ฐ ์์ผ๋ก ์ค์ ๋๋ฉฐ, ์คํ ์๊ฐ ๋์ Hook์ ์ํด ๊ฒ์๋ ์ ์์ต๋๋ค.
ParameterName
(ํค) ๋ฐParameterValue
๋ ๊ฐ๊ฐ ์ต๋ 32 ๋ฐ์ดํธ์ 128 ๋ฐ์ดํธ์ ๊ธธ์ด๋ก ์ค์ ๋ฉ๋๋ค.
๋งค๊ฐ๋ณ์ ์ค์
SetHook
ํธ๋์ญ์ ์ ์ค์น๋ Hook ๋น ์ต๋ 16๊ฐ์ Hook ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.- Hook ๋งค๊ฐ๋ณ์ ๋ฐฐ์ด์ ์๋์ ํ์๋ ๋๋ก ๊ฐ Hook์ Hook ๋ฐฐ์ด ๋ด์์ ์ ํ์ ์ผ๋ก ์ ์๋ฉ๋๋ค.
๊ธฐ๋ณธ ๋งค๊ฐ๋ณ์
- Hook๋ฅผ ์ฒ์ ์ค์ ํ๋ ์ฌ์ฉ์๋ Hook ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ํ์ฌ ํด๋น Hook์ ๊ธฐ๋ณธ ๋งค๊ฐ๋ณ์๊ฐ ๋ ์ ์์ต๋๋ค.
- ์ดํ ๋์ผํ
HookDefinition
์ ์ฐธ์กฐํ๋ ๋ชจ๋ ์ฌ์ฉ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ ์ค์ ๋ Hook ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค. - ํ์ ์ฌ์ฉ์๋ ์ค์น์ ๋ํ ๊ธฐ๋ณธ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ ์ํ๋ ์์ฒด ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
Hook ๋ด์์์ ๋งค๊ฐ๋ณ์ ์ฌ์ฉ
- ๋งค๊ฐ๋ณ์๋ ํด๋น Hook์ ์ค์ ๋ ํ
hook_param
์ ์ฌ์ฉํ์ฌ ์ฝ์ ์ ์์ต๋๋ค. Hook Chain
์ ์ฌ๋ฌ Hook๊ฐ ์ค์น๋์ด ์์ผ๋ฉดhook_param_set
์ ์ฌ์ฉํ์ฌ ๋์ผํ ๊ณ์ ์ ์ฒด์ธ์์ ๋ ์๋์ ์๋ Hook์ Hook ๋งค๊ฐ๋ณ์๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
- ๋งค๊ฐ๋ณ์๋ ํด๋น Hook์ ์ค์ ๋ ํ
1.1.3. SetHook ํธ๋์ญ์ โ
SetHook ํธ๋์ญ์ ์ XRPL ๊ณ์ ์ Hook๋ฅผ ์ค์ ํ๊ฑฐ๋ ์์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ํธ๋์ญ์ ์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ์๋ ์ํ๋ ๊ณ์ ์ ์น์ด์ ๋ธ๋ฆฌ ๋ฐ์ดํธ์ฝ๋ ํ์์ Hook๋ฅผ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์ด ํธ๋์ญ์ ์ ๊ฐ๋จํด ๋ณด์ด์ง๋ง ๋ณต์กํ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์์ต๋๋ค.
{
Account: "r4GDFMLGJUKMjNhhycgt2d5LXCdXzCYPoc",
TransactionType: "SetHook",
Fee: "2000000",
Hooks:
[
{
Hook: {
CreateCode: fs.readFileSync('accept.wasm').toString('hex').toUpperCase(),
HookOn: '0000000000000000',
HookNamespace: addr.codec.sha256('accept').toString('hex').toUpperCase(),
HookApiVersion: 0
}
}
]
}
ํธ๋์ญ์ ๊ตฌ์กฐ
SetHook ํธ๋์ญ์ ์ ์ฃผ์ ๋ด์ฉ์
Hooks
๋ฐฐ์ด์ ๋๋ค. ์ด ๋ฐฐ์ด์ ๊ณ์ ์ ์ค์น๋ Hook Chain์ ๋ฐ์ํฉ๋๋ค. ๋ฐฐ์ด์ ์์น 0์ Hook Chain์ ์์น 0์ ํด๋นํ๊ณ , ์์น 3์ ์์น 3์ ํด๋นํฉ๋๋ค.HookSet ๊ฐ์ฒด์ ๋์ํ๋ Hook
Hooks ๋ฐฐ์ด์ ๊ฐ ํญ๋ชฉ์ HookSet ๊ฐ์ฒด๋ก, ๊ณ์ ์ Hook Chain์ ์๋ ํด๋น Hook์ ๋์ํ๋ Hook์ด๋ผ๊ณ ํฉ๋๋ค.
HookDefinition
๊ฐ ๋์ํ๋ Hook์
HookDefinition
๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ํฌํจํฉ๋๋ค. ์น์ด์ ๋ธ๋ฆฌ ๋ฐ์ดํธ์ฝ๋๋ ๋คํธ์ํฌ์ ๋ถํ๋ฅผ ์ฃผ๋ฏ๋ก, ์ค๋ณต ์ ๊ฑฐ๋ฅผ ์ํด ๊ฐ์ Hook์ ํ๋์ HookDefinition ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค.Reference Counting
์ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ณ์ ์ ์๋ฅผ ๋ํ๋ ๋๋ค.Hook ๊ธฐ๋ณธ๊ฐ
HookDefinition์ด ์์ฑ๋ ๋ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ์ด๊ธฐ ํ๋ผ๋ฏธํฐ, ๋ค์์คํ์ด์ค, ๊ถํ์ด ํฌํจ๋ฉ๋๋ค. ์ด ๊ฐ๋ค์ Hook ๊ธฐ๋ณธ๊ฐ์ด ๋ฉ๋๋ค. ์ด๋ค Hook์ด ์ด Hook Definition์ ์ฐธ์กฐํ๋ฉด ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ SetHook ํธ๋์ญ์ ์์ ์ด ์ฐธ์กฐ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ๋ ํ์ ์ ๋ฐ์ดํธ ์์ ์์ ๋ช ์์ ์ผ๋ก ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
HookSet ์์
์ด ์ฌ์ฏ ๊ฐ์ง ์์ ์ด ๊ฐ๋ฅํฉ๋๋ค: No Operation, Create, Update, Delete, Install ๋ฐ Namespace Delete. ๊ฐ ์์ ์ HookSet ๊ฐ์ฒด์ ํ๋์ ํฌํจ ๋๋ ์๋ต์ ๋ฐ๋ผ ์ง์ ๋ฉ๋๋ค. ์ด๊ฒ์ ์ฒ์์๋ ํผ๋์ค๋ฌ์ธ ์ ์์ง๋ง, ๋ช ๊ฐ์ง ์๋ฅผ ํตํด ์ง๊ด์ ์ผ๋ก ์ดํดํ ์ ์์ต๋๋ค.
ํธ๋์ญ์ ์ ์์ฑ, ์ ์ถ, ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ง์นจ์ XRPL ๋ฌธ์์์ ์ฐพ์ ์ ์์ต๋๋ค.
1.2. ์คํ (Execution)โ
1.2.1. HookOn ํ๋โ
๊ฐ์
HookOn
ํ๋๋ ํน์ ํธ๋์ญ์
์ ํ์ ๋ํ ํํฌ์ ์คํ ์ฌ๋ถ๋ฅผ ์ง์ ํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
ํต์ฌ ๋ด์ฉ
HookOn ํ๋ ๊ตฌ์กฐ
HookOn
์ 256๋นํธ ๋ฌด๋ถํธ ์ ์๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.- ๊ฐ ๋นํธ๋ ํน์ ํธ๋์ญ์ ์ ํ์์ ํํฌ๊ฐ ์คํ๋ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. ๋๋ถ๋ถ์ ๋นํธ๋ active low ์ํ์ด์ง๋ง 22๋ฒ์งธ ๋นํธ๋ง active high ์ํ์ ๋๋ค.
ttHOOK_SET
๋ 22๋ฒ์งธ ๋นํธ์ ๋์ํ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์ด 0์ผ ๋๋ SetHook ํธ๋์ญ์ ์ ๋ฐ์ํ์ง ์์ต๋๋ค.
๋นํธ ๋๋ฒ๋ง ๋ฐฉ์
- ์ตํ์ ๋นํธ: ๋นํธ 0 (๊ฐ์ฅ ์ค๋ฅธ์ชฝ)
- ์ต์์ ๋นํธ: ๋นํธ 63 (๊ฐ์ฅ ์ผ์ชฝ)
์์ ์ฝ๋
- ํํฌ๋ฅผ ์์ ํ ๋นํ์ฑํ:
~(1ULL << 22) /* ๋ชจ๋ ๋นํธ๋ 1, 22๋ฒ์งธ ๋นํธ๋ง 0 */
ttPAYMENT
๋ง ํ์ฑํํ๊ณ ๋๋จธ์ง๋ ๋นํ์ฑํ:
~(1ULL << 22) & ~(1ULL)
ttHOOK_SET
์ ์ธ ๋ชจ๋ ๊ฒ์์ ํ์ฑํ:
0
ttHOOK_SET
๋ฐ ๋ค๋ฅธ ๋ชจ๋ ํธ๋์ญ์ ์ ํ์์ ํ์ฑํ:
(1ULL << 22)
์ถ๊ฐ ๋ฆฌ์์ค
- ํํฌ์ ์คํ ์ฌ๋ถ๋ฅผ ์ฝ๊ฒ ๊ณ์ฐํ๋ ค๋ฉด HookOn Calculator๋ฅผ ์ฐธ์กฐํ์ธ์.
1.2.2. Chainingโ
XRPL์ Hook์ "ํ๋์ ์์ ๋ง ์ํํ๊ณ ๊ทธ ์์ ์ ์ ๋ง ์ ํด์ผ ํ๋ค"๋ ์์น์ ๋ฐ๋ผ ์ค๊ณ๋์์ต๋๋ค. ๋ณต์กํ ๋ก์ง์ ์ํํด์ผ ํ๋ ๊ฒฝ์ฐ, 'Hook Chaining' ๊ธฐ๋ฅ์ ํตํด ํ ๊ณ์ ์ ์ฌ๋ฌ Hook์ ์์ฐจ์ ์ผ๋ก ์ฐ๊ฒฐํ๊ณ , ๊ฐ๊ฐ์ Hook์ด ํ๋์ ์์ ์ ์ ๋ฌธ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ฒด์ธ ๊ตฌ์ฑ ๋ฐ ์คํ
- Hook Chain: XRPL ๊ณ์ ์ ์ค์นํ ์ ์๋ Hook์ ์ํ์ค๋ก, ์ต๋ 10๊ฐ๊น์ง ์ค์น ๊ฐ๋ฅํฉ๋๋ค.
- ์คํ ์์: ์ฒด์ธ์ ์คํ์ chain position 0์์ ์์ํ์ฌ chain position 9์์ ๋๋ฉ๋๋ค. ๋น ์์น๋ ์ฑ๊ณต์ผ๋ก ๊ฐ์ฃผ๋๊ณ ๊ฑด๋๋๋๋ค.
- ํธ๋์ญ์ ์ฑ๊ณต ์กฐ๊ฑด: ์ก์ ์ธก๊ณผ ์์ ์ธก์ Hook Chain์ด ๋ชจ๋ ์ฑ๊ณต์ ์ผ๋ก ์คํ๋์ด์ผ ํธ๋์ญ์ ์ด ์ฑ๊ณตํฉ๋๋ค.
๋ฐํ์์์์ ์กฐ์
- HookHash ํ์ธ:
hook_hash
๋ฅผ ํธ์ถํ์ฌ ์์ ์ HookHash๋ฅผ ์์๋ผ ์ ์์ต๋๋ค. - ์ฒด์ธ ์์น ํ์ธ:
hook_pos
๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ด ์ฒด์ธ์ ์ด๋ค ์์น์ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค. - ๋ค๋ฅธ Hook ์ ์ด:
hook_skip
๋ฅผ ์ฌ์ฉํ์ฌ ์ฒด์ธ ๋ด์ ๋ค๋ฅธ Hook์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค.hook_param_set
์ ์ฌ์ฉํ์ฌ ์ฒด์ธ ๋ด์ ๋ค๋ฅธ Hook์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์ฝํ ์คํ (Weak Executions)
- hook_again ํธ์ถ: Hook์ด ๋ ๋ฒ์งธ '์ฝํ ์คํ'์ ์๊ตฌํ ์ ์์ต๋๋ค.
- Weak Execution ์์: ์๋ ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์ ์ฉ๋ ํ์๋ง ์ฝํ ์คํ์ด ์ด๋ฃจ์ด์ง๋๋ค. ์ด๋ฌํ ์คํ์ ํน์ ์์(์: Account ID๋ Hook ์์น ๋ฑ)์ ๋ฐ๋ผ ์ํ๋ฉ๋๋ค.
1.3. ์ข ๋ฃ (Termination)โ
1.3.1. Accept & Rollbackโ
Accept์ Rollback์ hookapi์ ํจ์๋ค์ ๋๋ค. ์ด ๋ ํจ์๋ฅผ ํตํด, Hook์ ์์ ์ด ์ํํ ์์ ์ XRPL์ ์์ ํ๊ฒ ๋ฐ์ํ๊ฑฐ๋ ์ทจ์ํ ์ ์์ต๋๋ค.
Accept
- ์ฉ๋: Hook์ ์คํ์ '์ฑ๊ณต' ์ํ๋ก ์ข ๋ฃํ๊ณ , ๊ทธ ๋์ Hook์ด ์ํํ ๋ชจ๋ ์ํ ๋ณํ๋ฅผ ํ์ ํฉ๋๋ค.
- ๋์:
- ์ํ ๋ณํ๋ฅผ ์ปค๋ฐ(Commit)
emit()
ํธ๋์ญ์ ์ ์ถ- ์๋์ ํธ๋์ญ์ ์ ๊ณ์ ์งํ
- ์ฃผ์์ฌํญ: ๋ง์ฝ ์๋ ํธ๋์ญ์ ์ด ๋ค๋ฅธ ์ด์ ๋ก ์ค๋จ๋๋ค๋ฉด, 'Accept'๋ 'Rollback'์ด ๋ฉ๋๋ค.
Rollback
- ์ฉ๋: Hook์ ์คํ์ '์คํจ' ์ํ๋ก ์ข ๋ฃํ๊ณ , ๊ทธ ๋์ Hook์ด ์ํํ ๋ชจ๋ ์ํ ๋ณํ๋ฅผ ํ๊ธฐํฉ๋๋ค.
- ๋์:
- ๋ชจ๋ ์ํ ๋ณํ ํ๊ธฐ
emit()
ํธ๋์ญ์ ํ๊ธฐ- ์๋์ ํธ๋์ญ์ ์ ์ค์ง
- ์ฃผ์์ฌํญ: ์๋ ํธ๋์ญ์
์
tecHOOK_REJECTED
์ํ์ ํจ๊ป ์คํจํ๋ฉฐ, ์์๋ฃ๊ฐ ๋ถ๊ณผ๋ฉ๋๋ค.
1.3.2. HookDefinition ์ญ์ โ
Hook์ ์ค์นํ ๊ณ์ ์ด ์์ด์ ธ์ ํด๋น HookDefinition ๊ฐ์ฒด์ Reference Counting ๊ฐ์ด 0์ด ๋๋ฉด, ํด๋น HookDefinition ๊ฐ์ฒด๋ ์ญ์ ๋ฉ๋๋ค.
2. Advanced Hook Featuresโ
2.1. Ledger ๋ฐ์ดํฐ์์ ์ํธ์์ฉโ
2.1.1. Slots์ Keyletsโ
2.1.2. State Managementโ
2.1.3. Namespaceโ
2.2 Emitting Transactionsโ
2.3 Data representation in Hooksโ
- Serialized Objects
- Floating Point Numbers (XFL)
2.4 Hook Feesโ
- Weak and Strong
- Hook Fees
- Collect Call
3. Writing Your First Hookโ
4. Best Practices and Common Patternsโ
- Error Handling
- Efficient State Management
- Secure Coding Practices
5. Debugging and Testing Hooksโ
- Execution Metadata
- Debugging Hooks
6. Deployment and Production Considerationsโ
7. Community and Further Resourcesโ
- Forums and Workshops: ์ปค๋ฎค๋ํฐ ํฌ๋ผ ๋ฐ ์ํฌ์ต
- Sample Projects: ์ฐธ์กฐํ ์ ์๋ ์ํ ํ๋ก์ ํธ
8. Future Developments and Roadmapโ
- Upcoming Features: ํฅํ ์์ ๋ ๊ธฐ๋ฅ
- Research and Development: ์ฐ๊ตฌ ๋ฐ ๊ฐ๋ฐ ๋ฐฉํฅ