python区块链简单模拟【03】

引入钱包,账户地址,公私钥

# 导入椭圆曲线算法
from ecdsa import SigningKey, SECP256k1, VerifyingKey, BadSignatureError
import binascii
import base64
from hashlib import sha256class Wallet:"""钱包"""def __init__(self):"""钱包初始化时基于椭圆曲线生成一个唯一的秘钥对,代表区块链上一个唯一的账户"""self._private_key = SigningKey.generate(curve=SECP256k1)   #私钥  签名self._public_key = self._private_key.get_verifying_key()   #公钥  验证 @property    #通过 @property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对“()”小括号。def address(self):"""这里通过公钥生成地址base64.b64encode()将bytes类型数据进行base64编码,返回编码后的bytes类型base64.b64deocde()将base64编码的bytes类型进行解码,返回解码后的bytes类型、常见于网址url加密中"""h = sha256(self._public_key.to_pem())return base64.b64encode(h.digest())  #返回16进制sha256哈希加密后的哈希值并对其进行编码@propertydef pubkey(self):"""返回公钥字符串"""return self._public_key.to_pem()def sign(self, message):"""生成数字签名"""h = sha256(message.encode('utf8'))return binascii.hexlify(self._private_key.sign(h.digest()))  #二进制输出def verify_sign(pubkey, message, signature):"""验证签名"""verifier = VerifyingKey.from_pem(pubkey)h = sha256(message.encode('utf8'))return verifier.verify(binascii.unhexlify(signature), h.digest())

在这里插入图片描述

# 新建一个钱包w = Wallet()

在这里插入图片描述

# 打印钱包地址  
w.address

在这里插入图片描述

# 打印钱包公钥w.pubkey

在这里插入图片描述

# 测试数据data = "交易数据"
# 生成签名sig = w.sign(data)# 打印签名
print(sig)

在这里插入图片描述

# 验证签名verify_sign(w.pubkey, data, sig)

在这里插入图片描述

import jsonclass Transaction:"""交易的结构"""def __init__(self, sender, recipient, amount):"""初始化交易,设置交易的发送方、接收方和交易数量"""if isinstance(sender, bytes):sender = sender.decode('utf-8')self.sender = sender            # 发送方if isinstance(recipient, bytes):recipient = recipient.decode('utf-8')self.recipient = recipient      # 接收方self.amount = amount            # 交易数量def set_sign(self, signature, pubkey):"""为了便于验证这个交易的可靠性,需要发送方输入他的公钥和签名"""self.signature = signature      # 签名self.pubkey = pubkey            # 发送方公钥  提供给验证者和接收方用来验证交易def __repr__(self):"""交易大致可分为两种,一是挖矿所得,而是转账交易挖矿所得无发送方,以此进行区分显示不同内容"""if self.sender:           #发送方不为空,则是转账交易   s = "从 %s 转至 %s %d个加密货币" % (self.sender, self.recipient, self.amount)else:                     #否则是挖矿所得s = "%s 挖矿获取%d个加密货币" % (self.recipient, self.amount)return sclass TransactionEncoder(json.JSONEncoder):"""定义Json的编码类,用来序列化Transaction"""def default(self, obj):if isinstance(obj, Transaction):return obj.__dict__else:return json.JSONEncoder.default(self, obj)

在这里插入图片描述`import hashlib
from datetime import datetime

class Block:
“”"
区块结构
prev_hash: 父区块哈希值
transactions: 交易列表
timestamp: 区块创建时间
hash: 区块哈希值
Nonce: 随机数
“”"
def init(self, transactions, prev_hash):
# 将传入的父哈希值和数据保存到类变量中
self.prev_hash = prev_hash
self.transactions = transactions
# 获取当前时间
self.timestamp = datetime.now().strftime(“%Y-%m-%d %H:%M:%S”)

    # 设置Nonce和哈希的初始值为Noneself.nonce = Noneself.hash = Nonedef __repr__(self):return "区块内容:%s\n哈希值: %s" % (json.dumps(self.transactions), self.hash)`

在这里插入图片描述

class ProofOfWork:"""工作量证明简化为一个挖矿者,只要挖矿就一定能挖到,只是时间问题"""def __init__(self, block, miner, difficult=5):self.block = block# 定义工作量难度,默认为5,表示有效的哈希值以5个“0”开头self.difficulty = difficultself.miner = miner# 添加挖矿奖励self.reward_amount = 1  #奖励一个加密货币def mine(self):"""挖矿函数"""i = 0                            #初始化随机值prefix = '0' * self.difficulty   #设置难度# 添加奖励                    新建挖矿交易t = Transaction(sender="",recipient=self.miner.address,amount=self.reward_amount,)sig = self.miner.sign(json.dumps(t, cls=TransactionEncoder))    #钱包类中的账户使私钥签名t.set_sign(sig, self.miner.pubkey)                              #发送签名和公钥self.block.transactions.append(t)                               #将交易添加到区块链中交易列表中while True:message = hashlib.sha256()message.update(str(self.block.prev_hash).encode('utf-8'))# 更新区块中的交易数据# message.update(str(self.block.data).encode('utf-8'))message.update(str(self.block.transactions).encode('utf-8'))message.update(str(self.block.timestamp).encode('utf-8'))message.update(str(i).encode("utf-8"))digest = message.hexdigest()if digest.startswith(prefix):self.block.nonce = iself.block.hash = digestreturn self.blocki += 1def validate(self):"""验证有效性"""message = hashlib.sha256()#四句话将区块各个参数进行哈希运算message.update(str(self.block.prev_hash).encode('utf-8'))# 更新区块中的交易数据# message.update(str(self.block.data).encode('utf-8'))message.update(json.dumps(self.block.transactions).encode('utf-8'))message.update(str(self.block.timestamp).encode('utf-8'))message.update(str(self.block.nonce).encode('utf-8'))digest = message.hexdigest()  #16进制输出hash值prefix = '0' * self.difficultyreturn digest.startswith(prefix)   #验证是否为符合难度的哈希值

在这里插入图片描述

class BlockChain:"""区块链结构体blocks:        包含的区块列表"""def __init__(self):self.blocks = []def add_block(self, block):"""添加区块"""self.blocks.append(block)def print_list(self):print("区块链包含区块个数: %d\n" % len(self.blocks))for block in self.blocks:print("上个区块哈希:%s" % block.prev_hash)print("区块内容:%s" % block.transactions)print("区块哈希:%s" % block.hash)print("\n") 

在这里插入图片描述

def get_balance(user):balance = 0for block in blockchain.blocks:for t in block.transactions:if t.sender == user.address.decode():balance -= t.amountelif t.recipient == user.address.decode():balance += t.amountreturn balance

在这里插入图片描述

# 初始化区块链
blockchain = BlockChain()# 创建三个钱包,一个属于alice,一个属于tom,剩下一个属于bob
alice = Wallet()
tom = Wallet()
bob = Wallet()# 打印当前钱包情况
print("alice: %d个加密货币" % (get_balance(alice)))
print("tom: %d个加密货币" % (get_balance(tom)))
print("bob: %d个加密货币" % (get_balance(bob)))

在这里插入图片描述

# alice生成创世区块,并添加到区块链中new_block1 = Block(transactions=[], prev_hash="")
w1 = ProofOfWork(new_block1, alice)
genesis_block = w1.mine()
blockchain.add_block(genesis_block)
# 显示alice当前余额print("alice: %d个加密货币" % (get_balance(alice)))

在这里插入图片描述

# alice 转账给 tom 0.3个加密货币
transactions = []
new_transaction = Transaction(sender=alice.address,recipient=tom.address,amount=0.3
)
sig = tom.sign(str(new_transaction))       #私钥签名
new_transaction.set_sign(sig, tom.pubkey)  #发送签名和公钥

