def test_transaction_deserialization(user_input, user_output, data):
    from bigchaindb.common.transaction import Transaction
    from .utils import validate_transaction_model

    expected_asset = {'data': data}
    expected = Transaction(Transaction.CREATE, expected_asset, [user_input],
                           [user_output], None, Transaction.VERSION)

    tx = {
        'version': Transaction.VERSION,
        # NOTE: This test assumes that Inputs and Outputs can
        #       successfully be serialized
        'inputs': [user_input.to_dict()],
        'outputs': [user_output.to_dict()],
        'operation': Transaction.CREATE,
        'metadata': None,
        'asset': {
            'data': data,
        }
    }
    tx_no_signatures = Transaction._remove_signatures(tx)
    tx['id'] = Transaction._to_hash(Transaction._to_str(tx_no_signatures))
    tx = Transaction.from_dict(tx)

    assert tx == expected

    validate_transaction_model(tx)
Exemplo n.º 2
0
def test_validate_input_with_invalid_parameters(utx):
    from bigchaindb.common.transaction import Transaction

    input_conditions = [out.fulfillment.condition_uri for out in utx.outputs]
    tx_dict = utx.to_dict()
    tx_serialized = Transaction._to_str(tx_dict)
    valid = utx._input_valid(utx.inputs[0], tx_serialized, input_conditions[0])
    assert not valid
Exemplo n.º 3
0
def create(owner_before, outputs, metadata, asset_data):
    """
    Generate a CREATE transaction.

    The CREATE transaction creates a new asset.
    """
    input_ = Input.generate([owner_before])
    outputs = [Output.from_dict(c) for c in listify(outputs)]
    tx = Transaction(Transaction.CREATE, {'data': asset_data}, [input_],
                     outputs, metadata)
    tx = Transaction._to_str(tx.to_dict())
    click.echo(tx)
Exemplo n.º 4
0
def sign(transaction, private_key):
    """
    Signs a json transaction.

    Signs TRANSACTION (json) with given PRIVATE_KEY. Only a
    TRANSACTION using Ed25519 or ThresholdSha256 outputs can be signed.

    Outputs a signed transaction.
    """
    transaction = Transaction.from_dict(transaction)
    transaction = transaction.sign([private_key])
    transaction = Transaction._to_str(transaction.to_dict())
    click.echo(transaction)
Exemplo n.º 5
0
def transfer(inputs, outputs, asset, metadata):
    """
    Generate a TRANSFER transaction.

    The TRANSFER transaction transfers ownership of a given asset.
    """
    inputs = [Input.from_dict(i) for i in listify(inputs)]
    outputs = [Output.from_dict(i) for i in listify(outputs)]
    tx = Transaction(Transaction.TRANSFER,
                     asset=asset,
                     inputs=inputs,
                     outputs=outputs,
                     metadata=metadata)
    click.echo(Transaction._to_str(tx.to_dict()))
Exemplo n.º 6
0
from bigchaindb.common.transaction import Transaction
from bigchaindb.common import crypto

import sha3

