首页 技术 正文
技术 2022年11月8日
0 收藏 572 点赞 1,961 浏览 2542 个字

40多行python代码开发一个区块链?可信吗?我们将通过Python 2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理。python开发区块链的源代码保存在Github

尽管有人认为区块链目前还是不成熟的解决方案,但它无疑是计算机发展史上的一个奇迹。但是,到底区块链是什么呢?

区块链

区块链是一个公开的数字账本,它按时间顺序记录比特币或其他加密货币发生的交易。

更一般的讲,区块链是一个公共数据库,新的数据将存储在一个被称为”块“的容器中,然后块会被添加到一个不可篡改的链,因此被称为”区块链“。当我们谈到比特币或其他加密货币时,这些数据指的是交易记录。当然,你可以将任何类型的数据存入区块链。

区块链技术已经催生了全新的、完全数字化的货币,如比特币和莱特币,这些货币并不是由中央政府发行或管理的。这一技术给那些不认可当前银行系统人带来了新的自由。

区块链同时也为分布式计算带来了革命性的创新,例如,以太坊区块链引入了一些有趣的概念,比如智能合约。

在本文中,将用40多行的Python 2代码来做一个简单的区块链。我们称它为SnakeCoin

我们首先将定义“块”的数据结构。在区块链中,每个块都存储一个时间戳和一个可选地索引。在SnakeCoin中,我们将把两者都存储起来。为了确保整个区块链的完整性,每个块都有一个用于自我标识的哈希。与比特币一样,每个块的哈希将是对块索引、时间戳、数据和前块哈希计算出的加密哈希值。其中你可以在数据中保存任何内容。

import hashlib as hasherclass 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 datedef 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 blockblockchain = [create_genesis_block()]previous_block = blockchain[0]# How many blocks should we add to the chain# after the genesis blocknum_of_blocks_to_add = 20# Add blocks to the chainfor 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) 

下面来测试一下我们的区块链。

跑通了!如果希望在控制台中查看更多信息,可以编辑源文件并打印每个块的时间戳或块中的数据。

这就是SnakeCoin的全部内容。为了使SnakeCoin能够达到生产级区块链的规模,还需要添加更多的功能,比如用来跟踪多个节点上区块链变化的P2P服务层,以及限制

在一定时间内可以添加到链中的新块数量的工作量证明算法。

如果想了解更多的技术信息,可以在这里查看原始的比特币白皮书。

原文:Let’s Build the Tiniest Blockchain

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,489
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,904
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,737
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,489
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,128
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,290