2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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://qiita.com/kai_kou/items/e02e34dd9abb26219a7e

検証で利用したコード

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

Amazon Managed BlockchainでHyperledger Fabricのブロックチェーンネットワークを構築してみた - Qiita
https://qiita.com/kai_kou/items/e02e34dd9abb26219a7e

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://qiita.com/kai_kou/items/e02e34dd9abb26219a7e

Amazon Managed BlockchainでHyperledger Fabricのブロックチェーンネットワークを構築してみた - Qiita
https://qiita.com/kai_kou/items/e02e34dd9abb26219a7e

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?