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

引用

译者注:随着比特币的不断发展,它的底层技术区块链也逐步走进公众视野,引起大众注意。本文用不到50行的Python代码构建最小的数据区块链,简单介绍了区块链去中心化的结构与其实现原理。

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

区块链

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

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

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

在本文中,我将用不到50行的Python2代码来做一个简单的区块链。我称它为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()

1

2

3

4

5

6

7

89

10

11

12114151617

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

1

2

3

4

5

6

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)

1

2

3

4

5

6

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)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

# 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规模达到今天生产区块链的规模,必须添加更多的功能,比如服务器层,以跟踪多台机器上的链变化,以及在给定的时间段内限制添加的块数量的工作算法

原文出处: Gerald Nash   译文出处:黑色巧克力

原文地址:https://www.cnblogs.com/liuyl-2017/p/8535304.html

时间: 2024-10-07 03:57:36

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

50行Python代码构建小型区块链

本文介绍了如何使用python构建一个小型的区块链技术,使用Python2实现,代码不到50行. Although some think blockchain is a solution waiting for problems, there's no doubt that this novel technology is a marvel of computing. But, what exactly is a blockchain?虽然有人认为区块链本身仍有很多问题需要解决,但毫无疑问,这种

python代码 构建验证码

1.python代码编写 (随机验证码): 1 #coding: utf-8 2 3 import Image, ImageDraw, ImageFont, ImageFilter 4 import string, random 5 6 fontPath = "/home/itcast/ace/media/" 7 8 # 获得随机四个字母 9 def getRandomChar(): 10 return [random.choice(string.letters) for _ in r

200行Go代码实现自己的区块链——区块生成与网络通信

在第一篇文章[1]中,我们向大家展示了如何通过精炼的Go代码实现一个简单的区块链.如何计算每个块的 Hash 值,如何验证块数据,如何让块链接起来等等,但是所有这些都是跑在一个节点上的.文章发布后,读者反响热烈,纷纷留言让我快点填坑(网络部分),于是就诞生了这第二篇文章. 这篇文章在之前的基础上,解决多个节点网络内,如何生成块.如何通信.如何广播消息等. 流程 第一个节点创建"创始区块",同时启动 TCP server并监听一个端口,等待其他节点连接. Step 1 启动其他节点,并与

逻辑烧脑:python 区块链的简易实现

区块链技术因为比特币的火爆而广受关注,我们这里用 python 代码来聊一下区块链技术: 区块链实现原理的简易描述 区块链技术做为一种数字记账技术,其核心是将保存了交易数据的区块,以加密的方式,按时间的顺序链式记录.区块链本身就是一个公共的数据库,系统将新诞生的业务数据存储在被称为区块的容器之中,并将该区块添加到已有区块组成的链条之中.有点像贪吃蛇,吃的区块越多,蛇的身体越长:在比特币的应用场景下,这些数据是一组转账交易记录.在共享单车的应用场景下,这些数据就可以是借车还车的交易记录. 区块链的

用 Python 构建一个极小的区块链

虽然有些人认为区块链是一个早晚会出现问题的解决方案,但是毫无疑问,这个创新技术是一个计算机技术上的奇迹.那么,究竟什么是区块链呢? 区块链 以比特币(Bitcoin)或其它加密货币按时间顺序公开地记录交易的数字账本. 更通俗的说,它是一个公开的数据库,新的数据存储在被称之为区块(block)的容器中,并被添加到一个不可变的链(chain)中(因此被称为区块链(blockchain)),之前添加的数据也在该链中.对于比特币或其它加密货币来说,这些数据就是一组组交易,不过,也可以是其它任何类型的数据

用Java为Hyperledger Fabric(超级账本)编写区块链智能合约链代码

编写第一个 Java 链代码程序 在上一节中,您已经熟悉了如何构建.运行.部署和调用链代码,但尚未编写任何 Java 代码. 在本节中,将会使用 Eclipse IDE.一个用于 Eclipse 的 Gradle 插件,以及一个名为 ChaincodeTutorial 的 Java 链代码框架项目,编写第一个 Java 链代码程序.您将从我为此教程创建的 GitHub 存储库中获取框架代码,将该代码导入 Eclipse 中,添加代码来让链代码智慧合同按要求生效,然后在 Eclipse IDE 内

金猫kinmall全球行:2018规模最高的区块链峰会

少有一项技术,像区块链一样,在"幼年"阶段,就能够受到全世界的瞩目与激烈讨论,并吸引了各个行业中,最有前瞻性的顶级人才,义无反顾地涌入其中.过往一年,区块链行业,创新不断.探索不断.质疑不断.监管不断.政府支持不断.不久之后,势必将应用不断.变革不断.机遇不断! 现在区块链马上要由幼年阶段,过渡到少年阶段.此时行业充满着机遇,充满着可能,就像马云.马化腾.雷军,他们赶上了互联网.移动互联网的红利,在区块链行业里面,随着技术的成熟,也必将出现引领行业走势的人物. 而在这个迅速发展的行业里

区块链DAPP 开发入门 代码实现 场景应用

第一章 智能合约概述 智能合约是运行在区块链公链上的一种代码. 可以将区块链公链理解成操作系统,智能合约虚拟机则是编程语言编译之后的代码运行环境. 1. 区块链 1.1 区块链基础知识 区块链通常被理解为超级账本,账户与账户直接可以通过交易来完成转账,但这种转账区别于传统银行. (1)这是一个完全去中心化的金融系统.因为整个系统中没有这样的中心化部门来管理账户信息.使用者只需要根据一种[非对称加密算法]来生成一个密钥对,其公钥作为账户地址,也就是常说的[区块链钱包地址],这个地址可以在网络中传播

基于Tkinter用50行Python代码实现简易计算器

Tkinter一般是python自带的,所以代码不需要其他组件,本程序是在python2.7版本实现的. 主要涉及了tkinter的使用,函数定义和调用,匿名函数的使用,类成员函数定义等python基础知识,适合新手学习. 代码如下: from Tkinter import * #创建横条型框架 def frame(root, side): w = Frame(root) w.pack(side = side, expand = YES, fill = BOTH) return w #创建按钮