예제 #1
0
파일: id_lib.py 프로젝트: luomin/bbc1
    def update(self,
               user_id,
               public_keys_to_add=None,
               public_keys_to_remove=None,
               public_keys_to_replace=None,
               keypair=None):
        reftx = self.__update_local_database(user_id)

        dat = bytearray(b'')
        if public_keys_to_add is not None:
            dat.extend(
                Directive(Directive.CMD_ADD, public_keys_to_add).serialize())
        if public_keys_to_remove is not None:
            dat.extend(
                Directive(Directive.CMD_REMOVE,
                          public_keys_to_remove).serialize())
        if public_keys_to_replace is not None:
            dat.extend(
                Directive(Directive.CMD_REPLACE,
                          public_keys_to_replace).serialize())

        tx = bbclib.make_transaction_for_base_asset(
            asset_group_id=self.namespace_id, event_num=1)
        tx.events[0].asset.add(user_id=user_id, asset_body=dat)
        tx.events[0].add(mandatory_approver=user_id)
        bbclib.add_reference_to_transaction(self.namespace_id, tx, reftx, 0)

        if keypair is None:
            return tx

        return self.sign_and_insert(tx, user_id, keypair)
예제 #2
0
    def set_mint_data(self,
                      index,
                      asset_body,
                      update=False,
                      keypair=None,
                      idPublickeyMap=None):
        store_id = self.store_ids[index]

        if update:
            self.app.search_transaction_with_condition(
                asset_group_id=self.mint_id, user_id=store_id)
            res = self.app.callback.synchronize()
            if res[KeyType.status] >= ESUCCESS:
                reftx = bbclib.BBcTransaction(
                    deserialize=res[KeyType.transactions][0])
        else:
            reftx = None

        tx = bbclib.make_transaction_for_base_asset(
            asset_group_id=self.mint_id, event_num=1)
        tx.events[0].asset.add(user_id=store_id, asset_body=asset_body)
        tx.events[0].add(mandatory_approver=self.mint_id)
        if reftx is None:
            tx.add(witness=bbclib.BBcWitness())
            tx.witness.add_witness(self.mint_id)
        else:
            bbclib.add_reference_to_transaction(self.mint_id, tx, reftx, 0)

        if keypair is None:
            return tx

        return self.sign_and_insert(tx, self.mint_id, keypair, idPublickeyMap)
