ニモニック財布を作る


以前ニモニック財布の作り方を習ったことがありますが、実習したことはありますが、ついていくだけで、「あ~いいよ~」からやめました…今回は公式文書を読んで整理したいと思います.
まず、ニモニックの財布を作るには、ニモニック号が何なのかを知る必要があります.

ニモニック号


複雑な秘密鍵の入力を容易にするために、12個または24個のランダムな英語単語で財布文を生成することができ、通貨財布を暗号化するユーザーが技術を理解していない場合に財布を便利に使用するのを助けることができる.
秘密鍵の代わりなので、財布を復元する際にも使われますが、秘密鍵が漏れると財布内の暗号化された通貨も失われます.そのため、暗号化して保存したり、紙に書いたりして金庫などで物理的に保管するのは安全です.
これは暗号化されたセキュリティパスワード方式で、ニモニックの単語を順番につづり、ニモニックの文字を順番につづることができなければ、誰も財布を開けることができません.初めて「マイウォレット」の作成を実行すると、ウォレットは英語の単語グループを使って固有のウォレット文を生成し、この言葉が私のウォレットのアニメーションになります.
BIP-39形式で整理されたアニメーションコードは、任意の値を予め定義された日常単語リストにマッピングする.Nimonicコードはハッシュ関数のキー伸張過程を再帰的に繰り返すことによって主シードを生成し,その主シードはHD財布動作の基礎である.

ニモニック語コード単語


決定的な財布を誘導するために使用されるデジタル符号化された単語のシーケンス.単語のシーケンスでシーケンスを再生成するか、財布とすべての派生キーを再生成することができます.

