Exemple #1
0
async def send_raw_transaction(request):
    try:
        data = request.params['data']
    except KeyError:
        raise RpcInvalidParamsError(message='Missed data')

    with suppress(Exception):
        data = data.encode('utf-8')

    try:
        transaction = base64.b64decode(data)
    except Exception:
        raise RpcGenericServerDefinedError(
            error_code=-32050,
            message='Decode payload of tranasaction failed'
        )

    try:
        tr_pb = Transaction()
        tr_pb.ParseFromString(transaction)
    except DecodeError:
        raise RpcGenericServerDefinedError(
            error_code=-32050,
            message='Failed to parse transaction proto'
        )

    try:
        tr_head_pb = TransactionHeader()
        tr_head_pb.ParseFromString(tr_pb.header)
    except DecodeError:
        raise RpcGenericServerDefinedError(
            error_code=-32050,
            message='Failed to parse transaction head proto'
        )

    prefix, public_key = tr_head_pb.signer_public_key[:2], \
        tr_head_pb.signer_public_key[2:]
    if prefix in ('02', '03') and len(public_key) != 64:
        raise RpcGenericServerDefinedError(
            error_code=-32050,
            message='Signer public key format is not valid'
        )

    client = PubKeyClient()
    response = client.send_raw_transaction(tr_pb)
    return response['data']
def post(payload):
    tr = payload['transaction']
    with suppress(Exception):
        tr = tr.encode('utf-8')

    try:
        transaction = base64.b64decode(tr)
    except Exception:
        return {'error': 'Decode payload of tranasaction failed'}, 400

    try:
        tr_pb = Transaction()
        tr_pb.ParseFromString(transaction)
    except DecodeError:
        return {'error': 'Failed to parse transaction proto'}, 400

    client = PubKeyClient()
    try:
        result = client._send_raw_transaction(tr_pb)
        return {'batch_id': result['batch_id']}, 200
    except Exception as e:
        return {'error': 'Send batch with transaction failed: %s' % e}, 400
Exemple #3
0
async def send_raw_transaction(request):
    try:
        data = request.params['data']
    except KeyError:
        raise RpcInvalidParamsError(message='Missed data')

    try:
        transaction = base64.b64decode(data.encode('utf-8'))
    except Exception:
        raise RpcGenericServerDefinedError(
            error_code=-32050,
            message='Decode payload of tranasaction failed'
        )

    try:
        tr_pb = Transaction()
        tr_pb.ParseFromString(transaction)
    except DecodeError:
        raise RpcGenericServerDefinedError(
            error_code=-32050,
            message='Failed to parse transaction proto'
        )

    try:
        tr_head_pb = TransactionHeader()
        tr_head_pb.ParseFromString(tr_pb.header)
    except DecodeError:
        raise RpcGenericServerDefinedError(
            error_code=-32050,
            message='Failed to parse transaction head proto'
        )

    try:
        tr_payload_pb = TransactionPayload()
        tr_payload_pb.ParseFromString(tr_pb.payload)
    except DecodeError:
        raise RpcGenericServerDefinedError(
            error_code=-32050,
            message='Failed to parse transaction payload proto'
        )

    prefix, public_key = tr_head_pb.signer_public_key[:2], \
        tr_head_pb.signer_public_key[2:]
    if prefix in ('02', '03') and len(public_key) != 64:
        raise RpcGenericServerDefinedError(
            error_code=-32050,
            message='Signer public key format is not valid'
        )

    try:
        handler = TP_HANDLERS[tr_head_pb.family_name]
    except KeyError:
        raise RpcGenericServerDefinedError(
            error_code=-32050,
            message='Validation handler not set for this method'
        )

    validator = _get_proto_validator(handler, tr_payload_pb)
    if validator and not validator.validate():
        logger.debug('Form "send_raw_transaction" validator errors: '
                     f'{validator.errors}')
        raise RpcGenericServerDefinedError(
            error_code=-32050,
            message=f'Invalid "{validator.get_pb_class().__name__}" '
                    'structure'
        )

    client = PubKeyClient()
    response = await client.send_raw_transaction(tr_pb)
    return response['data']