デマレージ
デマレージ とは、保有資産にかかるマイナスの金利で、その資産を保有するためのコストを表すものです。 XRP Ledgerで発行された通貨のデマレージを表現するために、デマレージレートを示すカスタム通貨コード を使って追跡することができます。 これによって、様々なデマレージの量に対応した別々のバージョンの通貨が効果的に作成されます。クライアントアプリケーションは、通貨コードと一緒に年率でデマレージ通貨コードを表現することによって、これをサポートすることができます。例えば、以下のようになります。"XAU (-0.5%pa)".
通貨量の表記について
XRP Ledgerのすべての金額を継続的に更新するのではなく、有利子通貨や減耗通貨の金額を2種類の金額に分割する方法です。XRP Ledgerに記録される「レジャー値」と、人に見せる「表示値」の2種類に分けます。「レジャー値」は、ある一定時点、すなわち2000年1月1日午前0時の「リップルエポック」での通貨の価値を表しています。「表示値」は、リップルエポックからその時点までの連続した利息やデマレージを計算した後の時点(通常は現在時刻)での金額を表しています。
したがって、クライアントソフトウェアは2つの変換を適用する必要があります。
- ある時点の表示値を取り込み、レジャー値に変換して記録すること。
- レジャー値を、ある時点の表示値に変換すること。
デマレージの計算
通貨に関するデマレージの完全な計算式は以下の通りです。
D = A × ( e ^ (t ÷ τ) )
- D はデマレージ後の金額
- A はグローバルレジャーに記録されたデマレージ前金額です。
- e はオイラー数
- t はリップルエポック(UTC2000年1月1日0時)からの経過秒数
- τ は、e倍加時間の時間(秒)です。この値は[希望する金利から計算](#e倍加時間の計算)されます。
表示金額とレジャー金額の変換は、以下の手順で行います。
( e ^ (t ÷ τ) )
の値を計算する。この数値を「デマレージ係数」と呼ぶ。デマレージ係数は常に現在時刻など特定の時刻からの相対値である。- 変換する量に適用します。
- レジャー値を表示値に変換する場合は、デマレージ係数を乗じる。
- 表示値をレジャー値に変換する場合は、デマレージ係数で割ってください。
- 必要であれば、結果値が望ましい精度で表現できるように調整する。XRP Ledgerの発行通貨形式により、レジャー値の精度は小数点以下15桁までとされています。
利子付き通貨コードフォーマット
標準通貨コード形式ではなく、正の金利や負の金利(Demurrage)を持つ通貨は、以下の形式の160ビット通貨コードを使用します。
- 最初の8ビットは
0x01
でなければなりません。 - 次の24ビットはASCIIの3文字を表します。 これはISO 4217のコードと予想されます。標準フォーマットのASCII文字と同じ文字をサポートしています。
- 次の24ビットはすべて「0」でなければなりません。
- 次の64ビットは通貨の金利で、IEEE754ダブルフォーマットで「e-folding time」と表現される。
- 次の24ビットは予約されており,すべて
0
でなければなりません
e倍加時間の計算
レジャー金額と表示金額の変換や、有利子/不利子通貨の通貨コードの計算には、「e倍加時間」としての金利が必要です。e倍加時間とは、ある数量が e(オイラー数)の倍数だけ増加するのにかかる時間のことである。慣例として、e倍加時間は数式ではτという文字で表記される。
ある年率パーセントの利息に対するe倍加時間の時間を計算すること。
- 100%に金利を足すと、年利を適用した後の初期金額に対する割合が算出されます。デマレージには、マイナスの金利を使用します。例えば、0.5%のデマレージは-0.5%の金利となり、**99.5%**の残存率となります。
- パーセンテージを小数で表します。例えば、99.5%は0.995となります。
- その数値の自然対数をとります。例えば、ln(0.995) = -0.005012541823544286 となります。(この数値は、当初の金利がプラスであればプラス、マイナスであればマイナスになります)。
- 1年間の秒数(31536000)を、前のステップの自然対数の結果で割ってください。例えば、31536000 ÷ -0.005012541823544286 = -6291418827.045599 となります。この結果が、e倍加時間(秒)です。
クライアントサポート
利息通貨とデマレージ通貨をサポートするために、クライアントアプリケーションはいくつかの機能を実装する必要があります。
レジャーやトランザクションデータから取得した通貨を減耗して表示する場合、クライアント側でレジャー値から表示値への変換が必要です。(デマレージでは、表示値はレジャー値より小さくなる)。
デマレージ通貨の入力を受け付ける場合、クライアントは金額を表示形式からレジャー形式に変換する必要があります。(デマレッジの場合、ユーザ入力値よりレジャー値の方が大きい)。クライアントは、支払い、オファー、その他のトランザクションを作成する際に、レジャーの値を使用しなければなりません。
クライアントは、金利やデマレージが発生する通貨と発生しない通貨、および金利やデマレージの利率が異なる通貨を区別する必要があります。クライアントは、利子付き通貨コードフォーマットを解析して、「XAU (-0.5% pa)」などの表示にできるようにしなければなりません。
ripple-lib サポート
デマレージは ripple-lib のバージョン 0.7.37 から 0.12.9 まででサポートされていました。デマレージは、最近のほとんどのライブラリではサポートされていません。
以下のコードサンプルは、互換性のあるバージョンのripple-libを使用して、レジャー値と表示値の変換を行う方法を示しています。また、Ripple Demurrage Calculatorもご覧ください。
表示値からレジャー値に変換するには、Amount.from_human()
を使用する。
// デマレージ通貨の表示金額を表す Amount オブジェクトを作成し、 // 現在の日付を表すreference_dateを渡します。 // (この場合、2017-11-04T00:07:50Zに、年0.5%の脱税で台帳値10 XAU。)。 var demAmount = ripple.Amount.from_human('10 0158415500000000C1F76FF6ECB0BAC600000000', {reference_date:563069270}); // 発行者を設定します demAmount.set_issuer("rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"); // get the JSON format for the ledger amount console.log(demAmount.to_json()); // { "value": "10.93625123082769", // "currency": "0158415500000000C1F76FF6ECB0BAC600000000", // "issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh" }
レジャー値から表示値へ変換する場合、
// レジャー値を持つ Amount オブジェクトを作成します。 ledgerAmount = ripple.Amount.from_json({ "currency": "015841551A748AD2C1F76FF6ECB0CCCD00000000", "issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "value": "10.93625123082769"}) // 表示金額を得るために現在時刻までの利息を適用する var displayAmount = demAmount.applyInterest(new Date()); console.log(displayAmount.to_json()); // { "value": "9.999998874657716", // "currency": "0158415500000000C1F76FF6ECB0BAC600000000", // "issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh" }