python搭建区块链
#!/usr/bin/env python
# encoding: utf-8
'''
我们要创建一个 Blockchain 类 ,他的构造函数创建了一个初始化的空列表(要存储我们的区块链),并且另一个存储交易。
我们的 Blockchain 类负责管理链式数据,它会存储交易并且还有添加新的区块到链式数据的Method。
'''
import hashlib
import json
import time
from textwrap import dedent
from uuid import uuid4
from flask import Flask,jsonify,request
class Blockchain(object):
def __init__(self):
self.chain=[]
self.current_transations=[]
## 创建创世区块,源区块,第一个区块前面没了。
self.new_block(previous_hash=1,proof=100) def new_block(self,previous_hash,proof):
'''
创建一个新的区块到区块链
:param previous_hash:前一个区块的hash值
:param proof: 由工作量证明(PoW)算法生成的证明
:return: 返回新的区块
'''
block={
'index':len(self.chain)+1,
'timestamp':time.time(),
'transactions':self.current_transations,
'proof':proof,
'previous_hash':previous_hash or self.hash(self.chain[-1])
}
#重置当前交易记录
self.current_transations=[]
self.chain.append(block)
return block def new_transation(self,sender,recipient,amount):
# Adds a new transaction to the list of transactions
'''
创建一笔新的交易到下一个被挖掘的区块中
:param sender: 发送者
:param recipient: 接收方
:param amount: 发送数量
:return: 返回将被添加到的区块的索引
'''
self.current_transations.append({
'sender':sender,
'recipient':recipient,
'amount':amount,
})
return self.last_block['index']+1 @staticmethod
def hash(block):
'''
给一个区块生成SHA-256值
:param block: Block
:return: 返回hash值
'''
#我们相比下确保这个字典(区块)是经过排序的,否则我们将会得到不一致的散列
block_string=json.dumps(block,sort_keys=True).encode()
return hashlib.sha256(block_string).hexdigest() #@property装饰器就是负责把一个方法变成属性调用的
@property
def last_block(self):
# Returns the last Block in the chain
return self.chain[-1]
#每个块都有一个 索引,一个 时间戳(Unix时间戳),一个事务列表, 一个 校验(稍后详述) 和 前一个块的散列 。
"""
实现工作量证明
让我们来实现一个相似 PoW 算法。规则类似上面的例子:
找到一个数字 P ,使得它与前一个区块的 proof 拼接成的字符串的 Hash 值以 4 个零开头。 衡量算法复杂度的办法是修改零开头的个数。使用 4 个来用于演示,你会发现多一个零都会大大增加计算出结果所需的时间。
"""
def proof_of_work(self,last_proof):
'''
:param last_proof:
:return:
'''
proof=0
while self.valid_proof(last_proof,proof) is False:
proof+=1
return proof @staticmethod
def valid_proof(last_proof,proof):
'''
:param last_proof: 上一个pow算法
:param proof: 现在的pow算法
:return:
'''
guess=f'{last_proof}{proof}'.encode()
guess_hash=hashlib.sha256(guess).hexdigest()
return guess_hash[:4]=="0000" app=Flask(__name__)
node_identity=str(uuid4()).replace('-','')
blockchain=Blockchain()
@app.route('/')
@app.route('/mine',methods=['GET'])
def mine():
# 挖矿
# 挖矿正是神奇所在,它很简单,做了一下三件事:
#
# 计算工作量证明 PoW
# 通过新增一个交易授予矿工(自己)一个币
# 构造新区块并将其添加到链中
# We run the proof of work algorithm to get the next proof...
last_block=blockchain.last_block
last_proof=last_block['proof']
proof=blockchain.proof_of_work(last_proof)
# We must receive a reward for finding the proof.
# The sender is "0" to signify that this node has mined a new coin.
blockchain.new_transation(
sender="0",
recipient=node_identity,
amount=1,
)
# Forge the new Block by adding it to the chain
previous_hash=blockchain.hash(last_block)
block=blockchain.new_block(proof,previous_hash)
response={
'message': "New Block Forged",
'index': block['index'],
'transactions': block['transactions'],
'proof': block['proof'],
'previous_hash': block['previous_hash'],
}
return jsonify(response),200
@app.route('/transactions/new',methods=['POST'])
def new_transaction():
'''
我们将添加一个新的事务处理
:return:
'''
values=request.get_json()
required=['sender','recipient','amount']
if not all(k in values for k in required):
return "Missing values", 400
#创建一个新的事务
index=blockchain.new_transation(values['sender'],values['recipient'],values['amount'])
response={'message':f'在区块上添加事务{index}'}
return jsonify(response),201 @app.route('/chain',methods=['GET'])
def full_chain():
a_chain=blockchain.chain
response={
'chain':a_chain,
'length':len(a_chain),
}
return jsonify(response),200
if __name__=="__main__":
app.run(debug=True) # 注意交易的接收者是我们自己的服务器节点,我们做的大部分工作都只是围绕 Blockchain 类方法进行交互。
# 到此,我们的区块链就算完成了,我们来实际运行下.
参考地址:https://segmentfault.com/a/1190000014483104?utm_source=channel-hottest
python搭建区块链的更多相关文章
- hyperledger explorer 结合 fabric1.4 搭建 区块链浏览器 踩坑记录
博主通过这篇博客的步骤搭建区块链浏览器:https://blog.csdn.net/qq_32675427/article/details/99946945 进行到下面这一步时出现各种异常,浪费了博主 ...
- 基于arm v8搭建区块链环境
服务器信息: cpu:华为鲲鹏 cpu架构:arm v8 系统:CenOS-AltArch 7.6 相关工具安装 yum更新 yum update 安装vim/gcc/git/curl工具软件 yum ...
- python实现区块链代码
如果你明白了原理其实挺简单的. 加密算法是python自带的 需要导入hashlib import hashlib as hash sha = hasher.sha256() sha.update(' ...
- 40多行python代码开发一个区块链。
40多行python代码开发一个区块链?可信吗?我们将通过Python 2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理.python开发区块链的源代码保存在Github. 尽管有人认为 ...
- Go语言开发区块链只需180行代码
区块链开发用什么语言?通过本文你将使用Go语言开发自己的区块链(或者说用go语言搭建区块链).理解哈希函数是如何保持区块链的完整性.掌握如何用Go语言编程创造并添加新的块.实现多个节点通过竞争生成块. ...
- [区块链] 带你进入Bitcoin开发 - 环境搭建
学习完区块链枯燥乏味的.高深的.必备的基础知识后,终于可以走上开发之路了!真是迫不及待啦!之后博客更新主要放在区块链的开发上,相信这才是大多数同学更加感兴趣的地方!学习过程从最经典的区块链鼻祖-比特币 ...
- 50行Python代码构建小型区块链
本文介绍了如何使用python构建一个小型的区块链技术,使用Python2实现,代码不到50行. Although some think blockchain is a solution waitin ...
- 用 Python 撸一个区块链
本文翻译自 Daniel van Flymen 的文章 Learn Blockchains by Building One 略有删改.原文地址:https://hackernoon.com/learn ...
- 用Python从零开始创建区块链
本文主要内容翻译自Learn Blockchains by Building One 本文原始链接,转载请注明出处. 作者认为最快的学习区块链的方式是自己创建一个,本文就跟随作者用Python来创建一 ...
随机推荐
- Android stadio Switch repository Android stadio切换仓库
Android stadio 有时候,有很多module. 这些module 都有自己的仓库.也就是不在一块.那么,Android stadio 默认管理的就是根git. 如图,画对号的就是默认的. ...
- 获取HTTP请求头中的地址
技术交流群:233513714 public static String getIpAddr(HttpServletRequest request) { String ip = request.get ...
- powershell设置SS代理
$env:HTTPS_PROXY="http://127.0.0.1:1080" $env:HTTP_PROXY="http://127.0.0.1:1080"
- python 按位置关系输出矩阵元素
描述:依次输出矩阵中最近邻的元素 例如:输入: [[1, 2, 3] [4, 5, 6] [7, 8, 9]] 输出: [[ 1. 2. 4. 5. 3. 6. 7. 8. 9.] [ ...
- Java与Scala的两种简易版连接池
Java版简易版连接池: import java.sql.Connection; import java.sql.DriverManager; import java.util.LinkedList; ...
- 利用split方法计算字符串中出现字母最多的次数
最近练习一些简单的算法题,知道自己很不聪明,但却没想到用了这么久,划算不划算是个需要考虑的问题, 其中有个算法是:统计一个字符串出现最多的字母,网上很多自己的见解,但是才疏学浅,有些地方看的有点困难, ...
- Fiddler - 使用教程
1.断点调试,修改请求表单和响应数据 命令介绍: bpu在请求开始时中断,bpafter在响应到达时中断,bps在特定http状态码时中断,bpv/bpm在特定请求method时中断. bpu m.t ...
- [网站公告]1月10日1:00-7:00阿里云RDS维护会造成30秒闪断
大家好! 阿里云将于1月10号1:00-7:00(今天夜里)对杭州机房部分RDS实例所在的物理主机做维护操作,维护期间部分RDS实例会有1-2次闪断,每次闪断时间在30秒以内. 我们使用的RDS实例将 ...
- 关于用python作为第三方程序,来调用shell命令的问题,以及返回值格式解析
1.用python语言作为第三方,调用shell 在python2.x中,可以通过包commands来进行调用shell命令.如下: cmd就是你要调用的shell命令,把环境配置好,输入正确的命令格 ...
- 孤荷凌寒自学python第五十二天初次尝试使用python读取Firebase数据库中记录
孤荷凌寒自学python第五十二天初次尝试使用python读取Firebase数据库中记录 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数 ...