DataSpiderとブロックチェーン その5
TRONネットワークをローカル環境に構築する
今回は、ローカル環境にTRONネットワークを構築する手順を紹介したいと思います。
今後、ブロックチェーン上にデプロイされたスマートコントラクトの更新系のメソッドをDataSpiderから呼び出す実装を行いますが、スマートコントラクトのデプロイや動作検証を繰り返し行う場面が想定されます。その際に、TRXをそれなりに消費しますので、使い切った場合、蛇口サイトからそのつどTRXを取得する必要があり、手間がかかります。
この課題を解決するため、TRONサービスをローカル環境に構築します。
ローカル環境のTRONサービスを起動する際に、100000TRXなどTRXの発行量 (※) を指定することができますので、上限を気にすることなく、動作検証ができるようになります。
※ 挙動的には発行量UINT_MAX(約40億TRX)までは問題なさそうです。
動作環境
今回も前回から同様にWindows10を使用します。
あらかじめDocker本体をダウロードしておきます。(※Docker本体のセットアップについては割愛)
やること
TRE(TronBox Runtime Environment)のDockerイメージを入手します。
dockerイメージの起動時に各パラメータを指定し起動します。
dockerとして展開されたTRONサービス上に今後使用するスマートコントラクトをデプロイします。
デプロイされたスマートコントラクの参照系のメソッドをコールして動作確認します。
TRON networkプライベート環境の構築
構築する各サービスの概要
前回までの実装では、NILE testnetに接続して動作検証を行っていました。
前回実装したコードで、Wapperメソッドを呼び出すことにより、実は裏側でNILEのgRPCサーバーを通信を行っていました。
さらにgRPC通信サービスでは、FullNode、SolidityNodeの2種類の接続先が存在していました。
今回は、ローカル環境の閉じた世界で環境を構築するにあたり、NILE環境と同様に、gRPCサービスを立ち上げ、FullNode、SolidityNodeと通信ができるようにします。
またNodeの種類として、gRPCのほかにJSON-RPCがあります。今後利用することを想定し、それぞれ有効にします。
DockerイメージTREのダウンロード
DOSプロンプトを開き以下のコマンドを実行します。
docker pull tronbox/tre
起動時のパラメータ
5つのアカウントにそれぞれ1000000TRXを発行し、gRPCとJSON-RPCを有効にしサービスを起動します。
「Base HD Path」まで表示されれば起動の成功です。
docker run -it -p 9090:9090 -p 50051:50051 -p 50052:50052 -p 8545:8545 -p 8555:8555 --rm --name tron -e "accounts=5" -e "defaultBalance=1000000" -e "mnemonic=hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge" tronbox/tre
以下のメッセージまで表示されれば起動完了です。
:
:
Available Accounts
==================
(0) TPPDEF8x6Pe3R16dJJi7Ui8fyjg1k1yUpo (1000000 TRX)
(1) TJGD2HHUz2poYebAaCLNxNQE1ZCEJ2nfuu (1000000 TRX)
(2) TGELKbM4VkUvimdXA1qcV8ysZgKjdtxGFz (1000000 TRX)
(3) TKEFjNo2g6gUp8Uhr7bj7bmVFr2JWAAvnt (1000000 TRX)
(4) TB89TSH8zz9axFwWVDo5zydgRbByo9tJAz (1000000 TRX)
Private Keys
==================
(0) e26d5a9e94aea8e35b6b2668c298d01fe09c2490c47d242eb4cfd036188f0b51
(1) ef6adeb8a7b8c179b3c9e97a7d833246a427745740c5d28a89a6dfa01c100d5c
(2) 0ed992c6d5ca56ea42ac53b1355c4edd1fa7c4aa1d70433709b214712544e579
(3) 5e3552bff3e53de48701a2fc7e007976d0be7b393a8c25edc6c97223ee7cf43e
(4) 628cdc21ce962aa1f1026959315e4496081ddf4c4a13d2c228d0b11ab2abbed3
HD Wallet
==================
Mnemonic: hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge
Base HD Path: m/44'/195'/0'/0/{account_index}
メインネット用のウォレットに上記のMnemonicを指定していはいけません。
今後の実装では、127.0.0.1:50051および127.0.0.1:50052の2つを使用します。
ソースコードの編集にて詳細を案内します。
スマートコントラクトのブラッシュアップ
前回までは、MetaCoinを使用しました。
今回は、TRC20Tokenに準拠したスマートコントラクトをデプロイします。
スマートコントラクトのデプロイ
サンプルコードを以下のURLからcloneします。
git clone https://github.com/dataspider-fan/TRC20-Contract.git
TRC20-Contract下のtronbox-config.jsを開き以下の行を修正します。
デプロイするアカウントの秘密鍵を記載します。
tronbox-config.js
:
dev: {
// For tronbox/tre docker image
userFeePercentage: 100,
- privateKey: 'your key',
+ privateKey: 'e26d5a9e94aea8e35b6b2668c298d01fe09c2490c47d242eb4cfd036188f0b51',
userFeePercentage: 0,
feeLimit: 1000 * 1e6,
fullHost: 'http://127.0.0.1:' + port,
network_id: '1337'
},
:
ローカル環境にデプロイします。
cd TRC20-Contract
tronbox migrate --reset --network dev
以下のメッセージが出力されればデプロイの完了です。
Compiling .\contracts\libs\ITRC20.sol...
Compiling .\contracts\libs\SafeMath.sol...
Compiling .\contracts\libs\TRC20.sol...
Compiling .\contracts\libs\TRC20Detailed.sol...
Compiling .\contracts\libs\ITRC20.sol...
Compiling .\contracts\libs\SafeMath.sol...
Writing artifacts to .\build\contracts
Using network 'dev'.
Running migration: 1_initial_migration.js
Replacing Migrations...
Migrations:
(base58) TAcQGDRrDru6ZDBX7BFjEfEQ6UjwsXtabY
(hex) 410708ca82a765f1d898c69164fee6be19e552a0a3
Saving successful migration to network...
Saving artifacts...
Running migration: 2_deploy_contracts.js
Replacing ConvertLib...
ConvertLib:
(base58) TM9DsJayo9ae68PVxAfhByxREcsm5vF48P
(hex) 417a8e4431cbb32dd9497a297a67499e756d13f006
Replacing MyToken...
MyToken:
(base58) TEQw51ck1JUja28JQ4Yg8fZsYMM1eXAmLe
(hex) 4130be04d695587f9bb08583f545132550ac60aa30
Saving successful migration to network...
Saving artifacts...
ソースコードの編集
前回までのDataSipderアダプタのソースコードから以下を追加します。
修正箇所
HelloWorldAdapterOperation.java
/*
* スマートコントラクトの関数呼び出し(ローカル環境の参照系呼び出し)
*/
// Private network wrapperの生成
// ApiWrapper( gRPC FullNode, gRPC SolidityNode, private key)
ApiWrapper wrapper_local = new ApiWrapper("127.0.0.1:50051", "127.0.0.1:50052", "");
// MyTokenをデプロイしたアドレスの秘密鍵をKeyPairメソッドに渡す
KeyPair keyPair_local = new KeyPair("e26d5a9e94aea8e35b6b2668c298d01fe09c2490c47d242eb4cfd036188f0b51");
// MyTokenの残高(balanceOf)を取得するアドレスを変数に格納する
String ownerAddr_local = keyPair_local.toBase58CheckAddress();
// 上記、MyTokenのデプロイ後のスマートコントラクトアドレスを指定する
String cntrAddr_local = "TEQw51ck1JUja28JQ4Yg8fZsYMM1eXAmLe";
// balanceOf関数の呼び出し
Function balanceOf_local = new Function("balanceOf",
Arrays.asList(new Address(ownerAddr_local)), Arrays.asList(new TypeReference<Uint256>() {}));
// balanceOfの取得結果を実行ログに表示
TransactionExtention txnExt_local = wrapper_local.constantCall(ownerAddr_local, cntrAddr_local, balanceOf_local);
String result_local = Numeric.toHexString(txnExt_local.getConstantResult(0).toByteArray());
log.info("balanceOf : " + FunctionReturnDecoder.decode(result_local, balanceOf_local.getOutputParameters()).get(0).getValue());
動作確認
実行ログにbalanceOfメソッドの残高数が表示されます。
プライベートネットワーク上に構築した環境と通信できたことが確認できます。
上記ソースコードは、こちらに公開しています。
Github : dataspider-fan/qiitacode
参考にしていただければと思います。