文档章节

区块链是什么?彻底理解只需40行python代码!

汇智网教程
 汇智网教程
发布于 2018/05/06 13:07
字数 1380
阅读 368
收藏 17

尽管有人认为区块链目前还是个不成熟的解决方案,但它无疑称得上是计算机发展历史上 的一个奇迹。但是,到底区块链是什么呢? 我们将通过动手实现一个迷你的区块链来帮你 真正理解区块链技术的核心原理。python源代码保存在Github

如果你希望马上开始学习以太坊区块链应用开发,可以访问汇智网提供的出色的在线互动教程:

区块链

区块链是一个公开的数字账本,它按时间顺序记录比特币或其他加密货币发生的交易。

更一般的讲,区块链是一个公共数据库,新的数据将存储在一个被称为”块“的容器中,然后 块会被添加到一个不可篡改的链,因此被称为”区块链“。当我们谈到比特币或其他加密货币时, 这些数据指的是交易记录。当然,你可以将任何类型的数据存入区块链。

区块链技术已经催生了全新的、完全数字化的货币,如比特币和莱特币,这些货币并不是由 中央政府发行或管理的。这一技术给那些不认可当前银行系统人带来了新的自由。 区块链同时也为分布式计算带来了革命性的创新,例如,以太坊区块链引入了一些有趣的概念, 比如智能合约。

在本文中,我将用不到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) 

下面来测试一下我们的区块链。

输入图片说明

跑通了!如果希望在控制台中查看更多信息,可以编辑源文件并打印每个块的时间戳或 块中的数据。

这就是SnakeCoin的全部内容。为了使SnakeCoin能够达到生产级区块链的规模, 还需要添加更多的功能,比如用来跟踪多个节点上区块链变化的P2P服务层,以及限制 在一定时间内可以添加到链中的新块数量的工作量证明算法。

如果想了解更多的技术信息,可以在这里查看原始 的比特币白皮书。

原文:40行python代码让你彻底理解区块链是什么

© 著作权归作者所有

汇智网教程
粉丝 20
博文 264
码字总数 332740
作品 0
东城
私信 提问
加载中

评论(0)

用 Python 从零开始创建区块链

本文主要内容翻译自 Learn Blockchains by Building One 本文原始链接 , 转载请注明出处。 作者认为最快的学习区块链的方式是自己创建一个,本文就跟随作者用 Python 来创建一个区块链。 对...

独钓渔
2019/05/03
46
0
用Python从零开始创建区块链1

作者认为最快的学习区块链的方式是自己创建一个,本文就跟随作者用Python来创建一个区块链。 对数字货币的崛起感到新奇的我们,并且想知道其背后的技术——区块链是怎样实现的。 但是完全搞懂...

雪花又一年
2018/04/13
0
0
干货!区块链入门、进阶、行业专家观点!1000篇好文帮你破解区块链密码!(下篇)

随着区块链概念理论的不断成熟以及强劲技术的不断深耕,区块链已经成为投资圈中备受关注的热点,从区块链1.0时代落地数字货币比特币、莱特币等,打开了区块链通向新弯道的高速路口,到区块链...

山哥在这里
2018/04/27
0
0
想学习区块链?那就用 Python 构建一个

了解区块链是如何工作的最快的方法是构建一个。 你看到这篇文章是因为和我一样,对加密货币的大热而感到兴奋。并且想知道区块链是如何工作的 —— 它们背后的技术基础是什么。 但是理解区块链...

03%
2018/07/30
0
0
区块链参考资源, 雷达 & 信号处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/antkillerfarm/article/details/85987183 区块链参考资源 https://mp.weixin.qq.com/s/bkLBaTs3pSQyYg9YgRnG8...

antkillerfarm
2019/01/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

REST API服务为验证失败返回的适当HTTP状态代码是什么?

每当我在基于Django / Piston的REST API应用程序中遇到验证失败时,我目前正在返回401 Unauthorized。 看过HTTP状态代码注册表后我不相信这是验证失败的合适代码,你们都推荐什么? 400错误请...

javail
7分钟前
61
0
《计算机程序的构造和解释》分享下载

书籍信息 书名:《计算机程序的构造和解释》 原作名:Structure and Interpretation of Computer Programs 作者: Harold Abelson / Gerald Jay Sussman / Julie Sussman 豆瓣评分:9.5分(22...

开始以后_
13分钟前
45
0
《Linux就该这么学》第六节课while循环语句,case测试语句,计划任务及用户文件的相关命令

《Linux就该这么学》 本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材,目前是国内最值得去读的Lin...

溪风之殇
22分钟前
44
0
有没有办法让非root进程绑定到Linux上的“特权”端口?

在我的开发盒上有这个限制是非常烦人的,因为除了我之外不会有任何用户。 我知道标准的解决方法 ,但它们都没有完全符合我的要求: authbind (Debian测试中的版本,1.0,仅支持IPv4) 使用i...

技术盛宴
22分钟前
44
0
Java程序员必须要了解的类Unsafe

前言 Java是一个安全的编程语言,它能最大程度的防止程序员犯一些低级的错误(大部分是和内存管理有关的)。但凡是不是绝对的,使用Unsafe程序员就可以操作内存,因此可能带来一个安全隐患。...

Onegoleya
22分钟前
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部