主页 > 怎么注册imtoken钱包 > Python区块链框架_用python实现自己的区块链(with python foundation)
Python区块链框架_用python实现自己的区块链(with python foundation)
4、Flask是python的轻量级web框架比特币产生的基础是,非常适合快速web开发。 我有一个用它编写的论坛项目。
6. 这是代码。 我的代码每个方法都写的很详细,有基础的人都能看懂。 如有不明白或报错欢迎评论留言
7. 请注意,我只用一节课就可以做到。
导入哈希库
导入 json
导入请求
从 textwrap 导入 dedent
从时间导入时间
从 uuid 导入 uuid4
从 urllib.parse 导入 urlparse
从烧瓶导入烧瓶,jsonify,请求
类区块链(对象):
def __init__(自我):
...
自己。 节点=设置()
# 使用set存储节点,避免重复添加节点。
...
自己。 链 = []
自己。 当前交易 = []
# 创建创世块
self.new_block(previous_hash=1,proof=100)
def register_node(自我,地址):
"""
将新节点添加到节点列表
:参数地址:
:返回:
"""
prsed_url = urlparse(地址)
self.nodes.add(prsed_url.netloc)
def valid_chain(自我,链):
"""
确定给定的区块链是否有效
:参数链:
:返回:
"""
last_block =链[0]
当前索引 = 1
而 current_index
块=链[current_index]
打印(f'{last_block}')
打印(f'{块}')
打印(“\n______\n”)
# 检查区块的哈希值是否正确
如果块 ['previous_hash'] != self.hash(last_block):
返回假
# 检查工作证明是否正确
如果不是 self.valid_proof(last_block['proof'], block['proof']):
返回假
last_block = 块
当前索引 += 1
返回真
def resolve_conflicts(自我):
"""
共识算法
:返回:
"""
邻居= self.nodes
新链=无
# 找到最长的链
max_length = len(self.chain)
# 获取并验证网络中所有节点的链
对于邻居中的节点:
响应 = 请求。 get(f'{node}/chain')
如果 response.status_code == 200:
length = response.json()['length']
chain = response.json()['chain']
# 检查长度是否长,链是否有效
如果长度 > max_length 和自我。 有效链(链):
最大长度 = 长度
new_chain = 链
# 如果发现新的有效链比当前链长,则替换当前链
如果是新链:
self.chain = new_chain
返回真
返回假
def new_block(self, proof, previous_hash=None):
"""
创建一个新块并将其添加到链中
:param proof: 工作量证明算法生成的证明
:param previous_hash: 上一个区块的哈希值
:return: 新块
"""
块= {
'index':len(self.chain)+1,
'时间戳':时间(),
'交易':自我。 当前交易,
'证明':证明,
'previous_hash': previous_hash or self.hash(self.chain[-1]),
}
# 重置当前交易记录
自己。 当前交易 = []
自己。 链。 附加(块)
返回块
def new_transaction(self, sender, recipient, amount):
# 将新交易添加到交易列表中
"""
创建一个新交易以进入下一个开采区块
:param sender: 发件人地址
:param recipient: 收件人地址
:param amount: 数量
:return: 持有该交易的区块的索引
"""
self.current_transactions.append({
'发件人':发件人,
'收件人':收件人,
'金额':金额,
})
回归自我。 最后一个块['索引'] + 1
@静态方法
def哈希(块):
"""
为块生成 SHA-256 值
:参数块:
:返回:
"""
# 你必须确保这个字典(块)是有序的,否则你会得到不一致的散列
block_string = json.dumps(block,sort_keys=True).encode()
返回 hashlib.sha256(block_string).hexdigest()
@财产
def last_block(自我):
# 返回链中的最后一个块
回归自我。 链[-1]
def proof_of_work(自我,last_proof):
# 工作算法的简单证明
证明 = 0
而 self.valid_proof(last_proof, proof) 为假:
证明 +=1
退货证明
@静态方法
def valid_proof(last_proof,证明):
# 验证证明
guess = f'{last_proof}{proof}'.encode()
guess_hash = hashlib.sha256(猜测).hexdigest()
返回 guess_hash[:4] =="0000"
# 实例化节点
app = 烧瓶(__name__)
# 为这个节点生成一个全球唯一的地址
node_identifier = str(uuid4()).replace('-','')
# 实例化区块链类
区块链=区块链()
# 发起挖矿请求
@app.route('/我的',methods=['GET'])
定义我的():
# 运行工作量证明算法以获得下一个证明。
last_block = blockchain.last_block
last_proof = last_block['proof']
proof = blockchain.proof_of_work(last_proof)
# 找到证据必须获得奖励。
blockchain.new_transaction(
发件人=“0”,
收件人=节点标识符,
金额=1,
)
# 通过将它们添加到链中来构建新块
previous_hash = blockchain.hash(last_block)
区块 = 区块链。 new_block(证明,previous_hash)
回应 = {
'消息':“新块锻造”,
'索引':块['索引'],
'交易':块['交易'],
'证明':块['证明'],
'previous_hash':块['previous_hash'],
}
返回 jsonify(响应),200
# 创建交易请求
@app.route('/transactions/new',methods=['POST'])
def new_transactions():
价值观 =要求。 get_json()
# 检查必填字段是否在 POST 数据中
必需 = ['家宴', '收件人', '金额']
如果不是全部(k in values for k in request):
返回“缺失值”,400
# 创建一个新事物
index = blockchain.new_transaction(values['sender'], values['recipient'], values['amount'])
response = {'message': f'Transaction will be added to Block {index}'}
返回 jsonify(响应),201
# 获取所有快速消息
@app.route('/chain',methods=['GET'])
def full_chain():
回应 = {
'链':blockchain.chain,
'长度':len(blockchain.chain),
}
返回 jsonify(响应),200
# 添加节点
@app.route('/nodes/register',methods=['POST'])
def register_nodes():
价值观 =要求。 get_json()
节点 = 值。 得到('节点')
如果节点是无:
返回“错误:请提供有效的节点列表”,400
对于节点中的节点:
区块链。 注册节点(节点)
回应 = {
'message': '已添加新节点',
'total_nodes':列表(blockchain.nodes),
}
返回 jsonify(响应),201
# 解决冲突
@app.route('/nodes/resolve', methods=['GET'])
定义共识():
替换 = 区块链。 解决冲突()
如果更换:
回应 = {
'message': '我们的链条被替换了',
'new_chain':blockchain.chain
}
别的:
回应 = {
'message': '我们的链是权威的',
'链':区块链。 链
}
返回 jsonify(响应),200
如果 __name__ == '__main__':
应用程序运行(主机='0.0.0.0'比特币产生的基础是,端口=5000)
代码准备好启动你的项目后,打开Postman并完成以下操作
XocCyBrwu5.png
让我们按要求挖矿:5000/矿
0FhWFFwqhI.png
以后会继续更新。