ハンズオンセミナーレポート2 LINE Blockchain Developersでトークンをつくるまで

こちらのレポートには実際のハンズオンの手順も記載しておりますので、ぜひLINE Blockchain Developersを使って試してみてください!

こんにちは。やんちゃる(twitter : @yanchal_crypto)です。前回のレポートに引き続き、LINE Blockchain Developers(以下LBD)のテストネットを使ったdAppの作成とトークン発行までの手順をご紹介します!

 

前回のレポートはこちら

 

サービス(dApp)の作成
 

① チェーンを選択
・今回はテストネットのCashew(TestNet)

 

②必須項目を入力

 

③「賭博行為に使用しないこと」に同意

④「作成」をクリックしてください

 

⑤自動生成されたAPI KeyとAPI Secretをコピー・メモして保存
*API Secret は再発行できないので確実にコピーしメモしてください。

⑥「確認」をクリックしてAPI Secretを確認

以上でLBDに自分のサービスが作成されました。
こんな感じで簡単にトークン作成リクエストなどができる環境ができて本当にデベロッパーフレンドリなUIだなと思います!

 

管理Walletの作成


*サービス(dApp)の管理に使うwalletを作成(dAppのOwner Wallet)
Owner walletが必要なブロックチェーンの操作は以下になります。
・Service Tokenの作成
・Service Tokenの鋳造(minting)
・Item Tokenの作成
・Item Tokenの鋳造(minting)
・Item Tokenの焼却(burn)etc,

 

①Wallet名を入力

②「作成」をクリック


③自動生成されるWallet Secretをコピー・メモして保存
*API Secret同様に再表示できません!確実にメモをお取りください。

④「確認」をクリックしてSecretを確認
サービストークンの作成は今回はスキップします!

こちらでサービス(dApp)の作成が完了しました!

作成で注意すべきこと
・Service API Secret(APIの秘密鍵)
・Owner Wallet Secret(ウォレットの秘密鍵)
 は確実に保存してください

Non-fungible Item Tokenの作成


続いてLBDを使ってNon-fungible Item Tokenを実際に作ってみました!

Non-fungible Item Tokenとは?
Non-fungible Item Tokenは、ブロックチェーン上に存在させることができる唯一無二のデータ(複製できない)のことで、主流なものとしてゲーム内で使えるトレーディングカードだったり、アイドルのデジタルトレーディングカードなどで主に使われているトークン技術です。例えばこのトークンをLINE Blockchainだと、BITMAX Walletのサービスで簡単にトレード(交換)できます!実際に私もやってみましたがすごく簡単で楽しいユーザー体験ができました!

①作成(create): web Consoleで実行可能

WEB ConsoleはこちらのGUIのことです https://blockchain.line.biz/#/
・Non-fungible Item Tokenの「テンプレート」を作成
・オブジェクト指向プログラミングに例えると「クラスの定義」

①「資産」→「Item Token」→「Create New」の順にクリックします

②「Non-fungible」を選択

③Token名を入力

 

④Owner Walletを選択
・作成されたTokenの鋳造、焼却を行う管理Wallet

 

⑤「作成」をクリック

 

⑥コピー・メモしておいたOwner WalletのWallet Secretを入力

⑦ Item Tokenの作成が完了しますと下のようになります!

Non-fungible Item Tokenの作成は完了です!

 

UIが整備されてるのですごく簡単にできました!
Meetup当日は、できた方挙手でという感じで進行を確認されてましたがかなり多くの方が早い段階で挙手されていた印象がありました!

鋳造(Mint):APIを通じて実行
・Non-fungible Item Tokenの実体を生成
・オブジェクト指向プログラミングに例えると「インスタンスの生成」
*こちらはCurlコマンドを使ってAPIにアクセスします

焼却(Burn): APIを通じて実行
・Non-fungible Item Tokenの実体を削除
・オブジェクト指向プログラミングに例えると「インスタンスの削除」
*こちらはCurlコマンドを使ってAPIにアクセスします

トークンの作成をしましたので続いて、鋳造(Mint)を行います!

 

