
Lisk SDK v6を使ったブロックチェーンアプリの作り方 その2
はじめに
こんにちは万博おじです。
前回は開発環境の準備を行いましたね!
なので、今回からさっそくブロックチェーンアプリを作っていきましょう!
…と言いたいのですが、その前にシステム開発についてLisk SDKの特徴をまじえながらお話が今回の記事です。
コマンドを打ったりしません。
せっかく作った環境も一切使いません。
流し読みして「あーわかるわかる」という人は次回までお休みしててくださいw
Lisk SDK について
Lisk SDK とは
「JavaScriptやTypeScriptでブロックチェーンアプリケーションを構築できるオープンソースな開発キット」です。
詳しくは公式ドキュメントを参照
Module(モジュール)
Lisk SDKではブロックチェーンアプリの機能をある単位にまとめたものをモジュールと言いいます。
作成したモジュールや配布されているモジュールを組み合わせてブロックチェーンアプリを作ります。
ブロックチェーンアプリは作らず、便利なモジュールの作成のみ行い配布するというのもアリかもしれませんね!
なお、ブロックチェーンアプリを稼働後にモジュール修正などを行うとほぼ確実にハードフォーク案件になるので注意しましょう。
Lisk公式モジュールとしてトークンモジュールやPoSモジュールなどがあります。
詳しくは公式ドキュメントを参照
Plugin(プラグイン)
Lisk SDKではモジュールによって登録されたブロックチェーン上の情報にアクセスしたりモジュールの機能を実行するような、自ブロックチェーンアプリ以外の機能のために作成するものをプラグインと言います。
モジュールとは違い、ブロックチェーンアプリを作る際に必須ではありません。
Lisk公式プラグインとしてはダッシュボードプラグインなどがあります。
詳しくは公式ドキュメントを参照
Store(ストア)
Lisk SDKではモジュールに含まれています。
ストアは以下の2種類存在します。
オンチェーンストア
オフチェーンストア
オンチェーンストアはブロックチェーン内に情報を保持したい場合に使用します。
オフチェーンストアはオンチェーンストアに保持するほどでもないような補完情報などを保持したい場合に使用します。
他のノードと同期されるのはオンチェーンストア内の情報のみです。
Lisk公式ではオンチェーンストアにアカウント情報などを保持しています。
Command(コマンド)
Lisk SDKではモジュールに含まれています。
トランザクションをトリガーとしてブロックチェーンに情報の登録などを行います。
Lisk公式コマンドとしてはLSKトークンを送信するtransferコマンド(トークンモジュール内)などがあります。
詳しくは公式ドキュメントを参照
Event(イベント)
Lisk SDKではモジュールに含まれています。
ブロック実行中にブロックチェーンネットワークで発生したイベントのログを保管します。
これはブロックごとに発生します。
Lisk公式イベントとしてはtransferイベント(トークンモジュール内)などがあります。
詳しくは公式ドキュメントを参照
Method(メソッド)
Lisk SDKではモジュールに含まれています。
自ブロックチェーンアプリケーション内の他のモジュールから、このメソッドが含まれているモジュールに関連する機能の呼び出しを行う際に使用されます。
Lisk公式では利用可能な残高をブロックチェーンから取得するgetAvailableBalance(トークンモジュール内)などがあります。
詳しくは公式ドキュメントを参照
使用例:モジュールからの呼び出し
const mtd = new TokenMethod(…);
const data = await mtd.getAvailableBalance(…);
Endpoint(エンドポイント)
Lisk SDKではモジュールおよびプラグインに含まれています。
メソッドと同じようにモジュールに関連する機能を提供しますが、外部のアプリケーションからも使用可能です。
Lisk公式では残高をブロックチェーンから取得するgetBalance(トークンモジュール内)などがあります。
詳しくは公式ドキュメントを参照
使用例1:モジュールからの呼び出し
const ep = new TokenEndpoint (…);
const data = await ep.getBalance(…);
使用例2:外部機能からの呼び出し(lisk-clientを使用)
const data = await client.invoke('token_getBalance', …);
使用例3:外部機能からの呼び出し(コマンドラインを使用)
./bin/run endpoint:invoke token_getBalance '{…}'
まとめ
Lisk SDKでブロックチェーンアプリケーションを作成する場合、最低限以下を作成する必要があります。
モジュール
コマンド
イベント
メソッド
エンドポイント(モジュールに含まれるもの)
ストア(オンチェーンストア)
プラグイン以外は基本的に作成する必要があるということですねw
考えること色々
フロントエンド開発の必要性
ユーザーが利用するサービス・機能をフロントエンドと言います。
例えばWEBサイトやスマホアプリなどですね。
Lisk SDKを使って作るブロックチェーンアプリはバックエンドなので、UXを考慮したうえでフロントエンド開発も行う必要があります。
Lisk SDKにはフロントエンド開発を行うにあたっての便利なライブラリも含まれています。
詳しくは公式ドキュメントを参照
Liskのサイドチェーンアプリにするか否か
Lisk SDKを使ってブロックチェーンアプリを作ってもサイドチェーンアプリにするかどうかは自由です。
他のサイドチェーンアプリとやり取りをしたいような場合はサイドチェーンアプリとするのがいいでしょう。
そうでない場合はあえてサイドチェーンアプリとする必要はありません。
独自の道を歩むのもいいかもしれませんw
ユースケースを考える
モジュールを作り、そのコマンドやエンドポイントを作成するにはユースケースをしっかりと考えておく必要があります。
例えばショッピングサイトをイメージしてみましょう。
購入者と販売者は概ねどのショッピングサイトでも以下のようなことが出来ると思います。
また、販売者は購入者と同じことが出来るはずです。
[購入者]
・ショッピングサイトにログインする
・自分の情報を確認する
・商品の情報を確認する
・商品をカートに入れる
・商品を購入する
[販売者]
・商品を販売する
※他購入者と同じことが可能
そして、上記の内容は何で作成するかを考えましょう。
ショッピングサイトにログインする
これはLiskで言うとパスフレーズを入力して自身の情報にアクセスするといったことで賄えるのではないでしょうか。
なので、基本的には実装は必要のない機能ということがわかります。
当たり前ですが、フロントエンド側でのセキュリティ考慮は必要です。
平文でパスフレーズを保持したりしてはいけません。
自分の情報を確認する
これは前述「Lisk SDKについて」のところで説明したエンドポイントを使用します。
商品の情報を確認する
これも上記同様にエンドポイントを使用します。
ブロックチェーンに保持した情報をフロントエンドに表示するにはエンドポイントです。覚えておきましょう。
商品をカートに入れる
これはフロントエンドの機能になります。
カートに入れたからと言ってブロックチェーンに「カートに入れたよ!」といった情報の登録が必要かを考えれば明確ですね!
なお、Liskのデスクトップウォレットで投票したいバリデータを選択するのがこれに近い機能ですね。
商品を購入する
購入情報はブロックチェーンに登録してあげる必要があるので、前述「Lisk SDKについて」のところで説明したコマンドを使用します。
商品モジュールの購入コマンドといったところでしょうか。
商品を販売する
商品情報はブロックチェーンに登録してあげる必要があるので、こちらも前述「Lisk SDKについて」のところで説明したコマンドを使用します。
商品モジュールの販売コマンドといったところでしょうか。
上記以外には「販売者」と「購入者」をブロックチェーン上で明確に分ける必要があるか否かも考える必要があります。
分ける場合は販売者登録を行うモジュールの作成が必要になるかもしれません。
セキュリティリスクを考える
リアルマネーが絡まないサービスであれば問題にならないだろうと思うかもしれませんが、そうではありません。
サービス公開を行う際にVPSなどを使用すると思いますが、サーバー乗っ取り、踏み台などにされないようにセキュリティ対策はしっかりと行っておくべきです。
踏み台にされたあげく逮捕とかありますからね。
おわりに
おわりです。
読み物なので面白くなかったですね。うん。
次回から開発していきますよ!
なお、公式サンプルのhelloを使います。
お疲れさまでした。