Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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)