# Witnessサーバ

[[ソース]](https://github.com/seelabs/xbridge_witness)

*（[XChainBridge Amendment](/ja/resources/known-amendments#xchainbridge)  が必要です）*

Witnessサーバは、ロックチェーンと発行チェーン間のトランザクションの中立的な監視人として機能します。このサーバはブリッジの両側のドアアカウントをリッスンし、トランザクションが発生したことを確認する証明書に署名します。サーバは基本的に、送金元アカウントで価値がロックまたはバーンされたことを"証明"するオラクルとして機能し、これにより受取人は送金先アカウントで同等の資金を(作成またはロック解除によって)請求することができます。

ロックチェーンと発行チェーンの間のブリッジは、その設定に以下の情報を含みます。

* ブリッジ上のトランザクションを監視するWitnessサーバ。Witnessサーバは1つ以上選択できます。
* Witnessサーバのサービス料金。


誰でもWitnessサーバを運用することができます。しかし、Witnessサーバの信頼性を評価する責任は発行チェーンの参加者にあります。Witnessサーバを実行する場合、`rippled`ノードも実行し、Witnessサーバがアクセスする必要があるチェーンと同期させる必要があります。

発行チェーンは、最初は1台のWitnessサーバだけでブリッジを構成し、Witnessサーバ自体を実行することを選択できます。この戦略は、発行チェーンがまだマーケットで地位を確立していない初期に役立ちます。

## Witnessサーバの設定

Witnessサーバはコマンドライン引数`--conf`で指定されたJSON設定ファイルを受け取ります。

### 設定JSONの例


```json
{
  "LockingChain": {
    "Endpoint": {
      "Host": "127.0.0.1",
      "Port": 6005
    },
    "TxnSubmit": {
      "ShouldSubmit": true,
      "SigningKeySeed": "shUe3eSgGK4e6xMFuCakZnxsMN1uk",
      "SigningKeyType": "ed25519",
      "SubmittingAccount": "rpFp36UHW6FpEcZjZqq5jSJWY6UCj3k4Es"
    },
    "RewardAccount": "rpFp36UHW6FpEcZjZqq5jSJWY6UCj3k4Es"
  },
  "IssuingChain": {
    "Endpoint": {
      "Host": "127.0.0.1",
      "Port": 6007
    },
    "TxnSubmit": {
      "ShouldSubmit": true,
      "SigningKeySeed": "shUe3eSgGK4e6xMFuCakZnxsMN1uk",
      "SigningKeyType": "ed25519",
      "SubmittingAccount": "rpFp36UHW6FpEcZjZqq5jSJWY6UCj3k4Es"
    },
    "RewardAccount": "rpFp36UHW6FpEcZjZqq5jSJWY6UCj3k4Es"
  },
  "RPCEndpoint": {
    "Host": "127.0.0.1",
    "Port": 6010
  },
  "DBDir": "/var/lib/witness/witness01/db",
  "LogFile": "/var/log/witness/witness01.log",
  "SigningKeySeed": "spkHEwDKeChm8PAFApLkF1E2sDs6t",
  "SigningKeyType": "ed25519",
  "XChainBridge": {
    "LockingChainDoor": "r3nCVTbZGGYoWvZ58BcxDmiMUU7ChMa1eC",
    "LockingChainIssue": {
      "currency": "XRP"
    },
    "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
    "IssuingChainIssue": {
      "currency": "XRP"
    }
  },
  "Admin": {
    "Username": "username01",
    "Password": "password01"
  }
}
```

### 設定のフィールド

| フィールド名 | JSONの型 | 必須? | 説明 |
|  --- | --- | --- | --- |
| `Admin` | オブジェクト | いいえ | Witnessサーバへの特権リクエスト用の`Username`フィールドと`Password`フィールド (文字列)。**注記:** adminフィールドは両方に設定、またはどちらも設定されていない必要があります。 |
| [`IssuingChain`](#issuingchain%E3%81%A8lockingchain%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89) | オブジェクト | はい | 発行チェーンと通信するためのパラメータ。 |
| [`LockingChain`](#issuingchain%E3%81%A8lockingchain%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89) | オブジェクト | はい | ロックチェーンと通信するためのパラメータ。 |
| `RPCEndpoint` | オブジェクト | はい | WitnessサーバへのRPCリクエストのエンドポイント。 |
| `LogFile` | 文字列 | はい | ログファイルの保存場所。 |
| `LogLevel` | 文字列 | はい | ログファイルに保存するログのレベル。`All`、`Trace`、`Debug`、`Info`、`Warning`、`Error`、`Fatal`、`Disabled`、`None`のいずれかを指定します。 |
| `DBDir` | 文字列 | はい | データベースが保存されているディレクトリの場所。 |
| `SigningKeySeed` | 文字列 | はい | Witnessサーバが証明書に署名する際に使用するシード。 |
| `SigningKeyType` | 文字列 | はい | `SigningKeySeed`のエンコードに使用するアルゴリズム。`secp256k1`と`ed25519`のいずれかを指定します。 |
| [`XChainBridge`](#xchainbridge%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89) | XChainBridge | はい | Witnessサーバが監視しているブリッジ。 |


#### IssuingChainとLockingChainのフィールド

| フィールド名 | JSONの型 | 必須? | 説明 |
|  --- | --- | --- | --- |
| `Endpoint` | オブジェクト | はい | チェーンと同期した`rippled`ノードのWebSocketエンドポイント。**注記:** `rippled`ノードとWitnessサーバは同じ人が操作する必要があります。 |
| `TxnSubmit` | オブジェクト | はい | チェーン上でトランザクションを送信するためのパラメータ。 |
| `RewardAccount` | 文字列 | はい | チェーン上で`SignatureReward`の報酬の分配を受け取るアカウント。 |


#### Endpointのフィールド

| フィールド名 | JSONの型 | 必須? | 説明 |
|  --- | --- | --- | --- |
| `Host` | 文字列 | はい | `rippled`ノードのIPアドレス。**注記:** IPv4アドレスかURLを指定します。 |
| `Port` | 文字列 | はい | WebSocketエンドポイントのポート。 |


#### RPCEndpointのフィールド

| フィールド名 | JSONの型 | 必須? | 説明 |
|  --- | --- | --- | --- |
| `Host` | 文字列 | はい | `rippled`ノードのIPアドレス。**注記:** IPv4アドレスかURLを指定します。 |
| `Port` | 文字列 | はい | WebSocketエンドポイントのポート。 |


#### TxnSubmitのフィールド

| フィールド名 | JSONの型 | 必須? | 説明 |
|  --- | --- | --- | --- |
| `ShouldSubmit` | 真偽値 | はい | Witnessサーバがロックチェーン上でトランザクションを提出すべきかどうかを示す真偽値。 |
| `SigningKeySeed` | 文字列 | いいえ | Witnessサーバがロックチェーン上のトランザクションに署名する際に使用するシード。これは`ShouldSubmit`が`true`の場合に必要です。 |
| `SigningKeyType` | 文字列 | いいえ | `SigningKeySeed`のエンコードに使用するアルゴリズム。`secp256k1`と`ed25519`のいずれかを指定します。これは`ShouldSubmit`が`true`の場合に必要です。 |
| `SubmittingAccount` | 文字列 | いいえ | `XChainAddClaimAttestation`と`XChainAddAccountCreateAttestation`トランザクションを送信するアカウント。これは`ShouldSubmit`が`true`の場合に必要です。 |


#### XChainBridgeのフィールド

| フィールド | JSONの型 | [内部の型](/ja/docs/references/protocol/binary-format) | 必須? | 説明 |
|  --- | --- | --- | --- | --- |
| `IssuingChainDoor` | 文字列 | Account | はい | 発行チェーンのドアアカウント。XRP-XRPブリッジの場合、これはジェネシスアカウント(ネットワークが最初に開始されたときに作成されるアカウントで、すべてのXRPを含む)でなければなりません。 |
| `IssuingChainIssue` | Issue | Issue | はい | 発行チェーン上で作成され、バーンされる資産。IOU-IOUブリッジの場合、供給量の問題を避けるため、資産の発行者は発行チェーンのドアアカウントでなければなりません。 |
| `LockingChainDoor` | 文字列 | Account | はい | ロックチェーンのドアアカウント。 |
| `LockingChainIssue` | Issue | Issue | はい | ロックチェーンでロック、アンロックされる資産。 |