About XRPL
home

Batch

์ฃผ์š” ๋‚ด์šฉ
์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์„ ํ•˜๋‚˜์˜ Batch๋กœ ์ฒ˜๋ฆฌ
ํด๋”๋ช…
Batch

์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ๋ช…๋ น์–ด

#1) ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ์‹คํŒจํ•˜๋Š” ํŠธ๋žœ์žญ์…˜ ๋‚˜์˜ค๋ฉด ๋ฐ”๋กœ ๋น ์ ธ๋‚˜์˜ด $npx ts-node xrpl/Batch/UntilFailure.ts #2) ํ•˜๋‚˜๋งŒ ์„ฑ๊ณตํ•˜๋ฉด ๋น ์ ธ๋‚˜์˜ค๊ณ  ์›์žฅ์— ๊ธฐ๋ก๋จ $npx ts-node xrpl/Batch/OnlyOne.ts #3) ์‹คํŒจ/์„ฑ๊ณต ์ƒ๊ด€์—†์ด ๋‚ด๋ถ€ ํŠธ๋žœ์žญ์…˜๋“ค์„ ๋ชจ๋‘ ์‹คํ–‰ $npx ts-node xrpl/Batch/Independent.ts #4) ๋‚ด๋ถ€ ํŠธ๋žœ์žญ์…˜๋“ค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ์›์žฅ์— ๊ธฐ๋ก ์•ˆ๋จ. ๋ชจ๋‘ ์„ฑ๊ณตํ•ด์•ผ ์ œ์ถœ๋˜๋Š” Batch ํŠธ๋žœ์žญ์…˜ $npx ts-node xrpl/Batch/AllOrNothing.ts
Bash
๋ณต์‚ฌ

1. Batch๋ž€?

Batch๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ XRPL ํŠธ๋žœ์žญ์…˜์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด Outer Transaction(Wrapper) ์•ˆ์—์„œ ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
โ€ข
Outer Transaction: TransactionType: "Batch"
โ€ข
Inner Transactions: ์‹ค์ œ ์‹คํ–‰๋˜๋Š” ํŠธ๋žœ์žญ์…˜๋“ค (์ตœ๋Œ€ 8๊ฐœ)
Batch ์‹คํ–‰ ๋ชจ๋“œ๋Š” Outer Transaction์˜ Flags ๊ฐ’์œผ๋กœ ๊ฒฐ์ •๋˜๋ฉฐ, ๊ฐ ๋ชจ๋“œ๋Š” ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์ •์˜ํ•œ๋‹ค.

Batch ์‹คํ–‰ ๋ชจ๋“œ 4๊ฐ€์ง€(Flags)

1.1 AllOrNothing (0x00010000)

โ€ข
์„ค๋ช…: ๋ชจ๋“  Inner๊ฐ€ tesSUCCESS์—ฌ์•ผ ์ปค๋ฐ‹. ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ์ „๋ถ€ ๋กค๋ฐฑ.
โ€ข
์‚ฌ์šฉ ์˜ˆ์‹œ:
โ—ฆ
NFT ๋ฐœํ–‰ + ์˜คํผ ์ƒ์„ฑ (์˜คํผ ์‹คํŒจ ์‹œ ๋ฐœํ–‰ ์ทจ์†Œ)
โ—ฆ
๋ฉ€ํ‹ฐ๊ณ„์ • ์Šค์™‘ (ํ•œ์ชฝ ์‹คํŒจ ์‹œ ์ „์ฒด ์ทจ์†Œ)

1.2 OnlyOne (0x00020000)

