Exemplo n.º 1
0
def test_add_transaction():
    transaction_pool = TransactionPool()
    transaction = Transaction(Wallet(), "abcd", 10)
    transaction_pool.add_transaction(transaction)

    assert transaction_pool.all_transactions[transaction.id] == transaction
def test_transaction_exceeds_balance():
    with pytest.raises(Exception, match='Amount exceeds balance'):
        Transaction(Wallet(), 'recipient', 9001)
def test_valid_transaction():
    Transaction.is_valid_transaction(Transaction(Wallet(), 'recipient', 50))
Exemplo n.º 4
0
def blockchain_three_blocks():
    blockchain = Blockchain()
    for i in range(3):
        blockchain.add_block(
            list([Transaction(Wallet(), 'recipient', i).to_json()]))
    return blockchain
Exemplo n.º 5
0
ROOT_PORT = 5000
PORT = ROOT_PORT

if os.environ.get('PEER') == 'True':
    PORT = random.randint(5001, 6000)

    result = requests.get(f'http://localhost:{ROOT_PORT}/blockchain')
    result_blockchain = Blockchain.from_json(result.json())

    try:
        blockchain.replace_chain(result_blockchain.chain)
        print('\n -- Successfully synchronized the local chain')
    except Exception as e:
        print(f'\n -- Error synchronizing: {e}')

if os.environ.get('SEED_DATA') == 'True':
    for i in range(10):
        blockchain.add_block([
            Transaction(Wallet(),
                        Wallet().address, random.randint(2, 50)).to_json(),
            Transaction(Wallet(),
                        Wallet().address, random.randint(2, 50)).to_json()
        ])

    for i in range(3):
        transaction_pool.set_transaction(
            Transaction(Wallet(),
                        Wallet().address, random.randint(2, 50)))

app.run(port=PORT)
Exemplo n.º 6
0
def test_set_transaction():
    transaction_pool = TransactionPool()
    transaction = Transaction(Wallet(), 'recipient', 1)
    transaction_pool.set_transaction(transaction)

    assert transaction_pool.transaction_map[transaction.id] == transaction
Exemplo n.º 7
0
def test_valid_transaction_chain_duplicate_transactions(populated_blockchain):
    transaction = Transaction(Wallet(), 'recipient', 1).to_json()
    populated_blockchain.add_block([transaction, transaction])

    with pytest.raises(Exception, match='is not unique!'):
        Blockchain.is_valid_transaction_chain(populated_blockchain.chain)
Exemplo n.º 8
0
def test_transaction_in_sufficient_balance():
    with pytest.raises(Exception, match="In sufficient balance"):
        Transaction(Wallet(), 'recipient', 1001)
Exemplo n.º 9
0
def test_valid_transaction():
    transaction = Transaction(Wallet(), "abcd", 20)
    Transaction.is_transaction_valid(transaction)
Exemplo n.º 10
0
def test_is_valid_transaction_chain_bad_transaction(blockchain_3b):
    bad_trans = Transaction(Wallet(), 'recipient', 1)
    bad_trans.input['signature'] = Wallet().sign(bad_trans.output)
    blockchain_3b.add_block([bad_trans.to_json()])
    with pytest.raises(Exception):
        Blockchain.is_valid_trans_chain(blockchain_3b.chain)
Exemplo n.º 11
0
def blockchain_3b():
    ''' Pytest Fixture for a blockchain containing 3 blocks '''
    blockchain = Blockchain()
    for i in range(3):
        blockchain.add_block([Transaction(Wallet(), 'recipient', i).to_json()])
    return blockchain
Exemplo n.º 12
0
def test_transaction_chain_when_duplicate_tx(clone_blockchain):
    tx_instance = Transaction(Wallet(), "b13b2bf4", 1).serialize_to_json()
    clone_blockchain.add_block([tx_instance, tx_instance])

    with pytest.raises(Exception, match="is not unique;"):
        Blockchain.is_tx_chain_valid(clone_blockchain.chain)
Exemplo n.º 13
0
def clone_blockchain():
    blockchain = Blockchain()
    for i in range(3):
        blockchain.add_block(
            [Transaction(Wallet(), "b13b2bf4", i).serialize_to_json()])
    return blockchain
