def create_transaction_object_and_send_sign_req(idx, receiver_user_id, ref_txids=None, file_data=None): if ref_txids is None or ref_txids[0] is None: ref_txids = [] txobj = bbclib.make_transaction(relation_num=1, witness=True) bbclib.add_relation_asset(txobj, relation_idx=0, asset_group_id=asset_group_id, user_id=receiver_user_id, asset_body="transferred", asset_file=file_data) txobj.witness.add_witness(user_ids[idx]) txobj.witness.add_witness(receiver_user_id) for i, ref_txid in enumerate(ref_txids): clients[idx].search_transaction(ref_txid) response_data = clients[idx].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]) bbclib.add_relation_pointer(txobj, 0, ref_transaction_id=prev_tx.digest()) sig_mine = txobj.sign(private_key=keypairs[idx].private_key, public_key=keypairs[idx].public_key) txobj.witness.add_signature_object(user_id=user_ids[idx], signature=sig_mine) asset_id = txobj.relations[0].asset.asset_id asset_files = {asset_id: file_data} ret = clients[idx].gather_signatures(txobj, destinations=[receiver_user_id], asset_files=asset_files) assert ret return txobj
def test_06_transaction_with_relation_and_witness(self): print("\n-----", sys._getframe().f_code.co_name, "-----") transaction1 = bbclib.make_transaction(relation_num=1, witness=True) bbclib.add_relation_asset(transaction1, relation_idx=0, asset_group_id=asset_group_id, user_id=user_id, asset_body=b'ccccc') bbclib.add_relation_pointer(transaction1, 0, ref_transaction_id=transaction2.digest()) transaction1.witness.add_witness(user_id) transaction1.witness.add_witness(user_id2) sig = transaction1.sign(private_key=keypair2.private_key, public_key=keypair2.public_key) if sig is None: print(bbclib.error_text) assert sig transaction1.witness.add_signature(user_id=user_id2, signature=sig) sig = transaction1.sign(private_key=keypair1.private_key, public_key=keypair1.public_key) if sig is None: print(bbclib.error_text) assert sig transaction1.witness.add_signature(user_id=user_id, signature=sig) print(transaction1)
def store_proc(asset_body, asset_file, asset_group_id, domain_id, key_pair, user_id, txid=None): bbc_app_client = setup_bbc_client(domain_id, user_id) store_transaction = bbclib.make_transaction(relation_num=1, witness=True) bbclib.add_relation_asset(store_transaction, relation_idx=0, asset_group_id=asset_group_id, user_id=user_id, asset_body=asset_body, asset_file=asset_file) store_transaction.witness.add_witness(user_id) if txid: bbc_app_client.search_transaction(txid) response_data = bbc_app_client.callback.synchronize() if response_data[KeyType.status] < ESUCCESS: return None, None, "ERROR: %s" % response_data[ KeyType.reason].decode() prev_tx, fmt_type = bbclib.deserialize( response_data[KeyType.transaction_data]) keypair = bbclib.KeyPair(privkey=key_pair.private_key, pubkey=key_pair.public_key) if not keypair.verify(prev_tx.transaction_id, prev_tx.signatures[0].signature): return None, None, "ERROR: Signature or keypair is invalid." bbclib.add_relation_pointer(transaction=store_transaction, relation_idx=0, ref_transaction_id=prev_tx.transaction_id) sig = store_transaction.sign(private_key=key_pair.private_key, public_key=key_pair.public_key) store_transaction.get_sig_index(user_id) store_transaction.add_signature_object(user_id=user_id, signature=sig) store_transaction.digest() print(store_transaction) ret = bbc_app_client.insert_transaction(store_transaction) assert ret response_data = bbc_app_client.callback.synchronize() if response_data[KeyType.status] < ESUCCESS: return None, None, "ERROR: %s" % response_data[KeyType.reason].decode() transaction_id = response_data[KeyType.transaction_id] asset_ids = store_transaction.relations[0].asset.asset_id return asset_ids, transaction_id, None
def test_20_make_transaction(self): print("\n-----", sys._getframe().f_code.co_name, "-----") user = clients[0]['user_id'] kp = clients[0]['keypair'] global start_from, transactions1 transactions1[0] = bbclib.make_transaction(relation_num=1, witness=True) bbclib.add_relation_asset(transactions1[0], relation_idx=0, asset_group_id=asset_group_id, user_id=user, asset_body=b'transaction1_0') transactions1[0].witness.add_witness(user) sig = transactions1[0].sign(keypair=kp) transactions1[0].witness.add_signature(user, sig) start_from = transactions1[0].timestamp print("timestamp: %d" % transactions1[0].timestamp) for i in range(1, 20): time.sleep(0.5) k = i - 1 transactions1[i] = bbclib.make_transaction(relation_num=1, witness=True) bbclib.add_relation_asset(transactions1[i], 0, asset_group_id=asset_group_id, user_id=user, asset_body=b'transaction1_%d' % i) bbclib.add_relation_pointer( transactions1[i], 0, ref_transaction_id=transactions1[k].transaction_id, ref_asset_id=transactions1[k].relations[0].asset.asset_id) transactions1[i].witness.add_witness(user) sig = transactions1[i].sign(keypair=kp) transactions1[i].witness.add_signature(user, sig) print("timestamp: %d" % transactions1[i].timestamp) clients[0]['app'].insert_transaction(transactions1[i]) dat = clients[0]['app'].callback.synchronize() assert KeyType.transaction_id in dat assert dat[ KeyType.transaction_id] == transactions1[i].transaction_id
def store_proc(file, txid=None): with open(file, "rb") as fin: data = fin.read() bbc_app_client = setup_bbc_client() store_transaction = bbclib.make_transaction(relation_num=1, witness=True) user_info = "Owner is %s" % user_name bbclib.add_relation_asset(store_transaction, relation_idx=0, asset_group_id=asset_group_id, user_id=user_id, asset_body=user_info, asset_file=data) store_transaction.witness.add_witness(user_id) if txid: bbc_app_client.search_transaction(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]) bbclib.add_relation_pointer(transaction=store_transaction, relation_idx=0, ref_transaction_id=prev_tx.transaction_id) sig = store_transaction.sign(private_key=key_pair.private_key, public_key=key_pair.public_key) store_transaction.get_sig_index(user_id) store_transaction.add_signature_object(user_id=user_id, signature=sig) store_transaction.digest() print(store_transaction) ret = bbc_app_client.insert_transaction(store_transaction) 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) store_id_mappings(os.path.basename(file), asset_group_id, transaction_id=response_data[KeyType.transaction_id], asset_ids=store_transaction.relations[0].asset.asset_id)
def generate_transaction(user_id, previous_txid): """ Generate a transaction object :param user_id: :param previous_txid: :return: """ if previous_txid is not None: print(previous_txid.hex()) # create a frame of transaction txobj = bbclib.make_transaction(relation_num=1, witness=True) # build asset body, which is the main data body you want to register in the bbc_core asset_body_dict = { "item_a": 1000, "item_b": "xxxx", "item_c": binascii.a2b_hex("0123456789") } asset_body_data = msgpack.dumps( asset_body_dict ) # in this example, messagepack is used to transform the body data into binary format # create relation object (BBcRelation) with asset and put the object into the transaction bbclib.add_relation_asset(txobj, relation_idx=0, asset_group_id=asset_group_id, user_id=user_id, asset_body=asset_body_data) # if previous_txid is not None, set BBcPointer to the relation object if previous_txid is not None: bbclib.add_relation_pointer(txobj, 0, ref_transaction_id=previous_txid) # add witness to include signature of the user txobj.witness.add_witness(user_id) # sign to the transaction keypair = read_keypair_file() signature_obj = txobj.sign(private_key=keypair.private_key, public_key=keypair.public_key) txobj.witness.add_signature(user_id=user_id, signature=signature_obj) txobj.digest() return txobj
def test_02_make_transaction(self): print("\n-----", sys._getframe().f_code.co_name, "-----") user = clients[0]['user_id'] kp = clients[0]['keypair'] transactions1[0] = bbclib.make_transaction(relation_num=1, witness=True, format_type=fmt) bbclib.add_relation_asset(transactions1[0], relation_idx=0, asset_group_id=asset_group_id, user_id=user, asset_body=b'transaction1_0') transactions1[0].witness.add_witness(user) sig = transactions1[0].sign(keypair=kp) transactions1[0].witness.add_signature(user, sig) transactions2[0] = bbclib.make_transaction(event_num=1, witness=True, format_type=fmt) transactions2[0].events[0].add(mandatory_approver=user) bbclib.add_event_asset(transactions2[0], event_idx=0, asset_group_id=asset_group_id, user_id=user, asset_body=b'transaction2_0') transactions2[0].witness.add_witness(user) sig = transactions2[0].sign(keypair=kp) transactions2[0].witness.add_signature(user_id=user, signature=sig) for i in range(1, 20): k = i - 1 transactions1[i] = bbclib.make_transaction(relation_num=1, witness=True, format_type=fmt) bbclib.add_relation_asset(transactions1[i], 0, asset_group_id=asset_group_id, user_id=user, asset_body=b'transaction1_%d' % i) bbclib.add_relation_pointer(transactions1[i], 0, ref_transaction_id=transactions1[k].transaction_id, ref_asset_id=transactions1[k].relations[0].asset.asset_id) transactions1[i].witness.add_witness(user) sig = transactions1[i].sign(keypair=kp) transactions1[i].witness.add_signature(user, sig) transactions2[i] = bbclib.make_transaction(event_num=1, witness=True, format_type=fmt) transactions2[i].events[0].add(mandatory_approver=user) bbclib.add_event_asset(transactions2[i], event_idx=0, asset_group_id=asset_group_id, user_id=user, asset_body=b'transaction2_%d' % i) transactions2[i].witness.add_witness(user) bbclib.add_reference_to_transaction(transactions2[i], asset_group_id, transactions2[k], 0) sig = transactions2[i].sign(keypair=kp) transactions2[i].witness.add_signature(user_id=user, signature=sig) if i == 9: bbclib.add_reference_to_transaction(transactions2[i], asset_group_id, transactions2[5], 0) sig = transactions2[i].sign(keypair=kp) transactions2[i].references[0].add_signature(user_id=user, signature=sig)
def create_transaction_object_for_filedata(receiver_name, receiver_user_id, ref_txids=None, file_data=None, bbc_app_client=None): if ref_txids is None or ref_txids[0] is None: ref_txids = [] transaction = bbclib.make_transaction(relation_num=1, witness=True) user_info_msg = "Ownership is transfered from %s to %s" % (user_name, receiver_name) bbclib.add_relation_asset(transaction, relation_idx=0, asset_group_id=asset_group_id, user_id=receiver_user_id, asset_body=user_info_msg, asset_file=file_data) transaction.witness.add_witness(user_id) transaction.witness.add_witness(receiver_user_id) for i, ref_txid in enumerate(ref_txids): 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 = bbclib.BBcTransaction(deserialize=response_data[KeyType.transaction_data]) bbclib.add_relation_pointer(transaction, 0, ref_transaction_id=prev_tx.digest()) asset_id = transaction.relations[0].asset.asset_id asset_files = {asset_id: file_data} ret = bbc_app_client.gather_signatures(transaction, destinations=[receiver_user_id], asset_files=asset_files) if not ret: print("Failed to send sign request") sys.exit(0) response_data = bbc_app_client.callback.synchronize() if response_data[KeyType.status] < ESUCCESS: print("Rejected because ", response_data[KeyType.reason].decode(), "") sys.exit(0) result = response_data[KeyType.result] transaction.witness.add_signature(user_id=result[1], signature=result[2]) sig_mine = transaction.sign(key_type=bbclib.KeyType.ECDSA_SECP256k1, private_key=key_pair.private_key, public_key=key_pair.public_key) transaction.witness.add_signature(user_id=user_id, signature=sig_mine) transaction.digest() return transaction
def send_signreq(receiver_name, receiver_user_id, ref_txids=None, file_data=None, bbc_app_client=None): transaction = bbclib.make_transaction(relation_num=1, witness=True) user_info_msg = "Ownership is transfered from %s to %s" % (user_name, receiver_name) bbclib.add_relation_asset(transaction, relation_idx=0, asset_group_id=asset_group_id, user_id=receiver_user_id, asset_body=user_info_msg, asset_file=file_data) transaction.witness.add_witness(user_id) transaction.witness.add_witness(receiver_user_id) for i, ref_txid in enumerate(ref_txids): 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]) bbclib.add_relation_pointer(transaction, 0, ref_transaction_id=prev_tx.digest()) asset_id = transaction.relations[0].asset.asset_id asset_files = {asset_id: file_data} ret = bbc_app_client.gather_signatures(transaction, destinations=[receiver_user_id], asset_files=asset_files) if not ret: print("Failed to send sign request") sys.exit(0) return transaction