โ€ข
์„ค๋ช…: ์ฒซ ๋ฒˆ์งธ๋กœ ์„ฑ๊ณตํ•˜๋Š” Inner๋งŒ ์‹คํ–‰, ๋‚˜๋จธ์ง€๋Š” ์‹คํ–‰ ์•ˆ ํ•จ.
โ€ข
์‚ฌ์šฉ ์˜ˆ์‹œ:
โ—ฆ
์—ฌ๋Ÿฌ ๊ฐ€๊ฒฉ์˜ ์˜คํผ๋ฅผ ๋™์‹œ์— ์ œ์ถœ โ†’ ๊ฐ€์žฅ ๋จผ์ € ์ฒด๊ฒฐ๋˜๋Š” ๊ฒƒ๋งŒ ์‹คํ–‰.
โ—ฆ
์—ฌ๋Ÿฌ ๊ฒฝ๋กœ์˜ ์†ก๊ธˆ โ†’ ์ฒซ ์„ฑ๊ณต ๊ฒฝ๋กœ๋งŒ ์‚ฌ์šฉ.

1.3 UntilFailure (0x00040000)

โ€ข
์„ค๋ช…: ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ์ฒซ ์‹คํŒจ๊ฐ€ ๋‚˜์˜ค๋ฉด ์ดํ›„๋Š” ์‹คํ–‰ ์•ˆ ํ•จ.
โ€ข
์‚ฌ์šฉ ์˜ˆ์‹œ:
โ—ฆ
์—ฌ๋Ÿฌ ๊ณ„์ •์— ์ˆœ์ฐจ ์†ก๊ธˆํ•˜๋‹ค๊ฐ€ ์ž”๊ณ  ๋ถ€์กฑ ์‹œ ์ค‘๋‹จ.
โ—ฆ
์—ฌ๋Ÿฌ ๋‹จ๊ณ„ ์ž‘์—… ์ค‘, ํŠน์ • ์‹œ์ ๊นŒ์ง€๋Š” ์‹คํŒจํ•ด๋„ ๊ดœ์ฐฎ์ง€๋งŒ ์ดํ›„๋Š” ์ค‘๋‹จ.

1.4 Independent (0x00080000)

โ€ข
์„ค๋ช…: ๋ชจ๋“  Inner๋ฅผ ์‹คํ–‰. ์‹คํŒจ ์—ฌ๋ถ€ ์ƒ๊ด€์—†์ด ์ „๋ถ€ ์‹œ๋„.
โ€ข
์‚ฌ์šฉ ์˜ˆ์‹œ:
โ—ฆ
์—์–ด๋“œ๋ž/๋ณด์ƒ ์ง€๊ธ‰ (๋ช‡ ๊ฐœ ์‹คํŒจํ•ด๋„ ๋‚˜๋จธ์ง€ ๊ณ„์† ์ง€๊ธ‰)
โ—ฆ
๋Œ€๋Ÿ‰ ์˜คํผ ๋“ฑ๋ก (์ค‘๊ฐ„ ์‹คํŒจ ๋ฌด์‹œ)

2. ์™œ ํ•„์š”ํ•œ๊ฐ€?

โ€ข
์›์ž์„ฑ(Atomic) ๋ณด์žฅ
โ—ฆ
์—ฌ๋Ÿฌ ๋‹จ๊ณ„ ์ž‘์—…์ด ๋ชจ๋‘ ์„ฑ๊ณตํ•ด์•ผ๋งŒ ์ปค๋ฐ‹ โ†’ ์ผ๋ถ€๋งŒ ์‹คํ–‰๋˜๋Š” ๋ถˆ์™„์ „ ์ƒํƒœ ๋ฐฉ์ง€.
โ€ข
์›Œํฌํ”Œ๋กœ์šฐ ๋‹จ์ˆœํ™”
โ—ฆ
NFT ๋ฐœํ–‰ โ†’ ์˜คํผ ์ƒ์„ฑ, ํ† ํฐ ๋ฐœํ–‰ โ†’ ์ „์†ก ๋“ฑ ๋ณตํ•ฉ ์ž‘์—…์„ ํ•˜๋‚˜๋กœ ๋ฌถ์Œ.
โ€ข
MultiAccount Transfer
โ—ฆ
์„œ๋กœ ๋‹ค๋ฅธ ๊ณ„์ •์˜ ํŠธ๋žœ์žญ์…˜์„ ํ•˜๋‚˜์˜ Batch์—์„œ ๋™์‹œ ์‹คํ–‰ ๊ฐ€๋Šฅ.
โ€ข
์ˆ˜์ˆ˜๋ฃŒ ์ตœ์ ํ™”
โ—ฆ
Inner Transaction๋“ค์€ Fee=0 โ†’ ์‹ค์ œ ์ˆ˜์ˆ˜๋ฃŒ๋Š” Outer Transaction์—์„œ ํ•œ ๋ฒˆ์— ๊ฒฐ์ œ.