LBD APIへの接続確認


当日の配布資料▼

①サーバー時刻を取得するAPIコールを行います

②APIの認証情報にサービスのAPI Keyのみ指定すればコール可能


・他のAPIはAPI Key(APIの公開鍵)以外にも認証が必要
・認証情報に関しては別途記述します。

 

シェルコマンド:実体の中身は下の例もしくは配布のシェルファイル LBD_GET_Time.sh をご参照ください。

#サーバ時刻を確認するAPIコール

SERVICE_API_KEY= #自身のサービスのAPIKey

curl -s -X GET https://test-api.blockchain.line.me/v1/time ¥ -H "service-api-key: $SERVICE_API_KEY" | jq

Status Codeに関してはこちらをご参照ください!
https://docs-blockchain.line.biz/ja/api-guide/ (ステータスコード以下参照)

 

こちらの結果の通りLBDのAPIサーバーにアクセスができました!これでAPIの接続確認は完了になります!

 

認証情報の作成

 

LBDでのAPIコールはHTTP Request Headerに以下が必要です

①service-api-key: サービス(dApp)作成時に自動発行されるAPI Key(公開鍵)

 

②timestamp: ミリ秒単位のUnix Time
・APIサーバー時刻との差が10秒以内である必要があり

 

③nonce: 8文字の任意の文字列
・使用可能文字:アルファベットの大文字・小文字、数字
・20秒以内に同じnonceを2回以上は使用不可

 

④signature: APIリクエストの内容をサービスのAPI Secret Keyで署名した結果

これらの4点をheadersに加えてください!追加の仕方は後ほど記載します!
*APIリクエストの署名に関して

実際の署名作成はシェルスクリプトファイルの中身を確認ください。

 

5のHttp Request bodyに関しては以下をご参照ください。

 

Shellコマンドで署名の作成を行う場合は下の事例かAuthenticationInfo.shの中身を参照ください。
#署名作成のshファイルです。

SERVICE_API_KEY= #Please copy&paste API KEY

SERVICE_SECRET= #Please copy&paste API Secret KEY

HTTP_METHOD= # GET or POST or PUT etc

HTTP_PATH_QUERY_BODY= # HTTP Path + Query Parameters + HTTP Request Body

# APIをコールしてサーバ時刻を取得

TIMESTAMP=`curl -s -X GET https://test-api.blockchain.line.me/v1/time -H "service-api-key: $SERVICE_API_KEY" | jq -r .responseTime`

NONCE=`echo "${TIMESTAMP:5:8}"` # timestampの下位8文字を使用 # 署名対象のメッセージ

MESSAGE="${NONCE}${TIMESTAMP}${HTTP_METHOD}${HTTP_PATH_QUERY_BODY}"

SIGNATURE=`echo $MESSAGE | openssl sha512 -binary -hmac "$SERVICE_SECRET" | base64` echo $SIGNATURE #Signature Confirm Please deleate # mark

AuthenticationInfo.shの実行結果は以下のように暗号化された結果がターミナルに出力されます!

fOkh4emrUyjuWHC0a7T54cc50XnDTrvnO4M1F4kaqUPifXplASXB5ueFGpTly+ylnYkAx5vzYRZlMQFY0w7psg==

では署名がこのように作成されることがわかりましたら認証情報は問題ありません!以上が認証の作成になります。

 

Non-fungible Item Token情報の照会

Non-fungible Item Token Typeの取得API
参照:https://docs-blockchain.line.biz/ja/api-guide/category-item-tokens?id=v1-item-tokens-contractid-non-fungibles-tokentype-get
APIに使うURI: https://docs-blockchain.line.biz/ja/api-guide/category-item-tokens?id=v1-item-tokens-contractid-non-fungibles-tokentype-mint-post
HTTPリクエストメソッド: GET
URLに使うPATH: /v1/item-tokens/{contractId}/non-fungibles/{tokenType}
・{contractId}, {tokenType}はWebコンソールで確認可能

