最終更新:
編集

マスターキーペアの無効化

このページでは、アカウントのアドレスに数学的に関連付けられたマスターキーペアを無効化する方法について説明します。あなたのアカウントのマスターキーペアが漏洩した可能性がある場合、またはマルチシグをあなたのアカウントからトランザクションを送信する 唯一 の方法としたい場合、これを行う必要があります。

注意
マスターキーペアを無効にすると、トランザクションの承認の方法の1つが削除されます。マスターキーペアを無効にする前に、レギュラーキーやマルチ・サインなど、他のトランザクションの承認方法のいずれかを使用できることを確認する必要があります。(例えば、レギュラーキーペアを割り当てた場合は、そのレギュラーキーで正常にトランザクションを送信できることを確認してください)。XRP Ledgerは分散型であるため、残りの取引承認方法を使用できない場合、誰もあなたのアカウントへのアクセスを回復することができません。

マスターキーペアを無効にするには、マスターキーペアを使用する必要があります。 ただし、他のトランザクションの認証方法を使用してマスターキーペアを 再有効化 することは可能です。

前提条件

アカウントのマスターキーペアを無効にするには、次の前提条件を満たしている必要があります。

  • XRP Ledgerアカウントを持ち、そのアカウントからマスターキーペアを用いてトランザクションの署名と提出ができることが必要です。安全な署名の設定 をご覧ください。これには2つの一般的な方法があります。
    • アカウントのマスターシード値を知っている。シード値は一般的に sn3nxiW7v8KXzPzAqzyHXbSSKNuN9のような "s" で始まる base58 値で表されます。
    • あるいは、シード値を知る必要がなく、安全に保存する専用の署名デバイス を使用します
  • あなたのアカウントには、マスターキーペア以外のトランザクションを認証する方法が少なくとも1つ必要です。つまり、以下のいずれか、または両方を行う必要があります。

手順

1. トランザクションJSONの作成

アカウントから、"SetValue": 4のフィールドを持つAccountSetトランザクションを準備します。これは AccountSet フラグ "Disable Master" (asfDisableMaster) に対応する値です。このトランザクションの他の必須フィールドは、必須の共通フィールドのみです。例えば、自動入力可能なフィールド を省けば、以下のトランザクション指示で十分である。

{
  "TransactionType": "AccountSet",
  "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
  "SetFlag": 4
}

ヒント
予測可能な時間内にトランザクションの結果を確実に得るために、LastLedgerSequenceフィールドも提供することが強く推奨されています。

2. トランザクションへの署名

トランザクションの署名には、マスターキーペアを使用する必要があります。

注意
自分が管理していないサーバに秘密鍵を提出したり、暗号化されていない状態でネットワーク上に送信したりしないでください。これらの例は、ローカルの rippled サーバ を使っていることを前提にしています。他の安全な署名方法を使っている場合は、これらの手順を変更する必要があります。

リクエストの例

{
  "command": "sign",
  "tx_json": {
    "TransactionType": "AccountSet",
    "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
    "SetFlag": 4
  },
  "secret": "s████████████████████████████"
}

レスポンスの例

{
  "result": {
    "deprecated": "This command has been deprecated and will be removed in a future version of the server. Please migrate to a standalone signing tool.",
    "tx_blob": "1200032280000000240000017C20210000000468400000000000000A732103AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB7446304402204457A890BC06F48061F8D61042975702B57EBEF3EA2C7C484DFE38CFD42EA11102202505A7C62FF41E68FDE10271BADD75BD66D54B2F96A326BE487A2728A352442D81144B4E9C06F24296074F7BC48F92A97916C6DC5EA9",
    "tx_json": {
      "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
      "Fee": "10",
      "Flags": 2147483648,
      "Sequence": 380,
      "SetFlag": 4,
      "SigningPubKey": "03AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB",
      "TransactionType": "AccountSet",
      "TxnSignature": "304402204457A890BC06F48061F8D61042975702B57EBEF3EA2C7C484DFE38CFD42EA11102202505A7C62FF41E68FDE10271BADD75BD66D54B2F96A326BE487A2728A352442D",
      "hash": "327FD263132A4D08170E1B01FE1BB2E21D0126CE58165C97A9173CA9551BCD70"
    }
  },
  "status": "success",
  "type": "response"
}

サーバがトランザクションに正常に署名したことを示す "status": "success" を探してください。代わりに "status": "error" が表示された場合は、 errorerror_message フィールドをチェックして、より詳しい情報を確認してください。よくある可能性としては、以下のようなものがあります。

  • "error": "badSecret" は通常、リクエストのsecretにタイプミスがあったことを意味します。
  • "error": "masterDisabled" は、このアドレスのマスターキーペアが 既に 無効であることを意味します。

レスポンスに含まれる tx_blob の値をメモしておきます。これはネットワークに送信できる署名済みトランザクションバイナリである。

3. トランザクションの送信

前のステップで署名されたトランザクションblobをXRP Ledgerに提出します。

リクエストの例

