BlcokChain[1]--SimpleBlockChian

BlcokChain[1]--SimpleBlockChian

一月 16, 2020

记录一下简单的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

这也就预示着,这个简单的区块链就完成啦.