ブロックチェーンの課題と可能性~BBc-1(Beyond Blockchain One)から学ぶブロックチェーン開発
第12回 BBc-1プログラミングガイド ~トランザクション取得
前回は,
なお,
また,
トランザクションの取得
coreノードに登録されているトランザクションを取得するための関数が,
- 単一トランザクションの取得
- 関数名:search_
transaction - 引数:トランザクション識別子
トランザクション識別子に対応するトランザクションデータを取得します。取得したデータはバイナリデータなので,
deserialize関数を用いてBBcTransactionオブジェクトに変換して利用します。また, アセットとしてファイルを同時に登録していた場合はそのファイルコンテンツも取得します。 - 関数名:search_
- 複数条件指定によるトランザクションの取得
- 関数名:search_
transaction_ with_ condition - 引数:アセットグループ識別子,
ユーザ識別子, アセット識別子, 検索方向, 上限取得数
トランザクション内のBBcEventやBBcRelationおよびBBcAssetオブジェクトに含まれているアセットグループ識別子,
ユーザ識別子, アセット識別子を条件として, 合致するトランザクション群を取得します。アセットグループ識別子, ユーザ識別子, アセット識別子はいずれか1つ以上指定されていればよく, 複数指定した場合はAND条件として検索されます。検索方向を0 (デフォルト値) に指定すると新しく登録されたものから順番に検索し, 1に指定すると1番古く登録されたものから順番に検索します。また, アセットとしてファイルを同時に登録していた場合はそのファイルコンテンツ群も取得します。 - 関数名:search_
- トランザクションツリーの取得
- 関数名:traverse_
transactions - 引数:トランザクション識別子,
アセットグループ識別子, ユーザ識別子, 検索方向, 取得上限階層数
トランザクション内のBBcReferenceやBBcPointerオブジェクトによって他のトランザクションとの関係性がある場合に,
起点となるトランザクションから指定された階層数まで関連するすべてのトランザクション群を取得します。アセットグループ識別子, ユーザ識別子が指定された場合は, その条件に合致するもののみを検索対象とします。検索方向を1 (デフォルト値) に指定すると起点となるトランザクションから古い方向に検索し, 0に指定すると起点から新しい方向に検索します。得られる結果は, 階層ごとにトランザクションデータがリストになっています。traverse_ transactionsで得られる検索結果のイメージを図1と図2に示します。四角はトランザクションを示し, A〜Pはそれぞれトランザクション識別子を表しており, 図中の矢印はBBcReferenceやBBcPointerオブジェクトで過去のトランザクションを参照していることを示しています。なお, 他の関数同様, アセットとしてファイルを同時に登録していた場合はそのファイルコンテンツ群も取得します。 - 関数名:traverse_
実際には検索結果はそれぞれバイナリデータになっていますので,
ここで紹介した検索関数の他に,
トランザクション取得関数の具体例
file_
file_
bbc_app_client.search_transaction(ref_txid)
response_data = bbc_app_client.callback.synchronize()
if response_data[KeyType.status] < ESUCCESS:
print("ERROR: ", response_data[KeyType.reason].decode())
sys.exit(0)
prev_tx, fmt_type = bbclib.deserialize(response_data[KeyType.transaction_data])
search_
file_
bbc_app_client = setup_bbc_client()
ret = bbc_app_client.search_transaction_with_condition(asset_group_id=asset_group_id, asset_id=fileinfo["asset_id"])
assert ret
response_data = bbc_app_client.callback.synchronize()
if response_data[KeyType.status] < ESUCCESS:
print("ERROR: ", response_data[KeyType.reason].decode())
sys.exit(0)
get_transaction, fmt_type = bbclib.deserialize(response_data[KeyType.transactions][0])
if KeyType.all_asset_files in response_data:
asset_file_dict = response_data[KeyType.all_asset_files]
asset_id = get_transaction.relations[0].asset.asset_id
data = asset_file_dict[asset_id]
else:
data = get_transaction.relations[0].asset.asset_body
search_
応答メッセージresponse_
まとめ
今回は,
次回はトランザクションの検証方法について,