💡
[Astar]コントラクト備忘録44(Polkadot.jsを使って「Mnemonic」を作成し、公開鍵・秘密鍵を取得しよう!)
本日は、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