示例#1
0
def prepare_transfer(inputs, outputs, metadata=None):
    """Create an instance of a :class:`~.Output`.

    Args:
        inputs (list of
                    (dict):
                        {
                            'tx': <(bigchaindb.common.transactionTransaction):
                                    input transaction, can differ but must have same asset id>,
                            'output': <(int): output index of tx>
                        }
                )
        outputs (list of
                    (dict):
                        {
                            'condition': <(cryptoconditions.Condition): output condition>,
                            'public_keys': <(optional list of base58): for indexing defaults to `None`>,
                            'amount': <(int): defaults to `1`>
                        }
                )
        metadata (dict)
    Raises:
        TypeError: if `public_keys` is not instance of `list`.
            """
    from bigchaindb.common.transaction import (Input, Output, TransactionLink)

    from bigchaindb.models import Transaction

    from cryptoconditions import (Fulfillment, Condition)

    asset = inputs[0]['tx']['asset']
    asset = {'id': asset['id'] if 'id' in asset else inputs[0]['tx']['id']}

    _inputs, _outputs = [], []

    for _input in inputs:

        _output = _input['tx']['outputs'][_input['output']]
        _inputs.append(
            Input(fulfillment=Condition.from_uri(_output['condition']['uri']),
                  owners_before=_output['public_keys'],
                  fulfills=TransactionLink(txid=_input['tx']['id'],
                                           output=_input['output'])))

    for output in outputs:
        _outputs.append(
            Output(fulfillment=output['condition'],
                   public_keys=output['public_keys']
                   if "public_keys" in output else [],
                   amount=output['amount'] if "amount" in output else 1))

    return Transaction(
        operation='TRANSFER',
        asset=asset,
        inputs=_inputs,
        outputs=_outputs,
        metadata=metadata,
    )