3. ์‹œ๋‚˜๋ฆฌ์˜ค: batchAllOrNothing โ†’ batchOnlyOne โ†’ batchUntilFailure โ†’ batchIndependent

Step 1. AllOrNothing (์ „๋ถ€ ์„ฑ๊ณต or ์ „๋ถ€ ๋กค๋ฐฑ)

โ€ข
์ฃผ์ฒด: User
โ€ข
ํ–‰๋™: Batch ํŠธ๋žœ์žญ์…˜ ์ „์†ก
โ€ข
๋‚ด์šฉ:
โ—ฆ
Flags: 0x00010000 (AllOrNothing)
โ—ฆ
RawTransactions: Payment 2๊ฑด์„ inner๋กœ ํฌํ•จ
โ—ฆ
๊ฐ inner๋Š” tfInnerBatchTxn(0x40000000) + Fee:"0" + SigningPubKey:"" + Sequence ํ•„์ˆ˜
โ—ฆ
๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ๋‘˜ ๋‹ค ๋กค๋ฐฑ
// ํ˜„์žฌ ๊ณ„์ •์˜ ์ตœ์‹  ์‹œํ€€์Šค ๋ฒˆํ˜ธ ์กฐํšŒ // outer ๋ฐ inner ํŠธ๋žœ์žญ์…˜์˜ Sequence ๊ฐ’ ๊ณ„์‚ฐ์— ์‚ฌ์šฉ const ai = await client.request({ command: "account_info", account: user.address }) const seq = ai.result.account_data.Sequence const tx: any = { TransactionType: "Batch", Account: user.address, Flags: 0x00010000, // AllOrNothing RawTransactions: [ { RawTransaction: { TransactionType: "Payment", Flags: 0x40000000, // tfInnerBatchTxn Account: user.address, Destination: user2.address, Amount: "5000000", // 5 XRP Sequence: seq + 1, Fee: "0", SigningPubKey: "" }}, { RawTransaction: { TransactionType: "Payment", Flags: 0x40000000, Account: user.address, Destination: user2.address, Amount: "10000000", // 10 XRP Sequence: seq + 2, Fee: "0", SigningPubKey: "" }} ], Sequence: seq }
TypeScript
๋ณต์‚ฌ
โ€ข
๊ฒ€์ฆ ํฌ์ธํŠธ: outer๋Š” tesSUCCESS๋ผ๋„, inner 2๊ฑด์ด ๋ชจ๋‘ ledger์— ๊ธฐ๋ก๋๋Š”์ง€ ํ™•์ธ. ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจ๋ฉด ๋‘˜ ๋‹ค ์—†์Œ.

Step 2. OnlyOne (์ฒซ ์„ฑ๊ณต๋งŒ ์ ์šฉ)

