DataSpiderから更新系コントラクトの関数を呼び出す

DataSpiderとブロックチェーン　その６

前回までで、ローカル環境にTRONネットワークに対して[参照系のスマートコントラクト関数を呼び出し動作確認](https://qiita.com/dataspider-fan/items/301dc2dd582f7e21ec3f)をしました。
今回は、ローカル環境にデプロイしたコントラクトの更新系の関数を呼び出したいと思います。

## やること
デプロイしたユーザが持っているMyTokenを、指定のアドレスに送金します。

## 更新系メソッドの処理概要
送金するメソッドを呼び出し、返却されたトランザクション情報に送金元のアドレスの秘密鍵を使用してサインします。サインすることにより、トランザクション情報をブロックチェーン上に書き込むことができます。
更新系の関数を呼び出す場合は、TRONネットワークのリソースモデル **（※）** のルールに従いTRXが必要となります。
パワーと最大手数料を指定し、トランザクションデータをブロードキャストします。

**※** TRONネットワークのリソースモデルについては別途紹介します。

## ソースコードの編集
送金する関数をコールする実装を行います。
送金前に送金先アドレスの残高を表示し、送金処理後、再度送金先アドレスの残高を表示します。
少々コードが汚いですが以下に実装内容を記します。

#### HelloWorldAdapterOperation.java
```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());

```
## 動作確認
![sendTransaction.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/a56dc8fb-354e-2236-a953-e0ddc022af5c.png)

:::note info
上記ソースコードは、こちらに公開しています。
Github : https://github.com/dataspider-fan/qiitacode
参考にしていただければと思います。
:::

## 次回は
更新系のスマートコントラクト関数の呼び出しについては以上です。
送信するトランザクションを生成後、秘密鍵にてサインした文字列をブロードキャストしてブロックチェーン上にデータを載せるイメージができましたでしょうか。前回から続き、参照系および更新系のスマートコントラクト関数の呼び出しについて紹介してきました。
[次回は、TRONネットワークのリソースモデル](https://qiita.com/dataspider-fan/items/f51a9fdf577ea6b9697f)について紹介します。ほかのchainではガス代という言い方がされるものもありますが、TRONにも同様に定義がされています。TRONネットワークを利用するにあたりTRXを所有する必要があり、場合によってはガス代として消費されます。その考え方についてこれらのリソースモデルについて紹介をしたいと思います。