用python构建一个极小的区块链

zxcv1234 zxcv1234     2022-11-23     439

关键词:

 

技术分享图片
 

 

虽然有些人认为区块链是一个早晚会出现问题的解决方案,但是毫无疑问,这个创新技术是一个计算机技术上的奇迹。那么,究竟什么是区块链呢?

区块链

以比特币(Bitcoin)或其它加密货币按时间顺序公开地记录交易的数字账本。

更通俗的说,它是一个公开的数据库,新的数据存储在被称之为区块(block)的容器中,并被添加到一个不可变的链(chain)中(因此被称为区块链(blockchain)),之前添加的数据也在该链中。对于比特币或其它加密货币来说,这些数据就是一组组交易,不过,也可以是其它任何类型的数据。

区块链技术带来了全新的、完全数字化的货币,如比特币和莱特币(Litecoin),它们并不由任何中心机构管理。这给那些认为当今的银行系统是骗局并将最终走向失败的人带来了自由。区块链也革命性地改变了分布式计算的技术形式,如以太坊(Ethereum)就引入了一种有趣的概念:智能合约(smart contract)。

在这篇文章中,我将用不到 50 行的 Python 2.x 代码实现一个简单的区块链,我把它叫做 SnakeCoin。

加vx;tanzhouyiwan 免费领取Python学习资料一套

不到 50 行代码的区块链

我们首先将从定义我们的区块是什么开始。在区块链中,每个区块随同时间戳及可选的索引一同存储。在 SnakeCoin 中,我们会存储这两者。为了确保整个区块链的完整性,每个区块都会有一个自识别的哈希值。如在比特币中,每个区块的哈希是该块的索引、时间戳、数据和前一个区块的哈希值等数据的加密哈希值。这里提及的“数据”可以是任何你想要的数据。

技术分享图片
 

 

真棒,现在我们有了区块的结构了,不过我们需要创建的是一个区块链。我们需要把区块添加到一个实际的链中。如我们之前提到过的,每个区块都需要前一个区块的信息。但问题是,该区块链中的第一个区块在哪里?好吧,这个第一个区块,也称之为创世区块,是一个特别的区块。在很多情况下,它是手工添加的,或通过独特的逻辑添加的。

我们将创建一个函数来简单地返回一个创世区块解决这个问题。这个区块的索引为 0 ,其包含一些任意的数据值,其“前一哈希值”参数也是任意值。

技术分享图片
 

 

现在我们可以创建创世区块了,我们需要一个函数来生成该区块链中的后继区块。该函数将获取链中的前一个区块作为参数,为要生成的区块创建数据,并用相应的数据返回新的区块。新的区块的哈希值来自于之前的区块,这样每个新的区块都提升了该区块链的完整性。如果我们不这样做,外部参与者就很容易“改变过去”,把我们的链替换为他们的新链了。这个哈希链起到了加密的证明作用,并有助于确保一旦一个区块被添加到链中,就不能被替换或移除。

技术分享图片
 

 

这就是主要的部分。

现在我们能创建自己的区块链了!在这里,这个区块链是一个简单的 Python 列表。其第一个的元素是我们的创世区块,我们会添加后继区块。因为 SnakeCoin 是一个极小的区块链,我们仅仅添加了 20 个区块。我们通过循环来完成它。

技术分享图片
 

 

让我们看看我们的成果:

技术分享图片

 

 

别担心,它将一直添加到 20 个区块

很好,我们的区块链可以工作了。如果你想要在主控台查看更多的信息,你可以编辑其完整的源代码并输出每个区块的时间戳或数据。

这就是 SnakeCoin 所具有的功能。要使 SnakeCoin 达到现今的产品级的区块链的高度,我们需要添加更多的功能,如服务器层,以在多台机器上跟踪链的改变,并通过工作量证明算法(POW)来限制给定时间周期内可以添加的区块数量。

如果你想了解更多技术细节,你可以在这里查看最初的比特币白皮书。

让这个极小区块链稍微变大些

这个极小的区块链及其简单,自然也相对容易完成。但是因其简单也带来了一些缺陷。首先,SnakeCoin 仅能运行在单一的一台机器上,所以它相距分布式甚远,更别提去中心化了。其次,区块添加到区块链中的速度同在主机上创建一个 Python 对象并添加到列表中一样快。在我们的这个简单的区块链中,这不是问题,但是如果我们想让 SnakeCoin 成为一个实际的加密货币,我们就需要控制在给定时间内能创建的区块(和币)的数量。

从现在开始,SnakeCoin 中的“数据”将是交易数据,每个区块的“数据”字段都将是一些交易信息的列表。接着我们来定义“交易”。每个“交易”是一个 JSON 对象,其记录了币的发送者、接收者和转移的 SnakeCoin 数量。注:交易信息是 JSON 格式,原因我很快就会说明。

 

