用python实现区块链简单原理

本是古典 何须时尚 2023-07-07 12:55 78阅读 0赞

1.设置好区块链的对应方法

  1. #一个区块应该包括的内容
  2. # {
  3. # 'index':0, #索引
  4. # 'timestamp':"", #时间戳
  5. # 'trascations':[ #交易信息
  6. # {"sender":"", #交易发送者
  7. # recipient":"",#交易接收者
  8. # "amout":""} #转账金额
  9. # ],
  10. # 'proof':"",#工作量证明
  11. # 'previous_hash':"" #上一个交易的hash值
  12. # }
  13. import hashlib
  14. import json
  15. from time import time
  16. from urllib.parse import urlparse
  17. import requests
  18. class Blokchain:
  19. def __init__(self):
  20. self.chain=[]
  21. #准备好一个存储当前交易记录的列表
  22. self.current_trascations=[]
  23. #准备实现一个创世纪的区块,其参数值可以是任意的
  24. self.new_block(proof=1,previous_hash=1)
  25. #准备好变量保存节点信息
  26. self.nodes=set()
  27. #注册节点,保存好节点的网络信息
  28. def register_node(self,address:str):
  29. parsed_url=urlparse(address)
  30. self.nodes.add(parsed_url.netloc)
  31. #解决冲突,实现共识机制
  32. def resolve_conflics(self):
  33. neighbours=self.nodes
  34. max_length=len(self.chain)
  35. new_chain=None
  36. for node in neighbours:
  37. response=requests.get(f'http://{node}/chain')
  38. if response.status_code==200:
  39. length=response.json()['length']
  40. chain=response.json()['chain']
  41. if length>max_length and self.valid_chain(chain):
  42. max_length=length
  43. new_chain=chain
  44. if new_chain:
  45. self.chain=new_chain
  46. return True
  47. return False
  48. #添加一个新的区块
  49. def new_block(self,proof,previous_hash=None):
  50. #准备一个新的区块
  51. block={
  52. 'index':len(self.chain)+1,
  53. 'timestamp':time(),
  54. 'trascations':self.current_trascations,
  55. 'proof':proof,
  56. 'previous_hash':previous_hash or self.hash(self.last_block)
  57. }
  58. #清空新的交易
  59. self.current_trascations=[]
  60. #把区块加入链条中
  61. self.chain.append(block)
  62. return block
  63. #创建一个新的交易
  64. def new_trascations(self,sender,recipient,amout):
  65. ''' :param sender: 交易的发送者 :param recipient: 交易的接收者 :param amout: 交易的金额 :return: 整型,返回创建新区块链的索引。 '''
  66. self.current_trascations.append({
  67. 'sender':sender,
  68. 'recipient':recipient,
  69. 'amout':amout
  70. })
  71. return self.last_block['index']+1
  72. #计算一个区块的hash值,使用静态方法
  73. @staticmethod
  74. def hash(block):
  75. #把节点传入的信息进行转化为字节串,并编码,这样hash函数才能够认识
  76. block_string=json.dumps(block,sort_keys=True).encode()
  77. #进行hash计算得到的是一个对象,进行hesdidest()方法得到hash摘要
  78. return hashlib.sha256(block_string).hexdigest()
  79. #获取一个最后一个区块。当做属性来处理
  80. @property
  81. def last_block(self):
  82. return self.chain[-1]
  83. #实现工作量证明,为了简化操作,我们就用上一个区块链的(hash值)工作量证明来验证
  84. def proof_of_work(self,last_proof):
  85. proof=0
  86. while self.valid_proof(last_proof,proof) is False:
  87. proof+=1
  88. print(proof)
  89. return proof #返回工作量证明
  90. #验证工作量的合法性
  91. def valid_proof(self,last_proof,proof):
  92. #把last_proof和proof拼接在一起,进行编码
  93. guess=f'{last_proof}{proof}'.encode()
  94. guess_hash=hashlib.sha256(guess).hexdigest()
  95. print(guess_hash)
  96. #说明工作强度,返回一个bool值
  97. return guess_hash[0:4]=='0000'
  98. #判断链条是否为有效链条
  99. def valid_chain(self, chain):
  100. last_block=chain[0]
  101. current_index=1
  102. while current_index<len(chain):
  103. block=chain[current_index]
  104. #如果上一块链的hash值不等于,则说明是假的
  105. if block['previous_hash']!=self.hash(last_block):
  106. return False
  107. #判断工作量证明
  108. if not self.valid_proof(last_block['proof'],block['proof']):
  109. return False
  110. #如果都满足则解决对应问题
  111. last_block=block
  112. current_index+=1
  113. return True
  114. if __name__=="__main__":
  115. testPow=Blokchain()
  116. testPow.proof_of_work(100)