예제 #3
0
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_for_base_asset(
        asset_group_id=asset_group_id, event_num=1)

    txobj.events[0].asset.add(user_id=receiver_user_id,
                              asset_body="transferred",
                              asset_file=file_data)
    txobj.events[0].add(mandatory_approver=receiver_user_id)

    for i, ref_txid in enumerate(ref_txids):
        clients[idx].search_transaction(ref_txid)
        response_data = clients[idx].callback.synchronize()
        assert response_data[KeyType.status] == ESUCCESS
        prev_tx = bbclib.recover_transaction_object_from_rawdata(
            response_data[KeyType.transaction_data])
        bbclib.add_reference_to_transaction(asset_group_id, txobj, prev_tx, 0)

    sig_mine = txobj.sign(key_type=bbclib.KeyType.ECDSA_SECP256k1,
                          private_key=keypairs[idx].private_key,
                          public_key=keypairs[idx].public_key)
    txobj.references[0].add_signature(user_id=user_ids[idx],
                                      signature=sig_mine)

    asset_id = txobj.events[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
예제 #4
0
def store_proc(data, approver_id, txid=None):
    # make transaction object
    transaction = bbclib.make_transaction_for_base_asset(
        asset_group_id=asset_group_id, event_num=1)
    transaction.events[0].add(mandatory_approver=approver_id,
                              asset_group_id=asset_group_id)
    transaction.events[0].asset.add(user_id=user_id, asset_body=data)
    if txid:
        obj = {
            "jsonrpc": "2.0",
            "method": "bbc1_GetTransaction",
            "params": {
                "asset_group_id": bbclib.bin2str_base64(asset_group_id),
                "tx_id": txid,
                "user_id": bbclib.bin2str_base64(user_id),
            },
            "id": 114514
        }
        response = json_post(obj)
        prevtx = response["result"]
        prevtx = bbclib.BBcTransaction(jsonload=prevtx)
        bbclib.add_reference_to_transaction(asset_group_id, transaction,
                                            prevtx, 0)

    # get transaction digest
    jsontx = transaction.jsondump()
    obj = {
        "jsonrpc": "2.0",
        "method": "bbc1_GetTransactionDigest",
        "params": jsontx,
        "id": 114514
    }
    response = json_post(obj)

    # add sign to transaction json
    sig = bbclib.bin2str_base64(
        key_pair.sign(
            binascii.a2b_base64(response["result"]["digest"].encode("utf-8"))))
    jsontx = json.loads(response["result"]["tx"])
    sig = {
        "type": 1,
        "signature": sig,
        "pubkey": bbclib.bin2str_base64(key_pair.public_key)
    }
    jsontx["Signature"].append(sig)
    # Insert Transaction
    obj = {
        "jsonrpc": "2.0",
        "method": "bbc1_InsertTransaction",
        "params": json.dumps(jsontx),
        "id": 114514
    }
    response = json_post(obj)
    print("TXID: %s" % response["result"])
    print("ASID: %s" % jsontx["Event"][0]["Asset"]["asset_id"])
    return response["result"]
예제 #5
0
파일: file_proof.py 프로젝트: luomin/bbc1
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_for_base_asset(
        asset_group_id=asset_group_id, event_num=1, witness=True)

    user_info_msg = "Ownership is transfered from %s to %s" % (user_name,
                                                               receiver_name)
    transaction.events[0].asset.add(user_id=receiver_user_id,
                                    asset_body=user_info_msg,
                                    asset_file=file_data)
    transaction.events[0].add(mandatory_approver=receiver_user_id)
    witness = transaction.witness
    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.recover_transaction_object_from_rawdata(
            response_data[KeyType.transaction_data])
        bbclib.add_reference_to_transaction(asset_group_id, transaction,
                                            prev_tx, 0)

    asset_id = transaction.events[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.get_sig_index(receiver_user_id)
    transaction.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.references[0].add_signature(user_id=user_id,
                                            signature=sig_mine)
    transaction.digest()
    return transaction
예제 #6
0
    def test_13_gather_signature(self):
        print("\n-----", sys._getframe().f_code.co_name, "-----")
        prev_tx = transactions[0]
        user = clients[1]['user_id']
        transactions[1] = bbclib.make_transaction_for_base_asset(
            asset_group_id=asset_group_id, event_num=1)
        transactions[1].events[0].asset.add(user_id=user, asset_body=b'123456')
        if len(cross_ref_list) > 0:
            transactions[1].add(cross_ref=cross_ref_list.pop(0))

        reference = bbclib.add_reference_to_transaction(
            asset_group_id, transactions[1], prev_tx, 0)
        ret = clients[1]['app'].gather_signatures(asset_group_id,
                                                  transactions[1],
                                                  reference_obj=reference)
        assert ret
        dat = msg_processor[1].synchronize()
        assert dat[KeyType.status] == ESUCCESS
        result = dat[KeyType.result]
        transactions[1].references[result[0]].add_signature(
            user_id=result[1], signature=result[2])

        transactions[1].dump()
        transactions[1].digest()
        print("register transaction=",
              binascii.b2a_hex(transactions[1].transaction_id))
        ret = clients[1]['app'].insert_transaction(asset_group_id,
                                                   transactions[1])
        assert ret
        msg_processor[1].synchronize()
예제 #7
0
    def test_13_make_transaction(self):
        print("\n-----", sys._getframe().f_code.co_name, "-----")
        for i, cl in enumerate(clients):
            user = cl['user_id']
            txobj = bbclib.make_transaction_for_base_asset(
                asset_group_id=asset_group_id, event_num=1)

            txobj.events[0].asset.add(user_id=user, asset_body=b"data2=%d" % i)
            other_user = (i + 1) % client_num
            txobj.events[0].add(
                reference_index=0,
                mandatory_approver=clients[other_user]['user_id'])

            reference = bbclib.add_reference_to_transaction(
                asset_group_id, txobj, transactions[i], 0)
            ret = cl['app'].gather_signatures(txobj, reference_obj=reference)
            assert ret
            dat = msg_processor[i].synchronize()
            assert dat[KeyType.status] == ESUCCESS
            result = dat[KeyType.result]
            txobj.references[result[0]].add_signature(user_id=result[1],
                                                      signature=result[2])

            txobj.digest()
            cl['app'].insert_transaction(txobj)
            dat = msg_processor[i].synchronize()
            assert KeyType.transaction_id in dat
            assert dat[KeyType.transaction_id] == txobj.transaction_id
            transactions[i] = txobj
예제 #8
0
def store_proc(data, approver_id,txid=None):
    bbc_app_client = setup_bbc_client()
    store_transaction = bbclib.make_transaction_for_base_asset(asset_group_id=asset_group_id, event_num=1)
    store_transaction.events[0].add(mandatory_approver=approver_id, asset_group_id=asset_group_id)
    store_transaction.events[0].asset.add(user_id=user_id, asset_body=data)

    LAB_id = bbclib.get_new_id("LegalAffairsBureau", include_timestamp=False)
    store_transaction.events[0].add(option_approver=LAB_id)

    if txid:
        bbc_app_client.search_transaction(asset_group_id, 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.recover_transaction_object_from_rawdata(response_data[KeyType.transaction_data])
        reference = bbclib.add_reference_to_transaction(asset_group_id, store_transaction, prev_tx, 0)
        sig = store_transaction.sign(key_type=bbclib.KeyType.ECDSA_SECP256k1_XY,
                                     private_key=key_pair.private_key,
                                     public_key=key_pair.public_key)
        store_transaction.references[0].add_signature(user_id=user_id, signature=sig)
    else:
        sig = store_transaction.sign(key_type=bbclib.KeyType.ECDSA_SECP256k1_XY,
                                     private_key=key_pair.private_key,
                                     public_key=key_pair.public_key)
        store_transaction.add_signature(signature=sig)
    store_transaction.add_signature(user_id=user_id, signature=sig)

    # Get signature from LegalAffairsBureau
    bbc_app_client.gather_signatures(asset_group_id, store_transaction,destinations=[LAB_id])
    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]
    store_transaction.get_sig_index(result[1])
    store_transaction.add_signature(user_id=result[1], signature=result[2])

    store_transaction.digest()
    store_transaction.dump()

    ret = bbc_app_client.insert_transaction(asset_group_id, 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)
    print("TxID: %s", binascii.b2a_hex(response_data[KeyType.transaction_id]))
    print("AsID: %s", binascii.b2a_hex(store_transaction.events[0].asset.asset_id))

    txinfo = [store_transaction.transaction_id, store_transaction.events[0].asset.asset_id]
    return txinfo
예제 #9
0
파일: file_proof.py 프로젝트: luomin/bbc1
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_for_base_asset(
        asset_group_id=asset_group_id, event_num=1)
    user_info = "Owner is %s" % user_name
    store_transaction.events[0].add(mandatory_approver=user_id)
    store_transaction.events[0].asset.add(user_id=user_id,
                                          asset_body=user_info,
                                          asset_file=data)
    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 = bbclib.recover_transaction_object_from_rawdata(
            response_data[KeyType.transaction_data])
        reference = bbclib.add_reference_to_transaction(
            asset_group_id, store_transaction, prev_tx, 0)
        sig = store_transaction.sign(key_type=bbclib.KeyType.ECDSA_SECP256k1,
                                     private_key=key_pair.private_key,
                                     public_key=key_pair.public_key)
        store_transaction.references[0].add_signature(user_id=user_id,
                                                      signature=sig)
    else:
        sig = store_transaction.sign(key_type=bbclib.KeyType.ECDSA_SECP256k1,
                                     private_key=key_pair.private_key,
                                     public_key=key_pair.public_key)
        store_transaction.get_sig_index(user_id)
        store_transaction.add_signature(user_id=user_id, signature=sig)
    store_transaction.digest()

    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)

    bbc_app.store_id_mappings(
        os.path.basename(file),
        asset_group_id,
        transaction_id=response_data[KeyType.transaction_id],
        asset_ids=store_transaction.events[0].asset.asset_id)
예제 #10
0
파일: coin.py 프로젝트: luomin/bbc1
def store_proc(data, approver_id, txid=None):
    bbc_app_client = setup_bbc_client()
    transaction = bbclib.make_transaction_for_base_asset(
        asset_group_id=asset_group_id, event_num=1)
    transaction.events[0].add(mandatory_approver=approver_id,
                              asset_group_id=asset_group_id)
    transaction.events[0].asset.add(user_id=user_id, asset_body=data)
    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 = bbclib.recover_transaction_object_from_rawdata(
            response_data[KeyType.transaction_data])
        reference = bbclib.add_reference_to_transaction(
            asset_group_id, transaction, prev_tx, 0)
        sig = transaction.sign(key_type=bbclib.KeyType.ECDSA_SECP256k1,
                               private_key=key_pair.private_key,
                               public_key=key_pair.public_key)
        transaction.references[0].add_signature(user_id=user_id, signature=sig)
    else:
        sig = transaction.sign(key_type=bbclib.KeyType.ECDSA_SECP256k1,
                               private_key=key_pair.private_key,
                               public_key=key_pair.public_key)
        transaction.add_signature(signature=sig)
    transaction.digest()
    print(transaction)

    ret = bbc_app_client.insert_transaction(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)
    print("TxID: %s", binascii.b2a_hex(response_data[KeyType.transaction_id]))
    print("AsID: %s", binascii.b2a_hex(transaction.events[0].asset.asset_id))

    bbc_app.store_id_mappings(
        data,
        asset_group_id,
        transaction_id=response_data[KeyType.transaction_id],
        asset_ids=transaction.events[0].asset.asset_id)
    txinfo = [transaction.transaction_id, transaction.events[0].asset.asset_id]
    return txinfo
예제 #11
0
def add_ref_tx(asset_group, transaction, ref_tx, ref_index):
    bbc_app_client = setup_bbc_client(asset_group)
    bbc_app_client.search_transaction(asset_group, ref_tx)
    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.recover_transaction_object_from_rawdata(
        response_data[KeyType.transaction_data])
    reference = bbclib.add_reference_to_transaction(asset_group, transaction,
                                                    prev_tx, 0)
    sig = transaction.sign(key_type=bbclib.KeyType.ECDSA_SECP256k1_XY,
                           private_key=key_pair.private_key,
                           public_key=key_pair.public_key)
    transaction.references[ref_index].add_signature(user_id=user_id,
                                                    signature=sig)
    if asset_group == land_asset_group:
        print("ref to land asset")

    return transaction
예제 #12
0
    def test_13_make_transaction(self):
        print("\n-----", sys._getframe().f_code.co_name, "-----")
        for i, cl in enumerate(clients):
            user = cl['user_id']
            txobj = bbclib.make_transaction_for_base_asset(
                asset_group_id=asset_group_id, event_num=1)
            cl['app'].get_cross_refs(asset_group_id=asset_group_id, number=2)
            dat = msg_processor[i].synchronize()
            cross_ref_list[i].extend(dat)
            if len(cross_ref_list[i]) > 0:
                txobj.add(cross_ref=cross_ref_list[i].pop(0))

            txobj.events[0].asset.add(user_id=user, asset_body=b"data2=%d" % i)
            other_user = (i + 1) % client_num
            txobj.events[0].add(
                reference_index=0,
                mandatory_approver=clients[other_user]['user_id'])

            reference = bbclib.add_reference_to_transaction(
                asset_group_id, txobj, transactions[i], 0)
            ret = cl['app'].gather_signatures(asset_group_id,
                                              txobj,
                                              reference_obj=reference)
            assert ret
            dat = msg_processor[i].synchronize()
            assert dat[KeyType.status] == ESUCCESS
            result = dat[KeyType.result]
            txobj.references[result[0]].add_signature(user_id=result[1],
                                                      signature=result[2])

            txobj.digest()
            txobj.dump()
            ret = cl['app'].insert_transaction(asset_group_id, txobj)
            assert ret
            msg_processor[i].synchronize()
            transactions[i] = txobj

        for i in range(len(cores)):
            print("[%d] cross_ref_list=%d" % (i, len(cores[i].cross_ref_list)))
예제 #13
0
def execute_escrow():
    coinasset = json.loads(
        get_data(coin_asset_group, coinasid).decode("UTF-8"))
    coinasset["owner"] = escrow["owner"]
    coinasset["date"] = datetime.now().strftime('%s')
    coinasset = json.dumps(coinasset)
    cointx_id = get_txid_from_asid(coin_asset_group, coinasid)

    landasset = json.loads(
        get_data(land_asset_group, landasid).decode("UTF-8"))
    landasset["owner"] = escrow["newowner"]
    landasset["date"] = datetime.now().strftime('%s')
    landasset = json.dumps(landasset)
    landtx_id = get_txid_from_asid(land_asset_group, landasid)

    # Make TX
    land_client = setup_bbc_client(land_asset_group)
    transaction = bbclib.make_transaction_for_base_asset(
        asset_group_id=land_asset_group, event_num=2)

    # Add event and asset
    print("Add event and asset")
    transaction.events[0].add(mandatory_approver=binascii.unhexlify(
        escrow["newowner"]),
                              asset_group_id=land_asset_group)
    transaction.events[0].asset.add(user_id=user_id, asset_body=landasset)

    LAB_id = bbclib.get_new_id("LegalAffairsBureau", include_timestamp=False)
    transaction.events[0].add(option_approver=LAB_id)

    coin_client = setup_bbc_client(coin_asset_group)
    transaction.events[1].add(mandatory_approver=binascii.unhexlify(
        escrow["owner"]),
                              asset_group_id=coin_asset_group)
    transaction.events[1].asset.add(user_id=user_id, asset_body=coinasset)

    # Add reference
    print("Add reference")
    land_client.search_transaction(land_asset_group, landtx_id)
    response_data = land_client.callback.synchronize()
    if response_data[KeyType.status] < ESUCCESS:
        print("ERROR: ", response_data[KeyType.reason].decode())
        sys.exit(0)
    prev_tx = bbclib.recover_transaction_object_from_rawdata(
        response_data[KeyType.transaction_data])
    reference = bbclib.add_reference_to_transaction(land_asset_group,
                                                    transaction, prev_tx, 0)

    coin_client.search_transaction(coin_asset_group, cointx_id)
    response_data = coin_client.callback.synchronize()
    if response_data[KeyType.status] < ESUCCESS:
        print("ERROR: ", response_data[KeyType.reason].decode())
        sys.exit(0)
    prev_tx = bbclib.recover_transaction_object_from_rawdata(
        response_data[KeyType.transaction_data])
    reference = bbclib.add_reference_to_transaction(coin_asset_group,
                                                    transaction, prev_tx, 0)

    # Add signature
    print("Add signature to escrow TX")
    sig = transaction.sign(key_type=bbclib.KeyType.ECDSA_SECP256k1_XY,
                           private_key=key_pair.private_key,
                           public_key=key_pair.public_key)
    transaction.references[0].add_signature(user_id=user_id, signature=sig)

    print("Get signature from LegalAffairsBureau")
    land_client.gather_signatures(land_asset_group,
                                  transaction,
                                  destinations=[LAB_id])
    response_data = land_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.get_sig_index(result[1])
    transaction.add_signature(user_id=result[1], signature=result[2])

    transaction.digest()
    transaction.dump()

    print("insert coin asset group")
    ret = coin_client.insert_transaction(coin_asset_group, transaction)
    assert ret
    response_data = coin_client.callback.synchronize()
    if response_data[KeyType.status] < ESUCCESS:
        print("ERROR: ", response_data[KeyType.reason].decode())
        sys.exit(0)
    print("TxID: %s", binascii.b2a_hex(response_data[KeyType.transaction_id]))
    print("coinAsID: %s",
          binascii.b2a_hex(transaction.events[0].asset.asset_id))
    print("landAsID: %s",
          binascii.b2a_hex(transaction.events[1].asset.asset_id))

    cointxinfo = [
        transaction.transaction_id, transaction.events[0].asset.asset_id
    ]
    landtxinfo = [
        transaction.transaction_id, transaction.events[1].asset.asset_id
    ]

    print("insert land asset group")
    ret = land_client.insert_transaction(land_asset_group, transaction)
    assert ret
    response_data = land_client.callback.synchronize()
    if response_data[KeyType.status] < ESUCCESS:
        print("ERROR: ", response_data[KeyType.reason].decode())
        sys.exit(0)
    print("TxID: %s", binascii.b2a_hex(response_data[KeyType.transaction_id]))
    print("coinAsID: %s",
          binascii.b2a_hex(transaction.events[0].asset.asset_id))
    print("landAsID: %s",
          binascii.b2a_hex(transaction.events[1].asset.asset_id))

    txinfo = [transaction.transaction_id, transaction.events[0].asset.asset_id]
    coin_client.send_message(txinfo, binascii.unhexlify(escrow["owner"]),
                             coin_asset_group)
    txinfo = [transaction.transaction_id, transaction.events[1].asset.asset_id]
    land_client.send_message(txinfo, binascii.unhexlify(escrow["newowner"]),
                             land_asset_group)
    print("Transfer is done.....")