WEBコンソールから取得しておく変数をまとめると以下になります。
・SERVICE_API_KEY (APIの公開鍵)
・SERVICE_SECRET (APIの秘密鍵)
・CONTRACT_ID (契約ID=LBDチャネル固有のID)
・TOKEN_TYPE (Non-fungible Item Tokenの識別番号)

実際に実行するシェルコマンドは以下になります!
実際のファイルはConfirm_NFT_TokenInfo.shをご参照ください。
APIとWalletの鍵情報は自身のサービスのものに置き換えください。

SERVICE_API_KEY=c660b634-085b-4cfb-bd6b-cdc81d3d51be #自身のチャネルのAPI Key SERVICE_SECRET=58d43946-acce-4209-b3ce-6f4df53cbe4a #自身のチャネルのAPI Secret Key CONTRACT_ID=bfe31faf

TOKEN_TYPE=10000001

TIMESTAMP=`curl -s -X GET https://test-api.blockchain.line.me/v1/time -H "service-api-key: $SERVICE_API_KEY" | jq -r .responseTime`

NONCE=`echo "${TIMESTAMP:5:8}"`

MESSAGE="${NONCE}${TIMESTAMP}GET/v1/item-tokens/$CONTRACT_ID/non-fungibles/$TOKEN_TYPE"

SIGNATURE=`echo -n $MESSAGE | openssl sha512 -binary -hmac "$SERVICE_SECRET" | base64`

curl -s -X GET https://test-api.blockchain.line.me/v1/item-tokens/$CONTRACT_ID/non-fungibles/$TOKEN_TYPE ¥ -H "service-api-key: $SERVICE_API_KEY" ¥ -H "nonce: $NONCE" ¥ -H "timestamp: $TIMESTAMP" ¥ -H "signature: $SIGNATURE"WEBコンソールから取得しておく変数をまとめると以下になります・SERVICE_API_KEY (APIの公開鍵)・SERVICE_SECRET     (APIの秘密鍵)・CONTRACT_ID          (契約ID=LBDチャネル固有のID)・TOKEN_TYPE            (Non-fungible Item Tokenの識別番号)

以上でファイルを実行すると以下のように結果が返ってきます!

自分の作成したTokenの名前(name)と発行時に自動で割り振られたToken Typeが結果として返ってきます!

 

このように結果が返ってくれば、Non-fungible Item Token Typeの取得は終了になります!

 

Non-fungible Item Tokenの鋳造

Non-fungible Item Tokenの鋳造API
参照URLはこちら:
https://docs-blockchain.line.biz/ja/api-guide/category-item-tokens?id=v1-item-tokens-contractid-non-fungibles-tokentype-mint-post

 

APIに使うURI: https://test-api.blockchain.line.me/
HTTPリクエストメソッド: POST
URLに使うPATH: /v1/item-tokens/{contractId}/non-fungibles/{tokenType}/mint
・{contractId}, {tokenType}はWebコンソールで確認可能(上同様)

HTTP Request Body(JSON)の内容
toAddress: 鋳造されてNon-fungible Item Tokenを受け取るWalletのアドレス
name : Non-fangble Item Tokenの名前(3文字以上 20文字以下)
ownerAddress: Non-fungible Item TokenのOwner Walletのアドレス
ownerSecret: Non-fungible Item TokenのOwner Wallet Secret

以上の内容を理解してAPIをコールしていきます。

 

実際に実行するシェルコマンドは以下になります!
実体のファイルはNFT_minting.shをご参照ください。
APIとWalletの鍵情報は自身のサービスのものに置き換えください。

#!/bin/bash

SERVICE_API_KEY=c660b634-085b-4cfb-bd6b-cdc81d3d51be

SERVICE_API_SECRET=58d43946-acce-4209-b3ce-6f4df53cbe4a

CONTRACT_ID=bfe31faf TOKEN_TYPE=10000001 OWNER_WALLET_ADDRESS=tlink1uz56gp9nsn47ay0d2vanev7mhe5khjqkv6u66w OWNER_WALLET_SECRET=qF/uVb3ipjWfdG66lDwfXIPdK4aTHre723gO+bmO29E=

