概要
loom-js
にはLoomProvider
があり、これはWeb3.jsとの統合を可能にする。こうして、Loom DAppチェーン上のEVMとより簡単に統合でき、またTruffleフレームワークを使用してテストやデプロイメント、Solidityスマートコントラクトを扱えるようになる。
Web3
Web3.js
は、公式ドキュメンテーションで次のように説明されている:
Web3.js
はライブラリ・コレクションである。これはHTTPもしくはIPC接続を使用して、ローカル又はリモートのイーサリアムノードとの対話を可能にする。
Loom DAppチェーンではHTTP
やIPC
の代わりに、WebSockets
を用いて通信する。しかしWeb3.js
がその部分の抽象化を行うので、この通信についての深い知識は必要ではない。
LoomProvider
Provider
は、Web3.js
のAPIをイーサリアム・ノードに接続するブリッジである。Web3.js
のコールがLoom DAppチェーンとの互換性を持つようにするには、LoomProvider
を使用する必要がある。
Loom DAppチェーン上にデプロイされたスマートコントラクトと対話するための良い選択肢として、Web3.js
とLoomProvider
の組み合わせがある。なぜならWeb3.js
はAPIコールの構成を抽象化し、ABIを手動で変換する必要がないからだ。
Truffleフレームワーク
Truffle
は公式サイトでこう説明されている:
Truffleは最もポピュラーなイーサリアム開発フレームワークであり、あなたの開発ライフをもっと簡単にするというミッションを持っている。
そして実際にその通りのものとなっている。なぜならTruffle
では以下を含む多くのことが可能なのだ: compile
、deploy
、test
、debug
Truffleを使ったデプロイと実行
ダウンロードとインストール
まずはTruffle
をインストールする必要がある:
# 現在サポートされているバージョン
npm install -g truffle
Truffle
がインストールされたら、ディレクトリを作成してプロジェクトの初期化を行おう:
# ディレクトリを作成しアクセス
mkdir simple-store
cd simple-store
# Truffleを使ってゼロからプロジェクトを初期化
truffle init
新しいディレクトリ構造は次のようになる:
.
├── contracts
│ └── Migrations.sol
├── migrations
│ └── 1_initial_migration.js
├── test
├── truffle-config.js
└── truffle.js
コントラクトの追加とマイグレーション
contracts
ディレクトリ上で、コントラクトをSolidityにて作成する必要がある。これから使用する有名なSimpleStore.sol
を説明しよう。set
関数は、パラメーターvalue
と状態を変更する。さらにget
関数は、読み取り専用でコールしても状態は変更されない。NewValueSet
というイベントは、次のサンプルのようにパラメーターvalue
を持つこととなる:
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;
}
}
では次にマイグレーションを追加しよう。Truffle
にはマイグレーションの概念があるので、変更や更新のトラッキングが非常に便利となる。 このファイルはマイグレーションのディレクトリ上に作成する必要がある。さらにJavaScript
ファイルとして、2_simple_store.js
というふうに、数字の2
から始まるファイル名を持たなくてはならない。さらに、その中身は以下のようにする必要がある:
var SimpleStore = artifacts.require("./SimpleStore.sol");
module.exports = function(deployer) {
deployer.deploy(SimpleStore);
};
完全なTruffle統合のサンプルは、 https://github.com/loomnetwork/truffle-dappchain-example にて利用可能だ。
Loom Truffle Providerのダウンロードと設定
最後に追加するパーツはLoom Truffle Provider
である。このプラグインでは、Truffle
とLoom DAppチェーン間の接続が提供される(さらにその下にはLoomProvider
がある)。 ではインストールしよう:
npm install loom-truffle-provider --save
#または
yarn add loom-truffle-provider
さらに次のサンプルのように、truffle.js
のファイルを編集して必要な設定を追加しよう:
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 -a public_key -k private_key
を使用してキーを生成しよう。
Truffleデプロイコマンドの実行
これでデプロイコマンドを実行する準備ができた:
だがその前に、Loom DAppチェーンを起動しなくてはならない
truffle deploy --network loom_dapp_chain
もしすでに完了しているデプロイメントをリセットしたい場合は、メソッド
truffle deploy --reset --network loom_dapp_chain
を実行しよう
アカウントをさらに追加
LoomTruffleProvider
のアカウントにアクセスするには、getProviderEngine
関数を使用する必要がある。これはLoomProvider
を返却し、accountsAddrList
及びaccounts
プロパティへとアクセスできるようにする。
const loomTruffleProvider = new LoomTruffleProvider(chainId, writeUrl, readUrl, privateKey)
const loomProvider = loomTruffleProvider.getProviderEngine()
console.log("Accounts list", loomProvider.accountsAddrList)
console.log("Accounts and Private Keys", loomProvider.accounts)
さらにアカウントを追加するには、関数createExtraAccounts
を使用すれば良い。
const loomTruffleProvider = new LoomTruffleProvider(chainId, writeUrl, readUrl, privateKey)
loomTruffleProvider.createExtraAccounts(10)
Web3.js と LoomProviderの設定と実行
ダウンロードとインストール
npm
を使って、Web3.js
の最新バージョンをダウンロードできる。
npm install web3 --save
# 又は
yarn add web3
さらにLoomProvider
をダウンロードしてインストールしよう(loom-js
にて機能)
npm install loom-js --save
# 又は
yarn add loom-js
プロジェクトへの追加と設定
インストール後、Node.jsプロジェクト(Node.jsバージョン8以上 )にWeb3.js
を追加するのは非常に簡単だ。これはWebpack
を用いたプロジェクトの場合と同じくらい簡単なはずだ:
// Node.JS 8 または8以上
const Web3 = require('web3')
// ES2016サポートのWebpack
import Web3 from 'web3'
次のステップではLoomProvider
を設定しよう。これはNodeJS & Browser Quick Start
のサンプルにかなり似ている。
const privateKey = CryptoUtils.generatePrivateKey()
const publicKey = CryptoUtils.publicKeyFromPrivateKey(privateKey)
// クライアントを作成
const client = new Client(
'default',
'ws://127.0.0.1:46658/websocket',
'ws://127.0.0.1:46658/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
の宣言が上述されているとすると、set
関数及びget
関数をより簡単に呼び出すことができる。
// バリューを47に設定
const tx = await contract.methods.set(47).send()
// バリュー47を取得
const value = await contract.methods.get().call()
またイベントをリッスンするには、例えばイベントNewValueSet
の場合だと以下のようになる:
contract.events.NewValueSet({}, (err, event) => {
if (err) {
return console.error(err)
}
console.log('New value set', event.returnValues._value)
})