BBc-1では、文字列、バイナリデータおよびファイルをアセットと見なすことができます。file_proof.pyでは、”Owner is 〇〇”という文字列および対象となるファイルをアセットとしました(file_proof.pyの298行目など)。つまり、人間が読める形式で所有者名を表記したものとファイル本体の組を「資産」見なしているのです。アセットの考え方、記述の仕方はアプリケーションで自由に決められます。例えば、json文字列でアセットを表記すれば、トークンのような量も簡単に表現できますし、センサーデータのようなバイナリ情報そのものをアセットにすることも可能です。
user_infoは、アセット本体の文字列情報で、”Owner is 〇〇”という文字列を設定します。
そしてBBcAssetオブジェクトの生成とBBcRelationオブジェクトへの格納をbbclib.add_relation_asset関数というユーティリティ関数で実施します。第1引数は対象となるBBcTransactionオブジェクトを、第2引数はrelationリストの何番目の要素か(relation_idx=0:0が1番目を表します)を指定します。asset_group_idはBBcRelationオブジェクトにセットされる情報で、格納するアセットがどんな種類のアセットであるかを識別するための情報です(32バイトのバイナリ列です)。そして、user_id以降がBBcAssetオブジェクトに格納される情報で、user_idが所有者の識別子、asset_bodyがアセット本体(ここでは、”Owner is 〇〇”という文字列)、asset_fileが外部ファイルとして分離管理するファイルコンテンツ(ファイルの中身)です。なお、BBcAssetオブジェクトにasset_fileをセットすると、自動的にasset_file_sizeの値をセットし、またSHA256ダイジェストを計算してそのダイジェスト値をasset_file_digestにセットしてくれます。外部ファイルが不要な場合は、asset_file=という部分を省略します。同じくasset_bodyが不要な場合もasset_body=という部分を省略します。
def pick_valid_transaction_info(received_data=None, bbc_app_client=None):
transaction, fmt_type = bbclib.deserialize(received_data[KeyType.transaction_data])
asset_files = received_data[KeyType.all_asset_files]
asset_id = transaction.relations[0].asset.asset_id
if asset_id not in asset_files:
print("**** No valid file is received...")
print(received_data)
bbc_app_client.sendback_denial_of_sign(received_data[KeyType.source_user_id],
transaction.transaction_id,
"No valid file is received.")
sys.exit(1)
file_to_obtain = asset_files[asset_id]
file_digest = hashlib.sha256(file_to_obtain).digest()
print("--------------------------")
print("File digest written in the transaction data: ",
binascii.b2a_hex(transaction.relations[0].asset.asset_file_digest).decode())
print("File digest calculated from the received file:", binascii.b2a_hex(file_digest).decode())
print("--------------------------")