Loom Plasma Chainでサイドチェーンの世界へ旅立つ Part 1 ~DAppChain環境構築~
CryptoZombies Season 2において新たに追加されたPlasma Cashのチャプターですが、最初のマルチファンジブルトークン(Multi-Fungible Token)以降さっぱりアプデがないので、Loomのチュートリアル記事を見ながらDAppChainを試してみました。Plasma Chainは ZombieChainなどで使用されています。Loom SDKを使用してDAppChainを作成、Plasma Cashでスケーラブルなトークンの移転を目指します。
CryptoZombiesの『Plasma Path』でリリースされる予定のチャプターには以下のような内容が含まれていました。
- マルチファンジブルトークン(Multi-Fungible Token)
- Truffle/Plasma Chainへのデプロイ
- Plasma CashコントラクトとTransfer gateway利用方法
Part 1では、Plasma/Plasma Cashについて、DAppChainの環境構築について書いてます。Part 2では構築したDAppChainでTransfer gatewayを用いたトークンのネットワーク間移動について記載する予定です。(ネットワーク間とはEthereumとDappChainと呼ばれるサイドチェーン間です)
マルチファンジブルトークン(Multi-Fungible Token)のお試しは別記事でやってみました。
Plasmaとは?(いまさら)
Ethereum Mainnetでのトランザクション性能は10~20TPS(Transaction Per Second)と、大量のトランザクションが必要となるアプリケーション構築は難しくなっています。CryptoKittiesなどの人気アプリケーションによって高トランザクション下でネットワーク処理が逼迫することがあり、サイドチェーンやオフチェーンなどによる処理性能の向上やトランザクションのオフロードが検討されてきました。
スケーラビリティ問題への対応としてブロックチェーン自体の仕様変更で対応するレイヤ1対応(Shardingなど)とブロックチェーン上で対策を実装するレイヤ2対応が検討されています。Plasmaはレイヤ2対応として、メインのブロックチェーンへ接続する形で別のサイドチェーンを作成し、処理を後者のサイドチェーンへ処理を移譲することでブロックチェーンの処理性能を向上させるフレームワークです。[1]
多くのPlasmaのフレームワークがありますが、Loom NetworkではPlasma Cashを実装しています。
Minimal Viable Plasma (MVP) — UTXO(Unspent Transaction Output)ベースでPlasmaの基本実装、Ethereum上にセキュアで高いトランザクション処理性能のサイドチェーン実装を目的とする
More Viable Plasma (MoreVP) — 上記MVPからトランザクション作成のための動作数を少なくしてユーザエクスペリエンス向上を目指したもの
Plasma Snapp — Plasmaの複雑性を排除、より洗練されたプロトコルを目的とする
Plasma Cash — NFT(Non-Fungible Token)を応用した実装、各デポジットにIDを付与した上でプラズマチェーンの整合性の確認にマークルツリー証明を使用する、MVPの欠点を見直したもの
Plasma Debit — Plasma Cashで対応していなかったデポジットしたトークンの分割に対応している、部分的な支払いを受け付けることができることが利点でマイクロペイメントなどのアプリケーションを想定
Plasma Bridge — 異なるレイヤ1のブロックチェーンをPlasmaチェーン上で相互動作させることができる(Atomic Swaps)、例えば、Plasmaチェーン上でEthereumとEthereum Classicを繋げて動作させることができる
Shardingなどのレイヤ1対応やその他Plasma以外のレイヤ2対応と組み合わせて実装することもPlasmaには期待されています。Plasma BridgeではPlasmaチェーンを介してEthereumとEthereum Classicという異なるブロックチェーンを相互に動作させることも可能なようです。
Loom Plasma Cash
Loom SDKを使用してDAppChainというサイドチェーンを作成することが可能で、Plasma Cashコントラクトとサイドチェーンを利用することでスケーラビリティ問題に対応することできて、ガスコストも安価となるメリットがあります。[2]
- DAppChain上では様々なコンセンサスアルゴリズムを使用可能なことからスケーラビリティ問題に対応できる(例えばコンセンサスアルゴリズムとしてDPoSを使用)
- Dapps上の資産(例えばERC20やERC721などのトークン)はEthereum上のトランザクションで整合性が保たれている
以下、LoomによるPlasma Cashの実装です。当初はERC721のみNFT(Non-Fungible Token)のみへの対応だったようですが、既にETH、ERC20へ対応済みのようです。[3]
Loom Plasma Cashの全体像を見てみます。この説明はLoom Plasma Cashの実装に対するものですが、Plasma Cashで一般的に定義されているものと登場人物は同じです。[4]
Plasma CashコントラクトはEthereum Mainnet上の通常のスマートコントラクトとして実装されます。Plasma MVPなど、他Plasmaと同様の形です。ERC721のトークンをDAppChain上で取り扱いたい場合、UserはトークンをPlasma Cashコントラクトへ送付します( Deposit
イベントを発行)。
Userはそれに対してPlasma Cashコントラクトから送信したトークンの代替となるPlasmaトークンを受け取ります。受け取ったPlasmaトークンはDAppChainの中で利用され、DAppChainのブロックが生成されるとそのマークルルートをEthereum Mainnetへ記録していきます。Ethereum側に記録され、ブロックが承認されたことで、DAppChain側のトランザクションも承認されたことと見なされます。
UserはPlasma Cashコントラクトへ Exit
をリクエストすることでトークンをDAppChainから引き揚げることができます。その際にUserは過去2回に遡ったトークンのトランザクションとその2つのトランザクションがEthereum Mainnetに取り込まれていると証明できるマークルルート証明が必要です。
Userは正しいトークン保持者からの Exit
ではないという不正行為の申告(チャレンジ)の期間を経てからトークンはEthereum Mainnetへ戻されます。以下の流れとなっています。
1.ERC721トークンをデポジットする
2.Plasma Cashトークンを代わりに受け取る
3.Plasma Cashトークンでトランザクションのやりとり
4.Exitでトークンの引き出しをリクエストする
5.不正行為の申告(チャレンジ)期間の経過後にトークンが受け取れる
括弧で記載されているLiquidity Providerは、不正行為の申告(チャレンジ)期間を待たずにトークンを戻すサービスを提供します。
DAppChainの環境構築
Plasma Cashの前提知識を得た上で、DAppChainを見ていきます。DAppChainはLoomが提供するスケーラブルなサイドチェーンでTransfer gatewayを使用し、Plasma CashコントラクトとEthereum間で資産やトークンを移転することができます。DPoS(Delegated Proof of Stake)というコンセンサスアルゴリズムを採用しています。
サーバ環境でDAppChain(サイドチェーン)の構築およびコントラクトのデプロイをするためにまずは環境構築します。ここではUbuntu使ってますがチュートリアル的には以下手順でいけるはずです(対象はDebian/Ubuntu/CentOS)。[5]
$ cat /etc/issue
Ubuntu 16.04.1 LTS \n \l$ curl https://raw.githubusercontent.com/loomnetwork/loom-sdk-documentation/master/scripts/get_loom.sh | sh && chmod +x loom
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 615 100 615 0 0 632 0 --:--:-- --:--:-- --:--:-- 632
Downloading loom executable...
2.0.0+b789
All done.
次に./loom initします。
$ ./loom init
./loom runだけでDAppChainを立ち上げられます。ベースになっているのはtendermintだと思います、細かい設定は/chaindata/config/config.tomlファイルを編集することで可能です。[6]
$ ./loom run
I[16026-02-16|15:51:42.960] Loading IAVL Store module=loom
I[16026-02-16|15:51:42.975] Using simple log event dispatcher
I[16026-02-16|15:51:43.007] Deployed contract vm=plugin location=coin:1.0.0 name=coin address=default:0xe288d6eec7150D6a22FDE33F0AA2d81E06591C4d
Init DPOS Params &dpos.DPOSInitRequest{Params:(*dpos.Params)(0xc0000c1680), Validators:[]*types.Validator{(*types.Validator)(0xc0005cf880)}, XXX_NoUnkeyedLiteral:struct {}{}, XXX_unrecognized:[]uint8(nil), XXX_sizecache:0}
I[16026-02-16|15:51:43.008] Deployed contract vm=plugin location=dpos:1.0.0 name=dpos address=default:0x01D10029c253fA02D76188b84b5846ab3D19510D
I[16026-02-16|15:51:43.021] Starting RPC HTTP server on [::]:46658 module=query-server
I[16026-02-16|15:51:43.021] Starting RPC HTTP server on 127.0.0.1:9999 module=query-server
E[16026-02-16|15:52:13.019] Couldn't connect to any seeds module=p2p
いくつかコントラクトがデプロイされます。またTCPポート46658でRPCコールが可能となります。以下のサイトから構築したDAppChainのブロック生成が確認できるようになっています。
https://blockexplorer.loomx.io/
iptablesなどOSのパケットフィルタでTCP 46658を事前に許可してください。DAppChain Explorerのサイト下部にサーバのURLとポートを指定するカラムがあるのでhttp://X.X.X.X:46658のように利用しているサーバIPとポートの設定をしましょう。[7]
確認して頂くと分かるとおり1秒に1ブロックずつ生成される爆誕状態になっています。また最初からやり直したい場合には./loom resetコマンドで生成したブロックをすべてリセットできます。
DAppChainにトランザクションを発行するために鍵を生成します。以下コマンドでカレントディレクトリにpriv_keyおよびpub_keyというファイルが作成されます。作成されたファイルはエンコードされているのですが、local addressとして画面に表示される鍵を控えておいたほうが良いです。Plasma Chainのテストネットでfaucetを受け取る際にこのアドレスが必要となります。
$ ./loom genkey -k priv_key -a pub_key
local address: 0x462A8Eb9e0b784FEdFD80BA32cCBA0e40E31f38d
local address base64: RiqOueC3hP7f2AujLMug5A4138f=
サンプルコード
LoomのGithub上にあるサンプルコードを使用して、構築したDAppChainへコントラクトをデプロイしてみます。まずはコードをクローンして、リポジトリにpriv_keyをコピー、名前をextdev_private_keyに変更してコピーいます。extdev_private_keyはテストネットへのデプロイ時に使用します。
$ git clone https://github.com/loomnetwork/truffle-dappchain-example
Cloning into 'truffle-dappchain-example'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 337 (delta 0), reused 1 (delta 0), pack-reused 333
Receiving objects: 100% (337/337), 459.39 KiB | 0 bytes/s, done.
Resolving deltas: 100% (186/186), done.
Checking connectivity... done.$ cd truffle-dappchain-example
$ cp ../priv_key extdev_private_key
コントラクトをデプロイするためにtruffle-config.jsで今回構築したローカルのネットワークを指定する必要があります。
まずはtruffle-config.jsに定義されている3つのネットワークを確認。
loom_dapp_chain
はローカル用に定義されているネットワークで、ここに構築したDAppChainを指定しますextdev_plasma_us1
はLoom Plasma Chainのテストネット用でデプロイするには別にトークンが必要となります(Karmaというトークンで本番環境は月額利用、テスト環境のKarmaは無料でfaucetからゲットできる)rinkeby
はRinkeby EthereumのテストネットでPart 2でTransfer gatewayを利用する際に使用します
構築したDAppChain上へコントラクトをデプロイするためにloom_dapp_chain
のwriteUrlおよびreadUrlの設定をサーバのIPへ変更しておきます。<YOUR IP ADDRESS>を正しいサーバIPで置き換えてください。
loom_dapp_chain: {
provider: function() {
const privateKey = readFileSync(path.join(__dirname, 'private_key'), 'utf-8')
const chainId = 'default'
const writeUrl = 'http://<YOUR IP ADDRESS>:46658/rpc'
const readUrl = 'http://<YOUR IP ADDRESS>:46658/query'
const loomTruffleProvider = new LoomTruffleProvider(chainId, writeUrl, readUrl, privateKey)
loomTruffleProvider.createExtraAccountsFromMnemonic("gravity top burden flip student usage spell purchase hundred improve check genre", 10)
return loomTruffleProvider
}
パッケージをインストール。
$ npm install
yarn deploy一発でデフォルトのloom_dapp_chainのネットワークへデプロイされるようになっています。
$ yarn deploy
以下のような出力結果がでれば成功です。package.jsonみると分かりますがいまはちょっと古いバージョンのパッケージも使っているようです。※はまりポイント、再デプロイするにはyarn deploy:resetと打つ必要あり
このサンプルではloom-truffle-providerを使用してDAppChain側とやり取りしています。[8]
React + Webpackによるフロントエンドも実装されていて、yarn serveでデプロイされたSimpleStore.solの動作を確認できます。
$ yarn serve --port 3000 --host X.X.X.X
SimpleStore.solの動作確認。Valueのカラムに値をセットできます。
ここまででDAppChainの環境構築とサンプルコードのデプロイができました。Part 2ではチュートリアルに沿いTransfer gatewayを用いてEthereum RinkebyのテストネットとPlasma Chain間でERC721トークンの移転を行ってみたいと思います。
まとめ
- スケーラビリティ問題にレイヤー2対応として様々なPlasmaフレームワークが検討および実装されている
- DAppChainと呼ばれるスケーラブルなサイドチェーンを構築できるSDKがLoomから提供されている
- loom-truffle-providerを利用して構築したDAppChainとやり取りができる
References
- [1] A Introduction to Plasma
- [2] Everything You Need to Know About Loom Network, All in One Place (Updated Regularly)
- [3] loomnetwork/plasma-cash
- [4] Plasma Cash Initial Release — Plasma-Backed NFTs Now Available on Loom Network Sidechains
- [5] Deploying Your First App to Loom PlasmaChain: Installing Loom, Setting up Your Environment, and Generating Keys
- [6] tendermint/tendermint
- [7] DAppChain Explorer
- [8] loomnetwork/loom-truffle-provider