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