用不到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判断字符串是否纯数字的方法
Nov 19 Python
python中字符串前面加r的作用
Jun 04 Python
Python构造自定义方法来美化字典结构输出的示例
Jun 16 Python
python3使用scrapy生成csv文件代码示例
Dec 28 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
django 多数据库配置教程
May 30 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
python: 自动安装缺失库文件的方法
Oct 22 Python
python3实现用turtle模块画一棵随机樱花树
Nov 21 Python
keras之权重初始化方式
May 21 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
Aug 17 Python
Python面试不修改数组找出重复的数字
May 20 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
SONY ICF-SW55的电路分析
2021/03/02 无线电
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
php调用自己java程序的方法详解
2016/05/13 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
Dreamweaver jQuery智能提示插件,支持版本提示,支持1.6api
2011/07/31 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
JavaScript中的ubound函数使用实例
2014/11/04 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
2015/02/17 Javascript
js 获取元素在页面上的偏移量的方法汇总
2015/04/13 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
js实现开启密码大写提示
2016/12/21 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
微信小程序 循环及嵌套循环的使用总结
2017/09/26 Javascript
微信小程序登录换取token的教程
2018/05/31 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
2019/06/10 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
Python fileinput模块使用介绍
2014/11/30 Python
安装dbus-python的简要教程
2015/05/05 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
python简单区块链模拟详解
2019/07/03 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
keras topN显示,自编写代码案例
2020/07/03 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
python Paramiko使用示例
2020/09/21 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
2013/01/09 HTML / CSS
html5 canvas实现圆形时钟代码分享
2013/12/25 HTML / CSS
遮罩层 + Iframe实现界面自动显示的示例代码
2020/04/26 HTML / CSS
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
请解释在new与override的区别
2012/10/29 面试题
仓管员岗位职责范文
2013/11/08 职场文书
建材业务员岗位职责
2013/12/08 职场文书
销售辞职报告范文
2014/01/12 职场文书
2015年环境整治工作总结
2015/05/22 职场文书
童年读书笔记
2015/06/26 职场文书
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL