Blockchain
Blockchain
import requests
import base64
import json
class Blockchain:
# Genesis block
self.bank = local_address
# Genesis transaction
self.genesis.transactions.append(transaction)
self.genesis.timestamp = 0
self.genesis.current_hash = self.genesis.get_hash()
self.blocks = [self.genesis] # List of added blocks (aka chain)
user.total_htbc += transaction[1]
db.session.commit()
def __str__(self):
# Ignore genesis
return chain
if self.validate_block(new_block, 1):
self.blocks.append(new_block)
user.total_htbc += transaction[1]
db.session.commit()
if new_block.transactions[0].receiver_address == self.bank:
user = User.query.filter_by(public_address =
new_block.transactions[0].sender_address).first()
user.paid_htbc += new_block.transactions[0].amount
db.session.commit()
return self
nonce = 0
block_to_mine = block
block_to_mine.nonce = nonce
# Update hash
block_hash = block_to_mine.get_hash()
nonce += 1
block_to_mine.nonce = nonce
block_hash = block_to_mine.get_hash()
block_to_mine.current_hash = block_hash
self.add_block(block_to_mine)
return
new_blocks = possible_chain
tmp_blockchain = []
transactions = []
for t in block["transactions"]:
if id == 0:
transaction = Transaction(sender_address=t["sender_address"],
receiver_address=t["receiver_address"],
amount=int(t["amount"]),
transaction_inputs=t["transaction_inputs"],
ids=t["user_id"], genesis=True)
else:
transaction = Transaction(sender_address=t["sender_address"],
receiver_address=t["receiver_address"],
amount=int(t["amount"]),
transaction_inputs=t["transaction_inputs"],
ids=t["user_id"])
transaction.transaction_id = t["transaction_id"]
transaction.signature = t["signature"]
transaction.transaction_outputs = t["transaction_outputs"]
transaction.change = int(t["change"])
transactions.append(transaction)
block = Block(block["index"], transactions, block["nonce"],
block["previous_hash"],
block["timestamp"])
block.current_hash = block.get_hash()
tmp_blockchain.append(block)
self.blocks = tmp_blockchain
return self
def to_od(self):
od = OrderedDict([
])
return od
def to_od_with_hash(self):
od = OrderedDict([
])
return od
def to_json(self):
return False
# Validate signature
to_test = deepcopy(block.transactions[0])
to_test.signature = ""
to_test = to_test.to_json()
h = SHA.new(to_test.encode('utf8'))
pub_key = block.transactions[0].sender_address
public_key = RSA.importKey(pub_key)
sign_to_test = PKCS1_v1_5.new(public_key)
if not(sign_to_test.verify(h, base64.b64decode(block.transactions[0].signature))):
return False
if block.transactions[0].receiver_address ==
self.genesis.transactions[0].receiver_address \
or block.transactions[0].receiver_address == block.transactions[0].sender_address:
None
else:
if block.transactions[0].sender_address ==
self.genesis.transactions[0].receiver_address:
None
else:
return False
# Verify the amount of money, verify that the sender has enough money to send
if new_chain == False:
user = User.query.filter_by(public_address =
block.transactions[0].sender_address).first()
return False
# Maybe the chain got updated, user still needs initial bonus money
if block.transactions[0].sender_address ==
self.genesis.transactions[0].receiver_address:
block.previous_hash = self.blocks[-1].current_hash
self.mine_block(block, 1)
return False
return True
money = {}
if index == 0:
money[block.transactions[0].receiver_address] = block.transactions[0].amount
block.current_hash = block.get_hash()
continue
amount = block.transactions[0].amount
change = block.transactions[0].change
if block.current_hash != block.get_hash():
return False
return False
if not(self.validate_block(block, 1, new_chain=True)):
return False
return False
money[block.transactions[0].sender_address] =
money[block.transactions[0].sender_address] - amount
try:
money[block.transactions[0].receiver_address] += amount
except:
money[block.transactions[0].receiver_address] = amount
#If we reach this part we need to update the DB with the new info
user.total_htbc = htbcs
db.session.commit()
return True