본문으둜 κ±΄λ„ˆλ›°κΈ°

결제 채널 (Payment Channels)

결제 채널은 "비동기" XRP 결제λ₯Ό 맀우 μž‘μ€ λ‹¨μœ„λ‘œ λ‚˜λˆ„κ³  λ‚˜μ€‘μ— κ²°μ œν•  수 μžˆλŠ” κ³ κΈ‰ κΈ°λŠ₯μž…λ‹ˆλ‹€.

결제 μ±„λ„μ˜ XRPλŠ” μΌμ‹œμ μœΌλ‘œ μ˜ˆμ•½λ©λ‹ˆλ‹€. μ†‘μ‹ μžλŠ” 채널에 λŒ€ν•œ 청ꡬ(Claims)λ₯Ό μƒμ„±ν•˜κ³ , μˆ˜μ‹ μžλŠ” XRP 원μž₯ 거래λ₯Ό λ³΄λ‚΄κ±°λ‚˜ μƒˆ 원μž₯ 버전이 ν•©μ˜μ— μ˜ν•΄ 승인되기λ₯Ό 기닀리지 μ•Šκ³  ν™•μΈν•©λ‹ˆλ‹€. (이것은 일반적인 νŠΈλžœμž­μ…˜μ΄ ν•©μ˜μ— μ˜ν•΄ μŠΉμΈλ˜λŠ” νŒ¨ν„΄κ³Ό λ³„κ°œλ‘œ λ°œμƒν•˜λ―€λ‘œ 비동기 κ³Όμ •μž…λ‹ˆλ‹€.) μˆ˜μ‹ μžλŠ” μ–Έμ œλ“ μ§€ 청ꡬλ₯Ό 인좜(redeem)ν•˜μ—¬ κ·Έ 청ꡬ에 μ˜ν•΄ 승인된 XRP κΈˆμ•‘μ„ 받을 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 청ꡬλ₯Ό κ²°μ •ν•˜λŠ” 것은 ν‘œμ€€ XRP 원μž₯ 거래λ₯Ό μ‚¬μš©ν•˜λ©°, μ΄λŠ” 일반적인 ν•©μ˜ κ³Όμ •μ˜ μΌλΆ€μž…λ‹ˆλ‹€. 이 단일 κ±°λž˜λŠ” 더 μž‘μ€ 청ꡬ에 μ˜ν•΄ 보μž₯된 μ—¬λŸ¬ 거래λ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ²­κ΅¬λŠ” κ°œλ³„μ μœΌλ‘œ ν™•μΈλ˜μ§€λ§Œ λ‚˜μ€‘μ— μΌκ΄„λ‘œ 결제될 수 있기 λ•Œλ¬Έμ—, 결제 채널을 톡해 νŠΈλžœμž­μ…˜μ„ μ°Έκ°€μžλ“€μ΄ μ΄λŸ¬ν•œ 청ꡬ의 디지털 μ„œλͺ…을 μƒμ„±ν•˜κ³  ν™•μΈν•˜λŠ” λŠ₯λ ₯μ—λ§Œ μ œν•œλ˜λŠ” μ†λ„λ‘œ 진행할 수 있게 λ©λ‹ˆλ‹€. 이 μ œν•œμ€ 주둜 μ°Έκ°€μžλ“€μ˜ ν•˜λ“œμ›¨μ–΄ 속도와 μ„œλͺ… μ•Œκ³ λ¦¬μ¦˜μ˜ λ³΅μž‘μ„±μ— κΈ°λ°˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ΅œλŒ€ 속도λ₯Ό μ–»κΈ° μœ„ν•΄μ„ , XRP 원μž₯의 기본적인 secp256k1 ECDSA μ„œλͺ…보닀 λΉ λ₯Έ Ed25519 μ„œλͺ…을 μ‚¬μš©ν•˜μ„Έμš”. μ—°κ΅¬λŠ” 2011λ…„μ˜ μƒν’ˆ ν•˜λ“œμ›¨μ–΄μ—μ„œ μ΄ˆλ‹Ή Ed25519 100,000개 μ΄μƒμ˜ μ„œλͺ…을 μƒμ„±ν•˜κ³  μ΄ˆλ‹Ή 70,000개 이상을 확인할 수 μžˆλŠ” λŠ₯λ ₯을 증λͺ…ν–ˆμŠ΅λ‹ˆλ‹€.

