打造一个最小区块链

让我们来创造一个最小区块链

仅需不足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的规模增长跟一些已经被广泛应用的区块链一样的话,我们必须添加更多元素,比如服务层来跟踪在多台机器上的区块链的变化,以及工作量验证算法,以限制一定时间内可以添加的新区块总数。

如果你想了解更多关于区块链的信息,你可以去看看比特币白皮书。

祝您好运!

提示:本教程还有第二部分

本文的版权归 飞翔的猪脚粉 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏liuchengxu

50 行 Python 代码构建一个区块链

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

882
来自专栏编程

前沿Python技术:用不到50行的Python代码构建最小的区块链

尽管一些人认为区块链是一个等待问题的解决方案,但毫无疑问,这种新技术是计算机的奇迹。但是,区块链到底是什么呢区块链 它是比特币或其他加密货币进行交易的数字账本,...

2850
来自专栏Seebug漏洞平台

以太坊蜜罐智能合约分析

在学习区块链相关知识的过程中,拜读过一篇很好的文章《The phenomenon of smart contract honeypots》,作者详细分析了他遇到...

1933
来自专栏互联网高可用架构

白话比特币原理解密

1755
来自专栏Seebug漏洞平台

以太坊“后偷渡时代”盗币之“拾荒攻击”

作者:Sissel@知道创宇404区块链安全研究团队 发布时间:2018/08/20

4095
来自专栏丑胖侠

以太坊实战-再谈nonce使用陷阱

在《以太坊实战之如何正确处理nonce》一文中我们介绍了nonce的基本概念和使用方法。也提到了它能够覆盖之前交易的特异功能。但是那只是nonce的冰山一角。今...

64810
来自专栏智能合约

以太坊智能合约开发第二篇:理解以太坊相关概念

2776
来自专栏华仔的技术笔记

一些基本比特币概念

3809
来自专栏纯洁的微笑

用Java实现简单的比特币系统

1915
来自专栏CDA数据分析师

以太坊是什么丨以太坊开发入门指南

原文地址:https://www.cnblogs.com/tinyxiong/p/7878468.html

720

扫码关注云+社区

领取腾讯云代金券