逻辑烧脑:Python区块链的简易实现

发表于:2018-2-22 09:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:51Testing    来源:51Testing软件测试网原创

#
Python
分享:
  区块链技术因为比特币的火爆而广受关注,我们这里用 python 代码来聊一下区块链技术:
  区块链实现原理的简易描述
  区块链技术做为一种数字记账技术,其核心是将保存了交易数据的区块,以加密的方式,按时间的顺序链式记录。区块链本身就是一个公共的数据库,系统将新诞生的业务数据存储在被称为区块的容器之中,并将该区块添加到已有区块组成的链条之中。有点像贪吃蛇,吃的区块越多,蛇的身体越长;在比特币的应用场景下,这些数据是一组转账交易记录。在共享单车的应用场景下,这些数据就可以是借车还车的交易记录。
  区块链的简易实现代码
# -*- coding:utf-8 -*-
import hashlib
from datetime import datetime
# 定义区块类
class Block(object):
def __init__(self, index, time, data, pre_hash):
self.index = index
self.time = time
self.data = data
self.pre_hash = pre_hash
self.hash = self.hash_block()
def hash_block(self):
sha = hashlib.sha256()
sha.update("{}{}{}{}".format(self.index,self.time,self.data,self.pre_hash))
return sha.hexdigest()
# 创建初始区块
def head_block_create():
return Block(0,datetime.now(),"Head Block","0")
# 创建新的区块
def new_block(last_block):
_index = last_block.index + 1
_time = datetime.now()
_data = "block {}".format(_index)
_hash = last_block.hash
return Block(_index,_time,_data,_hash)
blockchain = [ head_block_create()]
pre_block = blockchain[0]
print "Block id:0 Hash value:{}".format(blockchain[0].hash)
# 待测新增区块的数量
num_block = 10
for i in range(num_block):
one_block = new_block(pre_block)
blockchain.append(one_block)
pre_block = one_block
  print "Block id:{} Hash value:{}".format(one_block.index, one_block.hash)
  在上述的代码中,区块链核心存储的数据结构是列表,通过 new_block()产生的新区块,被不断的增添到区块链的尾部,每个区块的 Hash 值中包含该区块所有的数据信息,在计算该 Hash 值的过程中需引用前一区块的 Hash 值,故而实现了防篡改。而区块链数据库的最大价值就是这种高度防篡改的可信计算。在我们的简易区块链实现中成功体现了这一点。在商用级的区块链应用中,新建区块的过程被称为智能合约,区块链就是通过智能合约不断的壮大。
  以下是代码的运行结果,在不同的时间下,运行结果不同。
  运行结果
Block id:0 Hash value:b04fc0d7ae7d5021da4e49cdbebaf3bc1e27d926a905cc365a160aaf5136692b
Block id:1 Hash value:3f6b49529a0333b359d49ddf6f91d7943f1a551d1d3374daa5510ad6b1eed517
Block id:2 Hash value:7089817515c5c9ef0ec0a4c50912b7c268345b9441aa870373949c3b2f804204
Block id:3 Hash value:28f20d2ea8ae5fef85acd89ad10370022930438a5329fa54eaf8bb8994c1cddc
Block id:4 Hash value:e033054800d81e60571611cf7fe845faefb5d0779b0604b931c17004aaea7ca1
Block id:5 Hash value:7428e1ab5a1bda7cd6fc62a210e9c1d4c807a9390b2b3726a304bfd120f3ea74
Block id:6 Hash value:0770614e40da99f52910946fcc8703565f6a13b40b88b272b66847fbf8efb38c
Block id:7 Hash value:2c2940adb46c77daefe6e5415d1cb1db991e9337e8fca763855d889baa5133aa
Block id:8 Hash value:e09d2e1183c3d7bb123f207c25ef9bdd387b2baad183730d62fb49811e0493e5
Block id:9 Hash value:b35deb22f71b0f845cf0ccdf4f999437bd78303e4ba5a09e633e2c1d14fd652c
Block id:10 Hash value:c63c5fbee68db81e40fdae2973c35b7e9556e9bbf2fd0737df3f145634f7e557

版权声明:51Testing软件测试网原创出品,未经明确的书面许可,任何人或单位不得对本文进行复制、转载或镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号