了解区块链(代码片段)

jiangchunsheng jiangchunsheng     2022-12-18     696

关键词:

尽管有人认为区块链 (blockchain) 是一个答案先于问题的技术,但毫无疑问, 这项新的技术已然是一个计算的奇迹。不过,到底区块链是什么呢

 

区块链

   一个随时间增长,记录比特币或其他加密货币的交易的公开数字账本。

    简单来说,区块链是一个公开的数据库,新的数据会被存储到一个叫做区块 (block) 的数据结构中,而区块会被添加到一个不可更改的链 (chain) 上 (也就是区块链),该链上存储着过去所添加的所有数据。在比特币和其他一些加密货币中,这些数据就是交易。不过,实际上,这些数据可以是任何类型。

 

    区块链技术催生了像比特币,莱特币这样全新的完全数字资产,它们不由任何一个中心权威机构发行或管理。这给那些不信任现有银行系统的个人带来了新的选项。区块链也重新定义了分布式计算,出现了像以太坊这样的技术,它引入了像智能合约这样新的概念

 

    在本文,我将会通过不到 50 行的 Python 代码构建一个简单的区块链原型(原文代码为 Python 2,分为多个部分托管于 gist。译者已将其改为 Python 3,并将源码放到了 GitHub 上,点击 这里 查看。),就叫 SnakeCoin 吧。

 

    首先,来定义我们的区块大概是什么样。在区块链中,每个区块都需要一个时间戳 (timestamp) 和一个可选的索引 (index)。在 SnakeCoin 中,我们会同时存储这两项。为了确保区块链的完整性,每个区块都需要有一个能够识别自身身份的哈希 (hash)。在比特币中,每个区块的哈希对区块索引、时间戳、数据和前一区块哈希所有内容的一个加密哈希。此外,数据可以是任何你想要存储的任何内容。

 

 

 1 import hashlib as hasher
 2 
 3 class Block:
 4     def __init__(self, index, timestamp, data, previous_hash):
 5         self.index = index
 6         self.timestamp = timestamp
 7         self.data = data
 8         self.previous_hash = previous_hash
 9         self.hash = self.hash_block()
10 
11     def hash_block(self):
12         sha = hasher.sha256()
13         sha.update(
14             bytes(
15                 str(self.index) + str(self.timestamp) + str(self.data) + str(
16                     self.previous_hash), utf-8))
17         return sha.hexdigest()

很好,已经有了区块结构,但是我们构建的是一个区块链。所以,我们需要将区块添加到真正的链上。正如前文所说,每个区块都需要前一个区块的信息。如此一来,就出现了一个问题:区块链中的第一个区块是如何而来? 第一个区块,或者一般叫做创始块(genesis block), 这是一个十分特殊的块。在很多情况下,它是通过手动或是一些特殊的逻辑添加到区块链中。

 

为简便起见,我们创建一个简单返回创世块的函数。创始块的索引为 0,有一个任意的数据值,一个属于 “前一个哈希” 参数的任意值。

1 import datetime as date
2 def create_genesis_block():
3     #  Manually construct a block with index 0 and arbitrary previous hash
4     return Block(0, date.datetime.now(), "Genesis Block", "0")

现在我们已经创建一个创世块,接下来我们需要一个能够在区块链中生成后续区块的函数。这个函数接受区块链中的前一个区块作为参数,创建所要生成区块的数据,然后返回带有数据的新区块。当新区块对前面的区块信息进行哈希时,区块链的完整性将会得到进一步增强。如果我们不对以前的区块信息进行哈希,那么第三者就能够轻易地“篡改历史”,用一个他们自己的链替换我们的链。区块链的哈希就像是一个加密证明,它能够保证一旦一个区块被加入到区块链中,那么这个区块就永远无法被替换或者移除。

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

这就是整个部分最困难的地方了。现在,可以来创建我们的区块链了!在我们的案例中,区块链其实仅仅是一个 Python 的列表。列表的第一个元素是创世块。当然了,我们需要增加后续区块。因为这只是一个极简的区块链模型,我们仅添加 20 个新的区块。可以通过一个循环来添加。

 1 #  Create the blockchain and add the genesis block
 2     blockchain = [create_genesis_block()]
 3     previous_block = blockchain[0]
 4 
 5     #  How many blocks should we add to the chain after the genesis block
 6     num_of_blocks_to_add = 20
 7 
 8     for i in range(0, num_of_blocks_to_add):
 9         block_to_add = next_block(previous_block)
