Skip to content

Commit

Permalink
add multiprocessing and fix consensus
Browse files Browse the repository at this point in the history
  • Loading branch information
pdxwebdev committed Oct 9, 2018
1 parent 730829d commit cbb63da
Show file tree
Hide file tree
Showing 8 changed files with 550 additions and 292 deletions.
189 changes: 96 additions & 93 deletions node.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,14 @@ class ChatNamespace(BaseNamespace):
def on_error(self, event, *args):
print 'error'

def node():
def node(nonces=None):
latest_block_index = Value('i', 0)
my_peer = Config.peer_host + ":" + str(Config.peer_port)
Config.max_duration = 300000
Config.block_version = 1
p = Process(target=new_block_checker, args=(latest_block_index,))
#p = Process(target=new_block_checker, args=(latest_block_index,))
status = Array('c', 'asldkjf')
p.start()
#p.start()
Mongo.init()
# default run state will be to mine some blocks!
block = BU.get_latest_block()
Expand All @@ -68,107 +68,110 @@ def node():
block = BU.get_latest_block()
latest_block_index.value = block.get('index')

print '\r\n\r\n\r\n//// YADA COIN MINER ////'
start = time.time()
print '\r\n\r\n\r\n//// YADA COIN MINER v2 ////'

dup_test = Mongo.db.consensus.find({'peer': 'me', 'index': latest_block_index.value})
dup_tests = Mongo.db.consensus.find({'peer': 'me', 'index': latest_block_index.value}).sort([('index', -1)])
for dup_test in dup_tests:
if int(dup_test['block']['version']) == int(BU.get_version_for_height(dup_test['index'])):
return

if not dup_test.count():
transactions = Mongo.db.miner_transactions.find()
transaction_objs = []
unspent_indexed = {}
for txn in transactions:
try:
transaction = Transaction.from_dict(txn)
transaction.verify()
#check double spend
address = str(P2PKHBitcoinAddress.from_pubkey(transaction.public_key.decode('hex')))
if address in unspent_indexed:
unspent_ids = unspent_indexed[address]
else:
needed_value = sum([float(x.value) for x in transaction.outputs]) + float(transaction.fee)
res = BU.get_wallet_unspent_transactions(address, needed_value=needed_value)
unspent_ids = [x['id'] for x in res]
unspent_indexed[address] = unspent_ids
failed1 = False
failed2 = False
used_ids_in_this_txn = []
print '\r\n\r\n\r\n//// YADA COIN MINER v2 434345z////'
transactions = Mongo.db.miner_transactions.find()
transaction_objs = []
unspent_indexed = {}
for txn in transactions:
try:
transaction = Transaction.from_dict(txn)
transaction.verify()
#check double spend
address = str(P2PKHBitcoinAddress.from_pubkey(transaction.public_key.decode('hex')))
if address in unspent_indexed:
unspent_ids = unspent_indexed[address]
else:
needed_value = sum([float(x.value) for x in transaction.outputs]) + float(transaction.fee)
res = BU.get_wallet_unspent_transactions(address, needed_value=needed_value)
unspent_ids = [x['id'] for x in res]
unspent_indexed[address] = unspent_ids
failed1 = False
failed2 = False
used_ids_in_this_txn = []

