记录一下简单的BlockChain的实现 Language: python
简介 BlockChain,说这个东西大家都会说,但是其中大有讲究. 今天我们就稍微的实现一下基本的框架,包括Block的基本结构,Chain的基本结构,以及一些基本的方法.
Block block,一个块,这个快能存什么呢?
1 2 3 4 5 Block{ data; Hash; PreviousHash; }
其中,data表示的就是这个块里存储的数据 PreviousHash存储的是前一个块的Hash 而这个Hash呢,是计算得到的. 今天的简易版区块链,不包含pow机制,不包含动态难度,就只是简单的实现,于是我使用的是PreviousHash和data的拼接的Hash来表示
(实际中需要加上难度指数,这样再加上刷新时间,就可以有效的防范攻击.其实本质上来说,是让对手没有那么足够的算力,来支持自己修改区块)
实现起来也很容易:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Block: def __init__(self, data, previousHash): self.data = data self.previousHash = previousHash self.ownhash = self.ComputeHash() def ComputeHash(self): '''计算Hash值''' sha256 = hashlib.sha256() sha256.update((str(self.data) + self.previousHash).encode("utf-8")) return sha256.hexdigest() def StandardOutput(self): '''标准化输出''' print("Block:\n\t\tData: {}\n\t\tOwnHash: {}\n\t\tPreviousHash: {}".format(self.data, self.ownhash, self.previousHash), end="\n")
这就是一个简单的Block类
Chain 这个链也很简单,就是把所有的Block串起来,利用Hash进行索引的一个特殊的链表 当然要实现它的纠错能力.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 class Chain: def __init__(self): self.chainlist = [self.GenesisBlock()] def GenesisBlock(self): '''创建祖先区块''' return Block("Genesis", "") def InsertNewBlock(self, data): '''插入新的区块''' newblock = Block(data, self.chainlist[-1].ownhash) self.chainlist.append(newblock) def StandardOutput(self): '''标准化输出''' print("Chain:\n", end="") for i in range(0, len(self.chainlist)): print("",end="\t") self.chainlist[i].StandardOutput() def ValidateChain(self): '''验证区块链是否合法''' for i in range(1, len(self.chainlist)): if self.chainlist[i].ownhash == self.chainlist[i].ComputeHash(): if self.chainlist[i].previousHash != self.chainlist[i-1].ownhash: print("前后区块链断裂") return False else: continue else: print("数据被篡改") return False return True
主函数部分 就可以发挥自己的想象力啦,想加什么就加什么,非常的方便.
比如:
1 2 3 4 5 6 7 8 9 if __name__ == "__main__": chain = Chain() chain.InsertNewBlock("我有十块钱") chain.InsertNewBlock("我有二十块钱") chain.InsertNewBlock("我有三十块钱") chain.InsertNewBlock("我有四十块钱") chain.InsertNewBlock("我有五十块钱") chain.StandardOutput() print(chain.ValidateChain())
然后输出结果就是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Chain: Block: Data: Genesis OwnHash: 81ddc8d248b2dccdd3fdd5e84f0cad62b08f2d10b57f9a831c13451e5c5c80a5 PreviousHash: Block: Data: 我有十块钱 OwnHash: e955d6b2656633c5855cfd08c9f96f4d6cf1233115c6b28ef2e8acb0ea0be9e0 PreviousHash: 81ddc8d248b2dccdd3fdd5e84f0cad62b08f2d10b57f9a831c13451e5c5c80a5 Block: Data: 我有二十块钱 OwnHash: 444d95fe961da65f4ab2990380c390c1558b7d0d516848dd332e9b7d62c632d0 PreviousHash: e955d6b2656633c5855cfd08c9f96f4d6cf1233115c6b28ef2e8acb0ea0be9e0 Block: OwnHash: c616e399a667b3a3f7c110b48e433846b6fd7f3fe703820b2a59ed61d2cc99ed PreviousHash: 444d95fe961da65f4ab2990380c390c1558b7d0d516848dd332e9b7d62c632d0 Block: Data: 我有四十块钱 OwnHash: 2619942d5689a95bfc899d503d702db784b14834d34ea5000c3c1625a89558e7 PreviousHash: c616e399a667b3a3f7c110b48e433846b6fd7f3fe703820b2a59ed61d2cc99ed Block: Data: 我有五十块钱 OwnHash: 5b931c9e6e7da60d5a74203264ed49fd5111e064df80acf642fb6220ebf9d642 PreviousHash: 2619942d5689a95bfc899d503d702db784b14834d34ea5000c3c1625a89558e7 True
这也就预示着,这个简单的区块链就完成啦.