10         blockchain.append(block_to_add)
11         previous_block = block_to_add
12         #  Tell everyone about it!
13         print("Block # has been added to the"
14               "blockchain!".format(block_to_add.index))
15         print("Hash: 
".format(block_to_add.hash))

来看一下效果:

 

技术分享图片

 

可以看出我们的链已经如期工作了。如果想要在控制台中看到更多信息,可以编辑源文件打印每个块的时间戳和数据。

这是 SnakeCoin 能够完成的事情了。如果想要将 SnakeCoin 达到今天可真实使用的区块链标准,我们还必须要加入更多特性,比如跟踪在多台机器上链的变化的服务层,限制在给定时间内能够加入的区块数量的工作量证明算法。

如果想要了解更多技术细节,可以查看原版的比特币白皮书

区块链记账原理(代码片段)

...区块链为区块链2.0,如以太坊是典型的区块链2.0很多人只了解过比特币,不知道区块链,比特币实际是一个使用了区块链技术的应用,只是比特币当前太热,把区块链技术的光芒给掩盖了。区块链才是未来,期望各位开发人员少... 查看详情

区块链记账原理(代码片段)

...区块链为区块链2.0,如以太坊是典型的区块链2.0很多人只了解过比特币,不知道区块链,比特币实际是一个使用了区块链技术的应用,只是比特币当前太热,把区块链技术的光芒给掩盖了。区块链才是未来,期望各位开发人员少... 查看详情

几分钟了解区块链是什么?(主要针对初懂者)(代码片段)

...词语是我再2017年的时候听说的,因为身在程序界不可能不了解一下,认识它的时候是因为比特币的原因(普及一下比特币的概念:比特币最初是由自称中本聪这么一个人物在2009年提出的,它是怎样产生的呢?它有特定的算法,通过大量的... 查看详情

一文带你了解火爆的区块链互联网cosmos(代码片段)

Cosmos诞生的背景假如时间倒退4,5年前,如果有人跟你说他要做一个区块链的互联网,让市面上所有的公链互联互通。你一定觉得他疯了。因为那个时候公链就没有几个,大家谈来谈去还是比特币,以太坊等这... 查看详情

初识区块链(代码片段)

...,觉得挺新奇的。看官网介绍,一堆概念搞不清楚,想着了解一下一直在论坛和社交媒体上讨论得如火如荼的区块链技术,这是背景(在mac上装了下fibos,执行起来就报错了,也不懂fibjs,有些依赖关系搞不清楚,第一次买币冲... 查看详情

一文弄懂区块链技术原理(代码片段)

...层出不穷,其中以诈骗圈钱为目的空气币也不少.只有深入了解了数字货币 查看详情

从0到1快速建一个区块链(代码片段)

近期的区块链重回热点,如果你想深入了解区块链,那就来看一下本文,手把手教你构建一个自己的区块链。 弄懂区块链的最快方法-亲自构建一个 看到这篇文章,说明您也是对加密货币的兴起感兴趣,想知道区块链是... 查看详情

只用200行go代码写一个自己的区块链!(代码片段)

...都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的。这篇文章就是帮助你使用Go语言来实现一个简单的区块链,用不到200行代码来揭示区块链的原理!高可用架构也会持续推出更多区块链方面文章... 查看详情

第一行代码:以太坊-创建自己的私有区块链(代码片段)

...掌握搭建以太坊开发环境的方法掌握geth的基本使用方法了解如何启动JavaScript控制台掌握建立一个私有区块链的步骤掌握如何在私有区块链上挖矿1.以太坊(Ethereum)开发环境搭建在玩以太坊之前,首先要搭建以太坊的开发环境。... 查看详情

第一行代码:以太坊-创建自己的私有区块链(代码片段)

...掌握搭建以太坊开发环境的方法掌握geth的基本使用方法了解如何启动JavaScript控制台掌握建立一个私有区块链的步骤掌握如何在私有区块链上挖矿1.以太坊(Ethereum)开发环境搭建在玩以太坊之前,首先要搭建以太坊的开发环境。... 查看详情

区块链的生成与基本操作(代码片段)

...操作项目github地址link一、项目愿景通过该项目,能够了解区块链的构成以及如何实现一个功能完善的区块链。二、项目架构三、项目特点1.去中心化2.可追溯3.不可篡改四、项目流程区块的基本结构与操作区块头的细节如上图... 查看详情

原用java编写第一个区块链(代码片段)

...创建一个简单的加密货币,叫作“noobcoin”。前提:已经了解了区块链基本知识用到GSON和boun 查看详情

用java编写第一个区块链(代码片段)

...恰恰相反,这是一个概念证明的实例,可以帮助您进一步了解区块链。准备:  我将会使用Java来实现,当然你也可以使用任何面向对象的语言。环境:JDK8IDEAMa 查看详情

用go语言撸一个简易版的区块链(代码片段)

...区块链。不过麻雀虽小,五脏俱全。通过这个代码你了解区块链内部的大概运行机制时没有问题的。比特币底层区块链的代码非常复杂,但是我们可以从中梳理几个核心的概念,然后对应进行简单的实现。通过这些简... 查看详情

用go语言撸一个简易版的区块链(代码片段)

...区块链。不过麻雀虽小,五脏俱全。通过这个代码你了解区块链内部的大概运行机制时没有问题的。比特币底层区块链的代码非常复杂,但是我们可以从中梳理几个核心的概念,然后对应进行简单的实现。通过这些简... 查看详情

区块链是什么(代码片段)

目录一、什么是区块链?中本聪对区块链概念的描述二、区块链系统核心优势三、区块链工作原理3.1什么是区块?3.2.区块结构 3.3 区块头 3.4 区块头结构 3.4 创始区块四、区块链分叉五、区块链衍生概念5.1公链(pu... 查看详情

:最小可行区块链(代码片段)

概览区块数据结构区块哈希创世块创建区块保存区块链验证区块完整性选择最长链节点间通信操作节点架构运行测试小结概览区块链的基础概念非常简单,说白了就是一个维护着一个持续增长的有序数据记录列表的这么一个分布... 查看详情

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

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