μ™œ 결제 채널을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”κ°€β€‹

결제 채널을 μ‚¬μš©ν•˜λŠ” 과정은 항상 두 λ‹Ήμ‚¬μž, 즉 μ§€λΆˆμžμ™€ μˆ˜μ·¨μΈμ„ ν¬ν•¨ν•©λ‹ˆλ‹€. μ§€λΆˆμžλŠ” XRP 원μž₯을 μ‚¬μš©ν•˜λŠ” κ°œμΈμ΄λ‚˜ κΈ°κ΄€μœΌλ‘œ, 수취인의 κ³ κ°μž…λ‹ˆλ‹€. μˆ˜μ·¨μΈμ€ μƒν’ˆμ΄λ‚˜ μ„œλΉ„μŠ€μ— λŒ€ν•œ λŒ€κ°€λ‘œ XRPλ₯Ό λ°›λŠ” κ°œμΈμ΄λ‚˜ μ‚¬μ—…μ²΄μž…λ‹ˆλ‹€.

결제 채널은 본질적으둜 μ–΄λ–€ 것을 κ΅¬λ§€ν•˜κ³  νŒλ§€ν•  수 μžˆλŠ”μ§€μ— λŒ€ν•΄ μ§€μ •ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 결제 채널에 μ ν•©ν•œ μƒν’ˆκ³Ό μ„œλΉ„μŠ€μ˜ μœ ν˜•μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • 디지털 μ•„μ΄ν…œμ²˜λŸΌ 거의 μ¦‰μ‹œ 전솑될 수 μžˆλŠ” 것듀
  • 거래 처리 λΉ„μš©μ΄ κ°€κ²©μ˜ λΉ„μ‹Ό 뢀뢄을 μ°¨μ§€ν•˜λŠ” μ €λ ΄ν•œ 것듀
  • μ •ν™•ν•œ μˆ˜λŸ‰μ΄ 미리 μ•Œλ €μ§€μ§€ μ•Šκ³  λŒ€λŸ‰μœΌλ‘œ κ΅¬λ§€ν•˜λŠ” 것듀

결제 μ±„λ„μ˜ 생애주기​

λ‹€μŒ λ‹€μ΄μ–΄κ·Έλž¨μ€ 결제 μ±„λ„μ˜ 생애주기λ₯Ό μš”μ•½ν•œ κ²ƒμž…λ‹ˆλ‹€.

paychan-flow

결제 μ±„λ„μ˜ JSON ν‘œν˜„β€‹

{
"Account": "rBqb89MRQJnMPq8wTwEbtz4kvxrEDfcYvt",
"Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Amount": "4325800",
"Balance": "2323423",
"PublicKey": "32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A",
"SettleDelay": 3600,
"Expiration": 536027313,
"CancelAfter": 536891313,
"SourceTag": 0,
"DestinationTag": 1002341,
"DestinationNode": "0000000000000000",
"Flags": 0,
"LedgerEntryType": "PayChannel",
"OwnerNode": "0000000000000000",
"PreviousTxnID": "F0AB71E777B2DA54B86231E19B82554EF1F8211F92ECA473121C655BFC5329BF",
"PreviousTxnLgrSeq": 14524914,
"index": "96F76F27D8A327FC48753167EC04A46AA0E382E6F57F32FD12274144D00F1797"
}

결제 채널 κ΄€λ ¨ νŠΈλžœμž­μ…˜ 및 λ¦¬ν€˜μŠ€νŠΈ νƒ€μž…β€‹

