让我们构建最小的区块链
注:本文最初发表于Crypto Current。
尽管有些人认为区块链只是一种等待解决问题的解决方案,但毫无疑问,这项新技术是计算领域的奇迹。那么,区块链究竟是什么呢?
区块链
更通俗地说,它是一个公共数据库,新数据被存储在一个称为区块的容器中,并被添加到一条不可变的链(因此被称为区块链)中,该链包含过去添加的数据。对于比特币和其他加密货币来说,这些数据是交易组。当然,数据可以是任何类型的。
区块链技术催生了比特币和莱特币等新型全数字货币,这些货币并非由中央机构发行或管理。这为那些认为当今银行系统是骗局或可能崩溃的个人带来了新的自由。区块链还以以太坊等技术的形式彻底改变了分布式计算,并引入了智能合约等有趣的概念。
在本文中,我将用不到 50 行 Python 2 代码创建一个简单的区块链。它被称为 SnakeCoin。
我们首先要定义区块的格式。在区块链中,每个区块都存储一个时间戳和一个可选的索引。在 SnakeCoin 中,我们将同时存储这两个信息。为了确保整个区块链的完整性,每个区块都有一个自标识哈希值。与比特币类似,每个区块的哈希值都是由该区块的索引、时间戳、数据以及前一个区块哈希值的加密哈希值构成的。对了,数据可以是任何你想要的内容。
import hashlib as hasher
class 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,其数据值和“previous hash”参数均为任意值。
import datetime as date
def 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 block
blockchain = [create_genesis_block()]
previous_block = blockchain[0]
# How many blocks should we add to the chain
# after the genesis block
num_of_blocks_to_add = 20
# Add blocks to the chain
for 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 能够扩展到如今生产区块链的规模,我们必须添加更多功能,例如一个服务器层,用于在多台机器上跟踪区块链的变化,以及一个工作量证明算法,用于限制在给定时间段内添加的区块数量。
如果您想了解更多技术知识,可以点击此处查看原始比特币白皮书。祝您好运,黑客攻击愉快!
非常感谢你的阅读!
Twitter、Github、Snapchat、Medium、Instagram