# トラストライントークン

トラストライントークンは、XRP Ledgerにおける[代替可能トークン](/ja/docs/concepts/tokens)の一種です。管理を担うのがトラストラインで、「望まないトークンを他者に保有させることはできない」というルールを強制します。[Multi-Purpose Token](/ja/docs/concepts/tokens/fungible-tokens/multi-purpose-tokens)に対して、こちらはXRP Ledgerに従来からあるトークン規格です。

## 構造

トラストラインは[RippleStateエントリ](/ja/docs/references/protocol/ledger-data/ledger-entry-types/ripplestate)としてレジャーに記録されます。それぞれのトラストラインは、以下の要素からなる *双方向* の関係です。

- トラストラインが接続する2つの[アカウント](/ja/docs/concepts/accounts)の識別子。
- 共有される単一の残高で、一方のアカウントから見るとプラス、他方から見るとマイナスになります。
  - マイナスの残高を持つ側が、通常はトークンの「発行者」とみなされます。ただし、[API](/ja/docs/references/http-websocket-apis)では、`issuer` という名前がどちらの側を指すこともあります。
- 各種の設定とメタデータ。2つのアカウントは *それぞれ* 、トラストライン上の自分の設定を制御できます。
  - 最も重要なのは、それぞれがトラストラインに設定する限度額で、デフォルトは0です。各アカウントから見た残高は、[アカウント自身の操作](#%E9%99%90%E5%BA%A6%E9%A1%8D%E3%81%AE%E8%B6%85%E9%81%8E)による場合を除き、そのアカウントの限度額を超えられません。


1本のトラストラインは、特定の[通貨コード](/ja/docs/references/protocol/data-types/currency-formats#%E9%80%9A%E8%B2%A8%E3%82%B3%E3%83%BC%E3%83%89)に対応します。2つのアカウントの間に、通貨コードの異なるトラストラインをいくつ作成しても構いませんが、同じ通貨コードについて共有されるトラストラインは1本だけです。

トラストラインの残高は、どちら側から見るかによってマイナスにもプラスにもなります。マイナスの残高を持つ側は「発行者」と呼ばれ、そのトークンの振る舞いに関するいくつかのプロパティを制御できます。発行者以外のアカウントにトークンを送ると、そのトークンは *Rippling* によって発行者を経由し、場合によっては同じ通貨コードを使用する他のアカウントも経由して移動します。役立つ場面もありますが、予期しない、望ましくない挙動を招く場面もあります。Ripplingを防ぎたい場合は、トラストラインに[No Rippleフラグ](/ja/docs/concepts/tokens/fungible-tokens/rippling)を設定できます。

## 作成

どのアカウントも、ゼロでない限度額と自分の設定を指定した[TrustSetトランザクション](/ja/docs/references/protocol/transactions/types/trustset)を送信することで、他のアカウントによるトークン発行を一方的に「信頼」できます。これにより、残高がゼロのトラストラインが作成され、相手側の設定はデフォルトになります。

トラストラインは、[分散型取引所](/ja/docs/concepts/tokens/decentralized-exchange)でトークンを購入するなど、一部のトランザクションによって暗黙のうちに作成されることがあります。この場合、トラストラインの設定はすべてデフォルトになります。

## 限度額の超過

トラストライン上の自分の限度額 *より大きい* 残高を保有できるケースが3つあります。

1. [取引](/ja/docs/concepts/tokens/decentralized-exchange)によってそのトークンを追加で取得した場合
2. プラスの残高があるトラストラインの限度額を引き下げた場合
3. [チェックの現金化](/ja/docs/concepts/payment-types/checks)によってそのトークンを追加で取得した場合 _Added by the [CheckCashMakesTrustLine amendment](/resources/known-amendments#checkcashmakestrustline). (Enabled: 2023-01-23)_


## トラストラインの設定

共有される残高とは別に、各アカウントはトラストライン上に以下の設定を持ちます。

- **限度額**: 0から[トークンの最大額](/ja/docs/references/protocol/data-types/currency-formats)までの数値。支払いや他のアカウントの操作によって、トラストラインの残高が（このアカウントから見て）限度額を超えることはありません。デフォルトは `0` です。
- **Authorized**: [認可トラストライン](/ja/docs/concepts/tokens/fungible-tokens/authorized-trust-lines)と組み合わせて、このアカウントが発行するトークンの保有を相手側に許可する真偽値。デフォルトは `false` です。一度 `true` にすると元へは戻せません。
- **No Ripple**: このトラストラインでトークンの[Rippling](/ja/docs/concepts/tokens/fungible-tokens/rippling)を許可するかどうかを制御する真偽値。デフォルト値はアカウントの「Default Ripple」設定によって決まり、新規アカウントでは「Default Ripple」がオフであるため、No Rippleのデフォルトは `true` です。通常、発行者はRipplingを許可し、発行者以外はコミュニティクレジットにトラストラインを使用する場合を除いてRipplingを無効にするべきです。
- **Freeze**: このトラストラインに[個別のフリーズ](/ja/docs/concepts/tokens/fungible-tokens/freezes#individual-freeze)がかかっているかどうかを示す真偽値。デフォルトは `false` です。
- **DeepFreeze**: このトラストラインに[ディープフリーズ](/ja/docs/concepts/tokens/fungible-tokens/freezes#%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BA)がかかっているかどうかを示す真偽値。デフォルトは `false` です。
- **Quality In** と **Quality Out**: 相手のアカウントが発行したこのトラストライン上のトークンを、額面より低く（あるいは高く）評価するための設定です。たとえばステーブルコインの発行者が、レジャー外の資産と引き換えにトークンを出金する際に3%の手数料を取るなら、この設定でそのトークンを額面の97%として評価できます。デフォルトの `0` は額面どおりを表します。


## 特性

XRPやMPTとは異なり、トラストライントークンは常に *トラストライン* の中に存在し、すべての送金はトラストラインに沿って行われます。他人のアカウントに、そのトラストラインで設定された *限度額* を超える量のトークンを保有させることはできません（自分のトラストラインについては、分散型取引所で追加購入したり、プラスの残高がある状態で限度額を下げたりすることで、限度額を超え *られます* ）。

必要なトラストラインが設定されていれば、誰でも[Paymentトランザクション](/ja/docs/references/protocol/transactions/types/payment)を送信してトラストライントークンを発行できます。トークンを発行者に送り返せば *バーン* （破棄）できます。発行者の設定によっては、異なる通貨間の支払いや取引によってトークンが追加で生まれる場合もあります。

発行者は、XRPでは使えない選択肢をトークンに対して持ちます。ユーザがトークンを送金する際に自動的に差し引かれる[送金手数料](/ja/docs/concepts/tokens/fungible-tokens/transfer-fees)を課せます。また、自分のトークンが関わる為替レートの[ティックサイズ](/ja/docs/concepts/tokens/decentralized-exchange/ticksize)も定義できます。発行者と一般のアカウントはどちらもトラストラインを[フリーズ](/ja/docs/concepts/tokens/fungible-tokens/freezes)でき、そのトラストライン上のトークンの使い道を制限できます。

送金手数料、ティックサイズ、フリーズの可否といった設定は発行者のアカウント単位で定義され、そのアカウントが発行するすべてのトラストライントークンに適用されます。したがって、設定を使い分ける必要がある場合に備えて、発行するトラストライントークンの種類ごとに発行アカウントを分けることを推奨します。

トラストライントークンは、15桁の精度を持つ10進数演算と指数を使用し、非常に大きな値（最大 9999999999999999 × 1080）と非常に小さな値（最小 1.0 × 10-81）を表現できます。

## 準備金と削除

トラストラインはレジャー上の領域を占有するため、[トラストラインを持つとアカウントが準備金として保持すべきXRPが増加します](/ja/docs/concepts/accounts/reserves)。トラストラインの状態に応じて、双方のアカウントの一方または両方が準備金を負担することがあります。自分の設定のいずれかがデフォルトでない場合、またはプラスの残高を保有している場合、そのトラストラインは自分の所有者準備金の1項目としてカウントされます。

つまり通常は、トラストラインを作成したアカウントが準備金を負担し、発行者は負担しません。

双方の設定がデフォルトの状態で、かつ残高が0であれば、トラストラインは自動的に削除されます。したがって、トラストラインを削除するには、以下の手順を踏みます。

1. [TrustSetトランザクション](/ja/docs/references/protocol/transactions/types/trustset)を送信して、自分の設定をデフォルトに戻します。
2. トラストライン上にプラスの残高があれば手放します。[支払い](/ja/docs/concepts/payment-types/cross-currency-payments)を送るか、[分散型取引所](/ja/docs/concepts/tokens/decentralized-exchange)でその通貨を売却すれば手放せます。


自分の残高がマイナスの場合（自分が発行者の場合）や、相手側の設定がデフォルトでない場合、トラストラインを完全に削除することはできませんが、同じ手順を踏めば、自分の所有者準備金の対象から外すことはできます。

**Authorized** 設定は一度オンにすると解除できないため、トラストラインがデフォルト状態かどうかの判定には含まれません。

### 無料のトラストライン

[[ソース]](https://github.com/XRPLF/rippled/blob/3c43f4614f87965298773279ff5b85d4c56c637b/src/libxrpl/tx/transactors/token/TrustSet.cpp#L347-L367)

XRP Ledgerにおいてトラストラインは重要な機能であるため、アカウントが最初に作成する2本を「無料」にする特別な仕組みがあります。

アカウントが新しいトラストラインを作成する場合、その新しいトラストラインを含めてレジャー上に所有するオブジェクトが2つ以下であれば、そのアカウントの所有者準備金は通常の額ではなくゼロとして扱われます。この扱いにより、レジャー上のオブジェクト所有によって増える準備金要件を満たすだけのXRPを持っていなくても、トランザクションは成功します。

レジャー上に3つ以上のオブジェクトを所有している場合は、所有者準備金が全額適用されます。

## 関連項目

- **コンセプト:**
  - [分散型取引所](/ja/docs/concepts/tokens/decentralized-exchange)
  - [Rippling](/ja/docs/concepts/tokens/fungible-tokens/rippling)
- **リファレンス:**
  - [account_linesメソッド](/ja/docs/references/http-websocket-apis/public-api-methods/account-methods/account_lines) - 指定したアカウントに紐づくトラストラインを調べる
  - [gateway_balancesメソッド](/ja/docs/references/http-websocket-apis/public-api-methods/account-methods/gateway_balances) - 発行者が発行した総額を調べる
  - [RippleStateオブジェクト](/ja/docs/references/protocol/ledger-data/ledger-entry-types/ripplestate) - レジャーの状態データにおけるトラストラインのデータ形式
  - [TrustSetトランザクション](/ja/docs/references/protocol/transactions/types/trustset) - トラストラインを作成または変更するトランザクション