在这里插入图片描述

# bob 在网络上接收到这笔交易,进行验证没问题后生成一个新的区块并添加到区块链中if verify_sign(new_transaction.pubkey, str(new_transaction),new_transaction.signature):    #验证者验证# 验证交易签名没问题,生成一个新的区块print("验证交易成功")new_block2 = Block(transactions=[new_transaction], prev_hash="")print("生成新的区块...")w2 = ProofOfWork(new_block2, bob)block = w2.mine()                              #bob挖矿,找到新的区块将其写入区块链print("将新区块添加到区块链中")blockchain.add_block(block)
else:print("交易验证失败!")

在这里插入图片描述# 打印当前钱包情况 print("alice: %.1f个加密货币" % (get_balance(alice))) print("tom: %.1f个加密货币" % (get_balance(tom))) print("bob: %d个加密货币" % (get_balance(bob)))

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(1)(1.11) SiK Radio v2(一)

文章目录 前言 1 概述 2 特点 3 状态LED灯 前言 SiK 遥测无线电是在自动驾驶仪和地面站之间建立遥测连接的最简单方法之一。本文提供了如何连接和配置无线电的基本用户指南。 3DR Radio v2(SiKRadio 的消费者版本) !Note 本页面以前的…

企业跨境数据传输的创新技术和应用领域

在当前数字化时代,跨境数据传输成为一个极为关键的领域。随着数据传输需求的不断增加,跨国企业在这一过程中面临着越来越多的问题。为了解决这些挑战,创新技术层出不穷,为跨境数据传输提供了更高效、安全和可靠的解决方案。本文将…

visual studio code B站教程:GPT4

B站教程:AI编程辅助神器-CodeMoss使用介绍_哔哩哔哩_bilibili 通用 General 按 Press 功能 Function Ctrl Shift P,F1 显示命令面板 Show Command Palette Ctrl P 快速打开 Quick Open Ctrl Shift N 新窗口/实例 New window/instance Ctrl Sh…

Flink CDC 1.0至3.0回忆录

Flink CDC 1.0至3.0回忆录 一、引言二、CDC概述三、Flink CDC 1.0:扬帆起航3.1 架构设计3.2 版本痛点 四、Flink CDC 2.0:成长突破4.1 DBlog 无锁算法4.2 FLIP-27 架构实现4.3 整体流程 五、Flink CDC 3.0:应运而生六、Flink CDC 的影响和价值…

腾讯云4核8G服务器选择轻量还是标准型S5服务器?

腾讯云4核8G服务器优惠价格表,云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元,5年6490.44元,轻量应用服务器4核8G12M带宽一年446元、529元15个月,阿腾云atengyun.com分享腾讯云4核8G服务器详细配置、优惠价格及限制条件&…

whistle网络监控 fiddler的开源替代

github源码:https://github.com/avwo/whistle 官网说明:http://wproxy.org/whistle/ windows/mac一键安装 先安装nodejs 然后运行命令 npm i -g whistle && w2 start --init启动 w2 start停止 w2 stop注意停止后要手动关闭代理服务器设置 w…

【免杀测试】Kali之Metasploit几款工具免杀练习

余磊 不知攻,焉知防。作为渗透测试攻城狮,实战之前要做大量的攻防练习。一般黑客拿到主机的shell之后,需要留后门方便进行下一步的渗透。普通的木马已经很容易被查杀工具识别,这时就催生出了免杀技术来绕过杀毒软件。 下面就尝试…

Domino 14中的重新设定样式功能

大家好,才是真的好。 上周末,我测试了一些Domino 14版本新功能,令人惊喜的是重新设定样式(Restyle)新特性。 如果不知道什么是Restyle,请参考这篇《Notes 12.0.2版本新特性》。 简而言之,Res…

十大VSCODE 插件推荐2023

