Amazon Managed BlockchainでHyperledger Fabricのブロックチェーンネットワークを構築して、チェーンコードの実装をしていて気になったのでメモ。

検証環境

ローカル

下記を参考に構築したfabric-sampleのbasic-network。
Hyperledger FabricのバージョンはAmazon Managed Blockchainに合わせるため、下記コマンドでv1.2.1を利用しました。

> curl -sSL http://bit.ly/2ysbOFE | bash -s 1.2.1 1.2.1 0.4.10

Hyperledger Fabricを動かしてみよう (v1.4/v1.3/v1.2.1対応版) – Qiita
https://qiita.com/miki110/items/7f4ef59b43c63aa7b754

Amazon Managed Blockchain

下記を参考に構築したネットワークタイプが「starter」のネットワーク。

Amazon Managed BlockchainでHyperledger Fabricのブロックチェーンネットワークを構築してみた – Qiita
https://cloudpack.media/46963

検証で利用したコード

TypeScriptで実装。実装方法は下記を参考ください。

Amazon Managed BlockchainでHyperledger Fabricのブロックチェーンネットワークを構築してみた – Qiita
https://cloudpack.media/46963

import {
  Shim,
  ChaincodeInterface,
  ChaincodeStub,
  ChaincodeResponse,
} from 'fabric-shim';

class Chaincode implements ChaincodeInterface {

  async Init(stub: ChaincodeStub): Promise<ChaincodeResponse> {
    return Shim.success();
  }

  async Invoke(stub: ChaincodeStub): Promise<ChaincodeResponse> {
    let ret = stub.getFunctionAndParameters();
    const {fcn, params} =  stub.getFunctionAndParameters();
    const method = (this as any)[fcn];
    if (!method) {
      throw new Error('Received unknown function ' + ret.fcn + ' invocation');
    }

    try {
      let payload = await method(stub, params);
      return Shim.success(payload);
    } catch (err) {
      return Shim.error(err);
    }
  }

  async queryHoge(stub: ChaincodeStub, args: string[]): Promise<Buffer> {
    if (args.length != 1) {
      throw new Error('Incorrect number of arguments');
    }

    let key = args[0];
    let valueAsBytes = await stub.getState(key);
    if (!valueAsBytes || valueAsBytes.toString().length <= 0) {
      throw new Error(key + ' does not exist: ');
    }

    return valueAsBytes;
  }

  async saveHoge(stub: ChaincodeStub, args: string[]): Promise<void> {
    if (args.length != 1) {
      throw new Error('Incorrect number of arguments');
    }

    let hoge = JSON.parse(args[0]);
    await stub.putState(hoge.key, Buffer.from(JSON.stringify(hoge)));
  }

  async deleteHoge(stub: ChaincodeStub, args: string[]): Promise<void> {
    if (args.length != 1) {
      throw new Error('Incorrect number of arguments.');
    }

    let key = args[0];
    await stub.deleteState(key);
  }
};

Shim.start(new Chaincode());

動作確認

動作確認するとローカルのネットワークだとdeleteHogeで呼び出しているstub.deleteState(key);でステートDBの指定したキーの情報が削除されました。
Amazon Managed Blockchainのネットワークだと、stub.deleteState(key);を呼び出すと正常終了するものの、ステートDBの指定したキーの情報が削除されずそのままとなります。

Amazon Managed BlockchainのネットワークでPeerノードのストレージ容量が枯渇する問題を抱えてたりするので、なにかしら環境に問題があると信じたいところです。。。

新しい情報が得られたら追記予定です。

参考

Hyperledger Fabricを動かしてみよう (v1.4/v1.3/v1.2.1対応版) – Qiita
https://qiita.com/miki110/items/7f4ef59b43c63aa7b754 

Amazon Managed BlockchainでHyperledger Fabricのブロックチェーンネットワークを構築してみた – Qiita
https://cloudpack.media/46963

元記事はこちら

Amazon Managed Blockchainで構築したブロックチェーンネットワークで'deleteState'が機能してない?