コード例 #1
0
    def test_add_signature_to_transaction_with_netowrk_id(self):

        for network_id in [1, 2, 66, 100]:

            sender_private_key = "0x0164f7c7399f4bb1eafeaae699ebbb12050bc6a50b2836b9ca766068a9d000c0"
            sender_address = "0xde3d2d9dd52ea80f7799ef4791063a5458d13913"
            to_address = "0x056db290f8ba3250ca64a45d16284d04bc6f5fbf"
            value = 10000000000
            nonce = 1048576
            data = b''
            gasprice = DEFAULT_GASPRICE
            startgas = DEFAULT_STARTGAS
            network_id = 1

            tx1 = Transaction(nonce, gasprice, startgas, to_address, value,
                              data, network_id, 0, 0)
            tx = encode_transaction(tx1)
            tx1.sign(data_decoder(sender_private_key), network_id=network_id)
            expected_signed_tx = encode_transaction(tx1)
            sig = data_encoder(signature_from_transaction(tx1))

            signed_tx = add_signature_to_transaction(tx, sig)

            self.assertEqual(signed_tx, expected_signed_tx)

            tx_obj = decode_transaction(tx)

            add_signature_to_transaction(tx_obj, sig)

            self.assertEqual(tx_obj.network_id, network_id)
            self.assertEqual(data_encoder(tx_obj.sender), sender_address)

            self.assertEqual(encode_transaction(tx_obj), expected_signed_tx)
コード例 #2
0
    def test_tx_network_id(self):

        network_id = 1
        tx = create_transaction(
            nonce=9,
            gasprice=20 * 10**9,
            startgas=21000,
            to="0x3535353535353535353535353535353535353535",
            value=10**18,
            data=b'',
            network_id=network_id)
        key = data_decoder(
            "0x4646464646464646464646464646464646464646464646464646464646464646"
        )

        self.assertEqual(
            "0xec098504a817c800825208943535353535353535353535353535353535353535880de0b6b3a764000080018080",
            encode_transaction(tx))
        tx.sign(key, network_id=network_id)

        self.assertEqual(
            "0xf86c098504a817c800825208943535353535353535353535353535353535353535880de0b6b3a76400008025a028ef61340bd939bc2195fe537567866003e1a15d3c71ff63e1590620aa636276a067cbe9d8997f761aecb703304b3800ccf555c9f3dc64214b297fb1966a3b6d83",
            data_encoder(rlp.encode(tx)))

        self.assertEqual((
            37,
            0x28ef61340bd939bc2195fe537567866003e1a15d3c71ff63e1590620aa636276,
            0x67cbe9d8997f761aecb703304b3800ccf555c9f3dc64214b297fb1966a3b6d83
        ), (tx.v, tx.r, tx.s))
コード例 #3
0
    def do_POST(self):

        # TODO: figure out why read is blocking here
        data = self.rfile.read(len(self.rfile.peek()))
        data = data.decode('utf-8')
        data = json.loads(data)

        if self.path == "/v1/tx/skel":

            gas_price = parse_int(data['gas_price']) if 'gas_price' in data else DEFAULT_GASPRICE
            gas = parse_int(data['gas']) if 'gas' in data else DEFAULT_STARTGAS
            nonce = parse_int(data['nonce']) if 'nonce' in data else 0

            if 'value' not in data or 'from' not in data or 'to' not in data:
                self.write_data(400, {'errors': [{'id': 'bad_arguments', 'message': 'Bad Arguments'}]})
                return
            value = parse_int(data['value'])
            to_address = data['to']
            from_address = data['from']

            if not validate_address(to_address):
                self.write_data(400, {'errors': [{'id': 'invalid_to_address', 'message': 'Invalid To Address'}]})
                return
            if not validate_address(from_address):
                self.write_data(400, {'errors': [{'id': 'invalid_from_address', 'message': 'Invalid From Address'}]})
                return

            tx = create_transaction(nonce=nonce, gasprice=gas_price, startgas=gas,
                                    to=to_address, value=value)

            transaction = encode_transaction(tx)

            self.write_data(200, {
                "tx_data": {
                    "nonce": hex(nonce),
                    "from": from_address,
                    "to": to_address,
                    "value": hex(value),
                    "startGas": hex(gas),
                    "gasPrice": hex(gas_price)
                },
                "tx": transaction
            })

        elif self.path == "/v1/tx":

            tx = decode_transaction(data['tx'])

            if 'signature' in data:

                sig = data_decoder(data['signature'])

                add_signature_to_transaction(tx, sig)

            self.write_data(200, {"tx_hash": data_encoder(tx.hash)})

        else:

            self.write_data(404)
コード例 #4
0
    def test_get_skel(self):

        tx = self.service_client.generate_tx_skel(
            "0x0004DE837Ea93edbE51c093f45212AB22b4B35fc",
            "0xdb089a4f9a8c5f17040b4fc51647e942b5fc601d",
            1000000000000000000,
            timeout=5)

        self.assertEqual(encode_transaction(tx), "0xe9808504a817c80082520894db089a4f9a8c5f17040b4fc51647e942b5fc601d880de0b6b3a764000080")
コード例 #5
0
    def send_tx(self, tx, signature=None, **kwargs):

        if isinstance(tx, (Transaction, UnsignedTransaction)):
            tx = encode_transaction(tx)

        body = {"tx": tx}
        if signature:
            body['signature'] = signature

        resp = self._fetch("/v1/tx", "POST", body, **kwargs)
        return resp['tx_hash']
コード例 #6
0
        def test_vector(name, vector):
            if 'transaction' not in vector:
                return  # TODO: process rlp tests
            transaction = vector['transaction']
            tx = create_transaction(
                nonce=parse_int(transaction['nonce']),
                gasprice=parse_int(transaction['gasPrice']),
                startgas=parse_int(transaction['gasLimit']),
                to=transaction['to'],
                value=parse_int(transaction['value']),
                data=data_decoder(transaction['data']),
                v=parse_int(transaction['v']),
                r=parse_int(transaction['r']),
                s=parse_int(transaction['s']))
            self.assertEqual(data_encoder(tx.sender),
                             "0x{}".format(vector['sender']), name)
            self.assertEqual(calculate_transaction_hash(tx),
                             "0x{}".format(vector['hash']), name)
            self.assertEqual(encode_transaction(tx), vector['rlp'], name)

            # test decode transaction -> encode transaction round trip
            tx = decode_transaction(vector['rlp'])
            self.assertEqual(encode_transaction(tx), vector['rlp'], name)
コード例 #7
0
    def test_add_signature_to_transaction(self):

        tx = "0xe9808504a817c80082520894db089a4f9a8c5f17040b4fc51647e942b5fc601d880de0b6b3a764000080"
        sig = "0xf5a43adea07d366ae420a5c75a5cae6c60d3e4aaa0b72c2f37fc387efd43d7fd30c4327f2dbd959f654857f58912129b09763329459d08e25547d895ae90fa0f01"

        expected_signed_tx = "0xf86c808504a817c80082520894db089a4f9a8c5f17040b4fc51647e942b5fc601d880de0b6b3a7640000801ca0f5a43adea07d366ae420a5c75a5cae6c60d3e4aaa0b72c2f37fc387efd43d7fda030c4327f2dbd959f654857f58912129b09763329459d08e25547d895ae90fa0f"

        signed_tx = add_signature_to_transaction(tx, sig)

        self.assertEqual(signed_tx, expected_signed_tx)

        tx_obj = decode_transaction(tx)

        add_signature_to_transaction(tx_obj, sig)

        self.assertEqual(encode_transaction(tx_obj), expected_signed_tx)