class Server: def __init__(self,server_name="System"): self.server_name = server_name self.__miners = deque() self.__blockchain = BlockChain() self.__users = [User(self.server_name,float("inf"))] @staticmethod def from_dict(dict): server = Server(dict['server_name']) server.__blockchain = BlockChain.from_dict(dict['chain']) if not server.__blockchain.isValid(): raise Exception("Blockchain isn't valid") server.__users = [] for user in dict['users']: server.__users.append(User.from_dict(user)) return server def saveServerState(self): self.update() with open("server.json", 'w') as outfile: json.dump({ 'server_name' : self.server_name, 'chain' : self.__blockchain, 'users' : self.__users }, outfile, default=lambda o: o.__dict__, indent=4) @property def userCount(self): return len(self.__users) - 1 def isExistUser(self,username): for user in self.__users: if user.name == username: return True return False def newUser(self,username): if not self.isExistUser(username): self.__users.append(User(username,0)) print(f"New user {username} were created") return True print(f"{username} already exist") return False @staticmethod def findNextNonce(prev_nonce,difficulty,nonce=0): while hashlib.sha256(f'{prev_nonce}{nonce}'.encode()).hexdigest()[:difficulty] != "0"*difficulty: nonce+=1 return nonce def mineBlock(self,username): last_nonce = self.__blockchain.getChain()[-1].nonce nonce = self.findNextNonce(last_nonce,self.__blockchain.difficulty) if self.__blockchain.newBlock(nonce,username): self.__blockchain.newTransaction(Transaction(TransactionType.REWARD,self.server_name,username,self.__blockchain.difficulty/10)) self.update() return True return False def mine(self,username=None): if username: self.__miners.append(username) if len(self.__miners) == 0: return miner = self.__miners.popleft() while self.mineBlock(miner): print(f"{miner} mined new block!") miner = None if len(self.__miners) > 0: miner = self.__miners.popleft() else: break if miner is not None: self.__miners.appendleft(miner) def sendFromTo(self,sender_name,recipient_name,amount,message=""): sender = self.findUserByName(sender_name) if sender.balance >= amount: self.__blockchain.newTransaction(Transaction(TransactionType.FROMTO,sender_name,recipient_name,amount,message)) self.update() print(f"{sender_name} sent {recipient_name} {amount} with message \"{message}\"") return True print(f"{sender_name} tried to send {recipient_name} {amount} with message \"{message}\"") return False def buy(self,recipient_name,amount): self.__blockchain.newTransaction(Transaction(TransactionType.BUY,self.server_name,recipient_name,amount)) self.update() print(f"{recipient_name} bought {amount}") def sell(self,sender_name,amount): sender = self.findUserByName(sender_name) if sender.balance >= amount: self.__blockchain.newTransaction(Transaction(TransactionType.SELL,sender_name,self.server_name,amount)) self.update() print(f"{sender_name} sold {amount}") return True print(f"{sender_name} tried to sell {amount}") return False def findUserByName(self,username): for user in self.__users: if user.name == username: return user def getRandomUser(self): return random.choice(self.__users[1:]).name def updateBalance(self,username,delta): user = self.findUserByName(username) user.balance += delta def update(self): blocks_count = self.__blockchain.update() if blocks_count == 0: return blocks = self.__blockchain.getChain()[-blocks_count:] for block in blocks: for transaction in block.transactions: if transaction.type == TransactionType.REWARD: self.updateBalance(transaction.recipient,transaction.amount) elif transaction.type == TransactionType.FROMTO: self.updateBalance(transaction.recipient,transaction.amount) self.updateBalance(transaction.sender,-transaction.amount) elif transaction.type == TransactionType.BUY: self.updateBalance(transaction.recipient,transaction.amount) elif transaction.type == TransactionType.SELL: self.updateBalance(transaction.sender,-transaction.amount)
from blockchain import BlockChain from wallet import wallet #Robin Danz - Joris Monnet #He-Arc - Security if __name__ == '__main__': firstChain = BlockChain() firstChain.createFirstBlock() print(firstChain) firstWallet = wallet.create_wallet() secondWallet = wallet.create_wallet() print("Second Wallet values = " + str(secondWallet)) firstChain.mine(firstWallet["address"]) firstChain.mine(secondWallet["address"]) firstChain.createTransaction(firstWallet["address"], secondWallet["address"], 5) print(firstChain) secondChain = BlockChain() secondChain.createFirstBlock() secondChain.mine(firstWallet["address"]) secondChain.mine(firstWallet["address"]) secondChain.mine(firstWallet["address"]) print(secondChain) firstChain.replaceChain(secondChain.getChain()) print(firstChain)