💡

[Astar]コントラクト備忘録44(Polkadot.jsを使って「Mnemonic」を作成し、公開鍵・秘密鍵を取得しよう!)

2023/03/13に公開

本日は、Polkadot.jsで「Mnemonic」を作成し、そこから公開鍵・秘密鍵の作り方を見ていきましょう。

こちらを使っています。


https://polkadot.js.org/docs/util-crypto/examples/create-mnemonic

コードはこちらになります。


import {
  mnemonicGenerate,
  mnemonicToMiniSecret,
  mnemonicValidate,
  ed25519PairFromSeed
} from '@polkadot/util-crypto';

const inter = Inter({ subsets: ['latin'] })

async function main () {
  // Create mnemonic string for Alice using BIP39
  const mnemonicAlice = mnemonicGenerate();

  console.log(`Generated mnemonic: ${mnemonicAlice}`);

  // Validate the mnemonic string that was generated
  const isValidMnemonic = mnemonicValidate(mnemonicAlice);

  console.log(`isValidMnemonic: ${isValidMnemonic}`);

  // Create valid Substrate-compatible seed from mnemonic
  const seedAlice = mnemonicToMiniSecret(mnemonicAlice);

  console.log(`seedAlice: ${seedAlice.toString()}`);

  // Generate new public/secret keypair for Alice from the supplied seed
  const { publicKey, secretKey } = ed25519PairFromSeed(seedAlice);

  console.log(`publicKey: ${publicKey.toString()}`);
  console.log(`secretKey: ${secretKey.toString()}`);
}

main().then(() => console.log('completed'))

まずは、BIP39について理解しましょう。

こちらは「ビットコイン改善提案」で「Deterministic Wallets」についての規格です。

chatGPT

では、コードを見てみましょう。

下のように、「mnemonic」を作成し、妥当性を検証しています。

その「mnemonic」からSubstrateに互換性のあるシードを作成して、そこから秘密鍵と公開鍵を作成しています。

なお、ここでは「ed25519」を使っていますね。

下のように、うまく取得することができました。

本日は以上です。

import { useState } from 'react';
const { u8aToHex } = require('@polkadot/util');
import {mnemonicGenerate, mnemonicToMiniSecret, mnemonicValidate, ed25519PairFromSeed} from '@polkadot/util-crypto'

const inter = Inter({ subsets: ['latin'] })

export default function Home() {
  const [mnemonicAlice, setMnemonicAlice] = useState('');
  const [isValidMnemonic, setIsValidMnemonic] = useState(false);
  const [seedAlice, setSeedAlice] = useState('');
  const [publicKey, setPublicKey] = useState('');
  const [secretKey, setSecretKey] = useState('');

  async function createKeys () {
    // Create mnemonic string for Alice using BIP39
    const mnemonicAlice = mnemonicGenerate();

    setMnemonicAlice(mnemonicAlice);
  
    // Validate the mnemonic string that was generated
    const isValidMnemonic = mnemonicValidate(mnemonicAlice);
  
    setIsValidMnemonic(isValidMnemonic)
  
    // Create valid Substrate-compatible seed from mnemonic
    const seedAlice = mnemonicToMiniSecret(mnemonicAlice);

    setSeedAlice(seedAlice)
  
    // Generate new public/secret keypair for Alice from the supplied seed
    const { publicKey, secretKey } = ed25519PairFromSeed(seedAlice);
  
    setPublicKey(u8aToHex(publicKey).toString());
    setSecretKey(u8aToHex(secretKey).toString());
  }
<div>
            <button  style={{ marginBottom: '30px' }} onClick={createKeys}>Generate Keys</button>
            <div style={{ marginBottom: '30px' }}>mnemonic: {mnemonicAlice}</div>
            <div style={{ marginBottom: '30px' }}>isValidMnemonic: {isValidMnemonic.toString()}</div>
            <div style={{ marginBottom: '30px' }}>seedAlice: {seedAlice}</div>
            <div style={{ marginBottom: '30px' }}>Public Key: {publicKey}</div>
            <div style={{ marginBottom: '30px' }}>Secret Key: {secretKey}</div>
          </div>

Discussion