资讯专栏INFORMATION COLUMN

50 行代码构建区块链

Coding01 / 2494人阅读

摘要:区块链技术催生了数字化的货币,如比特币和,这些货币并不是由权威机构发行或管理的。在本文中,我用创建一个简单的区块链。为了帮助确保整个区块链的完整性,每个块都有一个值作为标识符。来看看运行结果全新的区块链就这样实现的。

简评:区块链如今大火大热,如果你还不知道什么是区块链,可以通过这 50 行代码来帮助你的理解。

区块链
在更通用的术语中,它是一个公共数据库,在这个数据库中,新数据存储在一个名为 Block 的容器中,并将其添加到一个不可变链中。对于比特币和其他加密货币,这些数据是一组交易。当然,数据也可以是任何类型。

区块链技术催生了数字化的货币,如比特币和 Litecoin,这些货币并不是由权威机构发行或管理的。区块链还像 Ethereum 这样的技术,革新了分布式计算,它引入了一些有趣的概念,比如智能合同。

在本文中,我用 Python 创建一个简单的区块链。我称它为 SnakeCoin。

首先我们需要定义一个 Block。在区块链中,每个块都存储了一个时间戳和一个索引。在 SnakeCoin 中,我们将存储两者。为了帮助确保整个区块链的完整性,每个块都有一个 hash 值作为标识符。与比特币一样,通过对 Block 的索引、时间戳、数据做哈希加密得到每个 Block 的哈希值。数据可以是任何内容。

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()

区块链中我们已经定义了 Block,我们需要在实际的链中添加块。正如我前面提到的,每个 Block 都需要前一个 Block 的信息(区块链的第一个 Block 称为起源 Block(genesis block),在很多情况下,它是需要手动添加的,或者有独特的逻辑把它添加到链表头)。

这里创建一个函数,它简单地返回起源 Block。该块是索引 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")

现在我们已经创建了一个起源 Block,我们还需要一个函数来生成块链中的后续 Block。 该函数将链中的前一个 Block 作为参数,创建一个新的 Block(新的 Block 的 hash 值依赖于前一个 Block 的哈希值) ,并添加到不变链表中。 这个哈希链作为加密证明,有助于确保一旦块被添加到块链中,它不能被替换或删除。

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 列表。 列表的第一个元素是起源 Block(genesis block)。 当然,我们需要添加后续的块。 因为 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: {}
".format(block_to_add.hash) 

来看看运行结果

全新的区块链 SnakeCoin 就这样实现的 。 当然这里只是实现了区块链最最基础部分的代码, 如果想让 SnakeCoin 运作起来 ,我们必须添加更多的功能,如服务器层,以跟踪多台机器上链的变化,并提供工作证明算法,以限制在限定时间内允许添加 Block 的数量。

这项研究由三星,谷歌,Facebook 英特尔和华盛顿大学资助。研究团队将于 8 月 2 日在洛杉矶的 SIGGRAPH 会议上详细介绍他们的发现。

原文:Let’s Build the Tiniest Blockchain

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23922.html

相关文章

  • 用 Go 构建一个区块 ---- Part 1: 基本原型

    摘要:在区块链中,存储有效信息的是区块。存储的是前一个块的哈希。正是由于这个特性,才使得区块链是安全的。这样的结构,能够让我们快速地获取链上的最新块,并且高效地通过哈希来检索一个块。 翻译的系列文章我已经放到了 GitHub 上:blockchain-tutorial,后续如有更新都会在 GitHub 上,可能就不在这里同步了。如果想直接运行代码,也可以 clone GitHub 上的教程仓...

    ZoomQuiet 评论0 收藏0
  • Python以太坊区块交互将数据存入数据库

    摘要:是一个用于连接以太坊区块链的库。网络执行以太坊协议,该协议定义节点彼此之间的交互规则及网络上的智能合约。数据库设计下一步是设计数据库。 关于区块链介绍性的研讨会通常以易于理解的点对点网络和银行分类账这类故事开头,然后直接跳到编写智能合约,这显得非常突兀。因此,想象自己走进丛林,想象以太坊区块链是一个你即将研究的奇怪生物。今天我们将观察该生物,并与其进行交互然后将有关它的所有数据收集到一...

    paulli3 评论0 收藏0

发表评论

0条评论

Coding01

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<