让我们来创造一个最小区块链
仅需不足50行的Python代码
注意:本教程的第2部分可以在这个链接找到。
虽然有人认为区块链本身仍有很多问题需要解决,但毫无疑问,这种新颖的技术是计算机界的奇迹。 但是,究竟什么是区块链?
区块链
通俗点来说,它就是一个公共数据库。新的数据被存储到一个称为区块的容器中,接着会被不可逆地添加到已经有很多数据的数据链中,(这时候就可以叫它区块链了)。在对比特币和其他加密货币来说,这些数据类型就是是交易数据组。当然,这些数据当然可以是任何其他类型。
区块链技术带来了全新数字货币的崛起,如比特币和莱特币,而这些货币并非由中央机构发行或管理。这为一些认为当今的银行体系是一种骗局或失败品的人带来了福音。区块链中的新技术,以太坊也为分布式计算带来了革新,以太坊引入了智能合约等有趣的概念。
在本文中,我将用少于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,并且它在“前区块哈希值”参数中具有任意数据值和任意前哈希参数值。
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)
让我们来检验下工作成果:
别担心,虽然后面的图没截到,但它确实增长到20个了。
完美!我们的区块链已经能正常运转了。如果您想在控制台界面中看到更多信息,你可编辑完整的源文件并输出每个区块的时间戳或数据。
这就是SnakeCoin目前所能做到的一切了。如果要让SnakeCoin的规模增长跟一些已经被广泛应用的区块链一样的话,我们必须添加更多元素,比如服务层来跟踪在多台机器上的区块链的变化,以及工作量验证算法,以限制一定时间内可以添加的新区块总数。
如果你想了解更多关于区块链的信息,你可以去看看比特币白皮书。
祝您好运!
原文发布时间为:2018-03-10
本文作者:区块链
本文来源:腾讯云 云+社区,如需转载请联系原作者。