Exemplo n.º 14
0
def test_transaction():
    sender_wallet = Wallet()
    recipient = 'recipient'
    amount = 50
    transaction = Transaction(sender_wallet, recipient, amount)

    assert transaction.output[recipient] == amount

    assert transaction.output[
        sender_wallet.address] == sender_wallet.balance - amount

    assert 'timestamp' in transaction.input

    assert transaction.input['amount'] == sender_wallet.balance
    assert transaction.input['address'] == sender_wallet.address
    assert transaction.input['public_key'] == sender_wallet.public_key

    assert Wallet.verfiy(transaction.input['public_key'], transaction.output,
                         transaction.input['signature'])

    def test_transaction_exceeds_balance():
        with pytest.raises(Exception, match='Amount exceeds balance'):
            transaction(Wallet(), 'recipient', 9001)

    def test_transaction_update():
        sender_wallet = Wallet()
        first_recipient = 'first_recipient'
        first_amount = 50

        transaction = Transaction(sender_wallet, first_recipient, first_amount)

        next_recipient = 'next_recipient'
        next_amount = 75
        transaction.update(sender_wallet, next_recipient, next_amount)

        assert transaction.output[next_recipient] == next_amount
        assert transaction.output[sender_wallet.address] ==\
            sender_wallet.balance - first_amount - next_amount

        assert Wallet.verfiy(transaction.input['public_key'],
                             transaction.output,
                             transaction.input['signature'])

        to_first_again_amount = 25
        transaction(sender_wallet, first_recipient, to_first_again_amount)

        assert transaction.output[
            first_recipient] == first_amount + to_first_again_amount
        assert transaction.output[
            sender_wallet.
            address] == sender_wallet.balance - first_amount - next_amount - to_first_again_amount

        assert Wallet.verfiy(transaction.input['public_key'],
                             transaction.output,
                             transaction.input['signature'])

    def test_valid_transaction():
        Transaction.is_valid_transaction(Transaction(Wallet(), 'recipient',
                                                     50))

    def test_valid_transaction_invalid_output():
        sender_wallet = Wallet()
        transaction = Transaction(sender_wallet, 'recipient', 50)
        transaction.output[sender_wallet.address] = 9001

        with pytest.raises(Exception,
                           match='Invalid transaction output values'):
            Transaction.is_valid_transaction(transaction)

    def test_valid_transaction_invalid_signature():
        transaction = Transaction(Wallet(), 'recipient', 50)
        transaction.input['signature'] = Wallet().sign(transaction.output)

        with pytest.raises(Exception, match='Invalid signature'):
            Transaction.is_valid_transaction(transaction)

    def test_reward_transaction():
        miner_wallet = Wallet()
        transaction = Transaction.reward_transaction(miner_wallet)

        assert transaction.input == MINING_REWARD_INPUT
        assert transaction.output[miner_wallet.address] == MINING_REWARD

    def test_valid_reward_transaction():
        reward_transaction = Transaction.reward_transaction(Wallet())
        Transaction.is_valid_transaction(reward_transaction)

    def test_invalid_rt_er():
        reward_transaction = Transaction.reward_transaction(Wallet())
        reward_transaction.output['extra_recipient'] = 60

        with pytest.raises(Exception, match='Invalid mining reward'):
            Transaction.is_valid_transaction(reward_transaction)

    def test_invalid_rt_ia():
        miner_wallet = Wallet()
        reward_transaction = Transaction.reward_transaction(miner_wallet)
        reward_transaction.output[miner_wallet.address] = 9911

        with pytest.raises(Exception, match='Invalid mining reward'):
            Transaction.is_valid_transaction(reward_transaction)
Exemplo n.º 15
0
def test_is_valid_transaction_chain_duplicate_transactions(
        blockchain_three_blocks):
    transaction = Transaction(Wallet(), "recipient", 1).to_json()
    blockchain_three_blocks.add_block([transaction, transaction])
    with pytest.raises(Exception, match="is not unique"):
        Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
Exemplo n.º 16
0
def test_valid_transaction_with_invalid_signature():
    transaction = Transaction(Wallet(), "recipient", 50)
    transaction.input["signature"] = Wallet().sign(transaction.output)

    with pytest.raises(Exception, match="Invalid signature"):
        Transaction.is_valid_transaction(transaction)
Exemplo n.º 17
0
def test_is_valid_transaction_chain_bad_transaction(blockchain_three_blocks):
    bad_transaction = Transaction(Wallet(), "recipient", 1)
    bad_transaction.input["signature"] = Wallet().sign(bad_transaction.output)
    blockchain_three_blocks.add_block([bad_transaction.to_json()])
    with pytest.raises(Exception):
        Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
Exemplo n.º 18
0
def test_valid_transaction_with_invalid_outputs():
    sender_wallet = Wallet()
    transaction = Transaction(sender_wallet, 'recipient', 50)
    transaction.output[sender_wallet.address] = 9001
    with pytest.raises(Exception, match='Invalid transaction output values'):
        Transaction.is_valid_transaction(transaction)
Exemplo n.º 19
0
def populated_blockchain():
    blockchain = Blockchain()
    for i in range(3):
        blockchain.add_block([Transaction(Wallet(), 'recipient', i).to_json()])
    return blockchain