#Non-fungible Item Tokenの鋳造に必要な情報

TO_ADDRESS=$OWNER_WALLET_ADDRESS

NFT_NAME=YukkaCard

TIMESTAMP=`curl -s -X GET https://test-api.blockchain.line.me/v1/time -H "service-api-key: $SERVICE_API_KEY" | jq -r .responseTime`

NONCE=`echo "${TIMESTAMP:5:8}"`

MESSAGE="${NONCE}${TIMESTAMP}POST/v1/item-tokens/$CONTRACT_ID/non-fungibles/$TOKEN_TYPE/mint?name=$NFT_NAME&ownerAddress=$OWNER_WALLET_ADDRESS&ownerSecret=$OWNER_WALLET_SECRET&toAddress=$TO_ADDRESS"

SIGNATURE=`echo -n $MESSAGE | openssl sha512 -binary -hmac "$SERVICE_API_SECRET" | base64`

curl -s -X POST https://test-api.blockchain.line.me/v1/item-tokens/$CONTRACT_ID/non-fungibles/$TOKEN_TYPE/mint ¥ -H "service-api-key: $SERVICE_API_KEY" ¥ -H "nonce: $NONCE" ¥ -H "timestamp: $TIMESTAMP" ¥ -H "signature: $SIGNATURE" ¥ -H "Content-Type: application/json" ¥ -d " {

 \"ownerAddress\": \"$OWNER_WALLET_ADDRESS\", \"ownerSecret\": \"$OWNER_WALLET_SECRET\",

\"name\": \"$NFT_NAME\", \"toAddress\": \"$TO_ADDRESS\"

}

" | jq

処理を実行すると下のように結果が返ってきます!
responseData.txHashにhash値が返ってきていれば成功です。

この返ってきたtxHashはLINE Blockchain Explorerでトランザクションに関する実行結果を確認してください!

 

実際にトランザクションを検索するとこのように詳細があります。

以上でmintingが完了しました!
Non-fungible Item Tokenの鋳造ができました!これでOwner Walletから自分のBITMAX Walletに送れば自分のBITMAX Walletで確認できるようになったそうです!鋳造も資料のサンプルですごく簡単にできました!

 

まとめ

 

今回のハンズオンでは、時間の都合上Non-fnagible Item Tokenの鋳造まで行いました!
前回に引き続きLINE Blockchain のMeetupに参加してみた感想として、テックを絡めたMeetupはLINE Blockchainのイベントでは初だったと思うので、どんどんこういった企画を増やして、LINE Blockchain Developers を使って面白いサービスの立案やLINE BlockchainのMeetupでのハッカソンやアイデアソンなどのイベントができるくらいまで、LINE Blockchainの開発者コミュニティーが発展していって欲しいなと思いました!
実際に今回の手順とドキュメントを閲覧してNon-fungble Item Tokenのイメージを入れて独自デジタルトレカを作ってみましたが、BTIMAX Walletでのコレクティングの感覚は非常に新しいユーザー体験だなと思いました!

 

改善希望ポイント

 

シェルコマンドを使ってのMeetupだったので若干のつまづきがありました。調べる時間も必要だったので、もう少し時間に余裕があるとよかったです。

 

最後に

LINE Blockchainはロードマップやホワイトペーパーで記載されている通り、今後はパブリックブロックチェーンになっていく計画や、カスタムコントラクトのデプロイなどが予定されていると伺っているため、引き続き動向を追っていきたいと思います!次はどんなMeetupを企画していただけるのか非常に楽しみですね!

 

私たちの生活に根強いLINEでのブロックチェーンは非常になじみやすいと思うので、開発者の方は是非、今後のMeetupに参加して情報収集されることをお勧めします!

 

ホワイトペーパーはこちら
https://blockchain.line.me/wp-content/uploads/2020/08/LINE%20Blockchain%20Whitepaper%20v2.1_JP.pdf

 

記事を読んでいただきありがとうございました。