for x in transaction.inputs:
if x.id not in unspent_ids:
failed1 = True
if x.id in used_ids_in_this_txn:
failed2 = True
used_ids_in_this_txn.append(x.id)
if failed1:
Mongo.db.miner_transactions.remove({'id': transaction.transaction_signature})
print 'transaction removed: input presumably spent already, not in unspent outputs', transaction.transaction_signature
Mongo.db.failed_transactions.insert({'reason': 'input presumably spent already', 'txn': transaction.to_dict()})
elif failed2:
Mongo.db.miner_transactions.remove({'id': transaction.transaction_signature})
print 'transaction removed: using an input used by another transaction in this block', transaction.transaction_signature
Mongo.db.failed_transactions.insert({'reason': 'using an input used by another transaction in this block', 'txn': transaction.to_dict()})
else:
transaction_objs.append(transaction)
except MissingInputTransactionException as e:
print 'missing this input transaction, will try again later'
except InvalidTransactionSignatureException as e:
print 'InvalidTransactionSignatureException: transaction removed'
for x in transaction.inputs:
if x.id not in unspent_ids:
failed1 = True
if x.id in used_ids_in_this_txn:
failed2 = True
used_ids_in_this_txn.append(x.id)
if failed1:
Mongo.db.miner_transactions.remove({'id': transaction.transaction_signature})
Mongo.db.failed_transactions.insert({'reason': 'InvalidTransactionSignatureException', 'txn': transaction.to_dict()})
except InvalidTransactionException as e:
print 'InvalidTransactionException: transaction removed'
print 'transaction removed: input presumably spent already, not in unspent outputs', transaction.transaction_signature
Mongo.db.failed_transactions.insert({'reason': 'input presumably spent already', 'txn': transaction.to_dict()})
elif failed2:
Mongo.db.miner_transactions.remove({'id': transaction.transaction_signature})
Mongo.db.failed_transactions.insert({'reason': 'InvalidTransactionException', 'txn': transaction.to_dict()})
except Exception as e:
print e
print 'rejected transaction', txn['id']
except BaseException as e:
print e
print 'rejected transaction', txn['id']
print '\r\nStarting to mine block height:', latest_block_index.value
try:
block = BlockFactory.mine(transaction_objs, Config.public_key, Config.private_key, Config.max_duration, output, latest_block_index, status)
print 'transaction removed: using an input used by another transaction in this block', transaction.transaction_signature
Mongo.db.failed_transactions.insert({'reason': 'using an input used by another transaction in this block', 'txn': transaction.to_dict()})
else:
transaction_objs.append(transaction)
except MissingInputTransactionException as e:
print 'missing this input transaction, will try again later'
except InvalidTransactionSignatureException as e:
print 'InvalidTransactionSignatureException: transaction removed'
Mongo.db.miner_transactions.remove({'id': transaction.transaction_signature})
Mongo.db.failed_transactions.insert({'reason': 'InvalidTransactionSignatureException', 'txn': transaction.to_dict()})
except InvalidTransactionException as e:
print 'InvalidTransactionException: transaction removed'
Mongo.db.miner_transactions.remove({'id': transaction.transaction_signature})
Mongo.db.failed_transactions.insert({'reason': 'InvalidTransactionException', 'txn': transaction.to_dict()})
except Exception as e:
raise
if block:
dup_test = Mongo.db.consensus.find({'peer': 'me', 'index': block.index})
if not dup_test.count():
print '\r\nCandidate submitted for index:', block.index
print '\r\nTransactions:'
for x in block.transactions:
print x.transaction_signature
Mongo.db.consensus.insert({'peer': 'me', 'index': block.index, 'id': block.signature, 'block': block.to_dict()})
print '\r\nSent block to:'
for peer in Peers.peers:
print e
print 'rejected transaction', txn['id']
except BaseException as e:
print e
print 'rejected transaction', txn['id']

print '\r\nStarting to mine block height:', latest_block_index.value, nonces[0], nonces[-1]
try:
block = BlockFactory.mine(transaction_objs, Config.public_key, Config.private_key, Config.max_duration, output, latest_block_index, status, nonces)
except Exception as e:
raise
if block:
dup_test = Mongo.db.consensus.find({'peer': 'me', 'index': block.index})
if not dup_test.count():
print '\r\nCandidate submitted for index:', block.index
print '\r\nTransactions:'
for x in block.transactions:
print x.transaction_signature
Mongo.db.consensus.insert({'peer': 'me', 'index': block.index, 'id': block.signature, 'block': block.to_dict()})
print '\r\nSent block to:'
for peer in Peers.peers:
try:
block_dict = block.to_dict()
block_dict['peer'] = my_peer
requests.post(
'http://{peer}/newblock'.format(
peer=peer.host + ":" + str(peer.port)
),
json=block_dict,
timeout=3,
headers={'Connection':'close'}
)
print peer.host + ":" + str(peer.port)
except Exception as e:
print e
try:
block_dict = block.to_dict()
block_dict['peer'] = my_peer
print 'reporting bad peer'
requests.post(
'http://{peer}/newblock'.format(
peer=peer.host + ":" + str(peer.port)
),
json=block_dict,
'https://yadacoin.io/peers',
json={'host': peer.host, 'port': str(peer.port), 'failed': True},
timeout=3,
headers={'Connection':'close'}
)
print peer.host + ":" + str(peer.port)
except Exception as e:
print e
try:
print 'reporting bad peer'
requests.post(
'https://yadacoin.io/peers',
json={'host': peer.host, 'port': str(peer.port), 'failed': True},
timeout=3,
headers={'Connection':'close'}
)
except:
print 'failed to report bad peer'
pass
else:
print 'greatest block height changed during mining'
except:
print 'failed to report bad peer'
pass
else:
print 'no block found'

end = time.time()
end = time.time()

p.terminate()

0 comments on commit cbb63da

Please sign in to comment.