โ€ข
์ฃผ์ฒด: User
โ€ข
ํ–‰๋™: Batch ํŠธ๋žœ์žญ์…˜ ์ „์†ก
โ€ข
๋‚ด์šฉ:
โ—ฆ
Flags: 0x00020000 (OnlyOne)
โ—ฆ
์—ฌ๋Ÿฌ inner ์ค‘ ๊ฐ€์žฅ ๋จผ์ € ์„ฑ๊ณตํ•œ 1๊ฑด๋งŒ ๋ฐ˜์˜, ๋‚˜๋จธ์ง€๋Š” ์‹œ๋„ ์•ˆ ํ•˜๊ฑฐ๋‚˜ ๋ฏธ์ ์šฉ
// ํ˜„์žฌ ๊ณ„์ •์˜ ์ตœ์‹  ์‹œํ€€์Šค ๋ฒˆํ˜ธ ์กฐํšŒ // outer ๋ฐ inner ํŠธ๋žœ์žญ์…˜์˜ Sequence ๊ฐ’ ๊ณ„์‚ฐ์— ์‚ฌ์šฉ const ai = await client.request({ command: "account_info", account: user.address }) const seq = ai.result.account_data.Sequence const tx: any = { TransactionType: "Batch", Account: user.address, Flags: 0x00020000, // OnlyOne RawTransactions: [ { RawTransaction: { TransactionType: "Payment", Flags: 0x40000000, Account: user.address, Destination: user2.address, Amount: "5000000", // 5 XRP Sequence: seq + 1, Fee: "0", SigningPubKey: "" }}, { RawTransaction: { TransactionType: "Payment", Flags: 0x40000000, Account: user.address, Destination: user2.address, Amount: "10000000", // 10 XRP Sequence: seq + 2, Fee: "0", SigningPubKey: "" }} ], Sequence: seq }
TypeScript
๋ณต์‚ฌ
โ€ข
๊ฒ€์ฆ ํฌ์ธํŠธ: ์ฒซ ๋ฒˆ์งธ inner๋งŒ ledger ๋ฐ˜์˜. ๋‘ ๋ฒˆ์งธ๋Š” ๋ฏธ์‹คํ–‰/๋ฏธ๋ฐ˜์˜.

Step 3. UntilFailure (์‹คํŒจ๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ „๊นŒ์ง€ ์ˆœ์ฐจ ์‹คํ–‰)

โ€ข
์ฃผ์ฒด: User
โ€ข
ํ–‰๋™: Batch ํŠธ๋žœ์žญ์…˜ ์ „์†ก
โ€ข
๋‚ด์šฉ:
โ—ฆ
Flags: 0x00040000 (UntilFailure)
โ—ฆ
์•ž์—์„œ๋ถ€ํ„ฐ ์ˆœ์ฐจ ์ ์šฉ, ์ฒซ ์‹คํŒจ๊ฐ€ ๋‚˜์˜ค๋ฉด ๊ทธ ์ดํ›„๋Š” ์ค‘๋‹จ
// ํ˜„์žฌ ๊ณ„์ •์˜ ์ตœ์‹  ์‹œํ€€์Šค ๋ฒˆํ˜ธ ์กฐํšŒ // outer ๋ฐ inner ํŠธ๋žœ์žญ์…˜์˜ Sequence ๊ฐ’ ๊ณ„์‚ฐ์— ์‚ฌ์šฉ const ai = await client.request({ command: "account_info", account: user.address }) const seq = ai.result.account_data.Sequence const tx: any = { TransactionType: "Batch", Account: user.address, Flags: 0x00040000, // UntilFailure RawTransactions: [ { RawTransaction: { TransactionType: "Payment", Flags: 0x40000000, Account: user.address, Destination: user2.address, Amount: "5000000", // 5 XRP Sequence: seq + 1, Fee: "0", SigningPubKey: "" } }, // 2๋ฒˆ์งธ ๋‚ด๋ถ€ ํŠธ๋žœ์žญ์…˜์—์„œ ์˜๋„์  ์‹คํŒจ ์œ ๋„ (๊ณผ๋„ํ•œ ๊ธˆ์•ก ์ „์†ก) { RawTransaction: { TransactionType: "Payment", Flags: 0x40000000, Account: user.address, Destination: user2.address, Amount: "50000000000", // 50000 XRP (๊ณผ๋„ํ•œ ๊ธˆ์•ก) Sequence: seq + 2, Fee: "0", SigningPubKey: "" }}, { RawTransaction: { TransactionType: "Payment", Flags: 0x40000000, Account: user.address, Destination: user2.address, Amount: "10000000", // 10 XRP Sequence: seq + 3, Fee: "0", SigningPubKey: "" }} ], Sequence: seq }
TypeScript
๋ณต์‚ฌ
โ€ข
๊ฒ€์ฆ ํฌ์ธํŠธ: 1๋ฒˆ์€ ์„ฑ๊ณต, 2๋ฒˆ์—์„œ ์‹คํŒจ, 3๋ฒˆ์€ ๋ฏธ์‹คํ–‰.