技术分享图片
 

 

现在我们知道了交易信息看起来的样子了,我们需要一个办法来将其加到我们的区块链网络中的一台计算机(称之为节点)中。要做这个事情,我们会创建一个简单的 HTTP 服务器,以便每个用户都可以让我们的节点知道发生了新的交易。节点可以接受 POST 请求,请求数据为如上的交易信息。这就是为什么交易信息是 JSON 格式的:我们需要它们可以放在请求信息中传递给服务器。

技术分享图片
 

 

 

技术分享图片
 

 

真棒!现在我们有了一种保存用户彼此发送 SnakeCoin 的记录的方式。这就是为什么人们将区块链称之为公共的、分布式账本:所有的交易信息存储给所有人看,并被存储在该网络的每个节点上。

但是,有个问题:人们从哪里得到 SnakeCoin 呢?现在还没有办法得到,还没有一个称之为 SnakeCoin 这样的东西,因为我们还没有创建和分发任何一个币。要创建新的币,人们需要“挖”一个新的 SnakeCoin 区块。当他们成功地挖到了新区块,就会创建出一个新的 SnakeCoin ,并奖励给挖出该区块的人(矿工)。一旦挖矿的矿工将 SnakeCoin 发送给别人,这个币就流通起来了。

我们不想让挖新的 SnakeCoin 区块太容易,因为这将导致 SnakeCoin 太多了,其价值就变低了;同样,我们也不想让它变得太难,因为如果没有足够的币供每个人使用,它们对于我们来说就太昂贵了。为了控制挖新的 SnakeCoin 区块的难度,我们会实现一个工作量证明(Proof-of-Work)(PoW)算法。工作量证明基本上就是一个生成某个项目比较难,但是容易验证(其正确性)的算法。这个项目被称之为“证明”,听起来就像是它证明了计算机执行了特定的工作量。

在 SnakeCoin 中,我们创建了一个简单的 PoW 算法。要创建一个新区块,矿工的计算机需要递增一个数字,当该数字能被 9 (“SnakeCoin” 这个单词的字母数)整除时,这就是最后这个区块的证明数字,就会挖出一个新的 SnakeCoin 区块,而该矿工就会得到一个新的 SnakeCoin。

技术分享图片
 

 

现在,我们能控制特定的时间段内挖到的区块数量,并且我们给了网络中的人新的币,让他们彼此发送。但是如我们说的,我们只是在一台计算机上做的。如果区块链是去中心化的,我们怎样才能确保每个节点都有相同的链呢?要做到这一点,我们会使每个节点都广播其(保存的)链的版本,并允许它们接受其它节点的链。然后,每个节点会校验其它节点的链,以便网络中每个节点都能够达成最终的链的共识。这称之为共识算法(consensus algorithm)。

我们的共识算法很简单:如果一个节点的链与其它的节点的不同(例如有冲突),那么最长的链保留,更短的链会被删除。如果我们网络上的链没有了冲突,那么就可以继续了。

 

技术分享图片
 

 

我们差不多就要完成了。在运行了完整的 SnakeCoin 服务器代码之后,在你的终端可以运行如下代码。(假设你已经安装了 cCUL)。

1、创建交易

 

技术分享图片
 

 

2、挖一个新区块

 

技术分享图片
 

 

3、 查看结果。从客户端窗口,我们可以看到。

技术分享图片

 

 

对代码做下美化处理,我们看到挖矿后我们得到的新区块的信息:

技术分享图片
 

 

大功告成!现在 SnakeCoin 可以运行在多个机器上,从而创建了一个网络,而且真实的 SnakeCoin 也能被挖到了。

你可以根据你的喜好去修改 SnakeCoin 服务器代码,并问各种问题了。

加vx;tanzhouyiwan 免费领取Python学习资料一套
技术分享图片
 

 

 

技术分享图片
 

 

 

用go构建一个区块链--part7:网络(代码片段)

引言到目前为止,我们所构建的原型已经具备了区块链所有的关键特性:匿名,安全,随机生成的地址;区块链数据存储;工作量证明系统;可靠地存储交易。尽管这些特性都不可或缺,但是仍有不足。能够使得这些特性真正发... 查看详情

用go构建一个区块链--part6:交易(代码片段)

引言在这个系列文章的一开始,我们就提到了,区块链是一个分布式数据库。不过在之前的文章中,我们选择性地跳过了“分布式”这个部分,而是将注意力都放到了“数据库”部分。到目前为止,我们几乎已经实现了一个区块... 查看详情

用go构建一个区块链--part7:网络(代码片段)

