外链论坛

 找回密码
 立即注册
搜索
查看: 64|回复: 6

从零初始用 Python 打造自己的区块链

[复制链接]

2979

主题

3万

回帖

9956万

积分

论坛元老

Rank: 8Rank: 8

积分
99569190
发表于 2024-7-29 09:53:26 | 显示全部楼层 |阅读模式

本文来自作者FrankGitChat上分享 「从零起始用 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.4

4. 拜访 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 中仔细说明。

倘若有任何其他的问题,欢迎到我的读者圈中继续提问。

扫描下方二维码

【阅读完整原文】

并在读者圈与作者交流





上一篇:黑客怎么样攻破一个网站?图文讲解全流程
下一篇:怎么样设计一个高性能短链系统?
回复

使用道具 举报

0

主题

1万

回帖

1

积分

新手上路

Rank: 1

积分
1
发表于 2024-8-25 11:51:28 | 显示全部楼层
期待你更多的精彩评论,一起交流学习。
回复

使用道具 举报

0

主题

1万

回帖

1

积分

新手上路

Rank: 1

积分
1
发表于 2024-9-7 02:11:05 | 显示全部楼层
楼主的文章深得我心,表示由衷的感谢!
回复

使用道具 举报

3129

主题

3万

回帖

9996万

积分

论坛元老

Rank: 8Rank: 8

积分
99968654
发表于 2024-10-1 22:49:23 | 显示全部楼层
外链论坛的成功举办,是与各位领导、同仁们的关怀和支持分不开的。在此,我谨代表公司向关心和支持论坛的各界人士表示最衷心的感谢!
回复

使用道具 举报

3063

主题

3万

回帖

9915万

积分

论坛元老

Rank: 8Rank: 8

积分
99158953
发表于 2024-10-6 16:23:46 | 显示全部楼层
你的见解独到,让我受益匪浅,期待更多交流。
回复

使用道具 举报

2940

主题

3万

回帖

9997万

积分

论坛元老

Rank: 8Rank: 8

积分
99979445
发表于 2024-10-13 05:36:33 | 显示全部楼层
期待楼主的下一次分享!”
回复

使用道具 举报

2983

主题

3万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109240
发表于 2024-10-29 01:17:33 | 显示全部楼层
你的话语真是温暖如春,让我心生感激。
回复

使用道具 举报

2979

主题

3万

回帖

9956万

积分

论坛元老

Rank: 8Rank: 8

积分
99569190
 楼主| 发表于 2024-11-5 00:45:18 | 显示全部楼层
论坛的成果是显著的,但我们不能因为成绩而沾沾自喜。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-20 17:04 , Processed in 1.280791 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.