Lisk SDK (lisk-client)を使いながらJavaScriptを勉強してみない? - その3 -
おっはろーございます!万博おじです。
今回は4回目、内容は「非同期処理:APIからアカウント情報を取得」です。
準備
JavaScriptの基本:パスフレーズを生成
文字列操作:パスフレーズからアドレスを取得
非同期処理:APIからアカウント情報を取得
ループ処理:APIからトランザクション情報を取得
トランザクションの生成と送信
トランザクション手数料の取得
はじめに
今回は非同期処理をやっていきます。
内容的にも難しいと思うのでのんびりごらんください~。
それではしばしお付き合いください😊
前回
非同期処理とは
ざっくり言うと、なんらかの処理の結果を待たずに他の処理を行うことができる処理のことです。
逆に同期処理はなんらかの処理の結果を待ってから他の処理を行う処理です。
うん、よくわからんと思うので下図をどうぞ
というのを軽く頭に入れてから以下をどうぞ!
今回のお勉強用ソースコード
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>画面タイトルです</title>
<script src="https://js.lisk.com/lisk-client-5.2.2.min.js" defer></script>
<style>
html { font-size: 10px; }
body { font-size: 1.6rem; }
input[type="text"],
input[type="number"],
input[type="password"],
textarea,
button {
font-size: 1.6rem;
padding: 5px;
}
</style>
</head>
<body>
<div>
<input type="password" id="enter-passphrase" style="width: 300px;" placeholder="パスフレーズを入力してください" oninput="checkPassphrase(this.value)" />
</div>
<div>
<button type="button" id="btn-login" style="width: 150px;" onclick="login()" disabled="true">ログイン</button>
<button type="button" style="width: 150px;" onclick="createAccount()">アカウントを作成</button>
</div>
<div>
<a href="https://testnet-faucet.lisk.com/" target="_blank" rel="noopener noreferrer">テストネット用のLSKを受け取ります</a>
</div>
<hr>
<!-- (1)パスフレーズの表示場所 -->
<h4>パスフレーズ:</h4>
<div id="lisk-passphrase"></div>
<!-- (2)アドレスの表示場所 -->
<h4>アドレス:</h4>
<div id="lisk-address"></div>
<div id="lisk-bufferAddress"></div>
<!-- (3)公開鍵の表示場所 -->
<h4>公開鍵:</h4>
<div id="lisk-publicKey"></div>
<!-- (4)残高の表示場所 -->
<h4>残高:</h4>
<div id="lisk-balance"></div>
<script>
/*
* アカウント作成処理
*/
function createAccount() {
// (1)パスフレーズを生成して画面に表示
const mnemonic = lisk.passphrase.Mnemonic.generateMnemonic();
document.querySelector("#lisk-passphrase").innerHTML = mnemonic;
// (2)アドレスと公開鍵を取得して画面に表示
const addressAndPublicKey = lisk.cryptography.getAddressAndPublicKeyFromPassphrase(mnemonic);
const bufferAddress = addressAndPublicKey.address;
const publicKey = addressAndPublicKey.publicKey;
document.querySelector("#lisk-bufferAddress").innerHTML = `(${bufferAddress.toString("hex")})`;
document.querySelector("#lisk-publicKey").innerHTML = publicKey.toString("hex");
// (3)アドレスを取得して画面に表示
const address = lisk.cryptography.getLisk32AddressFromAddress(bufferAddress);
document.querySelector("#lisk-address").innerHTML = address;
// (4)残高は0LSKとする
document.querySelector("#lisk-balance").innerHTML = "0LSK";
}
/*
* ログイン
*/
async function login() {
// (1)入力されたパスフレーズを取得
const passphrase = document.querySelector("#enter-passphrase").value;
// (2)パスフレーズからlsk始まりのアドレスを取得
const address = lisk.cryptography.getLisk32AddressFromPassphrase(passphrase);
// (3)Lisk Service API の accounts を使用してアカウント情報を取得
const response = await fetch(`https://testnet-service.lisk.com/api/v2/accounts?address=${address}`);
const json = await response.json();
// (4)見つからなかった場合は終了
if (json.error) {
alert("アカウントが見つかりませんでした。");
return;
}
// (5)見つかった場合は画面に表示
const account = json.data[0];
document.querySelector("#lisk-address").innerHTML = account.summary.address;
document.querySelector("#lisk-balance").innerHTML = `${lisk.transactions.convertBeddowsToLSK(account.summary.balance)}LSK`;
document.querySelector("#lisk-passphrase").innerHTML = "ひみつ";
// (6)公開鍵とバッファアドレスはパスフレーズから取得して表示
const addressAndPublicKey = lisk.cryptography.getAddressAndPublicKeyFromPassphrase(passphrase);
document.querySelector("#lisk-bufferAddress").innerHTML = `(${addressAndPublicKey.address.toString("hex")})`;
document.querySelector("#lisk-publicKey").innerHTML = addressAndPublicKey.publicKey.toString("hex");
}
/*
* パスフレーズチェック
*/
function checkPassphrase(val) {
// (1)現在の入力値をチェック
const ret = lisk.passphrase.Mnemonic.validateMnemonic(val);
// (2)パスフレーズが正しくない場合はログインボタンを入力不可、正しい場合は入力可に変更
document.querySelector("#btn-login").disabled = !ret;
}
</script>
</body>
</html>
前回からの変更点
HTMLで変わったのは以下の通りです
パスフレーズの入力欄の追加
ログインボタンの追加
テストネット用のLSKを受け取りリンクを追加
JavaScriptで変わったのは以下の通りです
ログイン処理(function login)の追加
パスフレーズチェック処理(function checkPassphrase)の追加
画面を開くとこんな感じ
ソースコードの説明:HTML
<input type="password">
パスワード入力欄を表示します。
入力した文字が●などでマスクされるため、入力中の内容を見られたくないようなものに使用します。
placeholder=""
入力欄が未入力の場合に設定した内容を入力欄に表示します。
oninput=""
入力中に発生するイベントを定義します。
disabled="true"
入力欄やボタンなどにつけると使用不可になります。
disabled="false" または つけない場合は使用可です。
<a href=""></a>
リンクを表示するタグです。
リンクをクリックした際に開く画面のURLをhrefに設定します。
ソースコードの説明:JavaScript(lisk-client)
lisk.cryptography.getLisk32AddressFromPassphrase
パスフレーズからlsk始まりのアドレスを取得します。
lisk.passphrase.Mnemonic.validateMnemonic
ニーモニック(パスフレーズ)が有効なものかどうかを判定します。
有効な場合はtrue、無効な場合はfalseを返します。
lisk.transactions.convertBeddowsToLSK
アカウント情報などにある残高を1/100000000するための関数です。
ソースコードの説明:JavaScript
function checkPassphrase
パスフレーズをチェックする関数です。
パスフレーズを入力する度に実行され、有効なパスフレーズの場合にログインボタンを使用可能にします。
function login
ログイン処理(アカウント情報の取得)を行う関数です。
ログインボタンのクリックイベントから実行されます。
async
非同期処理ですよという宣言です。
await
awaitが宣言された関数の結果が返却されるまでasyncが宣言されている関数の処理が待ち状態になります。(同期処理と同じような動きになります)
asyncが宣言された関数内でのみ利用可能です。
fetch
指定のURLにアクセス(リクエスト)し、その結果(レスポンス)を取得する機能です。
response.json
fetchの実行結果responseからjsonを取得します。
if
条件判定を行います。
()に記載した内容がtrueになる場合に処理が実行されます。
{
"error": true,
"message": "Data not found"
}
json.data[0]
json内のdataの1件目の情報という意味になります。
[]は配列であることを指し、その中の数字は0始まりです。
ソースコードの説明:Liskサービス API
https://testnet-service.lisk.com/api/v2/accounts
テストネットのアカウント情報を取得するLisk公式のLiskサービスAPIです。
詳しくはこちらをご覧ください。
アカウント情報が取得できた時は以下のようなJSONが返却されます。
{
"data": [
{
"summary": {
"address": "lsk9g3k58b3gzcykjyaob9ekbt3a7b3e586h4gkxj",
"balance": "0",
....
},
....
},
{
"summary": {
....
},
....
},
{
"summary": {
....
},
....
},
]
}
エラー時は以下のようなJSONが返却されます。
{
"error": true,
"message": "Data not found"
}
おわりに
今回はここまで!お疲れさまでした!
非同期処理とLiskサービスのAPIが出てきたので前回より難しかったですね😅
非同期処理はWEBアプリを作る際にとても重要なのでasync/awaitは抑えておきましょう!(昔JavaScriptをやっていた人はPromiseとかコールバック地獄で悩まされたと思いますが、使うだけならだいぶ楽になりましたね~)
次回はものんびりご覧ください😉
万博おじについて
Liskに関するツールなど開発したりノード管理したりしています。
何かあればTwitter等でご連絡ください。
個人アカウント
Twitter:ys_mdmg
GitHub:lisknonanika
Discord:ys_mdmg#5646
Lisk Explorer:lisk observer, lisk scan
デリゲートアカウント(共同管理)
Twitter:liskcommulab
Discord:CommuLab#0097
Lisk Explorer:lisk observer, lisk scan
管理
ノード:Mainnet / Testnet
Lisk Service:Mainnet / Testnet
デリゲートサイト:Lisk CommuLab