...0c;进入src目录执行make即可。引言到目前为止,我们所构建的原型已经具备了区块链所有的关键特性:匿名& 查看详情

用go构建一个区块链----part1:基本原型(代码片段)

...中,我们将实现一个简化版的区块链,基于它来构建简化版的加密货币。区块让我们从“区块链”中的“区块”谈起。在区块链中,存储有效信息的是区块。比如,比特币区块存储的有效信息,就是比特币交... 查看详情

我居然用java构建了一个属于我自己的区块链(代码片段)

 正如我们所知,区块链的设计是不可变的。在这里,我们将设计一个简单的区块链,它将帮助您理解散列如何使区块链不可变,只需几行Java代码。注:这只是一个演示区块链,真正的区块链涉及很多其他... 查看详情

用python从零开始创建区块链(代码片段)

...源  https://learnblockchain.cn/2017/10/27/build_blockchain_by_python/ 本文主要内容翻译自LearnBlockchainsbyBuildingOne 本文原始链接,转载请注明出处。作者认为最快的学习区块链的方式是自己创建一个,本文就跟随作者用Python来创建... 查看详情

python区块链教程(代码片段)

来源https://zhuanlan.zhihu.com/p/141458648l  此区块链教程将详细介绍区块链背后的理论。区块链是数字货币比特币的基本构建块,此教程将讨论比特币的复杂性,全面解释区块链架构,并建立我们自己的区块链。SatoshiNakamoto创建... 查看详情

python区块链教程(代码片段)

来源  https://zhuanlan.zhihu.com/p/142136802  此区块链教程将详细介绍区块链背后的理论。区块链是数字货币比特币的基本构建块,此教程将讨论比特币的复杂性,全面解释区块链架构,并建立我们自己的区块链。本教程... 查看详情

用go构建一个区块链--part3:持久化和命令行接口(代码片段)

...进入src目录执行make即可。引言到目前为止,我们已经构建了一个有工作量证明机制的区块链。有了工作量证明ÿ 查看详情

用go构建一个区块链--part2:工作量证明(代码片段)

翻译的系列文章我已经放到了GitHub上:blockchain-tutorial,后续如有更新都会在GitHub上,可能就不在这里同步了。如果想直接运行代码,也可以cloneGitHub上的教程仓库,进入src目录执行make即可。在前面一文中,... 查看详情

区块链技术是怎么解决信任构建难题的?

导读区块链技术能够解决经济活动中的信任构建难题,打造更加公开透明的营商环境。我们应善加利用,以实现诚信山东建设的大提升、大突破。  区块链技术能够解决经济活动中的信任构建难题,打造更加公开透明的营商环... 查看详情

基于java语言构建区块链——工作量证明

引言在上一篇文章中,我们实现了区块链最基本的数据结构模型,添加区块以及和前一个区块连接在一起。但是,我们的实现方式非常简单,而真实的比特币区块链中,每一个区块的添加都是需要经过大量的计算才可以完成,这... 查看详情

40多行python代码开发一个区块链。(代码片段)

40多行python代码开发一个区块链?可信吗?我们将通过Python2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理。python开发区块链的源代码保存在Github。尽管有人认为区块链目前还是不成熟的解决方案,但它无疑... 查看详情

区块链很难吗?40行python开发一个区块链

...个迷你的区块链来帮你真正理解区块链技术的核心原理。python源代码保存在Github。区块链区块链是一个公开的数字账本,它按时间顺序记录比特币或其他加密货币发生的交易。更一般的讲,区块链是一个公共数据库,新的数据将... 查看详情

01-区块链入门之区块链介绍一-大叔思维

...分布式的银行记账系统。密码学者:区块链是使用密码学构建的去信任网络。码农:区块链就是一个确保最终一致性的分布式数据库 查看详情

设计和构建区块链社交媒体平台(代码片段)

...社交网络用例的理想选择。在本文中,我们将设计和构建一个名为Chirper的区块链社交媒体平台,它将在以太坊之上运行。内容设计社交媒体平台信息存储索引指定数据和控制流发布消息查找消息构建社交媒体平台应用程... 查看详情

怎么用javascript写一个区块链?

...语言都可以编写区块链开发程序。那么如何用JavaScript写一个区块链?以下我将要用JavaScript来创建1个简单的区块链来演示它们的内部到底是怎样工作的。我将会称作SavjeeCoin!  区块链是由一个个所有人能够访问的区块构成的... 查看详情

用区块链构建档案的信任

自古以来,档案在人类社会中作为一种记录信息,提供各种凭证的工具,起着十分重要的作用。而随着互联网的崛起,档案记录在获得便捷性、高效性的同时,它的信任体系也面临着巨大的冲击。尽管古老的... 查看详情