Я работаю через скрипт блокчейна. Он работает, но у меня возникает проблема с печатаемыми ключами, иногда они, кажется, повторно используют ключи из предыдущих блоков, не ссылаясь на «prevhash»
Код:
import hashlib
import json
class Block():
def __init__(self, nonce, tstamp, transaction, prevhash=""):
self.nonce = nonce
self.tstamp = tstamp
self.transaction = transaction
self.prevhash = prevhash
self.hash = self.calcHash()
def calcHash(self):
block_string = json.dumps({
"nonce":self.nonce,
"tstamp":self.tstamp,
"transaction":self.transaction,
"prevhash":self.prevhash
},sort_keys=True).encode
# hashId = hashlib.sha256(block_string).hexdigest()
hashId = hashlib.sha256()
hashId.update(repr(block_string).encode('utf-8'))
hashId = hashId.hexdigest()
return hashId
def __str__(self):
string = "nonce: " + str(self.nonce) + "\n"
# string += "tstamp: " + str(self.tstamp) + "\n"
# string += "transaction: " + str(self.transaction) + "\n"
string += "phash: " + str(self.prevhash) + "\n"
string += "chash: " + str(self.hash)
return string
def printHashes(self):
print("phash: ",self.prevhash)
print("chash: ",self.hash)
class Blockchain():
def __init__(self):
self.chain = [self.generateGenesisBlock(),]
def generateGenesisBlock(self):
return Block(0, '01/01/2018', '1000000')
def getLastBlock(self):
return self.chain[-1]
def addBlock(self, newBlock):
newBlock.prevhash = self.getLastBlock().hash
newBlock.hash = newBlock.calcHash()
self.chain.append(newBlock)
def isChainValid(self):
for i in range(1,len(self.chain)):
prevBlock = self.chain[i-1]
currentBlock = self.chain[i]
if(currentBlock.hash != currentBlock.calcHash()):
return False
if(currentBlock.prevhash != prevBlock.hash):
return False
return True
BCoin = Blockchain()
BCoin.addBlock(Block(1, '01/02/2018', 100))
BCoin.addBlock(Block(2, '01/14/2018', 200))
BCoin.addBlock(Block(3, '01/15/2018', 15))
BCoin.addBlock(Block(4, '01/16/2018', 324))
BCoin.addBlock(Block(5, '01/02/2018', 100))
BCoin.addBlock(Block(6, '01/14/2018', 200))
BCoin.addBlock(Block(7, '01/15/2018', 15))
BCoin.addBlock(Block(8, '01/16/2018', 324))
BCoin.addBlock(Block(9, '01/02/2018', 100))
BCoin.addBlock(Block(10, '01/14/2018', 200))
for block in BCoin.chain:
print(block)
# print(BCoin.isChainValid())
Выход:
phash:
chash: 19b00835428d29d63f2229933bf7067e7cec2057c19a90a51f22401c6571fd24
phash: 19b00835428d29d63f2229933bf7067e7cec2057c19a90a51f22401c6571fd24
chash: 687f54d1fbaabb7d43a009e87a9da34cd550a7e1a1c6499fb35a790bfbfd2bc4
phash: 687f54d1fbaabb7d43a009e87a9da34cd550a7e1a1c6499fb35a790bfbfd2bc4
chash: 687f54d1fbaabb7d43a009e87a9da34cd550a7e1a1c6499fb35a790bfbfd2bc4
phash: 687f54d1fbaabb7d43a009e87a9da34cd550a7e1a1c6499fb35a790bfbfd2bc4
chash: 6788d68d048817fd40a2c01e7f80a26efd23a3ae1f6fcb5fce87ae07f26cc18c
phash: 6788d68d048817fd40a2c01e7f80a26efd23a3ae1f6fcb5fce87ae07f26cc18c
chash: 687f54d1fbaabb7d43a009e87a9da34cd550a7e1a1c6499fb35a790bfbfd2bc4
Обратите внимание на повторное использование (chash) ключей из предыдущих блоков (1,2, & 4)
Часть проблемы связана с функцией hashlib.sha256. Исходный код дал мне ошибку, код замены должен был устранить ошибку, что и произошло, но затем я столкнулся с этой проблемой перефразировки.
# hashId = hashlib.sha256(block_string).hexdigest()
hashId = hashlib.sha256()
hashId.update(repr(block_string).encode('utf-8'))
hashId = hashId.hexdigest()
Кто-нибудь имеет представление о том, что является причиной этого?