1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. '''
  4. 我们要创建一个 Blockchain 类 ,他的构造函数创建了一个初始化的空列表(要存储我们的区块链),并且另一个存储交易。
  5. 我们的 Blockchain 类负责管理链式数据,它会存储交易并且还有添加新的区块到链式数据的Method。
  6. '''
  7. import hashlib
  8. import json
  9. import time
  10. from textwrap import dedent
  11. from uuid import uuid4
  12. from flask import Flask,jsonify,request
  13. class Blockchain(object):
  14. def __init__(self):
  15. self.chain=[]
  16. self.current_transations=[]
  17. ## 创建创世区块,源区块,第一个区块前面没了。
  18. self.new_block(previous_hash=1,proof=100)
  19.  
  20. def new_block(self,previous_hash,proof):
  21. '''
  22. 创建一个新的区块到区块链
  23. :param previous_hash:前一个区块的hash值
  24. :param proof: 由工作量证明(PoW)算法生成的证明
  25. :return: 返回新的区块
  26. '''
  27. block={
  28. 'index':len(self.chain)+1,
  29. 'timestamp':time.time(),
  30. 'transactions':self.current_transations,
  31. 'proof':proof,
  32. 'previous_hash':previous_hash or self.hash(self.chain[-1])
  33. }
  34. #重置当前交易记录
  35. self.current_transations=[]
  36. self.chain.append(block)
  37. return block
  38.  
  39. def new_transation(self,sender,recipient,amount):
  40. # Adds a new transaction to the list of transactions
  41. '''
  42. 创建一笔新的交易到下一个被挖掘的区块中
  43. :param sender: 发送者
  44. :param recipient: 接收方
  45. :param amount: 发送数量
  46. :return: 返回将被添加到的区块的索引
  47. '''
  48. self.current_transations.append({
  49. 'sender':sender,
  50. 'recipient':recipient,
  51. 'amount':amount,
  52. })
  53. return self.last_block['index']+1
  54.  
  55. @staticmethod
  56. def hash(block):
  57. '''
  58. 给一个区块生成SHA-256值
  59. :param block: Block
  60. :return: 返回hash值
  61. '''
  62. #我们相比下确保这个字典(区块)是经过排序的,否则我们将会得到不一致的散列
  63. block_string=json.dumps(block,sort_keys=True).encode()
  64. return hashlib.sha256(block_string).hexdigest()
  65.  
  66. #@property装饰器就是负责把一个方法变成属性调用的
  67. @property
  68. def last_block(self):
  69. # Returns the last Block in the chain
  70. return self.chain[-1]
  71. #每个块都有一个 索引,一个 时间戳(Unix时间戳),一个事务列表, 一个 校验(稍后详述) 和 前一个块的散列 。
  72. """
  73. 实现工作量证明
  74. 让我们来实现一个相似 PoW 算法。规则类似上面的例子:
  75. 找到一个数字 P ,使得它与前一个区块的 proof 拼接成的字符串的 Hash 值以 4 个零开头。
  76.  
  77. 衡量算法复杂度的办法是修改零开头的个数。使用 4 个来用于演示,你会发现多一个零都会大大增加计算出结果所需的时间。
  78. """
  79. def proof_of_work(self,last_proof):
  80. '''
  81. :param last_proof:
  82. :return:
  83. '''
  84. proof=0
  85. while self.valid_proof(last_proof,proof) is False:
  86. proof+=1
  87. return proof
  88.  
  89. @staticmethod
  90. def valid_proof(last_proof,proof):
  91. '''
  92. :param last_proof: 上一个pow算法
  93. :param proof: 现在的pow算法
  94. :return:
  95. '''
  96. guess=f'{last_proof}{proof}'.encode()
  97. guess_hash=hashlib.sha256(guess).hexdigest()
  98. return guess_hash[:4]=="0000"
  99.  
  100. app=Flask(__name__)
  101. node_identity=str(uuid4()).replace('-','')
  102. blockchain=Blockchain()
  103. @app.route('/')
  104. @app.route('/mine',methods=['GET'])
  105. def mine():
  106. # 挖矿
  107. # 挖矿正是神奇所在,它很简单,做了一下三件事:
  108. #
  109. # 计算工作量证明 PoW
  110. # 通过新增一个交易授予矿工(自己)一个币
  111. # 构造新区块并将其添加到链中
  112. # We run the proof of work algorithm to get the next proof...
  113. last_block=blockchain.last_block
  114. last_proof=last_block['proof']
  115. proof=blockchain.proof_of_work(last_proof)
  116. # We must receive a reward for finding the proof.
  117. # The sender is "0" to signify that this node has mined a new coin.
  118. blockchain.new_transation(
  119. sender="0",
  120. recipient=node_identity,
  121. amount=1,
  122. )
  123. # Forge the new Block by adding it to the chain
  124. previous_hash=blockchain.hash(last_block)
  125. block=blockchain.new_block(proof,previous_hash)
  126. response={
  127. 'message': "New Block Forged",
  128. 'index': block['index'],
  129. 'transactions': block['transactions'],
  130. 'proof': block['proof'],
  131. 'previous_hash': block['previous_hash'],
  132. }
  133. return jsonify(response),200
  134. @app.route('/transactions/new',methods=['POST'])
  135. def new_transaction():
  136. '''
  137. 我们将添加一个新的事务处理
  138. :return:
  139. '''
  140. values=request.get_json()
  141. required=['sender','recipient','amount']
  142. if not all(k in values for k in required):
  143. return "Missing values", 400
  144. #创建一个新的事务
  145. index=blockchain.new_transation(values['sender'],values['recipient'],values['amount'])
  146. response={'message':f'在区块上添加事务{index}'}
  147. return jsonify(response),201
  148.  
  149. @app.route('/chain',methods=['GET'])
  150. def full_chain():
  151. a_chain=blockchain.chain
  152. response={
  153. 'chain':a_chain,
  154. 'length':len(a_chain),
  155. }
  156. return jsonify(response),200
  157. if __name__=="__main__":
  158. app.run(debug=True)
  159.  
  160. # 注意交易的接收者是我们自己的服务器节点,我们做的大部分工作都只是围绕 Blockchain 类方法进行交互。
  161. # 到此,我们的区块链就算完成了,我们来实际运行下.

  参考地址:https://segmentfault.com/a/1190000014483104?utm_source=channel-hottest