νŠΈλžœμž­μ…˜ (Transaction)​

  • PaymentChannelCreate

    μ§€λΆˆ 채널을 μƒμ„±ν•˜κ³  XRP둜 μžκΈˆμ„ μ œκ³΅ν•©λ‹ˆλ‹€. 이 νŠΈλžœμž­μ…˜μ„ λ³΄λ‚΄λŠ” μ£Όμ†Œκ°€ μ§€λΆˆ μ±„λ„μ˜ "좜처 μ£Όμ†Œ"κ°€ λ©λ‹ˆλ‹€.

    {
    "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
    "TransactionType": "PaymentChannelCreate",
    "Amount": "10000",
    "Destination": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
    "SettleDelay": 86400,
    "PublicKey": "32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A",
    "CancelAfter": 533171558,
    "DestinationTag": 23480,
    "SourceTag": 11747
    }
  • PaymentChannelClaim

    XRP μ§€λΆˆ μ±„λ„μ—μ„œ XRPλ₯Ό μ²­κ΅¬ν•˜κ±°λ‚˜, μ§€λΆˆ μ±„λ„μ˜ λ§Œλ£ŒμΌμ„ μ‘°μ •ν•˜κ±°λ‚˜, λ‘˜ λ‹€ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 κ±°λž˜λŠ” νŠΈλžœμž­μ…˜ λ°œμ‹ μžμ˜ μ§€μ •λœ μ±„λ„μ—μ„œμ˜ 역할에 따라 λ‹€λ₯΄κ²Œ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

    μ±„λ„μ˜ 좜처 μ£Όμ†ŒλŠ” λ‹€μŒκ³Ό 같은 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

    1. μ±„λ„μ—μ„œ λͺ©μ μ§€λ‘œ XRPλ₯Ό μ²­κ΅¬μ„œμ™€ ν•¨κ»˜ λ˜λŠ” 없이 보낼 수 μžˆμŠ΅λ‹ˆλ‹€.
    2. μ±„λ„μ˜ SettleDelayκ°€ μ§€λ‚œ 후에 μ±„λ„μ˜ 만료λ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    3. 보λ₯˜ 쀑인 만료 μ‹œκ°„μ„ μ§€μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.
    4. 채널을 μ¦‰μ‹œ 닫을 수 있으며, 이 경우 청ꡬλ₯Ό λ¨Όμ € μ²˜λ¦¬ν•˜κ±°λ‚˜ μ²˜λ¦¬ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. 채널에 μž”μ—¬ XRPκ°€ μžˆλŠ” 경우 좜처 μ£Όμ†ŒλŠ” 채널을 μ¦‰μ‹œ 닫을 수 μ—†μŠ΅λ‹ˆλ‹€.

    μ±„λ„μ˜ λͺ©μ μ§€ μ£Όμ†ŒλŠ” λ‹€μŒκ³Ό 같은 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

    1. μ„œλͺ…λœ μ²­κ΅¬μ„œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ±„λ„λ‘œλΆ€ν„° XRPλ₯Ό μˆ˜λ Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    2. μ²­κ΅¬μ„œλ₯Ό μ²˜λ¦¬ν•œ 후에 채널을 μ¦‰μ‹œ 닫을 수 있으며, 이 경우 미청ꡬ XRPλ₯Ό μ±„λ„μ˜ 좜처둜 ν™˜λΆˆν•©λ‹ˆλ‹€.

    이 νŠΈλžœμž­μ…˜μ„ λ³΄λ‚΄λŠ” μ–΄λ–€ μ£Όμ†Œλ“ μ§€, 이전 λ ›μ €μ˜ 마감 μ‹œκ°„λ³΄λ‹€ 만료 λ˜λŠ” CancelAfter μ‹œκ°„μ΄ 더 였래된 채널을 닫을 수 μžˆμŠ΅λ‹ˆλ‹€. νŠΈλžœμž­μ…˜μ˜ λ‚΄μš©κ³ΌλŠ” 상관없이 μœ νš¨ν•˜κ²Œ κ΅¬μ„±λœ PaymentChannelClaim νŠΈλžœμž­μ…˜μ€ 이 효과λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

    {
    "Channel": "C1AE6DDDEEC05CF2978C0BAD6FE302948E9533691DC749DCDD3B9E5992CA6198",
    "Balance": "1000000",
    "Amount": "1000000",
    "Signature": "30440220718D264EF05CAED7C781FF6DE298DCAC68D002562C9BF3A07C1E721B420C0DAB02203A5A4779EF4D2CCC7BC3EF886676D803A9981B928D3B8ACA483B80ECA3CD7B9B",
    "PublicKey": "32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A"
    }
  • PaymentChannelFund

    μ§€λΆˆ 채널에 XRPλ₯Ό μΆ”κ°€ν•˜κ³ , ν•„μš”ν•˜λ‹€λ©΄ μ±„λ„μ˜ 만료 μ‹œκ°„μ„ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€. μ§€λΆˆ μ±„λ„μ˜ 좜처 μ£Όμ†Œλ§Œ 이 νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    {
    "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
    "TransactionType": "PaymentChannelFund",
    "Channel": "C1AE6DDDEEC05CF2978C0BAD6FE302948E9533691DC749DCDD3B9E5992CA6198",
    "Amount": "200000",
    "Expiration": 543171558
    }

