本文来自作者Frank在GitChat上分享 「从零起始用 Python 打造自己的区块链」
编辑 | 毛利
前言
2018 年 4 月败兴,随着加密货币价格的回升,各样关于区块链的专题甚嚣尘上,各大媒介对其商场性质、技术原理、发展前景各个方面,都有各样非常深入的探讨。
同期,新的项目、概念亦层出不穷,让人眼花缭乱。笔者认为,“区块链” 本质上还是一种软件算计 / 架构上的创新。
仅有自己搭建环境,编写代码,实现从创立账本到完成交易的全过程,才可真正体会区块链的精髓。
比特币近十年来的价格逐波提升
本场 Chat 的目的是,便是帮忙广大的区块链兴趣者或研发人员,从零起始打造属于您自己的区块链应用。
力求用最简单的语言,介绍这个最热门的技术,无任何基本的读者亦能按图索骥,一窥到底,消除各样专家为其增添的非常多迷思。
本文首要将介绍有些区块链的背景知识,而后将循序渐进地介绍在本地研发区块链应用所需要的模块和算法,做出一个简单的区块链交易程序。
这里过程中,会穿插非常多关于关联名字、术语、算法的解释。关联源代码都保留在笔者的 GitHub 项目中(https://github.com/marmul2/blockchain),欢迎读者直接运用或提交修改申请(pull request)。
GitHub 是一个面向开源及个人软件项目的托管平台,由于只支持 git 做为独一的版本管理格式,故名 GitHub。
由于这里聚集了超过 350 万研发者,其中又以男性程序员为主,因此被戏叫作为 “全世界最大同性交友网站”。
它不但支持代码的发布、管理,还供给了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱、代码片段分享等功能。
任何用户都能够在其上保留和发布自己的个人项目,非常多知名的开源项目如 Ruby on Rails、jQuery、python 等都托管在该平台上。
1. 区块链简介
一位名为 “中本聪” (Satoshi Nakamoto) 的人于 2008 年 11 月 1 日,在 metzdowd.com网站的秘码学邮件列表中,发布了一篇名为《比特币:一种点对点式的电子现金系统》(Bitcoin: A Peer to Peer Electronic Cash System) 的论文,首次提出了 “区块链”(Blockchain)的概念。
白皮书发布之后不久,中本聪于 2009 年 1 月 3 日,研发出首个实现了比特币算法的客户端程序,并进行了首次 “采矿”,得到了第1批 50 个比特币。
这标志着比特币的正式诞生。中本聪出于知识分享和推广的理念,把比特币程序的代码所有开源,与世界各地的软件研发人员一起分享。
中本聪的原始论文
经过这十年的发展,区块链已然发展作为全世界最具影响力的创新技术之一。
从金融行业、制造制品到教育公司的各行各业,都可能会被这项技术全面改造。它的三大最重点的特点是:
去中心化交易
区块链的本质是一种分散在所有用户电脑上(即所说的 “分布式”)的计算机账本,每一个分散的账本会记录区块链上进行的所有交易活动的信息。因此,它不需要一个集中的公司、网站、机构来管理这些信息。
法国大作家大仲马在 1884 这年出版的小说《三个火枪手》中有这么一句著名的话,“人人为我,我为人人”(All for one, one for all)。用这句话来形容区块链的去中心化特征非常贴切。
信息不可篡改,一旦写入没法改变
做为一个记录交易的账本,人们最不期盼的是它被暴徒恶意篡改。任何一个用户,都能够经过交易编号,拜访区块链上出现的所有交易记录和注释。
因为中本聪巧妙的算法设计,协同秘码限制和共识机制,倘若要修改区块链中的某一个数据,就必须更改其后出现的所有数据记录,计算量无可想象,非常庞大,几乎不可能实现。
实质上,比特币诞生到此刻已然接近 10 年,每日都有没有数的黑客绞尽脑汁攻击这个系统,然则从来无出现过一块交易记录被篡改的事件,这足以证明了它的安全性。
完全匿名
在互联网诞生初期,有句话说:“在互联网上,没人知道你是一只狗。” 这强调的是在互联网上的匿名拜访性。
在区块链世界里,所有的账户(或说 “钱包”)都是经过一个秘码来拜访。倘若你失去了秘码,亦就失去了账户里面的所有货币。
在现实生活中,倘若你忘记了秘码或丢失了银行卡,你能够去银行柜台申请补办,手续很简单。
然则在 “去中心化” 的区块链世界里,无这样的 “银行柜台”,谁亦不晓得你是谁,你亦没法向别人证明你是某个钱包的主人。
当然,与大部分技术同样,区块链亦是一个 “双刃剑”,有它的不足之处:
过度消耗能源
想要生成一个新的区块,必须要海量服务器资源进行海量无谓的尝试性计算进行 “挖矿”,严重耗费电能(后文将仔细介绍 “挖矿” 的过程)。
信息的网络延迟
以比特币为例,任何一笔交易数据都需要同步到其他所有节点,同步过程中难免会受到网络传输延迟的影响,带来较长的耗时。
区块链应用的实质研发,能够分为以下几步。下面咱们将针对每一个过程仔细介绍。
除了重点介绍环境配置的第二节和介绍交易过程的第七节以外,其他过程都分为概念介绍、代码实现、深入讲解这三个部分。
所有代码均已放在我的 GitHub 项目之中,您能够直接下载运用。倘若对详细的代码实现不感兴趣,您亦能够直接只关注每节中的概念介绍和深入讲解这两个部分。
倘若您对详细的算法亦不感兴趣,不碍事,您能够直接跳过这些部分,进入第七节,逐步尝试自己完成 “虚拟交易”。
2. 环境配置:创立 “交易所”
为了便于初学者学习,笔者会尽可能仔细地记录研发环境配置的每一个过程,倘若您已然熟练 Python 环境和关联模块的运用,您能够选取跳过这一部分。
1. 首要,您需要一台安装了 Win7 或 Win10 系统的电脑,能够是台式机或是笔记本电脑。
当然,不必定非要用 Windows 系统来研发区块链应用,Linux 或 Mac 系统亦是很好的选取,这儿咱们为了照顾大部分读者,只介绍 Windows 系统下的操作。
2. 拜访 www.python.org,下载并安装 Python 3.6.5 或将来的更高版本。
下载Python
3. 安装完毕 Python 之后,从 Windows 的起始菜单输入 “cmd”:
在命令行窗口输入以下指令,安装 Flask 和 requests 库。Flask 库将用于在本地构建一个 Web 服务器,把 Python 的功能映射到必定的端口,便于咱们稍后经过针对区别的位置终端(endpoint)发送 HTTP 请求,执行各项交易,从而形成咱们自己的 “虚拟交易所” ;requests 库则用于自动发送 HTTP 请求到服务器。 c:\>easy_install pip
c:\>pip install Flask==0.12.2 requests==2.18.44. 拜访 https://www.getpostman.com/apps, 下载并安装 Postman,它能够把咱们定制的交易内容,发送到咱们的 “虚拟交易所”。
Postman的起始界面
5. 此刻,打开电脑在带的写字板编辑器,保留这般一个文件到 D:\hello.py:
from flask import Flask
app = Flask(__name__)@app.route(/)def hello_world():
return 您好,欢迎来到我的虚拟货币交易所!
这儿实质上用的 Flask 模块的路由功能,详细语法信息请参阅 Flask 介绍页面(http://flask.pocoo.org/docs/0.12/quickstart/#a-minimal-application)。
6. 回到命令行掌控界面,输入下列指令:
c:\>set FLASK_APP=D:\hello.py
c:\>python -m flask run
你能够看到屏幕表示 “Running on https://127.0.0.1:5000/”。 此时,打开你的浏览器,拜访 https://127.0.0.1:5000/, 你能够看到这般的表示结果:
交易所起始运行
这就寓意着,咱们的运行环境已然搭建成功,您的 “虚拟交易所” 已然准备好接受交易了!
3. 构建区块链:把 “区块” ,“链” 到一块3.1 概念介绍
“区块链”(Blockchina)能够理解为把一个个符合特定格式的区块(Block),根据必定的办法 “链”(chain)到一块。
这儿先预习几个需要触及的概念:
“类” (class):类是面向对象程序设计中的概念,是面向对象编程的基本。
类是对现实生活中一类拥有一起特征的事物的抽象,譬如区块链这个概念,便是一类拥有一起特征的事物,咱们能够用一个类来表率它。
类能够描述一个对象(在本文中即某个区块链)能够做什么,以及做的办法(method)。
哈希值(Hash):所说 “哈希值” 便是计算机能够对任意内容,计算出一个长度相同的特征值。
区块链的哈希值长度是 256 位,这亦便是说,不管原始内容是什么,最后都会计算出一个 256 位的二进制数字。
况且能够保准,只要原始内容区别,对应的哈希必定是区别的。举例来讲,字符串 123 的哈希值是 a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0(十六进制),转成二进制便是 256 位,况且仅有 123 能得到这个哈希。
(理论上,其他字符串亦有可能得到这个哈希,然则概率极低,能够近似认为不可能出现。) 由此可以得到两个重要的结论:
结论 1:每一个区块的哈希都是不同样的,能够经过哈希标识一个区块。
结论 2:倘若区块的内容变了,它的哈希必定会改变。 3.2 代码实现
首要,咱们要用一个构造函数来创建一个区块链类 ,其中包含两个表:一个用于存储区块,一个用于记录交易。另一,咱们还要定义一个办法,用于生成区块的哈希值。
另外,咱们还为这个类定义了一个属性 last_block, 这般能够经过调用该类得到区块链中最后一个区块的信息。下面是这个类的初步结构: class Blockchain(object):
def __init__(self):self.chain = []
self.current_transactions = []def new_block(self):
# 创建一个新的区块
pass
def new_transaction(self):
# 把新的交易添加到交易列表中
pass
@staticmethod
def hash(block):
# 生成一个区块的哈希值
pass
@property
def last_block(self):
# 返回链中的最后一个区块
pass
这个类负责管理全部区块链,包含存储交易信息,把新的区块添加到全部区块链之中。
下面,咱们再来瞧瞧一个典型的区块是什么样的,以及它们是怎么形成一条区块链的。根据中本聪的原始定义,下面是一个典型的区块: block = { index: len(self.chain) +1, # 区块编号,即区块链之前长度+1
timestamp: time(), # 区块生成时间的UNIX时间戳
previous_hash: previous_hash or self.hash(self.chain[-1]), #上一个区块的哈希值,另一需要思虑第1个区块的状况
proof:proof, # 工作量证明(PoW),稍后会仔细介绍
transactions: [
{ sender: sender_hash, #付款人钱包位置
recipient: recipient_hash, #收款人钱包位置
amount: tranactions_ammount,#交易金额
}
], # 区块中的交易信息
}3.3 深入讲解
由上面的定义能够看出,一个区块包含下面几项内容:
区块索引 / 编号
区块产生时间
上一个区块的哈希值
工作量证明(PoW)
交易信息
这揭示了区块链的核心理念:每一个区块中包括了上一个区块的哈希值或说信息。这一点对区块链有重大道理:倘若有人修改了一个区块,该区块的哈希值就变了。
为了让后面的区块还能连到它,就必须依次修改后面所有的区块,否则被改掉的区块就脱离区块链了。
因为哈希值的计算非常耗时(后面将解释原由),短期内修改多个区块几乎不可能出现,除非有人真的把握了全世界网络中 51% 以上的计算能力。
正是经过这种联动机制,区块链保准了自己的靠谱性,数据一旦写入,就没法被篡改。这就像历史同样,出现了便是出现了,从此再没法改变。每一个区块都连着上一个区块,这亦是 “区块链” 这个名字的由来。
4. 记录交易: 怎么给区块添加交易记录?4.1 概念介绍
在创立起区块链之后,接下来咱们瞧瞧怎么为其添加交易信息。所说 “交易”(Transaction)的过程,实质上便是给区块链加一笔数据更新的记录,其中包括了付款人的钱包位置、收款人的钱包位置、交易金额。倘若把区块链做为一个状态机,则每次交易便是试图改变一次状态,而每次生成的区块,便是参与者针对区块中交易引起状态改变的结果进行确认。 4.2 代码实现
详细的添加过程,是经过 new_transaction 这个办法来实现的。下面是对这个办法的定义实例。
......
5. “挖矿” 解密
6. 在网络中传播区块链:共识算法
7. 执行交易
后记
本 Chat 中所有的代码都安置在我的 GitHub 项目 “Frank—Blockchain” 上,请自由索取或提交修改。
或您亦能够分叉(fork)一个自己的分支,创建您自己的区块链项目。开句玩笑话,这就像是在麻将的基本原则基本上,开辟出各样分支:四川麻将、上海麻将等等。
期盼本 Chat 能帮忙您认识并实践区块链的基本概念和实现办法。请重视,这儿说到的只是区块链最核心的部分,还有非常多非常多其他的技术细节和算法,譬如非对叫作加密、点对点网络等,我将会在以后的其他 Chat 中仔细说明。
倘若有任何其他的问题,欢迎到我的读者圈中继续提问。
扫描下方二维码
【阅读完整原文】
并在读者圈与作者交流
|