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…

经验 | IDEA常用快捷键

1、编辑(Editing) Ctrl Space 基本的代码完成(类、方法、属性) Ctrl Alt Space 快速导入任意类 Ctrl Shift Enter 语句完成 Ctrl P 参数信息(在方法中调用参数) Ctrl Q 快速查看文档 Shift F…

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之后,需要留后门方便进行下一步的渗透。普通的木马已经很容易被查杀工具识别,这时就催生出了免杀技术来绕过杀毒软件。 下面就尝试…

为什么需要升级EKS

当谈到在云环境中管理容器化应用程序时,Amazon EKS(Elastic Kubernetes Service)是一个备受欢迎的选择。它为用户提供了一个强大且高度可扩展的平台,使他们能够轻松地在Kubernetes上运行和管理应用程序。随着技术的不断发展&#…

[hive] sql中distinct的用法和注意事项

在 Hive SQL 中,DISTINCT 用于去重查询结果中的行。它返回唯一的行,消除结果集中的重复项。以下是 DISTINCT 的基本用法和一些注意事项: 基本用法: -- 获取列1和列2的唯一组合 SELECT DISTINCT column1, column2 FROM your_tabl…

前端性能优化十五:js优化的总体原则

1. js优化的总体原则: ①. 当需要时才优化:a. 项目到了某个阶段才需要优化.(1). 大的改版、代码架构无法满足现有业务.②. 考虑可维护性:a. 考虑团队的开发水平、规范.b. 不是为了优化牺牲了后续的可维护性.(1). 提升JS文件的加载性能: ①. 加载元素的顺序:a. css文件放在<…

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

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

十大VSCODE 插件推荐2023

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

java简介

1. 介绍 Java是一种广泛使用的面向对象编程语言&#xff0c;由Sun Microsystems开发&#xff0c;现在归Oracle公司管理。它以其跨平台性、安全性和可靠性而闻名&#xff0c;并被用于各种应用程序开发领域。本博客将介绍Java的基本概念、特性和用法。 2. Java的特性 a) 简单性 J…

《PCI Express体系结构导读》随记 —— 第I篇 PCI体系结构概述(1)

第I篇 PCI体系结构概述 背景 PCI&#xff08;Peripheral Component Interconnect&#xff0c;外部元件互连&#xff09;总线的诞生与PC&#xff08;Personal Computer&#xff0c;个人电脑&#xff09;的碰壁发展密切相关。在处理器体系结构中&#xff0c;PCI总线属于局部总线…

java中replace和replaceAll区别

replace()方法&#xff1a;replace()方法使用简单的字符替换&#xff0c;不涉及正则表达式。如果使用replace()方法来替换美元符号&#xff08;$&#xff09;&#xff0c;它会直接替换字符串中的美元符号&#xff0c;而不会考虑正则表达式中的特殊含义。replaceAll()方法&#…

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

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

java非对称加解密

简介 非对称加密&#xff1a;加密和解密使用不同的秘钥的加解密方法。一般的&#xff0c;用公钥做加密&#xff0c;私钥做解密使用 常用的加解密有&#xff1a;RSA、ECC、DSA&#xff0c;在java中使用最多的是RSA 工具类 /*** 非对称加解密工具类(RSA)** RSA加密(一次)有最…

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

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