最近(2018年6月13日) Loom SDKベータ版がパブリック公開されました。LOOMトークンを持っている身としては試してみないといけないなということで早速動かして見ました!その備忘録になります。
Loom SDKのパブリックベータ版をリリースしました🍾🎉
ついにこの発表ができることをすごく嬉しく思っています!!
ぜひ公式発表記事をチェックしてみてくださいね😉SDKロードマップとトークン使用についての更新もあります!(記事はすぐに日本語化しますが取り急ぎ…)https://t.co/o6jPig2bOp
— Loom Network JP (@LoomNetworkJP)
ちなみにLoom SDKを開発しているLoom Networkは以前DAppsの学習で利用しましたCryptoZombiesと同じ開発チームになります。
Contents
Loom SDKとは
ブロックチェーンプラットフォームのLoom Network上でDAppsを構築するための開発キットになります。
またLoom Networkとは、大規模なオンラインゲームやソーシャルアプリ向けのブロックチェーンプラットフォームになります。
4月にはアルファ版が一部の開発者で利用できるようになったばかりですが、今回は全開発者へ公開され誰でも利用できるようになりました。
動作環境
動作させた環境は以下になります。
- Mac OS High Sierra v10.13.5
- node v10.0.0
- yarn v1.6.0
- truffle v4.1.7
- solidity v0.4.22
セットアップ
基本的にはドキュメントを参考にしながら進めていきます。
必要なツールをインストール
1 2 3 |
$ brew install wget $ brew install go $ brew install protobuf |
Loom SDKをインストール
1 2 3 |
$ wget https://private.delegatecall.com/loom/osx/build-196/loom $ chmod +x loom $ cp loom /usr/local/bin/loom |
Dappチェーンを起動
1 2 3 4 5 6 7 8 9 10 |
$ mkdir dapp-chain $ cd dapp-chain $ loom spin weave-blueprint $ cd blueprint $ make deps $ make $ cd build $ loom init $ cp ../genesis.example.json genesis.json $ loom run |
Truffleデプロイコマンドを実行する
Truffleをインストール
1 |
$ npm install -g truffle |
プロジェクトを初期化
1 2 3 4 |
$ mkdir simple-store $ cd simple-store $ truffle init |
コントラクトを追加
contractsフォルダ配下にSimpleStore.solファイルを作成してコントラクトを作成する。 setメソッドでパラメータを保管して、getメソッドで取り出すというシンプルな内容になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
pragma solidity ^0.4.22; contract SimpleStore { uint value; event NewValueSet(uint _value); function set(uint _value) public { value = _value; emit NewValueSet(value); } function get() public view returns (uint) { return value; } } |
マイグレーションの追加
migrationsフォルダ配下に2_simple_store.jsファイルを追加してください。内容は以下の通りです。
1 2 3 4 5 |
var SimpleStore = artifacts.require("./SimpleStore.sol"); module.exports = function(deployer) { deployer.deploy(SimpleStore); }; |
Loom Truffle Providerのダウンロードと設定
loom-truffle-providerをインストール。このライブラリではTruffleとLoom DAppチェーン間の接続が提供されます。
1 |
$ yarn add loom-truffle-provider |
次にtruffle.jsファイルを編集して必要な設定を追加していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
const { readFileSync } = require('fs') const LoomTruffleProvider = require('loom-truffle-provider') const chainId = 'default' const writeUrl = 'http://127.0.0.1:46658/rpc' const readUrl = 'http://127.0.0.1:46658/query' const privateKey = readFileSync('./private_key', 'utf-8') const loomTruffleProvider = new LoomTruffleProvider(chainId, writeUrl, readUrl, privateKey) module.exports = { networks: { loom_dapp_chain: { provider: loomTruffleProvider, network_id: '*' } } } |
loom genkeyを使用してキーを生成
1 |
$ loom genkey -a public_key -k private_key |
Truffleデプロイコマンドの実行!
※デプロイ時は必ずDappチェーンを起動させた状態で実行してください。
1 |
$ truffle deploy --network loom_dapp_chain --reset |
下記のようなログが出ればOK。コントラクトアドレスは後ほど利用します。
Web3.jsとLoomProviderの設定と実行
続いてデプロイしたスマートコントラクトを利用するフロント側の実装を進めます。
必要なライブラリのインストール
1 2 |
$ yarn add web3 $ yarn add loom-js |
プロジェクト直下にsrcフォルダを作成し、中にindex.jsファイルを作成して下記の記述を追加
1 |
import Web3 from 'web3' |
LoomProviderを設定。index.jsに追記していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
const privateKey = CryptoUtils.generatePrivateKey() const publicKey = CryptoUtils.publicKeyFromPrivateKey(privateKey) // クライアントを作成 const client = new Client( 'default', 'ws://127.0.0.1:46657/websocket', 'ws://127.0.0.1:9999/queryws', ) // 関数呼び出し元のアドレス const from = LocalAddress.fromPublicKey(publicKey).toString() // LoomProviderを使って、web3クライアントをインスタンス化 const web3 = new Web3(new LoomProvider(client, privateKey)) const ABI = [{"anonymous":false,"inputs":[{"indexed":false,"name":"_value","type":"uint256"}],"name":"NewValueSet","type":"event"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}] const contractAddress = '0x…’ // Instantiate the contract and let it ready to be used const contract = new web3.eth.Contract(ABI, contractAddress, {from}) |
Web3コントラクトインスタンスの実行
SimpleStore.solのメソッドを実行するコードになります。
1 2 3 4 5 |
// バリューを47に設定 const tx = await contract.methods.set(47).send() // バリュー47を取得 const value = await contract.methods.get().call() |
イベントをリッスンさせたい場合は以下のように書きます。
1 2 3 4 5 6 7 |
contract.events.NewValueSet({}, (err, event) => { if (err) { return console.error(err) } console.log('New value set', event.returnValues._value) }) |
最終的なindex.jsのコードは以下の通りです。数値をセットした後に取り出してログとして出力しているだけになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
import Web3 from 'web3' import { Client, LocalAddress, CryptoUtils, LoomProvider } from 'loom-js' import LoomTruffleProvider from 'loom-truffle-provider' const privateKey = CryptoUtils.generatePrivateKey() const publicKey = CryptoUtils.publicKeyFromPrivateKey(privateKey) // クライアントを作成 const client = new Client( 'default', 'ws://127.0.0.1:46657/websocket', 'ws://127.0.0.1:9999/queryws', ) // 関数呼び出し元のアドレス const from = LocalAddress.fromPublicKey(publicKey).toString() // LoomProviderを使って、web3クライアントをインスタンス化 const web3 = new Web3(new LoomProvider(client, privateKey)) const ABI = [{"anonymous":false,"inputs":[{"indexed":false,"name":"_value","type":"uint256"}],"name":"NewValueSet","type":"event"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}] const contractAddress = '0xf8ea34a6c6d45007b3b82608b1ee8c5106ff1085' // ここはデプロイ時に発行されるコントラクトアドレスを置き換えてください // Instantiate the contract and let it ready to be used const contract = new web3.eth.Contract(ABI, contractAddress, {from}) async function setValue(number) { const tx = await contract.methods.set(number).send() const value = await contract.methods.get().call() return value } setValue(99999).then((value) => { console.log(value) }) contract.events.NewValueSet({}, (err, event) => { if (err) { return console.error(err) } console.log('New value set', event.returnValues._value) }) |
コードのポイントは以上です。デプロイ時のコントラクトアドレスを置き換えることにご注意ください。あとは実行するだけです。
今回書いたコードはこちらに置いています。
上記からコードを落としてセッティングした場合は、一連の手順の最後に下記のコマンドを実行して起動できます。
1 |
$ yarn start |
動作確認
ブラウザ(http://localhost:8080/)にアクセスしてコンソールへの出力が確認できればOK!
まとめ
今回はTruffleと連携させてLoom DAppチェーン上にデプロイしてスマートコントラクトを利用しました。
コード自体はそんなに難しいことはしておらず簡単にスマートコントラクトを実行できたかと思います。
SDKにはUnityベースの横スクロールアドベンチャーゲームやブラウザベースのゲームサンプルがあるのでそのあたりも気になっています。
またLoom Networkは送金速度を上げるPlasmaを初期実装していますし今後の動向に注目です。
ETH速報:イーサリアムDapps毎に送金トランザクション(TX)より最適化された独自のサイドチェーンを提供するLoom NetworkはPlasma Cashを初期実装。サイドチェーン上でノンファンジブルなERC-721トークンをコストなく1秒以内のTXが実行可能#イーサリアム #Ethereum #仮想通貨 #LoomNetwork #Plasma https://t.co/CEK3Ckc7jp
— 墨汁(Not giving away ETH)うまい (@bokujyuumai)
参考
近いうちにCryptoZombiesでも「Loom SDKエディション」の学習コースができるとか。良い学習サイトなのでLoom SDKを使い始めるエンジニアが増えそう!LOOMトークン買い増ししたい・・。