python搭建区块链的更多相关文章

  1. hyperledger explorer 结合 fabric1.4 搭建 区块链浏览器 踩坑记录

    博主通过这篇博客的步骤搭建区块链浏览器:https://blog.csdn.net/qq_32675427/article/details/99946945 进行到下面这一步时出现各种异常,浪费了博主 ...

  2. 基于arm v8搭建区块链环境

    服务器信息: cpu:华为鲲鹏 cpu架构:arm v8 系统:CenOS-AltArch 7.6 相关工具安装 yum更新 yum update 安装vim/gcc/git/curl工具软件 yum ...

  3. python实现区块链代码

    如果你明白了原理其实挺简单的. 加密算法是python自带的 需要导入hashlib import hashlib as hash sha = hasher.sha256() sha.update(' ...

  4. 40多行python代码开发一个区块链。

    40多行python代码开发一个区块链?可信吗?我们将通过Python 2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理.python开发区块链的源代码保存在Github. 尽管有人认为 ...

  5. Go语言开发区块链只需180行代码

    区块链开发用什么语言?通过本文你将使用Go语言开发自己的区块链(或者说用go语言搭建区块链).理解哈希函数是如何保持区块链的完整性.掌握如何用Go语言编程创造并添加新的块.实现多个节点通过竞争生成块. ...

  6. [区块链] 带你进入Bitcoin开发 - 环境搭建

    学习完区块链枯燥乏味的.高深的.必备的基础知识后,终于可以走上开发之路了!真是迫不及待啦!之后博客更新主要放在区块链的开发上,相信这才是大多数同学更加感兴趣的地方!学习过程从最经典的区块链鼻祖-比特币 ...

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

    本文介绍了如何使用python构建一个小型的区块链技术,使用Python2实现,代码不到50行. Although some think blockchain is a solution waitin ...

  8. 用 Python 撸一个区块链

    本文翻译自 Daniel van Flymen 的文章 Learn Blockchains by Building One 略有删改.原文地址:https://hackernoon.com/learn ...

  9. 用Python从零开始创建区块链

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

随机推荐

  1. DFS:C 小Y的难题(1)

    解题心得: 1.在明确使用DFS之后一定要找到递归函数的出口.方向,以及递归的点(在某个情况下开始递归)(void 也可以return,但是没有返回值).递归时也要有递归的方向,最后都能够达到递归的出 ...

  2. Oozie 实战之 Hive

    1.编辑job.propertiers nameNode=hdfs://cen-ubuntu.cenzhongman.com:8020 jobTracker=localhost:8032 queueN ...

  3. runtime如何通过selector找到对应的IMP地址?(分别考虑类方法和实例方法)

    每一个类对象中都一个对象方法列表(对象方法缓存) 类方法列表是存放在类对象中isa指针指向的元类对象中(类方法缓存) 方法列表中每个方法结构体中记录着方法的名称,方法实现,以及参数类型,其实selec ...

  4. 《Cracking the Coding Interview》——第16章:线程与锁——题目1

    2014-04-27 19:09 题目:线程和进程有什么区别? 解法:理论题,操作系统教材上应该有很详细的解释.我回忆了一下,写了如下几点. 代码: // 16.1 What is the diffe ...

  5. webstrom11 vue插件配置

    直接上图 1. 安装vue插件 2.添加模板 3.指定模板类型 最新的是插件 是 vue.js 创建完 Vue File 文件后 需要在 下面这里关联一下

  6. Centos7中查看IP地址命令ifconfig无法识别如何处理

    问题描述: 在虚拟机中已安装好Centos7系统,查看IP地址使用命令ifconfig时,提示找不到此命令,使用ip addr命令则可查询当前系统的IP地址(如图1.2): 图1 图2 解决问题步骤: ...

  7. ansible自动安装jdk

    脚本功能:安装jdk 测试环境:CentOS6.7 说明: 1.卸载系统自带的openjdk,重新安装Oracle jdk,支持Hotspot,性能更好,更稳定. 2.jdk软件包按文档说明进行定制( ...

  8. 团队项目-第九次scrum 会议

    时间:11.5 时长:40分钟 地点:F楼1039教室 工作情况 团队成员 已完成任务 待完成任务 解小锐 完成员工commit函数的数值函数编写 完成多种招聘方式的逻辑编写 陈鑫 实现游戏的暂停功能 ...

  9. 【转载】10个最佳ES6特性

    译者按: 人生苦短,我用ES6. 原文: Top 10 ES6 Features Every Busy JavaScript Developer Must Know 译者: Fundebug 为了保证 ...

  10. Visual Studio 2017 添加引用报错(未能正确加载ReferenceManagerPackage包)

    最近安装了VS2017,在开发时需要添加引用,于是像原来使用vs2012那样直接右键,添加引用,结果弹出一个错误提示“未能完成操作.不支持此接口”.真真是见了鬼了...... google.度娘一顿搜 ...