python编程示例系列 python编程示例系列二 python的Web神器Streamlit 如何应聘高薪职位 C#视觉应用开发问题系列 c#串口应用开发问题系列 microPython Python最小内核源码解析 NI-motion运动控制c语言示例代码解析
# 无许可区块链技术详解
用途
无许可(Permissionless)区块链是一种开放式网络,任何人都可以参与,无需获得特定实体的批准。它具有以下主要用途:
原理
无许可区块链的核心原理包括:
实现代码示例
以下是一个简化的无许可区块链实现,使用Python语言:
import hashlib
import json
import time
from typing import List, Dict, Any
import random
import ecdsa
import base64
class Transaction:
"""交易类:表示区块链上的一笔交易"""
def __init__(self, sender: str, recipient: str, amount: float, signature: str = None):
"""
初始化一个交易
参数:
sender: 发送方的公钥
recipient: 接收方的公钥
amount: 交易金额
signature: 交易签名
"""
self.sender = sender
self.recipient = recipient
self.amount = amount
self.timestamp = time.time()
self.signature = signature
def to_dict(self) –> Dict[str, Any]:
"""将交易转换为字典格式"""
return {
'sender': self.sender,
'recipient': self.recipient,
'amount': self.amount,
'timestamp': self.timestamp
}
def calculate_hash(self) –> str:
"""计算交易的哈希值"""
transaction_string = json.dumps(self.to_dict(), sort_keys=True)
return hashlib.sha256(transaction_string.encode()).hexdigest()
def sign_transaction(self, private_key: ecdsa.SigningKey) –> None:
"""
使用私钥签名交易
参数:
private_key: 发送方的私钥
"""
transaction_hash = self.calculate_hash()
signature = private_key.sign(transaction_hash.encode())
self.signature = base64.b64encode(signature).decode('utf-8')
def verify_signature(self) –> bool:
"""验证交易签名是否有效"""
if self.sender == "0": # 系统奖励交易不需要签名
return True
try:
transaction_hash = self.calculate_hash()
public_key = ecdsa.VerifyingKey.from_string(
base64.b64decode(self.sender),
curve=ecdsa.SECP256k1
)
signature = base64.b64decode(self.signature)
return public_key.verify(signature, transaction_hash.encode())
except:
return False
class Block:
"""区块类:表示区块链中的一个区块"""
def __init__(self, index: int, timestamp: float, transactions: List[Transaction], previous_hash: str, nonce: int = 0):
"""
初始化一个区块
参数:
index: 区块索引
timestamp: 区块创建时间戳
transactions: 包含的交易列表
previous_hash: 前一个区块的哈希值
nonce: 用于工作量证明的随机数
"""
self.index = index
self.timestamp = timestamp
self.transactions = transactions
self.previous_hash = previous_hash
self.nonce = nonce
self.hash = self.calculate_hash()
def calculate_hash(self) –> str:
"""计算区块的哈希值"""
# 将区块的所有信息合并并计算哈希
block_string = f"{self.index}{self.timestamp}{[t.calculate_hash() for t in self.transactions]}{self.previous_hash}{self.nonce}"
return hashlib.sha256(block_string.encode()).hexdigest()
def mine_block(self, difficulty: int) –> None:
"""
挖掘区块(工作量证明)
参数:
difficulty: 挖矿难度,表示哈希前缀0的数量
"""
# 计算满足难度要求的哈希值
target = '0' * difficulty
while self.hash[:difficulty] != target:
self.nonce += 1
self.hash = self.calculate_hash()
print(f"区块已挖出! 哈希值: {self.hash}")
class Wallet:
"""钱包类:管理用户的密钥对和余额"""
def __init__(self):
"""初始化钱包,生成新的密钥对"""
self.private_key = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1)
self.public_key = self.private_key.get_verifying_key()
self.public_key_string = base64.b64encode(self.public_key.to_string()).decode('utf-8')
def create_transaction(self, recipient: str, amount: float) –> Transaction:
"""
创建一笔新交易
参数:
recipient: 接收方的公钥
amount: 交易金额
返回:
已签名的交易对象
"""
transaction = Transaction(self.public_key_string, recipient, amount)
transaction.sign_transaction(self.private_key)
return transaction
class Blockchain:
"""区块链类:管理区块链的核心功能"""
def __init__(self, difficulty: int = 4):
"""
初始化区块链
参数:
difficulty: 挖矿难度
"""
self.chain = [self.create_genesis_block()]
self.difficulty = difficulty
self.pending_transactions = []
self.mining_reward = 10 # 挖矿奖励
def create_genesis_block(self) –> Block:
"""创建创世区块"""
return Block(0, time.time(), [], "0")
def get_latest_block(self) –> Block:
"""获取最新的区块"""
return self.chain[–1]
def mine_pending_transactions(self, miner_address: str) –> None:
"""
挖掘待处理的交易并将它们添加到新区块
参数:
miner_address: 矿工的钱包地址(接收奖励)
"""
# 创建奖励交易
reward_transaction = Transaction("0", miner_address, self.mining_reward)
# 将待处理交易和奖励交易一起打包到新区块
transactions_to_add = self.pending_transactions + [reward_transaction]
# 创建新区块
block = Block(
len(self.chain),
time.time(),
transactions_to_add,
self.get_latest_block().hash
)
# 挖掘区块
block.mine_block(self.difficulty)
# 将新区块添加到链上
self.chain.append(block)
# 清空待处理交易列表
self.pending_transactions = []
def add_transaction(self, transaction: Transaction) –> bool:
"""
添加交易到待处理列表
参数:
transaction: 要添加的交易
返回:
是否成功添加
"""
# 验证交易签名
if not transaction.verify_signature():
print("交易签名无效!")
return False
# 验证发送方余额是否足够
if transaction.sender != "0": # 非系统奖励交易
sender_balance = self.get_balance(transaction.sender)
if sender_balance < transaction.amount:
print("余额不足!")
return False
# 添加到待处理交易
self.pending_transactions.append(transaction)
return True
def get_balance(self, address: str) –> float:
"""
计算指定地址的余额
参数:
address: 要查询的钱包地址
返回:
该地址的当前余额
"""
balance = 0
# 遍历所有区块和交易
for block in self.chain:
for transaction in block.transactions:
if transaction.recipient == address:
balance += transaction.amount
if transaction.sender == address:
balance -= transaction.amount
return balance
def is_chain_valid(self) –> bool:
"""验证整个区块链是否有效"""
# 从第二个区块开始验证(跳过创世区块)
for i in range(1, len(self.chain)):
current_block = self.chain[i]
previous_block = self.chain[i–1]
# 验证当前区块的哈希是否正确
if current_block.hash != current_block.calculate_hash():
print("当前区块哈希无效!")
return False
# 验证区块之间的链接是否正确
if current_block.previous_hash != previous_block.hash:
print("区块链接无效!")
return False
# 验证每个交易的签名
for transaction in current_block.transactions:
if not transaction.verify_signature():
print("区块中存在无效交易签名!")
return False
return True
# 演示区块链的使用
def demonstrate_blockchain():
"""演示区块链的基本功能"""
# 创建区块链
my_blockchain = Blockchain(difficulty=2) # 降低难度以便演示
# 创建钱包
alice_wallet = Wallet()
bob_wallet = Wallet()
miner_wallet = Wallet()
# 创建一些交易
print("创建交易…")
tx1 = alice_wallet.create_transaction(bob_wallet.public_key_string, 5)
my_blockchain.add_transaction(tx1)
# 挖矿(处理待处理交易)
print("\\n开始挖矿…")
my_blockchain.mine_pending_transactions(miner_wallet.public_key_string)
# 检查余额
print("\\n检查余额:")
print(f"Alice 余额: {my_blockchain.get_balance(alice_wallet.public_key_string)}")
print(f"Bob 余额: {my_blockchain.get_balance(bob_wallet.public_key_string)}")
print(f"矿工余额: {my_blockchain.get_balance(miner_wallet.public_key_string)}")
# 创建更多交易
print("\\n创建更多交易…")
tx2 = bob_wallet.create_transaction(alice_wallet.public_key_string, 2)
my_blockchain.add_transaction(tx2)
# 再次挖矿
print("\\n再次挖矿…")
my_blockchain.mine_pending_transactions(miner_wallet.public_key_string)
# 再次检查余额
print("\\n再次检查余额:")
print(f"Alice 余额: {my_blockchain.get_balance(alice_wallet.public_key_string)}")
print(f"Bob 余额: {my_blockchain.get_balance(bob_wallet.public_key_string)}")
print(f"矿工余额: {my_blockchain.get_balance(miner_wallet.public_key_string)}")
# 验证区块链
print("\\n验证区块链…")
print(f"区块链有效: {my_blockchain.is_chain_valid()}")
if __name__ == "__main__":
demonstrate_blockchain()
代码逻辑流程图
#mermaid-svg-BU1cD9V0cRGOlvBo {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BU1cD9V0cRGOlvBo .error-icon{fill:#552222;}#mermaid-svg-BU1cD9V0cRGOlvBo .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BU1cD9V0cRGOlvBo .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-BU1cD9V0cRGOlvBo .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BU1cD9V0cRGOlvBo .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BU1cD9V0cRGOlvBo .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BU1cD9V0cRGOlvBo .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BU1cD9V0cRGOlvBo .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BU1cD9V0cRGOlvBo .marker.cross{stroke:#333333;}#mermaid-svg-BU1cD9V0cRGOlvBo svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BU1cD9V0cRGOlvBo .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-BU1cD9V0cRGOlvBo .cluster-label text{fill:#333;}#mermaid-svg-BU1cD9V0cRGOlvBo .cluster-label span{color:#333;}#mermaid-svg-BU1cD9V0cRGOlvBo .label text,#mermaid-svg-BU1cD9V0cRGOlvBo span{fill:#333;color:#333;}#mermaid-svg-BU1cD9V0cRGOlvBo .node rect,#mermaid-svg-BU1cD9V0cRGOlvBo .node circle,#mermaid-svg-BU1cD9V0cRGOlvBo .node ellipse,#mermaid-svg-BU1cD9V0cRGOlvBo .node polygon,#mermaid-svg-BU1cD9V0cRGOlvBo .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BU1cD9V0cRGOlvBo .node .label{text-align:center;}#mermaid-svg-BU1cD9V0cRGOlvBo .node.clickable{cursor:pointer;}#mermaid-svg-BU1cD9V0cRGOlvBo .arrowheadPath{fill:#333333;}#mermaid-svg-BU1cD9V0cRGOlvBo .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BU1cD9V0cRGOlvBo .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BU1cD9V0cRGOlvBo .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-BU1cD9V0cRGOlvBo .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-BU1cD9V0cRGOlvBo .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BU1cD9V0cRGOlvBo .cluster text{fill:#333;}#mermaid-svg-BU1cD9V0cRGOlvBo .cluster span{color:#333;}#mermaid-svg-BU1cD9V0cRGOlvBo div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BU1cD9V0cRGOlvBo :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
有效
无效
是
否
区块挖掘流程
是
否
哈希满足难度要求?
计算区块哈希
挖矿成功
增加随机数nonce
交易验证流程
是
否
是
否
签名有效?
验证交易签名
检查发送方余额
验证失败
余额充足?
验证成功
开始
创建区块链实例
创建钱包
创建交易
验证交易
添加到待处理交易池
拒绝交易
挖矿过程开始
创建新区块
添加矿工奖励交易
执行工作量证明
将新区块添加到链上
清空待处理交易池
是否有新交易
结束
应用场景
无许可区块链技术除了加密货币外,还有以下应用场景:
总结
无许可区块链是一种革命性的分布式账本技术,它允许任何人参与网络而无需获得许可。通过密码学、共识机制和分布式存储,它实现了去中心化、透明和不可篡改的数据管理系统。
本文介绍了无许可区块链的基本原理,并提供了一个简化但功能完整的Python实现,包括交易处理、区块创建、挖矿和验证等核心功能。这个实现虽然简化,但包含了区块链的基本组件:钱包、交易、区块和共识机制。
无许可区块链技术不仅仅局限于加密货币,它可以应用于需要透明性、不可篡改性和去中心化的各种场景。随着技术的发展,我们可以期待看到更多创新应用出现,解决现实世界中的各种问题。
然而,值得注意的是,无许可区块链也面临着诸如扩展性、能源消耗和监管等挑战。未来的发展将需要解决这些问题,以实现更广泛的应用和采用。
量化交易系统如何进行版本控制和代码管理 C#进行串口应用开发如何设置串口的发送和接收缓冲区大小 量化交易系统中+如何优化系统的内存和CPU使用? 量子计算Bernstein-Vazirani算法 利用qt及 c++语言如何计算KDJ技术指标,请给出示例代码 Linux 的shell的 bomb函数 c#视觉应用开发中如何在C#中进行图像边缘增强? NI-Motion 运动控制器上执行二维直线移动的C语言示例程序 如何应聘初级视觉应用工程师,年薪7到10万 C#进行串口应用开发如何通过串口实现转换器、中继器的串口扩展 c#视觉应用开发中如何在C#中进行图像恢复? microPython的源码解析之 vstr.c 量化交易系统中+如何实现实时数据的展示和更新? 智能农业设备软件工程师如何处理设备的系统性能优化 python如何绘制热力图 python 如何实现语法高亮 D-Link 澳大利亚使用 Python 控制固件更新 智能农业设备软件工程师如何实现远程设备监控和管理 保护Python运行环境 量化交易系统中+如何处理交易所API的限制和故障? 为什么很多游戏人物会穿模 车载系统软件工程师如何确保车载系统的高可靠性和可用性 车载系统软件工程师如何实现车载系统的电动车充电管理 python的NLTK库如何使用 Python如何模拟球的碰撞及摩擦力,弹力. 如何给一个客户端分配多个IP c#视觉应用开发中如何使用Emgu CV在C#中进行图像处理? 量化交易系统中如何处理分布式系统中的数据一致性问题? python生成和解决迷宫的库maze jupyter深度理解六 之ipywidgets 二叉树如何进行快速搜索 microPython的源码解析之 formatfloat.c 在搜索引擎如百度上搜索合法软件(如Notepad++和VNote)的用户正成为恶意广告和伪造链接的目标 C#进行串口应用开发如何检测电脑是否有串口 C#进行串口应用开发如何通过串口实现设备固件的远程升级 c#视觉应用开发中如何在C#中实现光流(Optical Flow)算法? microPython的源码解析之 objstr.c C#进行串口应用开发如何实现基于串口的心跳检测 量子计算Quantum Approximate Optimization Algorithm (QAOA)算法 量化交易系统中如何处理回测中的数据一致性问题? 车载系统软件工程师如何集成车载系统与车辆诊断和维修系统 Python如何测网速 量化交易系统中+如何进行模型的验证和评估? C++加QT如何实现RS232的高速通信? python的Array库如何使用 车载系统软件工程师如何处理车载系统的电磁干扰(EMI) python如何计算隐含波动率 隐写术,将信息隐藏起来 在进行股票统计研究中,有很多因子,如何屏蔽其他因子的影响,只研究一个因子的影响大小呢 量化交易策略 趋势跟踪 车载系统软件工程师如何实现车载系统的紧急制动和碰撞预警 车载系统软件工程师如何集成车载系统与第三方服务(如音乐、天气) 智能农业设备软件工程师如何集成和管理农业设备的多语言支持 OpenAI ChatGPT 可用的第三方插件可能成为威胁行为者寻求未经授权访问敏感数据的新攻击面 智能农业设备软件工程师如何确保设备的数据安全和隐私保护 opencv库的功能 Python的exceptional库 microPython的源码解析之 objdict.c c#视觉应用开发中如何在C#中进行图像去重影? C#进行串口应用开发如何避免串口通信因缓冲区阻塞问题导致的发送失败 车载系统软件工程师如何处理车载系统的用户数据和偏好管理 量化交易策略 做多做空策略 python加PyQT如何开发一个端口扫描工具 Python如何使用pickle库来复制、保存和加载一个空间 c#视觉应用开发中如何在C#中进行图像饱和度调整? python语言有哪些宝藏功能 量化交易系统中如何处理回撤期间的风险管理? 车载系统软件工程师如何处理车载系统的故障检测和诊断 C#进行串口应用开发如何处理串口通信因长度不匹配导致的数据截断问题 智能农业设备软件工程师如何实现农业设备的用户反馈和数据收集 智能农业设备软件工程师如何实现农业数据的云存储和备份 jupyter 深度理解四 之pixiedust C#进行串口应用开发如何实现串口通信的安全访问与权限控制 NI-Motion如何设置一个周期性断点,当运动轴到达预设的目标位置时,会在周期性断点位置暂停,然后继续运动直到再次到达目标位置的C语言代码示例 NI-Motion如何在一个运动控制器上创建并运行一个简单的板载程序的C语言示例代码 microPython的源码解析之 objreversed.c 车载系统软件工程师如何集成车载系统与车队管理系统 代码高尔夫 python 如何控制鼠标键盘 python 如何解析PDF文件,并将其翻译为其他语言 Python如何把sqlite完全加载到内存中操作 c++加QT,版本5.99的使用QGraphicsView的坐标问题,以及需要注意的事项. 量化交易系统中+如何处理策略的回撤和停止? 车载系统软件工程师如何实现车载系统的远程控制和监控 Python如何实现一个XML转换引擎过程 python的string 竟然有这么多用法 量化交易策略 标准差突破 使用Python开发患者健康门户网站 c#视觉应用开发中如何在C#中实现图像拼接? 量化交易系统中如何处理机器学习模型的训练和部署? 构建我们的Python代码库依赖图 c#视觉应用开发中如何在C#中进行图像数据库管理? 如何应聘仿真系统方面 高级软件工程师,年薪24万到42万元之间 C#进行串口应用开发如何实现基于串口的报文长度统计与解析 自动化工具软件详细列举 QT 的自定义宏 #define QT_ANNOTATE_CLASS(type, …)什么意思 c#视觉应用开发中如何在C#中进行图像几何变换? pyrhon 如何将实时的tick行情,处理成1分钟k线数据 microPython的源码解析之 modio.c 量化交易系统中如何处理监管机构的检查和审核?