λ¦¬ν€˜μŠ€νŠΈ (Request)​

  • channel_authorize

    μ§€λΆˆμžλŠ” channel_authorize λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±ν•œ μ„œλͺ…(signature)λŠ” 수취인이 XRPλ₯Ό μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ κΆŒν•œμ„ λΆ€μ—¬ν•©λ‹ˆλ‹€. 이 μ„œλͺ…은 μˆ˜μ·¨μΈμ—κ²Œ μ „μ†‘λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

    ν•˜μ§€λ§Œ λ‹¨μˆœνžˆ μ„œλͺ…λ§Œμ„ λ³΄λ‚΄λŠ” 것이 μ•„λ‹ˆλΌ, XRP Ledgerμ—μ„œμ˜ Payment Channel Claim νŠΈλžœμž­μ…˜μ„ μ œμΆœν•˜λŠ”λ° ν•„μš”ν•œ λͺ‡ 가지 정보도 ν•¨κ»˜ 보내야 ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ •λ³΄μ—λŠ” λ‹€μŒμ΄ ν¬ν•¨λ©λ‹ˆλ‹€:

    1. channel_id: 결제 μ±„λ„μ˜ κ³ μœ ν•œ μ‹λ³„μžμž…λ‹ˆλ‹€.
    2. signature: channel_authorize λ©”μ†Œλ“œμ— μ˜ν•΄ μƒμ„±λœ μ„œλͺ…μž…λ‹ˆλ‹€.
    3. public_key: 결제 채널을 λ§Œλ“  κ³„μ •μ˜ 곡개 ν‚€μž…λ‹ˆλ‹€.
    4. amount: μΈμΆœν•˜λ €λŠ” XRP κΈˆμ•‘μž…λ‹ˆλ‹€.

    이 정보듀을 μˆ˜μ·¨μΈμ—κ²Œ μ œκ³΅ν•˜λ©΄, μˆ˜μ·¨μΈμ€ 이λ₯Ό μ‚¬μš©ν•˜μ—¬ XRP Ledger에 Payment Channel Claim νŠΈλžœμž­μ…˜μ„ μ œμΆœν•˜κ³ , μ§€μ •λœ κΈˆμ•‘μ˜ XRPλ₯Ό μΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • channel_verify

    channel_verify λ©”μ†Œλ“œλŠ” 수취인이 결제 μ±„λ„μ—μ„œ νŠΉμ • μ–‘μ˜ XRPλ₯Ό μΈμΆœν•  수 μžˆλŠ” μ„œλͺ…μ˜ μœ νš¨μ„±μ„ κ²€μ‚¬ν•©λ‹ˆλ‹€. λ³΄μ•ˆμ„±μ„ ν™•λ³΄ν•˜κ³ , λΆ€μ •ν–‰μœ„λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œ, 자금의 μΈμΆœμ— μ§μ ‘μ μœΌλ‘œ 영ν–₯을 λΌμΉ˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

결제 채널 μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€β€‹

import os