# rapidjson.dumps(data, skipkeys=False, ensure_ascii=False,
#                            sort_keys=True)
tx_body_serialized = '{"Caption":"购智能手机返话费合约产品协议","Cname":"contract_mobilecallback","ContractId":"contract test from js->java->go-python","ContractOwners":["3FyHdZVX4adfSSTg7rZDPMzqzM8k5fkpu43vbRLvEXLJ","BbfY4Dc5s8dTP1Z1yixnetezRKYREHqwbP8GQGh3WyVS"],"StartTime":"1496535120000"}'
# ddd = '{"Caption":"购智能手机返话费合约产品协议","Cname":"contract_mobilecallback","ContractAssets":[{"Amount":1000,"AssetId":"test demo for contract-app","Caption":"理财产品","Description":"理财资产","MetaData":null,"Name":"asset_money","Unit":"份"}],"ContractComponents":[{"AgainstArguments":null,"CandidateList":null,"Caption":"查询用户账户","Cname":"enquiry_A","CompleteCondition":[{"Caption":"","Cname":"expression_comcond_A","Ctype":"Component_Expression.Expression_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"expression_data_A.ExpressionResult.code ==200","LogicValue":1}],"Ctype":"Component_Task.Task_Enquiry","DataList":[{"Caption":"","Category":null,"Cname":"data_A","Ctype":"Component_Data.Data_Float","DataRangeFloat":null,"DataRangeInt":null,"DataRangeUint":null,"DefaultValueFloat":0,"DefaultValueInt":0,"DefaultValueString":"","DefaultValueUint":0,"Description":"","Format":"","HardConvType":"float64","Mandatory":false,"ModifyDate":"","Options":null,"Parent":null,"Unit":"元","ValueFloat":600,"ValueInt":0,"ValueString":"","ValueUint":0}],"DataValueSetterExpressionList":[{"Caption":"","Cname":"expression_data_A","Ctype":"Component_Expression.Expression_Function","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"FuncGetBalance(contract_mobilecallback.ContractOwners.0)","LogicValue":1}],"DecisionResult":null,"Description":"查询移动用户A账户是否有500元","DiscardCondition":[{"Caption":"","Cname":"expression_discond_A","Ctype":"Component_Expression.Expression_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"true","LogicValue":1}],"NextTasks":["action_B","action_C"],"PreCondition":[{"Caption":"查询用户账户前提条件","Cname":"expression_precond_A","Ctype":"Component_Expression.Expression_LogicArgument","Description":"当前日期大于等于合约生效起始日期","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"contract_mobilecallback.StartTime >=\"2017-01-01 12:00:00\"&&contract_mobilecallback.EndTime <=\"2017-12-31 23:59:59\"","LogicValue":1}],"SelectBranches":null,"State":"TaskState_Discard","Support":0,"SupportArguments":null,"TaskExecuteIdx":0,"TaskId":"UUID110-1234-11111","TaskList":null,"Text":null},{"AgainstArguments":null,"CandidateList":null,"Caption":"A购置手机","Cname":"action_B","CompleteCondition":[{"Caption":"","Cname":"expression_comcond_B","Ctype":"Component_Expression.Expression_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"expression_data_B.ExpressionResult.code==200","LogicValue":1}],"Ctype":"Component_Task.Task_Action","DataList":null,"DataValueSetterExpressionList":[{"Caption":"A转账500给B","Cname":"expression_data_B","Ctype":"Component_Expression.Expression_Function","Description":"用户A转账500元给移动运营商B(运营商B将手机快递给用户A,不在线上确认)","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"FuncTanferMoney(contract_mobilecallback.ContractOwners.0,contract_mobilecallback.ContractOwners.1,500)","LogicValue":1}],"DecisionResult":null,"Description":"移动用户A账户存在500元:用户A将500元转账给移动运营商B,运营商B将手机快递给用户A","DiscardCondition":[{"Caption":"","Cname":"expression_discond_B","Ctype":"Component_Expression.Expression_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"true","LogicValue":1}],"NextTasks":["enquiry_D"],"PreCondition":[{"Caption":"","Cname":"expression_precond_B","Ctype":"Component_Expression.Expression_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"contract_mobilecallback.StartTime>=\"2017-01-01 12:00:00\"&&contract_mobilecallback.EndTime<=\"2017-12-31 23:59:59\"&&data_A.Value>500","LogicValue":1}],"SelectBranches":null,"State":"TaskState_Completed","Support":0,"SupportArguments":null,"TaskExecuteIdx":0,"TaskId":"UUID110-1234-11112","TaskList":null,"Text":null},{"AgainstArguments":null,"CandidateList":null,"Caption":"A账户存款500元","Cname":"action_C","CompleteCondition":[{"Caption":"","Cname":"expression_comcond_C","Ctype":"Component_Expression.Exporess_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"expression_data_C.ExpressionResult.code==200","LogicValue":1}],"Ctype":"Component_Task.Task_Action","DataList":null,"DataValueSetterExpressionList":[{"Caption":"","Cname":"expression_data_C","Ctype":"Component_Expression.Exporess_Function","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"FuncDeposit(contract_mobilecallback.ContractOwners.0, 500)","LogicValue":1}],"DecisionResult":null,"Description":"移动用户A账户不存在500元:用户A往账户存入500元,然后将500元转账给移动运营商B","DiscardCondition":[{"Caption":"","Cname":"expression_discond_C","Ctype":"Component_Expression.Exporess_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"true","LogicValue":1}],"NextTasks":["action_B"],"PreCondition":[{"Caption":"","Cname":"expression_precond_C","Ctype":"Component_Expression.Exporess_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"contract_mobilecallback.StartTime>=\"2017-01-01 12:00:00\"&&contract_mobilecallback.EndTime<=\"2017-12-31 23:59:59\"&.data_A.Value<500","LogicValue":1}],"SelectBranches":null,"State":"TaskState_Dormant","Support":0,"SupportArguments":null,"TaskExecuteIdx":0,"TaskId":"UUID110-1234-11113","TaskList":null,"Text":null},{"AgainstArguments":null,"CandidateList":null,"Caption":"查询用户月消费额","Cname":"enquiry_D","CompleteCondition":[{"Caption":"","Cname":"expression_comcond_D","Ctype":"Component_Expression.Expression_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"expression_data_D.ExpressionResult.code==200","LogicValue":1}],"Ctype":"Component_Task.Task_Enquiry","DataList":[{"Caption":"用户A月消费额","Category":null,"Cname":"data_D","Ctype":"Component_Data.Data_Float","DataRangeFloat":null,"DataRangeInt":null,"DataRangeUint":null,"DefaultValueFloat":0,"DefaultValueInt":0,"DefaultValueString":"","DefaultValueUint":0,"Description":"","Format":"","HardConvType":"float64","Mandatory":false,"ModifyDate":"","Options":null,"Parent":null,"Unit":"元","ValueFloat":80,"ValueInt":0,"ValueString":"","ValueUint":0}],"DataValueSetterExpressionList":[{"Caption":"","Cname":"expression_data_D","Ctype":"Component_Expression.Expression_Function","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"FuncQueryMonthConsumption(contract_mobilecallback.ContractOwners.0)","LogicValue":1}],"DecisionResult":null,"Description":"查询用户A当月消费额度,是否大于58元","DiscardCondition":[{"Caption":"","Cname":"expression_discond_D","Ctype":"Component_Expression.Expression_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"true","LogicValue":1}],"NextTasks":["action_E","actionF"],"PreCondition":[{"Caption":"","Cname":"expression_precond_D","Ctype":"Component_Expression.Expression_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"contract_mobilecallback.StartTime >=\"2017-01-01 12:00:00\"&&contract_mobilecallback.EndTime <=\"2017-12-31 23:59:59\"","LogicValue":1}],"SelectBranches":null,"State":"TaskState_Dormant","Support":0,"SupportArguments":null,"TaskExecuteIdx":0,"TaskId":"UUID110-1234-11114","TaskList":null,"Text":null},{"AgainstArguments":null,"CandidateList":null,"Caption":"移动运营商下月1号返移动用户A20元","Cname":"action_E","CompleteCondition":[{"Caption":"","Cname":"expression_comcond_E","Ctype":"Component_Expression.Expression_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"expression_data_E.ExpressionResult.code ==200","LogicValue":1}],"Ctype":"Component_Task.Task_Action","DataList":[{"Caption":"B返话费给A日期","Category":null,"Cname":"data_E","Ctype":"Component_Data.Data_Date","DataRangeFloat":null,"DataRangeInt":null,"DataRangeUint":null,"DefaultValueFloat":0,"DefaultValueInt":0,"DefaultValueString":"","DefaultValueUint":0,"Description":"","Format":"","HardConvType":"string","Mandatory":false,"ModifyDate":"","Options":null,"Parent":null,"Unit":"","ValueFloat":0,"ValueInt":0,"ValueString":"2017-02-01 12:00:00","ValueUint":0}],"DataValueSetterExpressionList":[{"Caption":"B返话费给A20元","Cname":"expression_data_E","Ctype":"Component_Expression.Expression_Function","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"FuncBackTelephoneFare(contract_mobilecallback.ContractOwners.1,contract_mobilecallback.ContractOwners.0,20)","LogicValue":1}],"DecisionResult":null,"Description":"移动用户A当月消费58元以上:移动运营商B下月1号返还话费20元;连续返还12个月","DiscardCondition":[{"Caption":"","Cname":"expression_discond_E","Ctype":"Component_Expression.Expression_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"true","LogicValue":1}],"NextTasks":["enquiry_D"],"PreCondition":[{"Caption":"","Cname":"expression_precond_E","Ctype":"Component_Expression.Expression_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"contract_mobilecallback.StartTime >=\"2017-01-01 12:00:00\"&&contract_mobilecallback.EndTime <=\"2017-12-31 23:59:59\"&&FuncGetNowDay()==1&&FuncGetNowDate()!= data_E.Value&& data_D.Value>=58","LogicValue":1}],"SelectBranches":null,"State":"TaskState_Dormant","Support":0,"SupportArguments":null,"TaskExecuteIdx":0,"TaskId":"UUID110-1234-11115","TaskList":null,"Text":null},{"AgainstArguments":null,"CandidateList":null,"Caption":"移动运行商不返话费","Cname":"action_F","CompleteCondition":[{"Caption":"","Cname":"expression_discond_F","Ctype":"Component_Expression.Expression_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"expression_data_F.ExpressionResult.code==200","LogicValue":1}],"Ctype":"Component_Task.Task_Action","DataList":[{"Caption":"B返话费给A执行日期","Category":null,"Cname":"data_F","Ctype":"Component_Data.Data_Date","DataRangeFloat":null,"DataRangeInt":null,"DataRangeUint":null,"DefaultValueFloat":0,"DefaultValueInt":0,"DefaultValueString":"","DefaultValueUint":0,"Description":"移动运营商B返话费给用户A的操作日期","Format":"","HardConvType":"string","Mandatory":false,"ModifyDate":"","Options":null,"Parent":null,"Unit":"","ValueFloat":0,"ValueInt":0,"ValueString":"2017-02-01 12:00:00","ValueUint":0}],"DataValueSetterExpressionList":[{"Caption":"不执行动作","Cname":"expression_data_F","Ctype":"Component_Expression.Expression_Function","Description":"消费不足58元,不执行动作","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"true","LogicValue":1}],"DecisionResult":null,"Description":"移动用户A当月消费不足58元:移动运营商B下月1号不返还话费","DiscardCondition":[{"Caption":"","Cname":"expression_discond_F","Ctype":"Component_Expression.Expression_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"true","LogicValue":1}],"NextTasks":["enquiry_D"],"PreCondition":[{"Caption":"","Cname":"expression_precond_F","Ctype":"Component_Expression.Expression_LogicArgument","Description":"","ExpressionResult":{"Code":200,"Messsage":""},"ExpressionStr":"contract_mobilecallback.StartTime >=\"2017-01-01 12:00:00\"&&contract_mobilecallback.EndTime <=\"2017-12-31 23:59:59\"&&FuncGetNowDay()==1&&FuncGetNowDate()!=data_E.Value&&data_D.Value<58","LogicValue":1}],"SelectBranches":null,"State":"TaskState_Dormant","Support":0,"SupportArguments":null,"TaskExecuteIdx":0,"TaskId":"UUID110-1234-11116","TaskList":null,"Text":null}],"ContractId":"contract test from js->java->go-python","ContractOwners":["3FyHdZVX4adfSSTg7rZDPMzqzM8k5fkpu43vbRLvEXLJ","BbfY4Dc5s8dTP1Z1yixnetezRKYREHqwbP8GQGh3WyVS"],"ContractSignatures":[{"OwnerPubkey":"3FyHdZVX4adfSSTg7rZDPMzqzM8k5fkpu43vbRLvEXLJ","SignTimestamp":"1496740225803","Signature":"3xrPx4ivaewr1A7hejBxa1XK4rq8bssSMc9hnckHo6yU9SRVmf7kwi5xUs3GKjr4R1H8duvps2yY9d4EVxqbGRwq"},{"OwnerPubkey":"BbfY4Dc5s8dTP1Z1yixnetezRKYREHqwbP8GQGh3WyVS","SignTimestamp":"1496740225775","Signature":"35E4o3WeXpnWiWQxGA6WLmJdLeirZdz93WKkfEPKUwt6mZcGJuh9gS3TgKb5ccLKBNyCwj3hrpkU2WXetgyqcvXQ"}],"ContractState":"Contract_Create","CreateTime":"1497888720000","Creator":"ABCDEFGHIJKLMNIPQRSTUVWXYZ","Ctype":"Component_Contract","Description":"移动用户A花费500元购买移动运营商B的提供的合约智能手机C后,要求用户每月消费58元以上通信费,移动运营商B便可按月返还话费(即:每月1号返还移动用户A20元话费),连续返还12个月","EndTime":"1516378320000","MetaAttribute":null,"NextTasks":["enquiry_A"],"StartTime":"1496535120000"}'
# tx_body_serialized = Transaction._to_str(tx_body_serialized)
# valid_tx_id1 = Transaction._to_hash(tx_body_serialized)
# valid_tx_id2 = crypto.hash_data(tx_body_serialized)
# valid_tx_id3 = sha3.sha3_256(tx_body_serialized.encode()).hexdigest()
# print(valid_tx_id1)
# print(valid_tx_id2)
# print(valid_tx_id3)

tx_id = Transaction._to_hash(tx_body_serialized)
print(tx_id)

tx_serialized = Transaction._to_str(tx_body_serialized)
print(tx_serialized)
tx_id = Transaction._to_hash(tx_serialized)
print(tx_id)

# 2d80573bb70422c1044b960292dbb49093d03e5c805f956e0f880b651ff4a5bf
Exemplo n.º 7
0
def get_message_to_sign(transaction):
    from bigchaindb.common.transaction import Transaction
    # fulfillments are not part of the message to sign
    tx_dict = Transaction._remove_signatures(transaction.to_dict())
    return Transaction._to_str(tx_dict).encode()