打造一个最小区块链

简介:

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

仅需不足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
本文作者:区块链
本文来源:腾讯云 云+社区,如需转载请联系原作者。

目录
相关文章
|
6月前
|
算法
KPM算法求字符串的最小周期证明
公式 `ans = n - LPS[n-1]` 描述了最小周期,其中 `n` 是子串长度,`LPS[n-1]` 是前缀函数值。证明分为特殊情况和一般情况:对于完整周期字符串,`LPS[n-1] = 3*T`,故 `ans = T`;对于非完整周期,通过分析不同长度的 `[末部分]` 和 `[前部分]`,展示 `ans` 始终等于周期 `T` 或由 `[e][b]` 构成的最小周期,从而证明公式正确。
|
6月前
leetcode-1020:飞地的数量
leetcode-1020:飞地的数量
38 0
|
人工智能 网络协议 区块链
区块链预测:它对你意味着什么。
区块链预测:它对你意味着什么。
leetcode 1020 飞地的数量
leetcode 1020 飞地的数量
58 0
leetcode 1020 飞地的数量
|
资源调度 负载均衡 算法
转:加权最小剩余算法实现云计算虚拟化资源调度
云计算虚拟化常用算法需要用到资源调度算法。资源调度算法可以帮助云计算系统更好地管理和分配资源。常用的资源调度算法包括:最小剩余算法、加权最小剩余算法、最小冲突算法和进化算法等。其中,加权最小剩余算法是一种常用的资源调度算法,它可以通过计算物理主机和虚拟机的资源使用情况来决定将虚拟机放置在哪个物理主机上。
389 0
|
算法 数据安全/隐私保护
密码学系列之:Merkle–Damgård结构和长度延展攻击
密码学系列之:Merkle–Damgård结构和长度延展攻击
密码学系列之:Merkle–Damgård结构和长度延展攻击
|
人工智能 C++
【LeetCode1020】飞地的数量
从4条边界进行遍历,即遇到边界上的1就递归遍历,把边界上的都为1的连通分量改成数字2,dfs搞完后,就遍历一遍二维数组,剩下的1即所求的飞地数量。
116 0
【LeetCode1020】飞地的数量
|
区块链
区块链扩容方案之Gas值限制
区块链扩容一直是区块链团队的重点研究方向。因为比特币对区块大小的设定是固定的,而且中本聪将最初大小值限定为1M,但随着交易量的增加,网络拥堵情况也愈渐严重,最终也导致了比特币的分叉。
3603 0
|
区块链
SmartRaiden 和 Lighting Network 进行去中心化跨链原子资产交换
SmartRaiden 和 Lighting Network 进行去中心化跨链原子资产交换 前言 如果能够进行以太坊和比特币跨链原子资产交换,是不是一件很酷的事情? 目前链下的扩容方式有很多,最广为人知的就是比特币的闪电网络和以太坊的雷电网络,今天我就来告诉如何通过智能雷电和闪电网络来实现跨链原子资产交换。
1131 0