|
@@ -1,5 +1,5 @@
|
|
|
-from block import GENESIS_BLOCK, GENESIS_BLOCK_HASH
|
|
|
|
|
-from blockchain import Blockchain
|
|
|
|
|
|
|
+from .block import GENESIS_BLOCK, GENESIS_BLOCK_HASH
|
|
|
|
|
+from .blockchain import Blockchain
|
|
|
|
|
|
|
|
class ChainBuilder:
|
|
class ChainBuilder:
|
|
|
"""
|
|
"""
|
|
@@ -7,7 +7,7 @@ class ChainBuilder:
|
|
|
chain that it attempts to download and verify.
|
|
chain that it attempts to download and verify.
|
|
|
"""
|
|
"""
|
|
|
|
|
|
|
|
- def __init__(self):
|
|
|
|
|
|
|
+ def __init__(self, protocol):
|
|
|
self.primary_block_chain = Blockchain([GENESIS_BLOCK])
|
|
self.primary_block_chain = Blockchain([GENESIS_BLOCK])
|
|
|
self.unconfirmed_block_chain = []
|
|
self.unconfirmed_block_chain = []
|
|
|
|
|
|
|
@@ -16,18 +16,21 @@ class ChainBuilder:
|
|
|
|
|
|
|
|
self.chain_change_handlers = []
|
|
self.chain_change_handlers = []
|
|
|
|
|
|
|
|
|
|
+ protocol.block_receive_handlers.append(self.new_block_received)
|
|
|
|
|
+ protocol.trans_receive_handlers.append(self.new_transaction_received)
|
|
|
|
|
+
|
|
|
def new_transaction_received(self, transaction):
|
|
def new_transaction_received(self, transaction):
|
|
|
""" Event handler that is called by the network layer when a transaction is received. """
|
|
""" Event handler that is called by the network layer when a transaction is received. """
|
|
|
hash_val = transaction.get_hash()
|
|
hash_val = transaction.get_hash()
|
|
|
- if block_chain.get_transaction_by_hash(hash_val) is None:
|
|
|
|
|
- unconfirmed_transactions[hash_val] = transaction
|
|
|
|
|
|
|
+ if self.primary_block_chain.get_transaction_by_hash(hash_val) is None:
|
|
|
|
|
+ self.unconfirmed_transactions[hash_val] = transaction
|
|
|
|
|
|
|
|
def _new_primary_block_chain(self, chain):
|
|
def _new_primary_block_chain(self, chain):
|
|
|
"""
|
|
"""
|
|
|
Does all the housekeeping that needs to be done when a new longest chain is found.
|
|
Does all the housekeeping that needs to be done when a new longest chain is found.
|
|
|
"""
|
|
"""
|
|
|
self.primary_block_chain = chain
|
|
self.primary_block_chain = chain
|
|
|
- for (hash_val, trans) in self.unconfirmed_transactions:
|
|
|
|
|
|
|
+ for (hash_val, trans) in self.unconfirmed_transactions.items():
|
|
|
if not trans.verify(chain):
|
|
if not trans.verify(chain):
|
|
|
del self.unconfirmed_transactions[hash_val]
|
|
del self.unconfirmed_transactions[hash_val]
|
|
|
|
|
|
|
@@ -43,6 +46,7 @@ class ChainBuilder:
|
|
|
while unc[-1].prev_block_hash in self.block_cache:
|
|
while unc[-1].prev_block_hash in self.block_cache:
|
|
|
unc.append(self.block_cache[unc[-1].prev_block_hash])
|
|
unc.append(self.block_cache[unc[-1].prev_block_hash])
|
|
|
|
|
|
|
|
|
|
+
|
|
|
if unc[-1].height == 0:
|
|
if unc[-1].height == 0:
|
|
|
chain = Blockchain(unc[::-1])
|
|
chain = Blockchain(unc[::-1])
|
|
|
if chain.verify_all_transactions():
|
|
if chain.verify_all_transactions():
|
|
@@ -62,13 +66,13 @@ class ChainBuilder:
|
|
|
if self.unconfirmed_block_chain[-1].prev_block_hash == block.hash:
|
|
if self.unconfirmed_block_chain[-1].prev_block_hash == block.hash:
|
|
|
self.unconfirmed_block_chain.append(block)
|
|
self.unconfirmed_block_chain.append(block)
|
|
|
self.get_next_unconfirmed_block()
|
|
self.get_next_unconfirmed_block()
|
|
|
- else if self.unconfirmed_block_chain[0].hash == block.prev_block_hash:
|
|
|
|
|
|
|
+ elif self.unconfirmed_block_chain[0].hash == block.prev_block_hash:
|
|
|
self.unconfirmed_block_chain.insert(0, block)
|
|
self.unconfirmed_block_chain.insert(0, block)
|
|
|
|
|
|
|
|
- if block.height > self.unconfirmed_block_chain[0].height and block.height > self.primary_block_chain.get_height():
|
|
|
|
|
|
|
+ if block.height > self.unconfirmed_block_chain[0].height and block.height > self.primary_block_chain.head.height:
|
|
|
self.unconfirmed_block_chain = [block]
|
|
self.unconfirmed_block_chain = [block]
|
|
|
self.get_next_unconfirmed_block()
|
|
self.get_next_unconfirmed_block()
|
|
|
- elif block.height > self.primary_block_chain.get_height():
|
|
|
|
|
|
|
+ elif block.height > self.primary_block_chain.head.height:
|
|
|
self.unconfirmed_block_chain = [block]
|
|
self.unconfirmed_block_chain = [block]
|
|
|
self.get_next_unconfirmed_block()
|
|
self.get_next_unconfirmed_block()
|
|
|
|
|
|