1、海鲸AI 插件链接:ChatGPT GPT-4 - 海鲸AI - Visual Studio Marketplace 包含了ChatGPT(3.5/4.0)等多个AI模型。可以实现代码优化,代码解读,代码bug修复等功能,反应迅捷,体验出色,是一个多功能的AI插件…

redis 从0到1完整学习 (八):QuickList 数据结构

文章目录 1. 引言2. redis 源码下载3. quickList 数据结构3.1 整体3.2 数据结构 4. 参考 1. 引言 前情提要: 《redis 从0到1完整学习 (一):安装&初识 redis》 《redis 从0到1完整学习 (二)&#xff1a…

浅谈ASJ系列剩余电流动作继电器

1. 概述 Overview 在工业应用中,剩余电流继电器与外部剩余电流互感器结合使用以检测和评估接地故障电流。它们也可以与保护装置结合使用,以实现电路的断开,从而实现对线路和人员的保护。 Residual current relay can be combined with ext…

C# SqlSugar 数据库 T4模板

生成效果 模板代码 <# template debug"false" hostspecific"true" language"C#" #> <# output extension".cs" #> <# assembly name"System.Core" #> <# assembly name"System.Data" #>…

PFA聚四氟乙烯镊子耐强腐蚀可夹取太阳能硅片等

PFA镊子是一种高纯度聚四氟乙烯制成的实验室工具&#xff0c;具有以下特点&#xff1a; 1.高耐腐蚀性&#xff1a;PFA镊子能够抵抗酸、碱、盐等多种化学物质的侵蚀&#xff0c;适用于处理各种强腐蚀性物质。 2. 高耐高温性&#xff1a;PFA镊子的熔点较高&#xff0c;能够在高温…

【MySQL】复合查询 | 内外连接

文章目录 一、MySQL复合查询基本查询回顾多表查询自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询合并查询 二、MySQL内外连接内连接外连接左外连接右外连接 一、MySQL复合查询 基本查询回顾 准备测试表 下面给出三张表&#xff0c;员工表&#xff08;emp&…

又一款 AI 工具火爆全网!DomoAI 实测体验如何(二)

上一篇介绍了 DomoAI 的两种生成视频的方式&#xff1a; 1、根据上传的视频生成多种风格的视频 2、根据上传的图片生成视频 下图就是通过 DomoAI 生成的一组视频。 DomoAI测试视频 对制作过程感兴趣的可以看上一篇&#xff1a; 程序员X小鹿&#xff1a;【AI 视频】又一款 AI…

std::string在 Windows MSVC和Linux Gcc 中capacity容量扩容策略的分析和对比

1、capacity()作用 在std::string中&#xff0c;capacity()为当前string占用内存字符的长度&#xff0c;表示当前string的容量&#xff0c;可以理解为一个预分配制度&#xff0c;如果当前的string不断进行扩展操作&#xff0c;则不需要每次都进行内存上的分配&#xff0c;提高程…

【银行测试】银行金融项目测试总结+面试题汇总(答案)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、银行项目测试的…

人型动画足部IK权重曲线烘焙

简介 如下图所示&#xff0c;Left、Right FootIK Weight两条动画曲线用于设置人物角色足部IK时获取权重值&#xff0c;手动编辑且动画片段较多时比较费事&#xff0c;可以考虑程序化烘焙这两条足部IK权重曲线。 实现思路 创建新的编辑器窗口&#xff0c;在OnGUI中获取当前所…

FART12刷机脱壳记录笔记

其他脱壳笔记&#xff1a; https://codeooo.blog.csdn.net/article/details/126891503 fart12 脱壳系统 可以脱邦邦 爱加密 企业壳 等&#xff1b; 寒冰大佬的脱壳王 本文记录下刷机过程&#xff0c;方便以后查看使用。 adb授权和ome锁要开着 代表锁是开着状态 如果出现&a…