📝

ブロックチェーンで小切手機能を利用する

2023/03/20に公開

XRP Ledger とは

XRP LedgerはBitcoinやEthereumなどと同じ分散型のパブリックブロックチェーンです。PoWやPoSとは異なる独自のコンセンサスアルゴリズムが用いられています。
トークン機能やDEX機能をプロトコルネイティブに搭載しており、強力な決済機能があります。決済機能だけでなくNFTやAMM(開発中)、Hooks(スマコン/開発中)など様々な機能を搭載しています。

Checkとは

https://xrpl.org/ja/use-checks.html

CheckとはXRP Ledgerに搭載されている機能の一つです。Check機能は小切手に似た仕組みであり、送金人は宛先と金額を指定したCheckオブジェクトを作成します。受取人はCheckを換金して送金人が指定した金額を上限に任意の金額を受け取ることができます。

送金人が指定した金額はCheck作成時点ではアカウントで拘束されることはありません。換金時に資金不足の場合は、処理に失敗しますが、有効期限(設定している場合)が切れるまで再試行できます。

Check機能はXRPと発行トークンのいずれでも利用可能です。

Check機能の利用方法

Check機能は次の3つのトランザクションによって成り立ちます。

CheckCreate

https://xrpl.org/ja/checkcreate.html

送金人より作成されるトランザクションで、宛先と金額などを指定し、Checkオブジェクトを作成します。

トランザクションの例

{
  "TransactionType": "CheckCreate",
  "Account": "rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo",
  // 宛先
  "Destination": "rfkE1aSy9G8Upk4JssnwBxhEv5p4mn2KTy",
  // 送金する金額: この例では100000000drops(=100XRP)
  "SendMax": "100000000",
  // 有効期限: 任意フィールド
  "Expiration": 570113521,
  // 送金の識別子等の任意のフィールド
  "InvoiceID": "6F1DFD1D0FE8A32E40E1F2C05CF1C15545BAB56B617F9C6C2D63A6B704BEF59B",
  // 受取人の識別タグ: 任意フィールド
  "DestinationTag": 1,
}

CheckCash

https://xrpl.org/ja/checkcash.html

Checkオブジェクトの宛先アカウントである受取人によって作成されるトランザクションで、金額を指定してCheckオブジェクトを資金化します。資金は正確な金額で指定して資金化したり、指定した金額を下限に可能な限りの額を資金化することができます。
送金人の資金が不足していたり、Checkオブジェクトの有効期限が切れている場合はトランザクションは失敗します。
受け取る発行トークンへのトラストラインが未設定の場合、自動的にトラストラインを設定します。

トランザクションの例: 1

{
  "Account": "rfkE1aSy9G8Upk4JssnwBxhEv5p4mn2KTy",
  "TransactionType": "CheckCash",
  // 100,000,000drops(=100XRP)を資金化する。送金人の資金不足の場合はエラーとなります。
  "Amount": "100000000",
  // Checkオブジェクトを識別するID
  "CheckID": "838766BA2B995C00744175F69A1B11E32C3DBC40E64801A4056FCBD657F57334",
}

トランザクションの例: 2

{
  "Account": "rfkE1aSy9G8Upk4JssnwBxhEv5p4mn2KTy",
  "TransactionType": "CheckCash",
  // 80,000,000drops(=80XRP)以上かつCheckオブジェクトのSendMaxの金額以下で可能な限りの金額を資金化する。
  // 資金化する金額が80XRPに満たない場合はトランザクションは失敗する
  "DeliverMin": "800000000",
  // Checkオブジェクトを識別するID
  "CheckID": "838766BA2B995C00744175F69A1B11E32C3DBC40E64801A4056FCBD657F57334",
}

CheckCancel

https://xrpl.org/ja/checkcancel.html

Checkオブジェクトの送金人または受取人により作成されるトランザクションで、Checkオブジェクトを削除します。
有効期限が切れたCheckオブジェクトは送金人または受取人だけでなくその他全てのアカウントが削除することができます。

トランザクションの例

{
   "Account": "rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo",
   "TransactionType": "CheckCancel",
    // Checkオブジェクトを識別するID
   "CheckID": "49647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB0",
}

Checkオブジェクト

Checkオブジェクトがレジャー上に存在する場合、オブジェクト毎に次のような情報が格納されています。

{
  // Checkの送金人
  "Account": "rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo",
  // Checkの宛先
  "Destination": "rfkE1aSy9G8Upk4JssnwBxhEv5p4mn2KTy",
  // 宛先アカウントでCheckを含むオブジェクトが格納されている位置
  "DestinationNode": "0000000000000000",
  // 受取人の識別タグ
  "DestinationTag": 1,
  // 有効期限: Ripple Epochで指定
  "Expiration": 570113521,
  // CheckではFlagsは定義されていないため常に0
  "Flags": 0,
  // 送金の識別子等の任意のフィールド
  "InvoiceID": "46060241FABCF692D4D934BA2A6C4427CD4279083E38C77CBE642243E43BE291",
  // このオブジェクトがCheckオブジェクトであることを示す
  "LedgerEntryType": "Check",
  // 送金人のアカウントでCheckを含むオブジェクトが格納されている位置
  "OwnerNode": "0000000000000000",
  // 最後にこのオブジェクトを変更したトランザクションの識別用ハッシュ
  "PreviousTxnID": "5463C6E08862A1FAE5EDAC12D70ADB16546A1F674930521295BC082494B62924",
  // 最後にこのオブジェクトを変更したトランザクションを含むレジャーインデックス
  "PreviousTxnLgrSeq": 6,
  // 受取人が受取可能な最大の金額
  "SendMax": "100000000",
  // このCheckを作成したCheckCreateトランザクションのシーケンス番号。
  "Sequence": 2,
  // オブジェクトを識別する一意な値
  "index": "49647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB0"
}

Checkオブジェクトの利用例

企業や金融機関等では資金の受け取り時に資金の送金元について明らかにしておく必要がある場合があります。
このような状況ではCheck機能はまさに有効であり、問題がない送金元からのCheckを資金化することで資金を受け取ることができます。
問題があった送金元からのCheckは無視するもしくは、CheckCancelトランザクションで削除することが考えられます。

この場合、Paymentによる送金はDeposit Authorization機能によって無効化することができます。

https://xrpl.org/ja/depositauth.html

DepositPreauthトランザクションを使用することで指定したアカウントのみPaymentトランザクションでの送金を許可することも可能です。

https://xrpl.org/ja/depositpreauth.html

サンプルコード

https://github.com/develoQ/xrpl-sample/blob/main/samples/checks/index.ts

CheckCreateトランザクション実行結果(テストネット)

https://testnet.xrpl.org/transactions/DA9866DF608E576D8CA84703F36AC9EA57CF9EE8D19D44E19057C06C5B31DCD6

CheckCashトランザクション実行結果(テストネット)

https://testnet.xrpl.org/transactions/0FC03E716EFA3C2CAEA1FEC9C74A5D803C11F22BA12315C98A71AEF62887AD52

おわりに

本記事では、XRP LedgerのChecks機能について説明しました。Check機能は、送金の受け取り時に送金元アカウントを確認する必要がある場合などに有効な機能です。企業や金融機関がXRP Ledgerを利用した送金を行う場合に非常に役に立つ機能と言えるでしょう。

Checksに関するコードは以下のリポジトリから参照できます。
https://github.com/develoQ/xrpl-sample/blob/main/samples/checks

興味を持たれた方はXRP Ledger開発者のDiscordチャンネルへ是非お越しください!
日本語チャンネルもありますので、英語ができなくても大丈夫です!
https://xrpldevs.org

Discussion