首页 编程 软件学院 查看内容

用不到50行代码构建一个小型区块链

2017-7-24 00:31 |来自: 互联网 1662 0

摘要: 区块链近年来被越炒越热,它的身影频繁出现在各大头条,一时间也成为投资者的关注点。你可能对区块链这个名词感到陌生,但是如果提到比特币,你肯定不会陌生。没错,比特币的交易过程中,就使用了区块链技术。百度百 ...

区块链近年来被越炒越热,它的身影频繁出现在各大头条,一时间也成为投资者的关注点。你可能对区块链这个名词感到陌生,但是如果提到比特币,你肯定不会陌生。没错,比特币的交易过程中,就使用了区块链技术。百度百科对于区块链的定义是这样的:区块链是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。

简单点来说,区块链是一个公共数据库。数据被存储在被称作 “块”的容器中,完成这一过程中,块将被添加到链上,该链包含了过去产生的数据。这些数据可以是任何类型,对于比特币或者其他一些数字货币来说,该数据就是一组交易。

区块链技术带来了新的,完全数字化的货币,如比特币,莱特币。它们不是由中央机构发行或管理的。比特币也诞生了以太坊这种新型分布式计算技术,它引入了有趣的概念,如智能合同。

下面我将用不到50行的python代码,来编写一个小型的区块链,我们暂且叫它为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()

现在我们有了块的数据结构。接下来,我们需要将块添加到链中。上文提到过,每一个块都需要前一个块的信息,那您可能有疑问了:第一个块是哪来的?一般来说,第一个块是特殊块,通常由特殊逻辑方式添加到链上。下面是我定义的源块代码:

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列表,列表的第一个是源块。当然,我们需要添加后续的块,这里我们只需要添加20个块,用简单的循环添加即可。

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

下面是测试:

以上只是区块链最简单的demo,SnakeCoin如果想要达到现阶段区块链产品的水平,则需要添加许多额外的特性。如需要添加服务层来监听不同机器上的链,也需要添加proof-of-work algorithm算法来限制一段时间内块的增加量。

本文出处: http://www.toutiao.com/a6445909842393530638/
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部