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

译文:CSDN - 黑色巧克力

geek.csdn.net/news/detail/228355

尽管一些人认为区块链是一个等待问题的解决方案,但毫无疑问,这种新技术是计算机的奇迹。但是,区块链到底是什么呢?

区块链

它是比特币或其他加密货币进行交易的数字账本,账本按时间顺序记录并对外公开。

在更一般的术语中,它是一个公共数据库,新数据存储在一个名为块的容器中,并被添加到一个不可变链(后来的区块链)中添加了过去的数据。在比特币和其他加密货币的情况下,这些数据是一组交易记录。当然,数据可以是任何类型的。

区块链技术已经催生了新的、完全数字化的货币,如比特币和莱特币,这些货币并不是由中央政府发行或管理的。因此为那些认为今天的银行系统是骗局或终将失败的人带来了新的自由。区块链所包含的以太坊技术对分布式计算进行了变革创新,它引入了一些有趣的概念,比如智能合约。

在本文中,我将用不到50行的Python2代码来做一个简单的区块链。我称它为SnakeCoin。

首先将定义块将是什么样子。在区块链中,每个块都存储一个时间戳和一个索引。在SnakeCoin中,需要把两者都存储起来。为了确保整个区块链的完整性,每个块都有一个自动识别散列。与比特币一样,每个块的散列将是块索引、时间戳、数据和前块哈希的加密哈希。数据可以是你想要的任何东西。

importhashlibashasher

classBlock:

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

defhash_block(self):

sha=hasher.sha256()

sha.update(str(self.index)+

str(self.timestamp)+

str(self.data)+

str(self.previous_hash))

returnsha.hexdigest()

这一步后有块结构,但现在是创建区块链,所以需要向实际的链中添加块。如前所述,每个块都需要上一个块的信息。但是按照这个说法就有一个问题,区块链的第一个区块是如何到达那里的呢?不得不说,第一个块,或者说是起源块,它是一个特殊的块。在很多情况下,它是手动添加的,或者有独特的逻辑允许添加。

下面将创建一个函数简单地返回一个起源块以便产生第一个区块。这个块是索引0,它具有任意的数据值和“前一个哈希”参数中的任意值。

importdatetimeasdate

defcreate_genesis_block():

# Manually construct a block with

# index zero and arbitrary previous hash

现在已经创建好了起源块,接下来需要一个函数,以便在区块链中生成后续的块。这个函数将把链中的前一个块作为参数,创建要生成的块的数据,并使用适当的数据返回新块。当新的块哈希信息来自前面的块时,区块链的完整性会随着每个新块而增加。如果不这样做,外部组织就更容易“改变过去”,用全新的方式取代已有的链条。这一系列的散列可以作为加密的证据,有助于确保一旦将块添加到区块链,它就不能被替换或删除。

defnext_block(last_block):

this_index=last_block.index+1

this_data="Hey! I'm block "+str(this_index)

this_hash=last_block.hash

returnBlock(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[]

# How many blocks should we add to the chain

# after the genesis block

num_of_blocks_to_add=20

# Add blocks to the chain

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

下面来测试一下目前产生的区块链。

本文来自企鹅号 - 程序员的那些事媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏区块链入门

【深度知识】10分钟教会你深挖以太坊数据层

在当下数据爆炸的信息时代,凭借区块链去中心化、点对点和防篡改的特性,“区块链+大数据”已成为研究的热门,可以说,区块链与大数据的结合为今后区块链应用的大规模落地...

1302
来自专栏Seebug漏洞平台

以太坊合约审计 CheckList 之“以太坊智能合约编码隐患”影响分析报告

在知道创宇404区块链安全研究团队整理输出的《知道创宇以太坊合约审计CheckList》中,我们把超过10个问题点归结为开发者容易忽略的问题隐患,其中包括“语法...

842
来自专栏java达人

以太坊:比特币+一切可能

来源:https://medium.com/@ConsenSys/ethereum-bitcoin-plus-everything-a506dc780106

750
来自专栏区块链大本营

0.166666667小时,教会你深挖以太坊数据层

从架构设计上来说,区块链可以简单的分为三个层次,协议层、扩展层和应用层。其中,协议层又可以分为存储层和网络层,它们相互独立但又不可分割。

935
来自专栏Seebug漏洞平台

以太坊蜜罐智能合约分析

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

1743
来自专栏Seebug漏洞平台

以太坊蜜罐智能合约分析

作者:dawu&0x7F@知道创宇404区块链安全研究团队 时间:2018/06/26

1375
来自专栏区块链入门

【链安科技】getToken函数漏洞

在最近一次漏洞监控扫描中,有相关安全公司风险监控平台发出预警,AMORCOIN (AMR) Token 合约存在致命漏洞,任何人都可以随意增加其账户上的 Tok...

731
来自专栏区块链入门

【葵花宝典】区块链技术面试必考题 01 区块链面试真经

话说,区块链行业对人才的缺口越来越大,但由于区块链涉及的知识领域较为广泛,能找到真正有用的人才对每个企业来说都非常不易。

1164
来自专栏区块链大本营

长文 | 深度解析Solidity让老司机翻车的17个坑及超详细避坑指南,建议先马后看(附送独家资源)

说起Solidity,虽然还很初级,但无疑已成为今天区块链开发的常用语言之一,今天以太坊智能合约的很多字节码,都是用Solidity编译的。

1112
来自专栏Seebug漏洞平台

从以太坊"MorphToken事件"看智能合约构造函数大小写编码错误漏洞

以太坊智能合约的含义就是一组代码(函数)和数据(合约的状态),它们位于以太坊区块链的一个特定地址上。智能合约一般使用solidity语言编写。

1063

扫码关注云+社区