Step 4. Independent (๋ชจ๋‘ ์‹œ๋„, ์„ฑ๊ณต/์‹คํŒจ ๋…๋ฆฝ)

โ€ข
์ฃผ์ฒด: User
โ€ข
ํ–‰๋™: Batch ํŠธ๋žœ์žญ์…˜ ์ „์†ก
โ€ข
๋‚ด์šฉ:
โ—ฆ
Flags: 0x00080000 (Independent)
โ—ฆ
๋ชจ๋“  inner๋ฅผ ์‹œ๋„. ์ผ๋ถ€ ์‹คํŒจํ•ด๋„ ๋‚˜๋จธ์ง€๋Š” ๊ณ„์† ์ง„ํ–‰
// ํ˜„์žฌ ๊ณ„์ •์˜ ์ตœ์‹  ์‹œํ€€์Šค ๋ฒˆํ˜ธ ์กฐํšŒ // outer ๋ฐ inner ํŠธ๋žœ์žญ์…˜์˜ Sequence ๊ฐ’ ๊ณ„์‚ฐ์— ์‚ฌ์šฉ const ai = await client.request({ command: "account_info", account: user.address }) const seq = ai.result.account_data.Sequence const tx: any = { TransactionType: "Batch", Account: user.address, Flags: 0x00080000, // Independent RawTransactions: [ { RawTransaction: { TransactionType: "Payment", Flags: 0x40000000, Account: user.address, Destination: user2.address, Amount: "100000000000", // 100000 XRP(๊ณผ๋„ํ•œ ๊ธˆ์•ก) Sequence: seq + 1, Fee: "0", SigningPubKey: "" }}, { RawTransaction: { TransactionType: "Payment", Flags: 0x40000000, Account: user.address, Destination: user2.address, Amount: "50000000000", // 50000 XRP(๊ณผ๋„ํ•œ ๊ธˆ์•ก) Sequence: seq + 2, Fee: "0", SigningPubKey: "" }}, { RawTransaction: { TransactionType: "Payment", Flags: 0x40000000, Account: user.address, Destination: user2.address, Amount: "5000000", // 5 XRP Sequence: seq + 3, Fee: "0", SigningPubKey: "" }} ], Sequence: seq }
TypeScript
๋ณต์‚ฌ
โ€ข
๊ฒ€์ฆ ํฌ์ธํŠธ: ์‹คํŒจํ•œ inner๊ฐ€ ์žˆ์–ด๋„ ๋‹ค๋ฅธ inner๋“ค์€ ์ •์ƒ ๋ฐ˜์˜.

4. ๊ตฌํ˜„ ์‹œ ์œ ์˜์‚ฌํ•ญ

โ€ข
Inner Transaction ์ œํ•œ
โ—ฆ
Fee: "0"์ด์–ด์•ผ ํ•จ (Outer๊ฐ€ ์ˆ˜์ˆ˜๋ฃŒ ๋ถ€๋‹ด)
โ—ฆ
์„œ๋ช… ์—†์Œ (SigningPubKey: "", TxnSignature ์ƒ๋žต)
โ—ฆ
Flags์— tfInnerBatchTxn (0x40000000) ํ•„์ˆ˜
โ€ข
Outer Transaction
โ—ฆ
๋ชจ๋“  Inner๋ฅผ ํฌํ•จํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ BatchSigners๋กœ ๋‹ค์ค‘ ๊ณ„์ • ์„œ๋ช… ํฌํ•จ
โ€ข
Inner Transaction ์ˆ˜
โ—ฆ
์ตœ๋Œ€ 8๊ฐœ (ํ–ฅํ›„ ์™„ํ™” ๊ฐ€๋Šฅ)