Development of Mnemonic Wallet


GitHub


github repository

mnemonicとは何ですか?


様々な暗号化通貨財布は、非対称鍵暗号化方式を使用します.非対称鍵暗号化方式には、公開鍵と秘密鍵がある.秘密鍵はユーザが保管する必要があるが,意味のない数字や文字の羅列は個人的には覚えにくい.したがって、ユーザが自分の秘密鍵を簡単に記憶して使用できるのはMnemonicである.
mnemonicは通常12個の英語の単語を組み合わせたものである.

開発環境



postmanを使用してAPIテストを行います.

postmanテスト、mnemonicコードの取得

// Get Mnemonic code using lightwallet module
router.post("/newMnemonic", async (req, res) => {
	let mnemonic;
	try {
		mnemonic = lightwallet.keystore.generateRandomSeed();
		res.json({ mnemonic });
	} catch (err) {
		console.log(err);
		res.status(404).send({ message: "Bad Request" });
	}
});
lightwalletモジュールのgenerateRandomSeed関数を用いてapiによって生成されたseed関数を受信する.
サーバを実行した後、postmanからメソッドをPOSTに変更し、http://localhost:3000/wallet/newMnemonicと入力します.では、以下に示すmnemonicコードが生成される.

mnemonicコード、パスワードを使用してnewWallet APIを作成


newWalletという名前のエンドポイントを使用してPOSTリクエストを送信することで、keywstoreとaddressを受信できます.keystoreは、暗号化された通貨財布を使用するために秘密鍵を暗号化するテキストファイルです.
コードではpassword、mnnonicの2つのパラメータでnewWalletを生成します.
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'"
        },
        function (err, ks) {
          ks.keyFromPassword(password, function (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);
    }
});

keysotre、address応答APIのテスト


bodyに次のように入力すると、newWallet APIが生成されます.新Walletには、keysotreファイルとaddressファイルが含まれています.
{
    "mnemonic": "saddle bind borrow tackle want thank acquire select jazz brass maximum female",
    "password": "abcde12345"
}

keystoreファイルとして保存


元のコードを変換してkeystoreをローカルに保存できます.
// before
res.json({ keystore: keystore, address: address });

// after
fs.writeFile("wallet.json", keystore, function (err, data) {
  if (err) {
    res.json({ code: 404, message: "Fail" });
  	} else {
      	res.json({ code: 204, message: "Success" });

ローカルサーバで財布を使用します.jsonファイルが生成されていることがわかります.

ファイルの内容は以下の通りです.
{"encSeed":{"encStr":"oQn0nUrhXhwJPLz891FlorSHMghkh8nSb2kHhRsh3S4nQBNgHgS7WjygiBG6qWGeZy0PMMgoiCETOxCJYFPt4Nc5ymws/kw5/BHti1pFLHCGJmbXkAFRDtcZU9aqJSwIyiaZ2kXSruF8XP2+fkmUWuNL6V4IyejI6Jmh+nDsfSgehxSPBmyy3w==","nonce":"b8Hj1IarDYHlZD4nFZ5WbrV1qmOY8US4"},"encHdRootPriv":{"encStr":"PpeXCQ8huIUPHGuhSudSuqr0cPKME3Uf8IymqIK112NMyNjFy53DjryQuPly+7Wys1pFfPDht6kX04+M6w6p7gHhrEbUNgi+l2dwNybMYchrLYG+C5mSY3Q0ojVb2BL/MpWw9M27+/Z6z/IDQfxLwzsK5xWFtiPbA0xBTmK5IA==","nonce":"pd8asOjx+RiEp6mF8ccCc0VxapDgkyg7"},"addresses":["fd0e7665a7d2c6a7f6b5cc3aa61be20fccc4340f"],"encPrivKeys":{"fd0e7665a7d2c6a7f6b5cc3aa61be20fccc4340f":{"key":"KPRn1VTKqo5A0cQCfD/cYkJK1jq+Qpnax8IYXKHNMaZHU/LyiqOYOSuJkpbCSgvO","nonce":"cDYcs2cmNf9qYG6qhmb1AKSH1TzNhOV1"}},"hdPathString":"m/0'/0'/0'","salt":"7a3thZwzUpJEgfWQDluHA/f4yBUxrpmIUJtQRvA7Xc0=","hdIndex":1,"version":3}

完全なコード

const express = require("express");
const router = express.Router();
const lightwallet = require("eth-lightwallet");
const fs = require("fs");

// Get Mnemonic code using lightwallet module
router.post("/newMnemonic", async (req, res) => {
	let mnemonic;
	try {
		mnemonic = lightwallet.keystore.generateRandomSeed();
		res.json({ mnemonic });
	} catch (err) {
		console.log(err);
		res.status(404).send({ message: "Bad Request" });
	}
});

// Create keysotre file using Mnemonic code and password
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'",
			},
			function (err, ks) {
				ks.keyFromPassword(password, function (err, pwDerivedKey) {
					ks.generateNewAddress(pwDerivedKey, 1);

					let address = ks.getAddresses().toString();
					let keystore = ks.serialize();

					fs.writeFile("wallet.json", keystore, function (err, data) {
						if (err) {
							res.json({ code: 404, message: "Fail" });
						} else {
							res.json({ code: 204, message: "Success" });
						}
					});
				});
			}
		);
	} catch (exception) {
		console.log("NewWallet ==>>>> " + exception);
	}
});

module.exports = router;

発展回顧(KPT)


KEEP(仕事とコードの面での良い経験)


実習を通して,Mnemonic codeとHD Walletの理論と動作原理を学ぶためにより多くの時間を得ることができ,これは有益である.

PROBLEM(操作とコードの面での悪い体験)


ブロックチェーンを学び始め、多くの理論に触れたが、まだ説明が容易ではなく、ブログではこれらの不足点が如実に明らかになった.

TRY(後で試すアクションアイテムを設定)


学んだ理論を一つ一つ整理した文章を書かなければならない.