Ledgerの技術に飛び込んで、統合を始めましょう。Ledgerでは、トランザクションによる一連の具体的なアクションの実行が承認されていることを、デジタル署名によって証明します。署名されたトランザクションのみがネットワークに送信され、検証済みレジャーに含まれます。すべてのデジタル署名は、トランザクションの送信側アカウントに関連付けられている暗号鍵ペアに基づいています。Ledgerでサポートされている暗号化署名アルゴリズムを使用して生成できます。キーペアの生成に使用されたアルゴリズムの種類にかかわらず、キーペアはマスターキーペア、レギュラーキーペア、または署名者リストのメンバーとして使用できます。秘密鍵のセキュリティを適切に維持することが重要です。Ledgerに対して検証できる唯一の手段であり、レジャーに提出されたトランザクションの取り消しや無効化を行う権限を有する管理者は存在しません。Ledgerアカウントの秘密鍵があなた以外の何者かに知られた場合、その人物はあなたと同様にデジタル署名を作成し、トランザクションを承認することができます。Ledgerでの使用に合わせてキーペアを生成できます。信頼できるデバイスやソフトウェアで生成されたキーペアのみを使用する必要があります。悪意のあるアプリケーションは、あなたの秘密情報を悪意のあるユーザーに公開する可能性があり、そのユーザーはあなたのアカウントから後でトランザクションを送信することができます。暗号鍵ペアは、鍵の導出プロセスを通じて数学的に関連づけられる秘密鍵と公開鍵のことです。秘密鍵は、強力なランダム性によって決定されなければなりません。暗号化署名アルゴリズムは、鍵の導出プロセスを定義し、暗号鍵となり得る数値の制限を設定します。Ledgerを扱う場合、パスフレーズ、シード、アカウントID、アドレスなど、いくつかの関連する値を使用することもあります。暗号鍵の値の関係を簡略化した図パスフレーズ、シード、秘密鍵は秘密であり、あるアカウントのこれらの値のいずれかを知っていれば、有効な署名を行うことができ、そのアカウントを完全に制御することができます。あなたがアカウントを所有しているのであれば、アカウントの秘密情報には細心の注意を払ってください。あなたがそれらを持っていないなら、あなたは自分のアカウントを利用することはできません。他の誰かがそれらにアクセスすることができれば、彼らはあなたのアカウントをコントロールすることができます。公開鍵、アカウントID、アドレスは公開情報です。Ledgerが署名を検証してトランザクションを処理できるようにすることが必要です。鍵の導出の仕組みの技術的な詳細については、鍵の導出を参照してください。パスフレーズオプションとして、パスフレーズやその他の情報を、シードや秘密鍵の決定方法として使用することができます。これは、完全にランダムにシードや秘密鍵を選択するよりも安全性が低いですが、これを行いたいレアケースもあります。XRPをプレゼントしました。彼はパズルの解答を、賞品のXRPを保有するアカウントへのパスフレーズとして使用しました)パスフレーズは秘密情報であるため、厳重に保管する必要があります。アドレスのパスフレーズを知った人は、そのアドレスを実質的に完全にコントロールすることができます。値は、アカウントの実際の秘密鍵と公開鍵を導出するために使用される、コンパクトな値です。すべて同一のシード値を様々な形式で表現します。使用することができます。master_という接頭辞がついていますが、このシードが表す鍵は必ずしもアカウントのマスターキーではありません。この鍵ペアはレギュラーキーとして、あるいはマルチシグリストのメンバーとして使用することもできます。シード値は秘密情報であるため、非常に厳重に保管する必要があります。あるアドレスのシード値を知っている人は、そのアドレスを実質的に完全にコントロールすることができます。デジタル署名を作成するために使用される値です。Ledgerソフトウェアは、秘密鍵を明示的に表示せず、必要に応じてシード値から秘密鍵の導出を行っています。シードの代わりに秘密鍵を保存し、それを使ってトランザクションに直接署名することは技術的には可能ですが、この使い方はレアケースです。シードと同様、秘密鍵は秘密情報であるため、厳重に保管する必要があります。あるアドレスの秘密鍵を知っている人は、そのアドレスを事実上完全にコントロールすることができます。公開鍵は、電子署名の正当性を検証するために使用される値です。公開鍵は、鍵の導出の一部として秘密鍵から導出されます。両方とも同じ公開鍵の値を表します。Ledgerのトランザクションには、ネットワークがトランザクションの署名を検証できるように、公開鍵が含まれている必要があります。公開鍵は有効な署名を作成するために使用することはできないので、公開しても問題はありません。アカウントIDとアドレスアカウントIDは、アカウントまたはキーペアの中核となる識別子です。これは公開鍵から派生します。Ledgerのプロトコルでは、アカウントIDは20バイトのバイナリデータです。APIは、アカウントIDをアドレスとして表現し、次の2つのフォーマットのうちの1つで表現します。「クラシックアドレス」は、base58にチェックサム付きでアカウントIDを書きます。「X-Address」は、アカウントIDと宛先タグを組み合わせ、チェックサムとともにbase58にその値を書き込みます。どちらの形式でもチェックサムがあるため、わずかな変更でアドレスが無効になり、他の有効なアカウントと入れ替わる可能性はありません。これにより、タイプミスや送信エラーが発生しても、間違った場所に送金されることはありません。すべてのアカウントID(またはアドレス)が台帳のアカウントを参照しているわけではないことを知っておくことが重要です。キーとアドレスの導出は、純粋に数学的な操作です。アカウントがXRPレジャーに情報を持つには、XRPの支払いを受け、準備金を満たす必要があります。アカウントは、資金が供給されるまでトランザクションを送信することはできません。アカウントIDやアドレスが資金提供されたアカウントを指していない場合でも、そのアカウントIDやアドレスを使用して、レギュラーキーペアや署名者リストのメンバーを表すことはできます。Ledgerは、複数の暗号署名アルゴリズムをサポートしています。任意のキーペアは、特定の暗号化署名アルゴリズムに対してのみ有効です。いくつかの秘密鍵は、技術的には複数のアルゴリズムに対して有効な鍵として適格かもしれませんが、それらの秘密鍵は各アルゴリズムに対して異なる公開鍵を持つことになり、いずれにしても秘密鍵を再利用すべきではありません。wallet_proposeメソッドのkey_typeフィールドは、使用する暗号化署名アルゴリズムを指します。マスターキーペアマスターキーペアは、秘密鍵と公開鍵で構成されています。アカウントのアドレスは、そのアカウントのマスターキーペアから得られるので、両者は本質的な関係となります。マスターキーペアの変更・削除はできませんが、無効にすることはできます。wallet_proposeメソッドは、マスターキーペアを生成する方法の1つです。このメソッドからの応答には、アカウントのシード、アドレス、マスター公開鍵が一緒に表示されます。悪意のある行為者があなたのマスター秘密鍵(またはシード)を知った場合、マスター鍵ペアが無効化されていない限り、彼らはあなたのアカウントを完全にコントロールすることができます。彼らはあなたのアカウントが保持している全ての資金を盗み、その他の回復不能な損害を与えることができます。秘密鍵は慎重に扱ってください!マスターキーペアは変更できないため、漏えいが発生した場合には無効化せざるを得ません。マスターキーペアをオフラインで保管し、代わりにアカウントのトランザクションの署名用にレギュラーキーペアを設定することを強くお勧めします。マスターキーペアを有効にしておきながらオンラインで使用することで、インターネットを使用してマスターキーペアにアクセスすることはできませんが、緊急時にマスターキーペアを使うことが可能になります。マスターキーペアをオフラインで保管する際には、不正使用者がアクセスできる場所に秘密情報(パスフレーズ、シード、秘密鍵)を保管しないようにします。インターネットに一切接続されない物理的に隔離されたマシンに保管したり、紙に記入して安全な場所に保管します。一般的には、インターネットと相互にやり取りをするコンピュータプログラムがアクセスできる範囲内には保管しません。マスターキーペアは、緊急時(漏えいの恐れがある場合や実際に漏えいが発生した場合にレギュラーキーペアを変更するなど)に限り、最も信頼できるデバイスでのみ使用することが理想的です。特殊な権限マスターキーペアのみが、ある特定の処理を行うトランザクションを承認することができます。アカウントの最初のトランザクションを送信する。アカウントはその他の方法でトランザクションを承認して初期化することができないからです。マスターキーペアを無効化する。凍結の機能を永久に放棄する。トランザクションコスト0XRPの特別なキーリセットトランザクションを送信する。レギュラーキーやマルチシグは、マスターキーペアと同じようにその他の処理を行うことができます。マスターキーペアを無効にした後、レギュラーキーペアやマルチシグを使用して再び有効にすることができます。削除の条件を満たしていれば、アカウントの削除を行うことも可能です。呼ばれるセカンダリキーペアを許可することができます。すると、マスターキーペアとレギュラーキーのどちらかを使ってトランザクションを承認することができるようになります。レギュラーキーペアは、アカウントの他の部分を変更することなく、いつでも削除または変更することができます。レギュラーキーペアは、マスターキーペアと同じ種類のトランザクションのほとんどを承認することができますが、特定の例外があります。マスター秘密鍵はオフラインの場所に保存し、ほとんどの時間、レギュラーキーペアを使用することがセキュリティ上推奨されます。万一の備えとして、レギュラーキーペアを定期的に変更するのもよいでしょう。悪意のあるユーザーにレギュラーの秘密鍵を知られてしまった場合、マスターキーペアをオフラインで保存し、それを使ってレギュラーキーペアを変更または削除することができます。することで、アカウントの制御を取り戻すことができます。悪意のあるユーザーにお金を盗まれるのを阻止するほどのスピードがなかったとしても、少なくとも、新しいアカウントに移行して、すべての設定や人間関係を一から作り直す必要はありません。レギュラーキーペアは、マスターキーペアと同じ形式です。生成方法も同じです(例えば、wallet_proposeメソッドを使用します)。唯一の違いは、レギュラーキーペアは、トランザクションに署名するアカウントと本質的に結びついていないことです。あるアカウントのマスターキーペアを別のアカウントの通常キーペアとして使用することは可能です(ただし、推奨されるものではありません)。SetRegularKeyトランザクションは、アカウントのレギュラーキーペアを割り当てたり変更したりします。署名アルゴリズム暗号鍵ペアは常に特定の署名アルゴリズムに関連付けられています。署名アルゴリズムは、秘密鍵と公開鍵の間の数学的関係を定義します。暗号化署名アルゴリズムには、現在の暗号技術では、秘密鍵を使用して対応する公開鍵を「簡単に」計算できるものの、公開鍵から対応する秘密鍵を計算することは実質的に不可能であるという特性があります。Ledgerでは次の暗号化署名アルゴリズムがサポートされています。これはBitcoinで使用されているスキームです。Ledgerではデフォルトでこのキータイプが使用されます。パフォーマンスに優れ、その他の便利な特性を備えた新しいアルゴリズムです。Ed25519公開鍵はsecp256k1鍵よりも1バイト短いため、rippledではEd25519公開鍵の先頭に0xEDバイトが追加されます。これにより、両方の公開鍵タイプは33バイトになります。wallet_proposeメソッドを使用してキーペアを生成するときには、キーの生成に使用する暗号化署名アルゴリズムを選択するためkey_typeを指定できます。デフォルト以外のキータイプを生成した場合は、トランザクションに署名する際にkey_typeも指定する必要があります。Ledgerでは、サポートされているさまざまなタイプのキーペアは、マスターキーペア、レギュラーキーペア、署名者リストメンバーとして互換的に使用できます。アドレス生成プロセスは、secp256k1キーペアとEd25519キーペアでは同一です。Ledgerには新しい暗号化署名アルゴリズムが必要になるでしょう。Ledger開発者は容易に解読できない暗号化署名アルゴリズムを追加できます。2019年半ばの時点で、確実な第一選択肢となる「耐量子」署名アルゴリズムはなく、量子コンピューターはまだ脅威となるほど実用的ではないため、現時点では特定のアルゴリズムを追加する予定はありません。鍵導出キーペアを導出するプロセスは、署名アルゴリズムによって異なります。シード値は完全にランダムにする(推奨)か、SHA-512ハッシュを取得して最初の16バイトを保持することで特定のパスフレーズから導出することができます(SHA-512ハーフと同様ですが、出力の256ビットではなく128ビットのみを保持します)。サンプルコードここで説明する鍵導出プロセスは、さまざまなプログラミング言語で複数の場所に実装されています。このリポジトリのコードサンプルセクション。Ed25519鍵導出[ソース]シード値のSHA-512ハーフを計算します。32バイトの秘密鍵が導出されます。32バイトの数値はすべて、有効なEd25519秘密鍵です。秘密鍵として使用する上で安全なのは、十分ランダムに選択された数値のみです。標準公開鍵を導出して、32バイトの公開鍵を導出します。暗号化アルゴリズムの場合と同様に、可能な場合は必ず、公的に監査された既知の標準実装を使用します。コア関数であるEd25519やsecp256k1が実装されています。Ed25519公開鍵を示すには、32バイトの公開鍵の前にシングルバイトのプレフィクス0xEDを付加し、33バイトにします。トランザクションに署名するコードを実装している場合は、プレフィクス0xEDを削除し、実際の署名プロセスに32バイトキーを使用します。アカウントの公開鍵をbase58にシリアル化する場合は、アカウントの公開鍵プレフィクス0x23を使用します。バリデータの一時キーにEd25519を使用することはできません。Ledgerアカウントキーでのsecp256k1鍵導出に、Ed25519鍵導出よりも多くの手順が含まれる理由は次のとおりです。32バイトの数値がすべて、有効なsecp256k1秘密鍵であるとは限りません。Ledgerのリファレンス実装には、単一のシード値からキーペアのファミリーを導出するための、未使用の不完全なフレームワークがあります。Ledgerのsecp256k1アカウントキーペアを導出する手順は次のとおりです。次のように、シード値から「ルートキーペア」を計算します。以下を順番に連結して、合計20バイトにします。シード値(16バイト)「ルートシーケンス」値(4バイト)。ビッグエンディアンの符号なし整数。ルートシーケンスの開始値として0を使用します。連結された(シード+ルートシーケンス)値のSHA-512ハーフを計算します。結果が有効なsecp256k1秘密鍵でない場合は、ルートシーケンスを1増やして最初からやり直します。数値順よりも低くなければなりません。secp256k1グループの順序は、定数0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141です。有効なsecp256k1秘密鍵を使用して、secp256k1曲線で標準ECDSA公開鍵を導出し、ルート公開鍵を導出します。(暗号化アルゴリズムの場合と同様に、可能な場合は必ず、公的に監査された既知の標準実装を使用します。コア関数であるEd25519およびsecp256k1が実装されています。バリデータではこのルートキーペアを使用します。バリデータのキーペアを計算する場合は、ここで停止できます。この2つのタイプの公開鍵を区別するには、バリデータの公開鍵のbase58シリアル化でプレフィクス0x1cを使用します。ルート公開鍵を33バイトの圧縮形式に変換します。ECDSA公開鍵の非圧縮形式は、32バイト整数のペア(X座標とY座標)で構成されます。圧縮形式は、X座標と1バイトのプレフィクスのみで構成されます。Y座標が偶数の場合は0x02、Y座標が奇数の場合は0x03です。非圧縮形式の公開鍵を圧縮形式に変換するには、opensslコマンドラインツールを使用します。非圧縮の公開鍵がファイルec-pub.pemにある場合は、次のような圧縮形式を出力できます。compressed次のように、圧縮されたルート公開鍵から「仲介銀行(機関)キーペア」を導出します。以下を順番に連結して、合計40バイトにします。(4バイトのゼロ)(この値は、同じファミリーの異なるメンバーの導出に使用することを目的としていましたが、実際には値0のみが使用されます。)「キーシーケンス」値(4バイト)。ビッグエンディアンの符号なし整数。キーシーケンスの開始値として0を使用します。連結された値のSHA-512ハーフを計算します。結果が有効なsecp256k1秘密鍵でない場合は、キーシーケンスを1増やし、アカウントの仲介銀行(機関)キーペアの導出をやり直します。有効なsecp256k1秘密鍵を使用して、secp256k1曲線で標準ECDSA公開鍵を導出し、仲介銀行(機関)公開鍵を導出します。(暗号化アルゴリズムの場合と同様に、可能な場合は必ず、公的に監査された既知の標準実装を使用します。コア関数であるEd25519およびsecp256k1が実装されています。)仲介銀行(機関)公開鍵をルート公開鍵に追加して、マスター公開鍵ペアを導出します。同様に、仲介銀行(機関)秘密鍵をルート秘密鍵に追加して秘密鍵を導出します。ECDSA秘密鍵は非常に大きな整数値であるため、secp256k1グループ順序を法として2つの秘密鍵を合計することで、2つの秘密鍵の合計を計算できます。ECDSA公開鍵は楕円曲線上の点であるため、楕円曲線の数値を使用して点の合計値を計算する必要があります。以前と同様に、マスター公開鍵を33バイトの圧縮形式に変換します。アカウントの公開鍵をbase58形式にシリアル化する場合は、アカウントの公開鍵プレフィクス0x23を使用します。アカウントの公開鍵からそのアドレスに変換するための情報とサンプルコードについては、アドレスのエンコードを参照してください。