from account import XrplAccount
from transaction import XrplTransaction
from request import XrplRequest
from utils import Logger

DIR = os.path.dirname(__file__)


def main():
# 0. μ§€λΆˆμžμ™€ 수취인의 지갑을 μ—°κ²°ν•©λ‹ˆλ‹€.
payer = XrplAccount(
wallet_path=os.path.join(DIR, "wallets", "payer.json"),
create=True,
)
payee = XrplAccount(
wallet_path=os.path.join(DIR, "wallets", "payee.json"),
create=True,
)

# νŠΈλžœμž­μ…˜κ³Ό λ¦¬ν€˜μŠ€νŠΈλ₯Ό μœ„ν•œ 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
transaction = XrplTransaction()
request = XrplRequest()
# κ²°κ³Ό 확인을 μœ„ν•΄ 둜거λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. (둜그 νŒŒμΌμ€ logs 디렉토리에 μ €μž₯λ©λ‹ˆλ‹€.)
logger = Logger(os.path.join(DIR, "logs", "channel_scenario.log"))

# 1. μ§€λΆˆμž: 채널 생성
# μ§€λΆˆμžκ°€ 채널을 μƒμ„±ν•˜λ©΄ μž…λ ₯ν•œ κΈˆμ•‘λ§ŒνΌμ˜ XRPκ°€ μ§€κ°‘μœΌλ‘œλΆ€ν„° λΉ μ Έλ‚˜μ™€ 채널에 μ˜ˆμΉ˜λ©λ‹ˆλ‹€.
result = transaction.create_payment_channel(
account=payer,
destination_address=payee.address,
amount=500,
settle_delay=86400,
public_key=payee.wallet.public_key,
)
logger.log(result)

# μ§€λΆˆμžμ™€ 수취인 λͺ¨λ‘ μ±„λ„μ˜ κ³΅κ°œν‚€λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. (이 κ³΅κ°œν‚€λŠ” 수취인이 μ²­κ΅¬μ„œλ₯Ό 검증할 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.)
channel_public_key = result["PublicKey"]

# 2. 수취인: 채널 확인
# μˆ˜μ·¨μΈμ€ μ§€λΆˆμžκ°€ μƒμ„±ν•œ 채널을 ν™•μΈν•©λ‹ˆλ‹€.
# 채널은 단방ν–₯μ΄λ―€λ‘œ μˆ˜μ·¨μΈμ€ μ§€λΆˆμžμ˜ 계정 μ£Όμ†Œλ₯Ό 톡해 채널을 ν™•μΈν•©λ‹ˆλ‹€.
result = request.get_account_channels(payee.client, payer.address)
logger.log(result)

channel_id = result["channels"][-1]["channel_id"]

# 3. μ§€λΆˆμž: μ²­κ΅¬μ„œμ— μ„œλͺ…
# μ§€λΆˆμžκ°€ 본인 μ§€κ°‘μ˜ λΉ„λ°€ν‚€λ‘œ μ²­κ΅¬μ„œμ— μ„œλͺ…ν•©λ‹ˆλ‹€.
result = request.authorize_channel(
client=payer.client,
channel_id=channel_id,
amount=100,
secret=payer.wallet.seed,
)
logger.log(result)
# μ„œλͺ… κ²°κ³Όλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. (이 μ„œλͺ… κ²°κ³Όλ₯Ό μ§€λΆˆμžκ°€ μˆ˜μ·¨μΈμ—κ²Œ 전솑해야 ν•©λ‹ˆλ‹€. Off-ledger둜 μ „μ†‘ν•©λ‹ˆλ‹€.)
signature = result["signature"]

# 4. μ§€λΆˆμž: μ²­κ΅¬μ„œλ₯Ό μˆ˜μ·¨μΈμ—κ²Œ 전솑
# ν•„μš”ν•œ 정보듀을 μ „λΆ€ ν¬ν•¨μ‹œμΌœ μ²­κ΅¬μ„œλ₯Ό λ§Œλ“­λ‹ˆλ‹€.
# Off-ledger둜 μ²­κ΅¬μ„œλ₯Ό μˆ˜μ·¨μΈμ—κ²Œ 전솑 ν•©λ‹ˆλ‹€. (XRP Ledgerμ—λŠ” κΈ°λ‘λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.)
invoice = {
"channel_id": channel_id,
"signature": signature,
"amount": 100,
"public_key": channel_public_key,
}
logger.log(invoice)