{
    "command": "submit",
    "tx_blob": "1200032280000000240000017C20210000000468400000000000000A732103AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB7446304402204457A890BC06F48061F8D61042975702B57EBEF3EA2C7C484DFE38CFD42EA11102202505A7C62FF41E68FDE10271BADD75BD66D54B2F96A326BE487A2728A352442D81144B4E9C06F24296074F7BC48F92A97916C6DC5EA9"
}

レスポンスの例

{
  "result": {
    "engine_result" : "tesSUCCESS",
    "engine_result_code" : 0,
    "engine_result_message" : "The transaction was applied. Only final in a validated ledger.",
    "tx_blob" : "1200032280000000240000017C20210000000468400000000000000A732103AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB7446304402204457A890BC06F48061F8D61042975702B57EBEF3EA2C7C484DFE38CFD42EA11102202505A7C62FF41E68FDE10271BADD75BD66D54B2F96A326BE487A2728A352442D81144B4E9C06F24296074F7BC48F92A97916C6DC5EA9",
    "tx_json" : {
      "Account" : "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
      "Fee" : "10",
      "Flags" : 2147483648,
      "Sequence" : 380,
      "SetFlag" : 4,
      "SigningPubKey" : "03AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB",
      "TransactionType" : "AccountSet",
      "TxnSignature" : "304402204457A890BC06F48061F8D61042975702B57EBEF3EA2C7C484DFE38CFD42EA11102202505A7C62FF41E68FDE10271BADD75BD66D54B2F96A326BE487A2728A352442D",
      "hash" : "327FD263132A4D08170E1B01FE1BB2E21D0126CE58165C97A9173CA9551BCD70"
    }
  },
  "status": "success",
  "type": "response"
}

トランザクションが tecNO_ALTERNATIVE_KEY という結果で失敗した場合、あなたのアカウントでは現在トランザクションを認証するための別の方法が有効になっていません。レギュラーキーペアを割り当てるマルチシグを設定 した後、再度マスターキーペアの無効化を試してみてください。

4. 検証の待機

本番環境のネットワークやTestnetでは、レジャーが自動的に閉鎖するまでに4~7秒かかる場合があります。

スタンドアロンモードでrippledを実行している場合は、[ledger_acceptメソッド][]を使用してレジャーを手動で閉鎖します。

5. アカウントフラグの確認

account_infoメソッドで、アカウントのマスターキーが無効になっていることを確認します。以下のパラメータを必ず指定してください。

フィールド
accountアカウントのアドレス
ledger_index"validated" とすると、検証済みの最新バージョンのレジャーから結果を得ることができます。

リクエストの例

{
  "command": "account_info",
  "account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
  "ledger_index": "validated"
}

レスポンスの例

{
  "result": {
    "account_data": {
      "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
      "AccountTxnID": "327FD263132A4D08170E1B01FE1BB2E21D0126CE58165C97A9173CA9551BCD70",
      "Balance": "423013688",
      "Domain": "6D64756F31332E636F6D",
      "EmailHash": "98B4375E1D753E5B91627516F6D70977",
      "Flags": 9633792,
      "LedgerEntryType": "AccountRoot",
      "MessageKey": "0000000000000000000000070000000300",
      "OwnerCount": 9,
      "PreviousTxnID": "327FD263132A4D08170E1B01FE1BB2E21D0126CE58165C97A9173CA9551BCD70",
      "PreviousTxnLgrSeq": 53391321,
      "RegularKey": "rD9iJmieYHn8jTtPjwwkW2Wm9sVDvPXLoJ",
      "Sequence": 381,
      "TransferRate": 4294967295,
      "index": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8",
      "urlgravatar": "http://www.gravatar.com/avatar/98b4375e1d753e5b91627516f6d70977"
    },
    "ledger_hash": "A90CEBD4AEDA24470AAC5CD307B6D26267ACE79C03669A0A0B8C41ACAEDAA6F0",
    "ledger_index": 53391576,
    "validated": true
  },
  "status": "success",
  "type": "response"
}

レスポンスの account_data オブジェクトで、 Flags フィールドと lsfDisableMaster フラグの値 (16 進数では 0x00100000、10 進数では 1048576) を ビット論理積 (ほとんどのプログラミング言語では & オペレーター) で比較します。

コード例:

// 上記のJSON-RPCレスポンスがaccount_info_responseとして保存されていると仮定します。
const lsfDisableMaster = 0x00100000;
let acct_flags = account_info_response.result.account_data.Flags;
if ((lsfDisableMaster & acct_flags) === lsfDisableMaster) {
  console.log("マスターキーペアが無効化されています");
} else {
  console.log("マスターキーペアが使用可能です");
}

この操作の結果は次の2つしかありません。

  • 結果が0でない場合は lsfDisableMaster の値と等しく、 マスターキーが正常に無効化されたこと を示します。
  • 結果が0の場合は、そのアカウントのマスターキーが無効になっていないことを示します。

結果が予想と異なる場合は、前の手順で送信したトランザクションが正常に実行されたかどうかを確認してください。それは、その口座のトランザクション履歴(account_txメソッド)の中で最も新しいもので、結果コード tesSUCCESS がついているはずです。それ以外の結果コードが表示された場合、そのトランザクションは正常に実行されませんでした。エラーの原因によっては、これらの手順を最初からやり直した方がよいかもしれません。