用不到50行的Python代码构建最小的区块链


Posted in Python onNovember 16, 2017

译者注:随着比特币的不断发展,它的底层技术区块链也逐步走进公众视野,引起大众注意。本文用不到50行的Python代码构建最小的数据区块链,简单介绍了区块链去中心化的结构与其实现原理。

用不到50行的Python代码构建最小的区块链

尽管一些人认为区块链是一个等待问题的解决方案,但毫无疑问,这种新技术是计算机的奇迹。但是,区块链到底是什么呢?

区块链

它是比特币或其他加密货币进行交易的数字账本,账本按时间顺序记录并对外公开。

在更一般的术语中,它是一个公共数据库,新数据存储在一个名为块的容器中,并被添加到一个不可变链(后来的区块链)中添加了过去的数据。在比特币和其他加密货币的情况下,这些数据是一组交易记录。当然,数据可以是任何类型的。

区块链技术已经催生了新的、完全数字化的货币,如比特币和莱特币,这些货币并不是由中央政府发行或管理的。因此为那些认为今天的银行系统是骗局或终将失败的人带来了新的自由。区块链所包含的以太坊技术对分布式计算进行了变革创新,它引入了一些有趣的概念,比如智能合约

在本文中,我将用不到50行的Python2代码来做一个简单的区块链。我称它为SnakeCoin。

首先将定义块将是什么样子。在区块链中,每个块都存储一个时间戳和一个索引。在SnakeCoin中,需要把两者都存储起来。为了确保整个区块链的完整性,每个块都有一个自动识别散列。与比特币一样,每个块的散列将是块索引、时间戳、数据和前块哈希的加密哈希。数据可以是你想要的任何东西。

import hashlib as hasher

class Block:
 def __init__(self, index, timestamp, data, previous_hash):
 self.index = index
 self.timestamp = timestamp
 self.data = data
 self.previous_hash = previous_hash
 self.hash = self.hash_block()

 def hash_block(self):
 sha = hasher.sha256()
 sha.update(str(self.index) + 
    str(self.timestamp) + 
    str(self.data) + 
    str(self.previous_hash))
 return sha.hexdigest()

这一步后有块结构,但现在是创建区块链,所以需要向实际的链中添加块。如前所述,每个块都需要上一个块的信息。但是按照这个说法就有一个问题,区块链的第一个区块是如何到达那里的呢?不得不说,第一个块,或者说是起源块,它是一个特殊的块。在很多情况下,它是手动添加的,或者有独特的逻辑允许添加。

下面将创建一个函数简单地返回一个起源块以便产生第一个区块。这个块是索引0,它具有任意的数据值和“前一个哈希”参数中的任意值。

import datetime as date

def create_genesis_block():
 # Manually construct a block with
 # index zero and arbitrary previous hash
 return Block(0, date.datetime.now(), "Genesis Block", "0")

现在已经创建好了起源块,接下来需要一个函数,以便在区块链中生成后续的块。这个函数将把链中的前一个块作为参数,创建要生成的块的数据,并使用适当的数据返回新块。当新的块哈希信息来自前面的块时,区块链的完整性会随着每个新块而增加。如果不这样做,外部组织就更容易“改变过去”,用全新的方式取代已有的链条。这一系列的散列可以作为加密的证据,有助于确保一旦将块添加到区块链,它就不能被替换或删除。

def next_block(last_block):
 this_index = last_block.index + 1
 this_timestamp = date.datetime.now()
 this_data = "Hey! I'm block " + str(this_index)
 this_hash = last_block.hash
 return Block(this_index, this_timestamp, this_data, this_hash)

大部分的工作已经完成,现在可以创建区块链了。在这次的示例中,区块链本身是一个简单的Python列表。列表的第一个元素是起源块。当然,还需要添加后续的块,因为SnakeCoin是最小的区块链,这里只添加20个新的块。可以用for循环来生成新块。

# Create the blockchain and add the genesis block
blockchain = [create_genesis_block()]
previous_block = blockchain[0]

# How many blocks should we add to the chain
# after the genesis block
num_of_blocks_to_add = 20

# Add blocks to the chain
for i in range(0, num_of_blocks_to_add):
 block_to_add = next_block(previous_block)
 blockchain.append(block_to_add)
 previous_block = block_to_add
 # Tell everyone about it!
 print "Block #{} has been added to the blockchain!".format(block_to_add.index)
 print "Hash: {}\n".format(block_to_add.hash)

下面来测试一下目前产生的区块链。

用不到50行的Python代码构建最小的区块链

看到了吧,这就是区块链。如果希望在控制台中查看更多信息,可以编辑完整的源文件并打印每个块的时间戳或数据。

这就是SnakeCoin要提供的所有东西。为了使SnakeCoin规模达到今天生产区块链的规模,必须添加更多的功能,比如服务器层,以跟踪多台机器上的链变化,以及在给定的时间段内限制添加的块数量的工作算法

作者丨Gerald Nash
翻译丨黑色巧克力

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python爬虫入门教程之糗百图片爬虫代码分享
Sep 02 Python
常见的在Python中实现单例模式的三种方法
Apr 08 Python
使用Python绘制图表大全总结
Feb 11 Python
从DataFrame中提取出Series或DataFrame对象的方法
Nov 10 Python
python-OpenCV 实现将数组转换成灰度图和彩图
Jan 09 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
May 18 Python
Keras自定义IOU方式
Jun 10 Python
keras K.function获取某层的输出操作
Jun 29 Python
使用Nibabel库对nii格式图像的读写操作
Jul 01 Python
Python datetime模块的使用示例
Feb 02 Python
python的变量和简单数字类型详解
Sep 15 Python
python内置函数:lambda、map、filter简单介绍
Nov 16 #Python
Python编程使用NLTK进行自然语言处理详解
Nov 16 #Python
高质量Python代码编写的5个优化技巧
Nov 16 #Python
python使用fork实现守护进程的方法
Nov 16 #Python
详解Python map函数及Python map()函数的用法
Nov 16 #Python
python中lambda()的用法
Nov 16 #Python
Python reduce()函数的用法小结
Nov 15 #Python
You might like
多人战的战术与战略
2020/03/04 星际争霸
PHP 第二节 数据类型之数组
2012/04/28 PHP
四个PHP非常实用的功能
2015/09/29 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
php中序列化与反序列化详解
2017/02/13 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
斜45度寻路实现函数
2009/08/20 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
js函数定时器实现定时读取系统实时连接数
2014/04/30 Javascript
js 加密压缩出现bug解决方案
2014/11/25 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
2016/08/15 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
VUE : vue-cli中去掉路由中的井号#操作
2020/09/04 Javascript
初学python数组的处理代码
2011/01/04 Python
Python的time模块中的常用方法整理
2015/06/18 Python
Python+OpenCV人脸检测原理及示例详解
2020/10/19 Python
教你用Python创建微信聊天机器人
2020/03/31 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
详解python分布式进程
2018/10/08 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
python学生信息管理系统实现代码
2019/12/17 Python
python实现最速下降法
2020/03/24 Python
Pycharm修改python路径过程图解
2020/05/22 Python
聊聊python中的循环遍历
2020/09/07 Python
关于Kotlin中SAM转换的那些事
2020/09/15 Python
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
护士辞职信范文
2014/01/19 职场文书
职业生涯规划书怎么写?
2014/09/14 职场文书
2014教师党员自我评议(5篇)
2014/09/20 职场文书
辩护词格式
2015/05/22 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书
参观监狱警示教育心得体会
2016/01/15 职场文书