2通过flask 实现网络节点的调用

  1. ''' 设置网络模拟,区块链中各个节点的运行原理 '''
  2. from uuid import uuid4
  3. from blockchain import Blokchain
  4. import flask
  5. import requests
  6. from flask import Flask, jsonify, request
  7. block_chain=Blokchain()
  8. #初始化一个Flask
  9. app=Flask(__name__)
  10. #实现创建一个新的交易
  11. @app.route('/transction/new',methods=['POST'])
  12. def new_transction():
  13. values=request.get_json()
  14. #判断获取的信息在不在范围内
  15. required=['sender','recipient','amout']
  16. if values==None:
  17. return 'Miss values !', 400
  18. #如果请求不在范围require的列表内,则返回错误
  19. if not all(k in values for k in required):
  20. return 'Miss values !',400
  21. index=block_chain.new_trascations(values['sender'],values['recipient'],values['amout'])
  22. response={ 'message':f'Transction will be added to Block {index}'}
  23. return jsonify(response),201
  24. #引入一个计算地址的库,保存好地址
  25. node_identifier=str(uuid4().replace('-',''))
  26. #实现挖矿(实现交易的打包)
  27. @app.route('/mine',methods=['GET'])
  28. def mine():
  29. last_block=block_chain.last_block
  30. last_proof=last_block['proof']
  31. proof=block_chain.proof_of_work(last_proof)
  32. # 完成一笔交易,给自己一点奖励
  33. block_chain.new_trascations(sender='0',
  34. recipient=node_identifier,
  35. amout=1)
  36. block=block_chain.new_block(proof,None)#给区块新建一个区块
  37. #打包好区块,广播给各个节点
  38. response={
  39. "message":'Now block forgod',
  40. 'index':block['index'],
  41. 'transactions':block['transactions'],
  42. 'proof':block['proof'],
  43. 'previous_hash':block['previous_hash']
  44. }
  45. return jsonify(response),200
  46. #实现增加一个节点
  47. @app.route('/chain',methods=['GET'])
  48. def chain():
  49. response={
  50. 'chain':block_chain.chain,
  51. 'length':len(block_chain.chain)
  52. }
  53. return jsonify(response),200
  54. #接收用户的节点注册:所接收的json字符串格式为{"nodes",["http:127.XXX]}
  55. @app.route('nodes/register',methods=['POST'])
  56. def register_nodes():
  57. values=request.get_json()
  58. nodes=values.get('nodes')
  59. if nodes is None:
  60. return "Error:please supply a valid list of nodes",400
  61. response={
  62. "message":"New nodes have been added",
  63. "total_nodes":list(block_chain.nodes)
  64. }
  65. return jsonify(response),201
  66. #设置达成共识的请求,解决冲突
  67. @app.route('/nodes/resolve',methods=['GET'])
  68. def consensus():
  69. replace=block_chain.resolve_conflics()
  70. if replace:
  71. response={
  72. 'message':"our chain was replaced",
  73. 'chain':block_chain.chain
  74. }
  75. else:
  76. response = {
  77. 'message': "our chain was authoritative",
  78. 'chain': block_chain.chain
  79. }
  80. return jsonify(response),200
  81. if __name__=='__main__':
  82. app.run(host='0.0.0.0', port=6000)

发表评论

表情:
评论列表 (有 0 条评论,78人围观)

还没有评论,来说两句吧...

相关阅读

    相关 简单区块Python实现

    什么是区块链 区块链是一种数据结构,也是一个分布式数据库。 从技术上来看:区块是一种记录交易的数据结构,反映了一笔交易的资金流向。系统中已经达成的交易的区块连接在一起形

    相关 Python & 区块

    一个完整的区块栗子 每个区块都有其索引,时间戳(Unix 时间),交易列表,证明 proof(稍后解释),以及前序区块的哈希值。 block = {

    相关 区块技术原理

     区块链是什么?     “区块链”技术最初是由一位化名中本聪的人为比特币(一种数字货币)而设计出的一种特殊的数据库技术,它基于密码学中的椭圆曲线数字签名算法(ECDSA

    相关 区块 简单实现介绍

    区块链的基础概念很简单:一个分布式数据库,存储一个不断加长的 list,list 中包含着许多有序的记录。然而,在通常情况下,当我们谈到区块链的时候也会谈起使用区块链来解决的问