Skip to content

Commit 9fd4ff2

Browse files
committed
Mine transactions and clear blockchain transactions from pool
1 parent a99b878 commit 9fd4ff2

5 files changed

Lines changed: 81 additions & 6 deletions

File tree

backend/app/__init__.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,10 @@ def route_blockchain():
2626

2727
@app.route('/blockchain/mine')
2828
def route_blockchain_mine():
29-
transaction_data = 'stubbed_transaction_data'
30-
31-
blockchain.add_block(transaction_data)
32-
29+
blockchain.add_block(transaction_pool.transaction_data())
3330
block = blockchain.chain[-1]
3431
pubsub.broadcast_block(block)
32+
transaction_pool.clear_blockchain_transactions(blockchain)
3533

3634
return jsonify(block.to_json())
3735

backend/pubsub.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ def message(self, pubnub, message_object):
3232

3333
try:
3434
self.blockchain.replace_chain(potential_chain)
35+
self.transaction_pool.clear_blockchain_transactions(
36+
self.blockchain
37+
)
3538
print('\n -- Successfully replaced the local chain')
3639
except Exception as e:
3740
print(f'\n -- Did not replace chain: {e}')

backend/scripts/test_app.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import requests
2+
import time
3+
4+
from backend.wallet.wallet import Wallet
5+
6+
BASE_URL = 'http://localhost:5000'
7+
8+
def get_blockchain():
9+
return requests.get(f'{BASE_URL}/blockchain').json()
10+
11+
def get_blockchain_mine():
12+
return requests.get(f'{BASE_URL}/blockchain/mine').json()
13+
14+
def post_wallet_transact(recipient, amount):
15+
return requests.post(
16+
f'{BASE_URL}/wallet/transact',
17+
json={ 'recipient': recipient, 'amount': amount }
18+
).json()
19+
20+
start_blockchain = get_blockchain()
21+
print(f'start_blockchain: {start_blockchain}')
22+
23+
recipient = Wallet().address
24+
post_wallet_transact_1 = post_wallet_transact(recipient, 21)
25+
print(f'\npost_wallet_transact_1: {post_wallet_transact_1}')
26+
27+
time.sleep(1)
28+
post_wallet_transact_2 = post_wallet_transact(recipient, 13)
29+
print(f'\npost_wallet_transact_2: {post_wallet_transact_2}')
30+
31+
time.sleep(1)
32+
mined_block = get_blockchain_mine()
33+
print(f'\nmined_block: {mined_block}')
Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,30 @@
11
from backend.wallet.transaction_pool import TransactionPool
22
from backend.wallet.transaction import Transaction
33
from backend.wallet.wallet import Wallet
4+
from backend.blockchain.blockchain import Blockchain
45

56
def test_set_transaction():
67
transaction_pool = TransactionPool()
78
transaction = Transaction(Wallet(), 'recipient', 1)
89
transaction_pool.set_transaction(transaction)
910

10-
assert transaction_pool.transaction_map[transaction.id] == transaction
11+
assert transaction_pool.transaction_map[transaction.id] == transaction
12+
13+
def test_clear_blockchain_transactions():
14+
transaction_pool = TransactionPool()
15+
transaction_1 = Transaction(Wallet(), 'recipient', 1)
16+
transaction_2 = Transaction(Wallet(), 'recipient', 2)
17+
18+
transaction_pool.set_transaction(transaction_1)
19+
transaction_pool.set_transaction(transaction_2)
20+
21+
blockchain = Blockchain()
22+
blockchain.add_block([transaction_1.to_json(), transaction_2.to_json()])
23+
24+
assert transaction_1.id in transaction_pool.transaction_map
25+
assert transaction_2.id in transaction_pool.transaction_map
26+
27+
transaction_pool.clear_blockchain_transactions(blockchain)
28+
29+
assert not transaction_1.id in transaction_pool.transaction_map
30+
assert not transaction_2.id in transaction_pool.transaction_map

backend/wallet/transaction_pool.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,25 @@ def existing_transaction(self, address):
1515
"""
1616
for transaction in self.transaction_map.values():
1717
if transaction.input['address'] == address:
18-
return transaction
18+
return transaction
19+
20+
def transaction_data(self):
21+
"""
22+
Return the transactions of thje transaction pool represented in their
23+
json serialized form.
24+
"""
25+
return list(map(
26+
lambda transaction: transaction.to_json(),
27+
self.transaction_map.values()
28+
))
29+
30+
def clear_blockchain_transactions(self, blockchain):
31+
"""
32+
Delete blockchain recorded transactions from the transaction pool.
33+
"""
34+
for block in blockchain.chain:
35+
for transaction in block.data:
36+
try:
37+
del self.transaction_map[transaction['id']]
38+
except KeyError:
39+
pass

0 commit comments

Comments
 (0)