def test_transaction_when_exceeds_balance():
    with pytest.raises(Exception, match="Input amount exceeds balance."):
        Transaction(Wallet(), "b64e8ac4", 10000)
Exemplo n.º 21
0
def test_valid_transaction_chain_bad_transaction(populated_blockchain):
    bad_transaction = Transaction(Wallet(), 'recipient', 1)
    bad_transaction.input['signature'] = Wallet().sign(bad_transaction.output)
    populated_blockchain.add_block([bad_transaction.to_json()])
    with pytest.raises(Exception):
        Blockchain.is_valid_transaction_chain(populated_blockchain.chain)
def test_tx_update_when_exceeds_balance():
    sender_wallet = Wallet()
    transaction = Transaction(sender_wallet, "b64e8ac4", 50)

    with pytest.raises(Exception, match="Input amount exceeds balance."):
        transaction.tx_update(sender_wallet, "a13b2bf4", 10000)
def test_transaction_exceeds_balance():
    with pytest.raises(Exception, match="The amount exceeds sender's balance"):
        Transaction(Wallet(), 'recipient', 9000)
def test_is_tx_valid():
    Transaction.is_tx_valid(Transaction(Wallet(), "b64e8ac4", 50))
ROOT_PORT = 5000
PORT = ROOT_PORT

# peer instance, supports up to 1,000 peers
if os.environ.get("PEER") == "True":
    PORT = random.randint(5001, 6000)

    # fetch blockchain instance
    res = requests.get(f"http://localhost:{ROOT_PORT}/blockchain")
    res_blockchain = Blockchain.deserialize_from_json(res.json())
    try:
        blockchain.surrogate_chain(res_blockchain)
        print("\n -- Successfully synchronized local blockchain instance.")
    except Exception as err:
        print(f"\n -- Error synchronizing local blockchain instance. See: {err}")

# seeded test instance - creates 10 blocks w/2 Tx ea
if os.environ.get("SEED") == "True":
    for i in range(10):
        blockchain.add_block([
            Transaction(Wallet(),Wallet().address, random.randint(2, 50)).serialize_to_json(),
            Transaction(Wallet(),Wallet().address, random.randint(2, 50)).serialize_to_json()
        ])
    # set Tx in pool
    for i in range(3):
        transaction_pool.set_transaction(
                        Transaction(Wallet(),Wallet().address, random.randint(2, 50))
        )

app.run(port=PORT)
def test_is_tx_valid_when_invalid_sig():
    transaction = Transaction(Wallet(), "b64e8ac4", 50)
    transaction.input["signature"] = Wallet().gen_signature(transaction.output)
def test_transaction_update_exceeds_balance():
    sender_wallet = Wallet()
    transaction = Transaction(sender_wallet, 'recipient', 50)

    with pytest.raises(Exception, match='Amount exceeds balance'):
        transaction.update(sender_wallet, 'new_recipient', 9001)
Exemplo n.º 28
0
            known_addresses.update(transaction['output'].keys())
    return jsonify(list(known_addresses))

@app.route('/transactions')
@cross_origin(origin='localhost',headers=['Content- Type','Authorization'])
def route_transactions():
    return jsonify(transactionpool.transaction_data())

PORT=ROOT_PORT

if os.environ.get('PEER')=='True':
    PORT=random.randint(5001,6000)
    result=requests.get(f'http://localhost:{ROOT_PORT}/blockchain')
    result_blockchain=Blockchain.from_json(result.json())
    try:
      blockchain.replace_chain(result_blockchain.chain)
      print('\n successfully synchronised the local chain')
    except Exception as e:
        print(f' \n Error synchronising:{e}')
if os.environ.get('SEED_DATA')=='True':
    for i in range(10):
        blockchain.add_block([
            Transaction(Wallet(),Wallet().address,random.randint(2,50)).to_json(),
            Transaction(Wallet(),Wallet().address,random.randint(2,50)).to_json()

        ])
    for i in range(3):
        transactionpool.set_transaction(Transaction(Wallet(),Wallet().address,random.randint(2,50)))
print(blockchain)         
app.run(port=PORT)
def test_valid_transaction_with_invalid_signature():
    transaction = Transaction(Wallet(), 'recipient', 50)
    transaction.input['signature'] = Wallet().sign(transaction.output)

    with pytest.raises(Exception, match='Invalid signature'):
        Transaction.is_valid_transaction(transaction)
Exemplo n.º 30
0
def test_is_valid_transaction_invalid_signature():
    sender_wallet = Wallet()
    transaction = Transaction(sender_wallet, 'recipient', 100)
    transaction.input['signature'] = Wallet().sign(transaction.output)
    with pytest.raises(Exception, match='Invalid signature'):
        Transaction.is_valid_transaction(transaction)