Solana Walletのmnemonic(シード鍵)をCLIから作る
Table of Contents
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は用途に応じて賢く分けよう!