最終更新:
編集

デマレージ

注意
デマレージは非推奨の機能であり、継続的なサポートはありません。このページでは、旧バージョンのXRP Ledgerソフトウェアの過去の動作について説明します。

デマレージ とは、保有資産にかかるマイナスの金利で、その資産を保有するためのコストを表すものです。 XRP Ledgerで発行された通貨のデマレージを表現するために、デマレージレートを示すカスタム通貨コード を使って追跡することができます。 これによって、様々なデマレージの量に対応した別々のバージョンの通貨が効果的に作成されます。クライアントアプリケーションは、通貨コードと一緒に年率でデマレージ通貨コードを表現することによって、これをサポートすることができます。例えば、以下のようになります。"XAU (-0.5%pa)".

通貨量の表記について

XRP Ledgerのすべての金額を継続的に更新するのではなく、有利子通貨や減耗通貨の金額を2種類の金額に分割する方法です。XRP Ledgerに記録される「レジャー値」と、人に見せる「表示値」の2種類に分けます。「レジャー値」は、ある一定時点、すなわち2000年1月1日午前0時の「リップルエポック」での通貨の価値を表しています。「表示値」は、リップルエポックからその時点までの連続した利息やデマレージを計算した後の時点(通常は現在時刻)での金額を表しています。

ヒント
デマレージはインフレに似ていると考えることができます。インフレの影響を受けたすべての資産の価値は時間とともに減少しますが、レジャーには常に2000年の値で金額が記録されます。これは実際のインフレを反映しているわけではなく、デマレージはむしろ一定の割合での仮想的なインフレのようなものです。

したがって、クライアントソフトウェアは2つの変換を適用する必要があります。

  • ある時点の表示値を取り込み、レジャー値に変換して記録すること。
  • レジャー値を、ある時点の表示値に変換すること。

デマレージの計算

通貨に関するデマレージの完全な計算式は以下の通りです。

D = A × ( e ^ (t ÷ τ) )
  • D はデマレージ後の金額
  • A はグローバルレジャーに記録されたデマレージ前金額です。
  • e はオイラー数
  • t はリップルエポック(UTC2000年1月1日0時)からの経過秒数
  • τ は、e倍加時間の時間(秒)です。この値は[希望する金利から計算](#e倍加時間の計算)されます。

表示金額とレジャー金額の変換は、以下の手順で行います。

  1. ( e ^ (t ÷ τ) )の値を計算する。この数値を「デマレージ係数」と呼ぶ。デマレージ係数は常に現在時刻など特定の時刻からの相対値である。
  2. 変換する量に適用します。
    • レジャー値を表示値に変換する場合は、デマレージ係数を乗じる。
    • 表示値をレジャー値に変換する場合は、デマレージ係数で割ってください。
  3. 必要であれば、結果値が望ましい精度で表現できるように調整する。XRP Ledgerの発行通貨形式により、レジャー値の精度は小数点以下15桁までとされています。

利子付き通貨コードフォーマット

標準通貨コード形式ではなく、正の金利や負の金利(Demurrage)を持つ通貨は、以下の形式の160ビット通貨コードを使用します。

通貨コード形式を削除する

  1. 最初の8ビットは 0x01 でなければなりません。
  2. 次の24ビットはASCIIの3文字を表します。 これはISO 4217のコードと予想されます。標準フォーマットのASCII文字と同じ文字をサポートしています。
  3. 次の24ビットはすべて「0」でなければなりません。
  4. 次の64ビットは通貨の金利で、IEEE754ダブルフォーマットで「e-folding time」と表現される。
  5. 次の24ビットは予約されており,すべて0でなければなりません

e倍加時間の計算

レジャー金額と表示金額の変換や、有利子/不利子通貨の通貨コードの計算には、「e倍加時間」としての金利が必要です。e倍加時間とは、ある数量が e(オイラー数)の倍数だけ増加するのにかかる時間のことである。慣例として、e倍加時間は数式ではτという文字で表記される。

ある年率パーセントの利息に対するe倍加時間の時間を計算すること。

  1. 100%に金利を足すと、年利を適用した後の初期金額に対する割合が算出されます。デマレージには、マイナスの金利を使用します。例えば、0.5%のデマレージは-0.5%の金利となり、**99.5%**の残存率となります。
  2. パーセンテージを小数で表します。例えば、99.5%は0.995となります。
  3. その数値の自然対数をとります。例えば、ln(0.995) = -0.005012541823544286 となります。(この数値は、当初の金利がプラスであればプラス、マイナスであればマイナスになります)。
  4. 1年間の秒数(31536000)を、前のステップの自然対数の結果で割ってください。例えば、31536000 ÷ -0.005012541823544286 = -6291418827.045599 となります。この結果が、e倍加時間(秒)です。

注記
XRP Ledgerの利息・デマレージルールでは、慣習上、1年あたりの固定秒数(31536000)が使用されており、閏日や閏秒の調整は行われていません。

クライアントサポート

利息通貨とデマレージ通貨をサポートするために、クライアントアプリケーションはいくつかの機能を実装する必要があります。

  • レジャーやトランザクションデータから取得した通貨を減耗して表示する場合、クライアント側でレジャー値から表示値への変換が必要です。(デマレージでは、表示値はレジャー値より小さくなる)。

  • デマレージ通貨の入力を受け付ける場合、クライアントは金額を表示形式からレジャー形式に変換する必要があります。(デマレッジの場合、ユーザ入力値よりレジャー値の方が大きい)。クライアントは、支払い、オファー、その他のトランザクションを作成する際に、レジャーの値を使用しなければなりません。

  • クライアントは、金利やデマレージが発生する通貨と発生しない通貨、および金利やデマレージの利率が異なる通貨を区別する必要があります。クライアントは、利子付き通貨コードフォーマットを解析して、「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" }