DataSpiderSDKによる更新系スマートコントラクトアダプタの作成

スマートコントラクトアダプタの作成 その２

スマートコントラクトアダプタ作成の第2回目です。
[前回は、参照系のスマートコントラクトアダプタを作成](https://qiita.com/dataspider-fan/items/5ad6201cebf607df3ba1)しました。
今回は、更新系のスマートコントラクトアダプタの実装例を紹介します。

## なにをやるか
スマートコントラクトアダプタに更新系の処理を実装するクラスを追加します。
１つのjarに参照系と更新系のクラスを含めて実装します。

## 実装方針
更新系に必要なオブジェクトをこの親Factoryクラスに実装し、コンストラクタにフラグを渡し、参照系と更新系画面に必要なオブジェクトをそれぞれ描画するようにします。
画面描画部分もFactoryクラスとして新設することも検討しましたが、今回は同一の親クラスで条件で分岐させる形で実装を行いました。
クラスの関連図 ※ はこちらを参照ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/3777d944-6101-8a0f-dac6-1463a6613c64.png)
※ コンポーネントSDK 4.2 開発ガイドより抜粋

## クラス構成
今回は、更新系処理を実装するためPostTronOperationおよびPostTronOperationFactoryクラスを追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/dd8b90fe-3f29-4040-5d54-06025fd02f3b.png)

## 実装イメージ
### TronAdapterModuleComponent.java
TRONアダプタのメインとなるクラス
```java
public class TronAdapterModuleComponent extends AdapterModuleComponent {


	@Override
	public ResourceFactory[] getResourceFactories() throws Exception {
		return new ResourceFactory[] {
			new BlockchainTronGlobalResourceFactory()
		};
	}

	@Override
	public OperationFactory[] getOperationFactories() throws Exception {
		return new OperationFactory[] {
				new GetTronOperationFactory(0), // 参照系のFactoryクラス
				new PostTronOperationFactory(0) // 更新系のFactoryクラス
		};
	}
}
```
### PostTronOperationFactory.java
TronOperationFactoryを継承し、TronOperationFactoryコンストラクタにTRON_WRITE_FUNCフラグを渡します。
```java
:
:
public class PostTronOperationFactory extends TronOperationFactory {

	public PostTronOperationFactory(int flag) {
		super(TRON_WRITE_FUNC);
	}

	@Override
	public String getOperationName() {
		return "tron_write";
	}
:
:
```

### TronOperationFactory.java
functionFlagにフラグをセットし、後続のUIを描画するオブジェクトの表示条件に使用します。
```java
:
:
public abstract class TronOperationFactory implements OperationFactory {

	protected int functionFlag;

	public TronOperationFactory(int flag) {
		this.functionFlag = flag;
	}
:

@Override
public OperationConfigurator createOperationConfigurator(
        OperationConfiguration conf,
        OperationContext context) throws Exception {
		/*
		 * 必須設定
		 */
		// 接続先設定
		configurator.addResourceParameter(KEY_BASIC_GROUP, createGlocalResourceTronParameter());

		if (this.functionFlag == TRON_WRITE_FUNC) {
			configurator.addSimpleParameter(KEY_BASIC_GROUP, createSelectingSmartContractWritableFunctionParameter()); 		//関数名を直接入力もしくは選択選択
			configurator.addSimpleParameter(KEY_BASIC_GROUP, createSelectWritableFunctionNameParameter(conf));	//更新系選択
			configurator.setObserver(KEY_SELECTING_SMARTCONTRACT_WRITABLE_FUNCTION, new SmartContractWritableFunctionsObserver()); // 関数名を直接入力もしくは選択選択
		} else {
			configurator.addSimpleParameter(KEY_BASIC_GROUP, createSelectingSmartContractReadableFunctionParameter()); 		//関数名を直接入力もしくは選択選択
			configurator.addSimpleParameter(KEY_BASIC_GROUP, createSelectReadableFunctionNameParameter(conf));	//参照系選択
			configurator.setObserver(KEY_SELECTING_SMARTCONTRACT_READABLE_FUNCTION, new SmartContractReadableFunctionsObserver()); // 関数名を直接入力もしくは選択選択
		}
:
:
}
:
:
```

## DataSpiderスクリプト実装イメージ
スクリプトのシナリオは、名簿一覧のユーザにTRONアドレスを発行し、そのユーザをNFT登録可能なユーザとしてスマートコントラクトに登録します。登録時のトランザクションIDを実行結果としてCSVファイルに出力するというものです。
スクリプト内の「更新系呼出」が今回作成した更新系スマートコントラクトアダプタのアイコンです。
1. スクリプト全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/81fb124a-4984-9619-a6a8-1dd5a1310e5d.png)
2. 一覧マッピング（入力側）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/e6a9f0d6-e4f7-a85c-2ed8-41c347edd15c.png)
3. 実行結果マッピング（出力側）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/6685958c-6815-4ae3-10d9-2f533494f47f.png)

## プロパティ画面イメージ
画面は基本的に参照系スマートコントラクトアダプタと同じ構成です。
1. 基本設定画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/d808500c-579b-64e8-152a-c31ffa4c9f00.png)

2. 入力側パラメータ設定画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/fd63a032-5b9b-29d2-1b33-9c6c2468216f.png)

3. 出力側パラメータ設定画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/d9997005-acd2-be65-5a5d-72f015a4b9c5.png)

4. 実行時の設定画面
実行時の画面では、エネルギー量の指定欄を設けました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/9f5495e3-2161-3863-50d4-05e9fd03d4f6.png)

## 次回は
今回までTRONネットワークのスマートコントラクトアダプタとして参照用および更新用を作成しました。
次回から、[プライベートネットワークで利用されるHyperledger Fabricとの連携](https://qiita.com/dataspider-fan/items/df1406c9f527073ba750)を検証していきたいと思います。