# 5. 수취인: μ²­κ΅¬μ„œ 확인
# μˆ˜μ·¨μΈμ€ μ²­κ΅¬μ„œλ₯Ό ν™•μΈν•˜κ³ , μ²­κ΅¬μ„œμ— ν¬ν•¨λœ μ„œλͺ…을 μ²­κ΅¬μ„œμ˜ κ³΅κ°œν‚€λ‘œ κ²€μ¦ν•©λ‹ˆλ‹€.
result = request.verify_channel(client=payee.client, **invoice)
logger.log(result)

# 6. 수취인: μƒν’ˆ λ˜λŠ” μ„œλΉ„μŠ€ 제곡
# Off-ledger λ˜λŠ” on-ledger둜 μƒν’ˆ λ˜λŠ” μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

# 7. μ›ν•˜λŠ”λŒ€λ‘œ 3-6단계 λ°˜λ³΅ν•©λ‹ˆλ‹€.

# 8. 수취인: XRP μƒν™˜
# κ±°λž˜κ°€ μ™„λ£Œλ˜λ©΄, μˆ˜μ·¨μΈμ€ 인증된 κΈˆμ•‘μ— λŒ€ν•œ 청ꡬλ₯Ό μƒν™˜ν•©λ‹ˆλ‹€.
# μ²­κ΅¬μ„œλŠ” λˆ„μ λœ κΈˆμ•‘μ„ ν¬ν•¨ν•˜κ³  μžˆμœΌλ―€λ‘œ, 3~6단계가 μ—¬λŸ¬λ²ˆ 진행됐어도 λ§ˆμ§€λ§‰ μ²­κ΅¬μ„œλ§Œ claimν•˜λ©΄ λ©λ‹ˆλ‹€.
# redeem_payment_channel은 λ‚΄λΆ€μ—μ„œ PaymentChannelClaim νŠΈλžœμž­μ…˜μ„ μƒμ„±ν•©λ‹ˆλ‹€.
result = transaction.redeem_payment_channel(
account=payee, balance=invoice["amount"], **invoice
)
logger.log(result)

# 9. μ§€λΆˆμž: 채널 λ‹«κΈ° μš”μ²­
# 채널을 λ‹«μœΌλ©΄ 채널에 λ‚¨μ•„μžˆλŠ” XRPκ°€ μ§€λΆˆμžμ—κ²Œ λŒμ•„κ°‘λ‹ˆλ‹€.
# close_payment_channel은 λ‚΄λΆ€μ—μ„œ 채널을 λ‹«λŠ” ν”Œλž˜κ·Έλ₯Ό ν¬ν•¨ν•œ PaymentChannelClaim νŠΈλžœμž­μ…˜μ„ μƒμ„±ν•©λ‹ˆλ‹€.
result = transaction.close_payment_channel(account=payer, channel_id=channel_id)
logger.log(result)

# 10. μ§€λΆˆμž(λ˜λŠ” λˆ„κ΅°κ°€): 만료된 채널 λ‹«κΈ°
# λ§Œμ•½ 채널이 λ‹«νžˆμ§€ μ•Šκ³  λ§Œλ£Œλ˜μ—ˆλ‹€λ©΄ μ•„λ¬΄λ‚˜ (μ§€λΆˆμžλ‚˜ 수취인 말고도 정말 μ•„λ¬΄λ‚˜) 채널을 닫을 수 μžˆμŠ΅λ‹ˆλ‹€.
# result = transaction.close_payment_channel(account=payee, channel_id=channel_id)
# logger.log(result)

# 채널 λ‹«ν˜”λŠ”μ§€ 확인
result = request.get_account_channels(payer.client, payer.address)
logger.log(result)


if __name__ == "__main__":
main()