DataSpiderとブロックチェーン その6
前回までで、ローカル環境にTRONネットワークに対して参照系のスマートコントラクト関数を呼び出し動作確認をしました。
今回は、ローカル環境にデプロイしたコントラクトの更新系の関数を呼び出したいと思います。
やること
デプロイしたユーザが持っているMyTokenを、指定のアドレスに送金します。
更新系メソッドの処理概要
送金するメソッドを呼び出し、返却されたトランザクション情報に送金元のアドレスの秘密鍵を使用してサインします。サインすることにより、トランザクション情報をブロックチェーン上に書き込むことができます。
更新系の関数を呼び出す場合は、TRONネットワークのリソースモデル (※) のルールに従いTRXが必要となります。
パワーと最大手数料を指定し、トランザクションデータをブロードキャストします。
※ TRONネットワークのリソースモデルについては別途紹介します。
ソースコードの編集
送金する関数をコールする実装を行います。
送金前に送金先アドレスの残高を表示し、送金処理後、再度送金先アドレスの残高を表示します。
少々コードが汚いですが以下に実装内容を記します。
HelloWorldAdapterOperation.java
/*
* スマートコントラクトの関数呼び出し(更新系)
*/
// Function transferに渡すパラメータ
long amount = 1; // 送金額
int decimal = 2;
long limitForFee = 5000000; // TODO Calculation methods and estimation logic need to be implemented separately.
String TransactionMessage = "transferCallForLocal";
// MyTokenコントラクトアドレス
String cntrAddrModify = "TTq6PiZee7XHiMUdcY5s4UXSrdXrHnLVbw";
// MyTokenコントラクトデプロイアカウントの秘密鍵
String privateModifyKey = "e26d5a9e94aea8e35b6b2668c298d01fe09c2490c47d242eb4cfd036188f0b51";
// localのgRPCサービスに接続
ApiWrapper wrapperModify = new ApiWrapper("127.0.0.1:50051", "127.0.0.1:50052", privateModifyKey);
// 送金元アドレス TPPDEF8x6Pe3R16dJJi7Ui8fyjg1k1yUpo
KeyPair keyPairModify = new KeyPair(privateModifyKey);
String ownerAddrModify = keyPairModify.toBase58CheckAddress();
// 送金先アドレス
String destAddr = "TJGD2HHUz2poYebAaCLNxNQE1ZCEJ2nfuu";
// transferスマートコントラクトの用意
Function transfer = new Function("transfer",
Arrays.asList(new Address(destAddr),
new Uint256(BigInteger.valueOf(amount).multiply(BigInteger.valueOf(10).pow(decimal)))),
Arrays.asList(new TypeReference<Bool>() {}));
TransactionBuilder Trxbuilder = wrapperModify.triggerCall(ownerAddrModify, cntrAddrModify, transfer);
Trxbuilder.setFeeLimit(limitForFee);
Trxbuilder.setMemo(TransactionMessage);
/*
* 送金先アドレスの残高(送金送金前)
*/
// getBalance関数の呼び出し
balanceOf_local = new Function("balanceOf",
Arrays.asList(new Address(destAddr)), Arrays.asList(new TypeReference<Uint256>() {}));
// getBalanceの取得結果を実行ログに表示
txnExt_local = wrapper_local.constantCall(destAddr, cntrAddrModify, balanceOf_local);
result_local = Numeric.toHexString(txnExt_local.getConstantResult(0).toByteArray());
log.info("送信先 送金前 残高 : " + FunctionReturnDecoder.decode(result_local, balanceOf_local.getOutputParameters()).get(0).getValue());
/*
* 送金実行
*/
log.info("送金実行");
// 更新系スマートコントラクトのブロードキャスト
Transaction toSendTxn = wrapperModify.signTransaction(Trxbuilder.build());
String toSendResult = wrapperModify.broadcastTransaction(toSendTxn);
log.info("transactionHash : " + toSendResult);
/*
* 送金先アドレスの残高(送金後)
*/
// getBalance関数の呼び出し
balanceOf_local = new Function("balanceOf",
Arrays.asList(new Address(destAddr)),
Arrays.asList(new TypeReference<Uint256>() {}));
// getBalanceの取得結果を実行ログに表示
txnExt_local = wrapper_local.constantCall(destAddr, cntrAddrModify, balanceOf_local);
result_local = Numeric.toHexString(txnExt_local.getConstantResult(0).toByteArray());
log.info("送信先 送金後 残高 : " + FunctionReturnDecoder.decode(result_local, balanceOf_local.getOutputParameters()).get(0).getValue());
動作確認
上記ソースコードは、こちらに公開しています。
Github : https://github.com/dataspider-fan/qiitacode
参考にしていただければと思います。
次回は
更新系のスマートコントラクト関数の呼び出しについては以上です。
送信するトランザクションを生成後、秘密鍵にてサインした文字列をブロードキャストしてブロックチェーン上にデータを載せるイメージができましたでしょうか。前回から続き、参照系および更新系のスマートコントラクト関数の呼び出しについて紹介してきました。
次回は、TRONネットワークのリソースモデルについて紹介します。ほかのchainではガス代という言い方がされるものもありますが、TRONにも同様に定義がされています。TRONネットワークを利用するにあたりTRXを所有する必要があり、場合によってはガス代として消費されます。その考え方についてこれらのリソースモデルについて紹介をしたいと思います。