
Lisk SDK で遊ぼう #2
はじめに
前回の記事からのんびりしてたらSDK 2.2.0がリリースされて「あらぁ。。」状態の万博おじです。
2.2.0リリース前にSDKを導入した人は、以下のコマンドでアップデートしておいてください。
cd [lisk-sdkを使ったプロジェクトのフォルダの場所]
npm i lisk-sdk
※[lisk-sdkを使ったプロジェクトのフォルダ]は前回の記事に書いてあるツールを使った場合は ~/lisk_dev/ 内にあります。
※node_module 内にlisk-sdk 2.1.0が使いもしないのに残るのが嫌な人は npm i lisk-sdk の前に rm -rf node_modules でnode_modulesを削除してください。
ということで、今回はconfigについてやりますー。
の前に
プログラムなどを見ていく上でど標準のVimやテキストエディタではきついと思うのでVisual Studio CodeやAtomを導入しておくのをおススメします。
でconfigの話
「configってなんぞや🤔」という人がいるかと思いますが、ざっくり言うと設定ファイルです。
Lisk SDK は以下のフォルダに入っているconfigを初期値として読み込んでいます。
node_modules/lisk-sdk/src/sample/config_devnet.json
Lisk SDKのconfigファイルについて
拡張子が.jsonとなっている通り、JSONで保持されています。
JSONはKEY-VALUEで情報を保持し、さらにVALUEは配列や階層も保持することができます。
以下のような感じですね。
{
key1: value1,
key2: {
key3: value3,
key4:[value4_1, value4_2, value4_3]
}
}
このJSON、JavaScriptにとってもとても使いやすい形式で、例えばkey3の値(value3)を取得する場合、key2.key3として取得できます。
また、key3に値を設定する場合は、key2.key3='hogehoge'となります。
階層の一番上から1つずつ目的地までドット(.)でつないでいくイメージですね!
ということで
Lisk 公式のチュートリアル Hello World App ではどんな風にしてconfigを設定しているか見てみましょう。
※コメントは削除しています。
const { Application, genesisBlockDevnet, configDevnet } = require('lisk-sdk');
configDevnet.app.label = 'helloWorld-blockchain-app';
configDevnet.components.storage.password = '<password>';
const app = new Application(genesisBlockDevnet, configDevnet);
app
.run()
.then(() => app.logger.info('App started...'))
.catch(error => {
console.error('Faced error in application', error);
process.exit(1);
});
「で、どこでconfig読んでるの?」というと、1行目のconfigDevnetです。
そのあと3,4行目で設定を変更しています。
以降は環境設定&プロジェクトを作るツールでプロジェクトを作った人は、プロジェクトのフォルダ内にあるindex.jsをこの内容に置き換えて、動かしながら試すと良いかもしれませんね!
プログラムのざっくり内容説明
1行目
lisk-sdk モジュールからなんや色々読み込む
3, 4行目
configファイルの内容を書き換え
※この場合はアプリケーションの名前とデータベースのパスワードを変更
※ファイル自体が書き換わるわけではない。
5行目
アプリケーションを生成(new Application)
8行目以降
アプリケーションを実行(app.run)
本題
上で見てもらったように、configファイル自体を触らずとも、configの内容を変えることが出来ます。
全部説明するにはかなり設定が多いので抜粋して「○○をするには」という逆引き形式でプログラム内に書く場合はどうするかを記載します。
直接読み込んでいるファイルを書き換えてしまうのもアリですが、lisk-sdkのバージョンが新たにリリースされた際の更新がめんどくさいので、プログラムで書くか、わかる人はそういった影響を受けないように別のファイルにしておくのがいいと思います。
config一覧(抜粋)
※公式ドキュメントのList of configuration optionsを参照しながら見ると理解が深まると思いますー。
1. アプリケーション名を変えたい
configDevnet.app.label = 'hogehoge';
2. アプリケーションのバージョンを変えたい
configDevnet.app.version = '1.0.1';
3. ブロックの生成時間を変えたいconfigDevnet.app.genesisConfig.BLOCK_TIME= 5;
4. 1ブロックが処理できるトランザクション数を変えたい
configDevnet.app.genesisConfig.MAX_TRANSACTIONS_PER_BLOCK = 10;
5. 接続するデータベースを変えたい
configDevnet.components.storage.database = 'my_app_db';
6. 接続するデータベースのユーザーを変えたいconfigDevnet.components.storage.user = 'kiminonaha';
7. 接続するデータベースのパスワードを変えたい
configDevnet.components.storage.password = 'qwertyuiop';
※データベースのパスワードを変えたらconfigも変えるのを忘れずに。
8. 外部にAPIを公開したい
configDevnet.modules.http_api.access.public = true;
または
configDevnet.modules.http_api.access.whiteList = ['127.0.0.1', '8.8.8.8'];
または
configDevnet.modules.http_api.access.whiteList.push('8.8.8.8');
※/api/accounts などはこれをしないと外部から使用できません。
※基本的に開発者だけが使える方が良いので、publicはfalseのままで、whiteListに自分のIPアドレスを追加するのをおススメします。
※pushは配列に値を追加するJavaScriptの機能です。
9. SSL認証を有効にしたい
configDevnet.modules.http_api.ssl = {
enabled: true,
options: {
port: 443,
address: "0.0.0.0",
key: "./ssl/lisk.key",
cert: "./ssl/lisk.crt"
}
※enabledをtrueにして、鍵や証明書の場所等を指定します。
※このようにJSON形式で値を設定することでsslの中を書き換えることもできます。
10. forgingを有効にしたい
configDevnet.modules.http_api.forging.access.whiteList = ['127.0.0.1', '8.8.8.8'];
または
configDevnet.modules.http_api.forging.access.whiteList.push('8.8.8.8');
または
configDevnet.modules.chain.forging.force = true;
※公式ドキュメントでも触れられていますがforceはローカル開発環境の場合のみtrueにすることをおススメします。
11. forgingしたい
configDevnet.modules.chain.forging.delegates.push({
encryptedPassphrase: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
publicKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
});
または
configDevnet.modules.chain.forging.delegates = [
{
encryptedPassphrase: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
publicKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
},{
encryptedPassphrase: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
publicKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
}
]
※encryptedPassphraseはconfigDevnet.modules.chain.forging.defaultPasswordに設定されているパスワードでLisk CommanderのEncrypt PassphraseやLisk ElementsのstringifyEncryptedPassphraseを使って取得した値を設定します。
※publicKeyはLisk Explorerなどで見れます。
12. パスフレーズを暗号化/複合化する為のパスワードを変えたい
configDevnet.modules.chain.forging.defaultPassword = 'doko doko don don';
※forgingの設定をした後で変えないように注意。
おわりに
「なんや色々設定多いんやなー😫」と思ったのではないでしょうか?
そう、多いんです😅
でも安心してください。設定を全部変えることは恐らくありません。
また、全てをプログラムで変えるということはしません。
プログラムに慣れてきたら本題の頭で書いたように別ファイルを作って読み込むようにするのがいいかなと思います。(フォーマットは合わせる必要があります)
その場合は以下のようにconfigDevnetを使用しないようになるのかな?
const { Application, genesisBlockDevne} = require('lisk-sdk');
// 独自のconfigファイルを読み込む
const myconf = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
const app = new Application(genesisBlockDevnet, myconf );
今日はここまで。
お疲れ様でした😆