🏦

Solana Walletのmnemonic(シード鍵)をCLIから作る

2022/06/07に公開

Solana公式ドキュメントに書かれていることではありますが、いくつか補足情報も見つかったのでまとめてみます。

背景

Solanaはガス代が安いため、経済的にWalletを細かく分割することができます。鍵が盗まれた際のセキュリティ被害を減らすことができ、ユーザーフレンドリーですね。

PhantomなどのWalletアプリでは簡単に追加するボタンがあり、これを利用した場合は派生鍵が作成されます。これは単一のmnemonicから生成されるシード鍵から一意に生み出せるので管理が簡単な一方、mnemonicが漏れた場合に全てのWalletが芋づる式に盗まれてしまいます。万一に備えると、重要なWalletではmnemonicも分けておきたいところです。

Solana CLIでは新規mnemonic作成も簡単に行えますので、これを利用してみます。

mnemonicをCLIで作成

まずはSolana CLIをインストールします。

$ sh -c "$(curl -sSfL https://release.solana.com/stable/install)"

インストールできたら、solana-keygenコマンドでmnemonicの作成を行います。通常はファイルへバイト列が書き出されるのですが、--no-outfileを指定することで画面にmnemonicを表示することができます。また、--word-countで長さを指定することができます。最高は24です。

$ solana-keygen new --no-outfile --word-count 24

実行するとパスフレーズを尋ねられますが、特に指定しないでも問題ありません。プロンプトも不要な場合は --no-bip39-passphrase を指定します。

========================================================================================================================================================================
Save this seed phrase to recover your new keypair:
float cancel (ry) horror
========================================================================================================================================================================

ちなみに、mnemonicは色々な言語が用意されており、--language japaneseを指定すると日本語のmnemonicが出てきます。

========================================================================================================================================================================================================================================================================================================
Save this seed phrase to recover your new keypair:
ぞんぶん せっかく (ry) まわす
========================================================================================================================================================================================================================================================================================================

作成ができたら大事にメモを取っておきましょう。mnemonicはSlopeなどのWalletではimportすることができます。一方Phantomではmnemonicは初回のみimport可能ですので、ここから秘密鍵も生成してみましょう。

mnemonicから鍵の情報を取得する

mnemonicからは次のようなTypeScriptコードで公開鍵と秘密鍵を取得できます。

import * as bip39 from 'bip39';
import { derivePath } from 'ed25519-hd-key';
import * as web3 from '@solana/web3.js';
import * as bs58 from 'bs58';

const showKeys = async (mnemonic: string) => {
    const seed = await bip39.mnemonicToSeed(mnemonic);
    const seedBuffer = Buffer.from(seed).toString('hex');
    const path = `m/44'/501'/0'/0'`;
    const derivedSeed = derivePath(path, seedBuffer).key;
    const keypair = web3.Keypair.fromSeed(derivedSeed);

    console.log(`pubkey: ${keypair.publicKey}`);
    console.log(`secretKey: ${keypair.secretKey}`);
    console.log(`secretKey (BASE58): ${bs58.encode(keypair.secretKey)}`);
}

流れとしては、まず bip39.mnemonicToSeed() でmnemonicからシード鍵を生成します。次にBIP32のパスを指定して派生鍵を入手します。後はそれを使ってSolanaのKeyPairを生成します。

以下はコードの解説です。

mnemonicはBitcoin BIP39に則っています。BIP39はnpmにもパッケージがあり、簡単に扱うことができます。詳しい解説は、BIP39について詳しく説明している日本語記事も参照ください

派生鍵を作る際に指定するパスは m/44’/501’/0’/0’/0 という呪文になっています。最後の数字を増やしてゆくと、別の派生アドレスが生み出されます。パスの概要はこちらの記事や、BIP32を参照してください。

Solanaの鍵はED25519です。暗号技術には明るくないですが、SSHでおなじみRSAと比べED25519はセキュアかつ高速な方式らしいです。Mozillaの記事が詳しい模様

まとめ

増えすぎると管理が大変なので、Walletは用途に応じて賢く分けよう!

Discussion