51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1773|回复: 1
打印 上一主题 下一主题

[讨论] 用不到50行的Python代码构建最小的区块链

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-2-5 10:24:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       尽管一些人认为区块链是一个等待问题的解决方案,但毫无疑问,这种新技术是计算机的奇
迹。但是,区块链到底是什么呢?
  区块链
  它是比特币或其他加密货币进行交易的数字账本,账本按时间顺序记录并对外公开。
  在更一般的术语中,它是一个公共数据库,新数据存储在一个名为块的容器中,并被添加到
一个不可变链(后来的区块链)中添加了过去的数据。在比特币和其他加密货币的情况下,这些数据
是一组交易记录。当然,数据可以是任何类型的。

       区块链技术已经催生了新的、完全数字化的货币,如比特币和莱特币,这些货币并不是由中
央政府发行或管理的。因此为那些认为今天的银行系统是骗局或终将失败的人带来了新的自由。
区块链所包含的以太坊技术对分布式计算进行了变革创新,它引入了一些有趣的概念,比如智能
合约。
  在本文中,我将用不到50行的Python2代码来做一个简单的区块链。我称它为SnakeCoin。
  首先将定义块将是什么样子。在区块链中,每个块都存储一个时间戳和一个索引。在
SnakeCoin中,需要把两者都存储起来。为了确保整个区块链的完整性,每个块都有一个自动识
别散列。与比特币一样,每个块的散列将是块索引、时间戳、数据和前块哈希的加密哈希。数据
可以是你想要的任何东西。
  1. import hashlib as hasher
  2. class Block:
  3. def __init__(self, index, timestamp, data, previous_hash):
  4. self.index = index
  5. self.timestamp = timestamp
  6. self.data = data
  7. self.previous_hash = previous_hash
  8. self.hash = self.hash_block()
  9. def hash_block(self):
  10. sha = hasher.sha256()
  11. sha.update(str(self.index) +
  12. str(self.timestamp) +
  13. str(self.data) +
  14. str(self.previous_hash))
  15. return sha.hexdigest()
复制代码
       这一步后有块结构,但现在是创建区块链,所以需要向实际的链中添加块。如前所述,每个
块都需要上一个块的信息。但是按照这个说法就有一个问题,区块链的第一个区块是如何到达那
里的呢?不得不说,第一个块,或者说是起源块,它是一个特殊的块。在很多情况下,它是手动添
加的,或者有独特的逻辑允许添加。
  下面将创建一个函数简单地返回一个起源块以便产生第一个区块。这个块是索引0,它具有任
意的数据值和“前一个哈希”参数中的任意值。
  1. import datetime as date
  2. def create_genesis_block():
  3. # Manually construct a block with
  4. # index zero and arbitrary previous hash
  5. return Block(0, date.datetime.now(), "Genesis Block", "0")
复制代码
       现在已经创建好了起源块,接下来需要一个函数,以便在区块链中生成后续的块。这个函数
将把链中的前一个块作为参数,创建要生成的块的数据,并使用适当的数据返回新块。当新的块
哈希信息来自前面的块时,区块链的完整性会随着每个新块而增加。如果不这样做,外部组织就
更容易“改变过去”,用全新的方式取代已有的链条。这一系列的散列可以作为加密的证据,有
助于确保一旦将块添加到区块链,它就不能被替换或删除。
  1. def next_block(last_block):
  2. this_index = last_block.index + 1
  3. this_timestamp = date.datetime.now()
  4. this_data = "Hey! I'm block " + str(this_index)
  5. this_hash = last_block.hash
  6. return Block(this_index, this_timestamp, this_data, this_hash)
复制代码
     大部分的工作已经完成,现在可以创建区块链了。在这次的示例中,区块链本身是一个简单
的Python列表。列表的第一个元素是起源块。当然,还需要添加后续的块,因为SnakeCoin是最
小的区块链,这里只添加20个新的块。可以用for循环来生成新块。
  1. # Create the blockchain and add the genesis block
  2. blockchain = [create_genesis_block()]
  3. previous_block = blockchain[0]
  4. # How many blocks should we add to the chain
  5. # after the genesis block
  6. num_of_blocks_to_add = 20
  7. # Add blocks to the chain
  8. for i in range(0, num_of_blocks_to_add):
  9. block_to_add = next_block(previous_block)
  10. blockchain.append(block_to_add)
  11. previous_block = block_to_add
  12. # Tell everyone about it!
  13. print "Block #{} has been added to the blockchain!".format(block_to_add.index)
  14. print "Hash: {}\n".format(block_to_add.hash)
复制代码
    下面来测试一下目前产生的区块链。

      看到了吧,这就是区块链。如果希望在控制台中查看更多信息,可以编辑完整的源文件并打
印每个块的时间戳或数据。
  这就是SnakeCoin要提供的所有东西。为了使SnakeCoin规模达到今天生产区块链的规模,
必须添加更多的功能,比如服务器层,以跟踪多台机器上的链变化,以及在给定的时间段内限
制添加的块数量的工作算法。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-9-20 20:48 , Processed in 0.064795 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表