nimonic単語の作成

  • 暗号学は、128〜256ビットのシーケンスSをランダムに生成する.
  • SのSHA−256ハッシュ値では、前のSの長さ/32ビットが検証島として使用される.
  • 2号で作成されたチェックアイランドをSの末尾に追加します.
  • 3号で作成したシーケンスとチェックアイランドの接続を11ビット単位で切断します.
  • を11ビットごとに2048(2^11)個の事前定義単語に変換します.
  • 個の単語シーケンスから順序を保ち、ニモニックコードを生成する.
  • シードの作成


    Nimonic単語は128〜256ビット長のエントロピーを表す.エントロピーは、キー伸張関数PBKDF 2によって512ビットシードを作成するために使用され、生成されたシードは、決定論的ウォレットを構築し、鍵を誘導するために使用される.
    キー引張関数には、nimonicとsoltの2つのパラメータが使用されます.Soltの目的は,無差別対入攻撃を許容するクエリーテーブルを生成することが困難である.PBKDF 2結合引張関数の最初のパラメータはnimonicであり,2番目のパラメータはsoletである.ソルトはニモニック号にユーザー指定のパスワードを貼った.PBKDF 2は、NIMONICおよびSALTをHMAC−SHA 512を介して2048回ハッシュし、シードである512ビットの値を生成する.

    ニモニック財布を作る


    まず、NIMONICを生成するAPIを作成し、それによって生成されたNIMONICコードとパスワードによって財布のAPIを作成します.

    新しいアニメーションAPIの作成

    router.post('/newMnemonic', async(req, res) => {
      let mnemonic;
      try {
        mnemonic = lightwallet.keystore.generateRandomSeed();
        res.json({mnemonic});
      } catch(err) {
        console.log(err);
      }
    });
    eth-light財布モジュールを使用して開発します.
    上で使用したkeystore.generateRandomSeed()関数は、ランダムに12個の単語のシードからなる文字列を生成して返します.

    アニメーションコードとパスワードを使用したウォレットAPIの作成

    router.post('/newWallet', async(req, res) => {
      let password = req.body.password;
      let mnemonic = req.body.mnemonic;
      
      try {
        lightwallet.keystore.createVault(
          {
            password: password,
            seedPhrase: mnemonic,
            hdPathString: "m/0'/0'/0'"
          },
          (err, ks) => {
            ks.keyFromPassword(password, (err, pwDerivedKey) => {
              ks.generateNewAddress(pwDerivedKey, 1);
              
              let address = ks.getAddresses().toString();
              let keystore = ks.serialize();
              
              res.json({keystore: keystore, address: address});
            });
          }
        );
      } catch (exception) {
        console.log("NewWallet => " + exception);
      }
    });       
    まずはkeystorecreateVault()関数を使用してkeystoreを生成します.
    最初のパラメータには、password、seedPhrase、hdPathString、saltなどのオブジェクトが含まれます.
  • パスワードは、シーケンス化時にリポジトリを暗号化する際に使用される文字列です.
  • seedPhraseは、アカウントを作成するための12単語nimonicです.
  • hdpathStringは、BIP 39と互換性のあるHDパス文字列をユーザに提供することを要求する.デフォルトはm/0'/0'/0'です.
  • 塩は、上記3種とは異なる選択事項である.vaultを暗号化および復号化するために使用され、入力しないと任意のソリューションが生成されます.
  • 2番目のパラメータにはkeystoreをパラメータとして使用するコールバック関数が含まれます.
    ここでキスツアーを探してみましょう
    keystoreは、通貨財布を暗号化する秘密鍵を使用してパスワードで暗号化されたテキストまたはファイルです.テキストやファイルを保存するときに、別の財布に入力し、適切なパスワードを入力すると、秘密鍵を復号してエクスポートすることができ、暗号化されたファイルであるため、keystoreファイルはコンピュータや手帳などに安全に保存することができます.しかし、パスワードが簡単すぎると、無差別で攻撃しやすくなります.
    次に、コールバック関数ではkeystoreです.keyFromPassword()関数を使用しています.この関数は、内部構成のソリューションを使用して、適切なpwDerivedKeyを返します.ユーザーが入力したpasswordを入力として使用して、keystoreを暗号化/復号するためのUIT 8 A rrayタイプの対称鍵を生成します.
    2番目のパラメータは、pwDerivedKeyをパラメータとして使用するコールバック関数を作成します.このコールバック関数ではkeystore.GenerateNewAddress()を使用して、新しいアドレス生成関数を実行します.パラメータとしてpwDerivedKeyを受信し、address/private鍵ペアを生成します.2番目のパラメータとして数値を使用すると、その数値に等しいペアが生成されます.既定値は1です.
    keystore.GenerateNewAddress()を実行した後、keystore.getAddress()呼び出しによって生成されたアドレス/秘密鍵ペアをロードできます.
    address変数はgetAddress()でロードされた値を文字列形式で格納し、keystore変数はJSON符号化文字列形式で現在のkeystoreオブジェクトを格納します.

    生成したkeystoreをjsonファイルとしてローカルサーバに保存


    上記のコードでは、keystoreとaddressの応答を含むのではなく、次のコードを記述します.
    // res.json({keystore: keystore, address: address});
    // 대신에
    
    fs.writeFile('wallet.json', keystore, (err, data) => {
      if (err) {
        res.json({code: 999, message: "실패"});
      } else {
        res.json({code: 1, message: "성공"});
      }
    });
    wallet.jsonという名前のファイルを保存し、応答は成功/失敗のみを返します.

    postmanを使用して結果をチェック


    まずサーバを実行させます.

    postmanを実行し、http://localhost:3000/wallet/newMnemonicを入力してPOST要求を行う.応答として、ニモニックが作成して戻るのが見えます.

    生成したNIMONICをコピーし、今度はhttp://localhost:3000/wallet/newWalletにPOSTリクエストを送信します.bodyにnimonicとpasswordを入力してリクエストを送信すると、成功メッセージが表示されます.

    財布もあるしjsonがローカルで生成されていることがわかります.

    https://github.com/be-kid/MnemonicWallet

    終了時..。


    確かに、正式なドキュメントを表示するときに、各関数の役割を正確に決定し、コードを表示し、内容とプロセスを理解しました.
    英語で書かれた文書が怖いので、韓国語で説明されたブログなどをよく探したり、ごまかしたりしますが、時間をかけてじっくり観察すると助かります.