虚拟币用到的非常哇塞的技术(闪电网络)解读

python编程示例系列
python编程示例系列二
python的Web神器Streamlit
如何应聘高薪职位
C#视觉应用开发问题系列
c#串口应用开发问题系列
microPython Python最小内核源码解析
NI-motion运动控制c语言示例代码解析
在这里插入图片描述# 闪电网络(Lightning Network)详解

用途

闪电网络是比特币等区块链的第二层扩展解决方案,主要解决以下问题:

  1. 扩展性问题:提高交易吞吐量,突破区块链主网的交易速度限制
  2. 微支付可行性:实现小额交易而不产生高额矿工费
  3. 即时确认:交易几乎实时确认,无需等待区块确认
  4. 降低费用:减少链上交易费用

原理

闪电网络的核心原理包括:

  1. 支付通道:两方之间建立的链下通道,允许多次交易而只在通道开启和关闭时与区块链交互
  2. 多重签名:使用多重签名钱包来锁定资金,确保通道安全
  3. 哈希时间锁定合约(HTLC):确保支付路由安全,即使通过多个中间节点也能安全完成交易
  4. 路由:通过网络中的多个支付通道路由交易,无需直接连接

实现代码示例

以下是一个简化的闪电网络节点实现示例,包含基本功能:

import hashlib
import time
import random
import json
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding

class LightningNode:
    """闪电网络节点类,实现基本的闪电网络功能"""
    
    def __init__(self, node_id):
        """
        初始化闪电网络节点
        参数:
            node_id: 节点唯一标识符
        """
        self.node_id = node_id
        # 生成RSA密钥对用于签名和验证
        self.private_key = rsa.generate_private_key(
            public_exponent=65537,
            key_size=2048
        )
        self.public_key = self.private_key.public_key()
        # 存储与其他节点的支付通道
        self.channels = {}
        # 存储正在处理的HTLC
        self.pending_htlcs = {}
        # 存储路由表信息
        self.routing_table = {}
        # 节点余额
        self.balance = 0
        
    def create_channel(self, peer_id, peer_public_key, local_amount):
        """
        创建与对等节点的支付通道
        参数:
            peer_id: 对等节点ID
            peer_public_key: 对等节点公钥
            local_amount: 本地提交到通道的金额
        返回:
            channel_id: 通道ID
        """
        if local_amount > self.balance:
            raise ValueError("余额不足以创建通道")
            
        # 生成通道ID(实际中应该是多重签名交易的txid)
        channel_id = hashlib.sha256(f"{self.node_id}:{peer_id}:{time.time()}".encode()).hexdigest()
        
        # 创建通道状态
        channel = {
            "peer_id": peer_id,
            "peer_public_key": peer_public_key,
            "local_balance": local_amount,
            "remote_balance": 0,  # 初始时对方余额为0,等待对方注资
            "status": "pending",  # 等待对方确认
            "htlcs": []
        }
        
        # 从余额中扣除资金
        self.balance -= local_amount
        
        # 存储通道信息
        self.channels[channel_id] = channel
        
        print(f"通道 {channel_id} 创建成功,等待对方确认")
        return channel_id
    
    def accept_channel(self, channel_id, peer_id, peer_amount):
        """
        接受来自对等节点的通道创建请求
        参数:
            channel_id: 通道ID
            peer_id: 对等节点ID
            peer_amount: 对等节点提交的金额
        """
        if channel_id not in self.channels:
            raise ValueError("通道不存在")
            
        channel = self.channels[channel_id]
        if channel["status"] != "pending":
            raise ValueError("通道状态错误")
            
        # 更新通道状态
        channel["remote_balance"] = peer_amount
        channel["status"] = "open"
        
        print(f"通道 {channel_id} 已确认并开启")
    
    def create_payment_hash(self, amount, memo=""):
        """
        创建支付哈希和预映像
        参数:
            amount: 支付金额
            memo: 支付备注
        返回:
            payment_hash: 支付哈希
            payment_preimage: 支付原像
        """
        # 生成随机预映像
        payment_preimage = str(random.getrandbits(256))
        # 计算哈希
        payment_hash = hashlib.sha256(payment_preimage.encode()).hexdigest()
        
        return payment_hash, payment_preimage
    
    def create_invoice(self, amount, memo="", expiry=3600):
        """
        创建支付发票
        参数:
            amount: 支付金额
            memo: 支付备注
            expiry: 过期时间(秒)
        返回:
            invoice: 支付发票
        """
        payment_hash, payment_preimage = self.create_payment_hash(amount, memo)
        
        # 创建发票
        invoice = {
            "node_id": self.node_id,
            "payment_hash": payment_hash,
            "amount": amount,
            "memo": memo,
            "timestamp": int(time.time()),
            "expiry": expiry
        }
        
        # 签名发票
        invoice_data = json.dumps(invoice, sort_keys=True).encode()
        signature = self.private_key.sign(
            invoice_data,
            padding.PSS(
                mgf=padding.MGF1(hashes.SHA256()),
                salt_length=padding.PSS.MAX_LENGTH
            ),
            hashes.SHA256()
        )
        
        invoice["signature"] = signature.hex()
        
        # 存储预映像以便后续验证
        self.pending_htlcs[payment_hash] = {
            "preimage": payment_preimage,
            "amount": amount,
            "status": "pending"
        }
        
        return invoice
    
    def add_htlc(self, channel_id, payment_hash, amount, cltv_expiry):
        """
        添加HTLC到通道
        参数:
            channel_id: 通道ID
            payment_hash: 支付哈希
            amount: 金额
            cltv_expiry: CLTV过期块高度
        """
        if channel_id not in self.channels:
            raise ValueError("通道不存在")
            
        channel = self.channels[channel_id]
        if channel["status"] != "open":
            raise ValueError("通道未开启")
            
        if channel["local_balance"] < amount:
            raise ValueError("通道余额不足")
        
        # 创建HTLC
        htlc = {
            "payment_hash": payment_hash,
            "amount": amount,
            "cltv_expiry": cltv_expiry,
            "status": "pending"
        }
        
        # 更新通道余额
        channel["local_balance"] -= amount
        channel["htlcs"].append(htlc)
        
        print(f"已添加HTLC到通道 {channel_id},金额: {amount},哈希: {payment_hash}")
    
    def fulfill_htlc(self, channel_id, payment_hash, payment_preimage):
        """
        使用支付原像兑现HTLC
        参数:
            channel_id: 通道ID
            payment_hash: 支付哈希
            payment_preimage: 支付原像
        """
        if channel_id not in self.channels:
            raise ValueError("通道不存在")
            
        channel = self.channels[channel_id]
        
        # 查找HTLC
        htlc_found = False
        for htlc in channel["htlcs"]:
            if htlc["payment_hash"] == payment_hash and htlc["status"] == "pending":
                htlc_found = True
                
                # 验证原像
                calculated_hash = hashlib.sha256(payment_preimage.encode()).hexdigest()
                if calculated_hash != payment_hash:
                    raise ValueError("支付原像无效")
                
                # 更新HTLC状态
                htlc["status"] = "fulfilled"
                
                # 更新通道余额
                channel["remote_balance"] += htlc["amount"]
                
                print(f"已兑现HTLC,通道: {channel_id},金额: {htlc['amount']},哈希: {payment_hash}")
                break
        
        if not htlc_found:
            raise ValueError("找不到匹配的HTLC")
    
    def close_channel(self, channel_id, cooperative=True):
        """
        关闭支付通道
        参数:
            channel_id: 通道ID
            cooperative: 是否是协作关闭
        """
        if channel_id not in self.channels:
            raise ValueError("通道不存在")
            
        channel = self.channels[channel_id]
        if channel["status"] != "open":
            raise ValueError("通道未开启")
        
        # 检查是否有未解决的HTLC
        pending_htlcs = [htlc for htlc in channel["htlcs"] if htlc["status"] == "pending"]
        if pending_htlcs and cooperative:
            raise ValueError("通道有未解决的HTLC,无法协作关闭")
        
        # 将通道余额返回到钱包
        self.balance += channel["local_balance"]
        
        # 更新通道状态
        channel["status"] = "closed"
        
        print(f"通道 {channel_id} 已关闭,返还余额: {channel['local_balance']}")
    
    def find_route(self, target_node_id, amount):
        """
        查找到目标节点的支付路径
        参数:
            target_node_id: 目标节点ID
            amount: 支付金额
        返回:
            route: 支付路径
        """
        # 简化的路由查找算法,实际中应使用更复杂的图算法
        if target_node_id in self.routing_table:
            direct_route = self.routing_table[target_node_id]
            if direct_route["capacity"] >= amount:
                return [direct_route]
        
        # 寻找中间路径
        # 这里仅作为示例,实际中应使用如Dijkstra或A*等算法
        routes = []
        for node, route_info in self.routing_table.items():
            if node != target_node_id and target_node_id in self.routing_table.get(node, {}).get("connections", {}):
                next_hop = self.routing_table[node]
                final_hop = self.routing_table[node]["connections"][target_node_id]
                
                if next_hop["capacity"] >= amount and final_hop["capacity"] >= amount:
                    routes.append([next_hop, final_hop])
        
        if routes:
            # 选择费用最低的路径
            return min(routes, key=lambda r: sum(hop.get("fee", 0) for hop in r))
        
        return None
    
    def send_payment(self, invoice, route=None):
        """
        发送支付
        参数:
            invoice: 支付发票
            route: 可选的预定义路由
        """
        # 解析发票
        payment_hash = invoice["payment_hash"]
        amount = invoice["amount"]
        target_node_id = invoice["node_id"]
        
        # 如果没有提供路由,尝试查找路由
        if not route:
            route = self.find_route(target_node_id, amount)
            if not route:
                raise ValueError(f"无法找到到节点 {target_node_id} 的路由")
        
        # 计算超时时间(实际中应基于路由长度和区块高度)
        current_time = int(time.time())
        cltv_expiry = current_time + 144  # 约24小时
        
        # 创建HTLC并沿路径发送
        # 注意:这是简化实现,实际中涉及到更复杂的协议交互
        first_hop = route[0]
        channel_id = first_hop["channel_id"]
        
        try:
            self.add_htlc(channel_id, payment_hash, amount, cltv_expiry)
            print(f"支付已发送,金额: {amount},目标节点: {target_node_id}")
            return True
        except Exception as e:
            print(f"支付失败: {str(e)}")
            return False
    
    def receive_payment(self, payment_hash, payment_preimage):
        """
        接收支付
        参数:
            payment_hash: 支付哈希
            payment_preimage: 支付原像
        """
        if payment_hash not in self.pending_htlcs:
            raise ValueError("未找到匹配的支付哈希")
        
        htlc_info = self.pending_htlcs[payment_hash]
        
        # 验证原像
        calculated_hash = hashlib.sha256(payment_preimage.encode()).hexdigest()
        if calculated_hash != payment_hash:
            raise ValueError("支付原像无效")
        
        # 更新状态
        htlc_info["status"] = "fulfilled"
        
        # 添加到余额
        self.balance += htlc_info["amount"]
        
        print(f"支付已接收,金额: {htlc_info['amount']},哈希: {payment_hash}")
        return True

# 演示如何使用闪电网络节点
def demo():
    # 创建两个节点
    alice = LightningNode("alice")
    bob = LightningNode("bob")
    
    # 给节点一些初始余额(在实际中,这应该是通过链上交易获得的)
    alice.balance = 1000
    bob.balance = 500
    
    print("初始余额:")
    print(f"Alice: {alice.balance}")
    print(f"Bob: {bob.balance}")
    
    # 创建通道
    channel_id = alice.create_channel("bob", bob.public_key, 100)
    bob.accept_channel(channel_id, "alice", 50)
    
    print("\n通道创建后:")
    print(f"Alice 通道余额: {alice.channels[channel_id]['local_balance']}")
    print(f"Bob 通道余额: {bob.channels[channel_id]['remote_balance']}")
    
    # 创建支付
    invoice = bob.create_invoice(10, "测试支付")
    print(f"\n创建发票: {invoice['payment_hash']}")
    
    # Alice 发送支付
    # 简化处理,实际中需要更复杂的路由
    alice.routing_table["bob"] = {
        "channel_id": channel_id,
        "capacity": 100,
        "fee": 1
    }
    
    alice.send_payment(invoice)
    
    # Bob 兑现HTLC
    payment_hash = invoice["payment_hash"]
    payment_preimage = bob.pending_htlcs[payment_hash]["preimage"]
    bob.fulfill_htlc(channel_id, payment_hash, payment_preimage)
    
    print("\n支付后通道状态:")
    print(f"Alice 通道余额: {alice.channels[channel_id]['local_balance']}")
    print(f"Bob 通道余额: {bob.channels[channel_id]['remote_balance']}")
    
    # 关闭通道
    alice.close_channel(channel_id)
    
    print("\n关闭通道后:")
    print(f"Alice 余额: {alice.balance}")
    print(f"Bob 余额: {bob.balance}")

if __name__ == "__main__":
    demo()

代码逻辑流程图

初始化节点
创建支付通道
通道是否成功创建?
接受通道
错误处理
通道开启
发送方流程
接收方流程
创建发票
查找路由
添加HTLC
等待HTLC兑现
接收HTLC
验证支付哈希
提供原像兑现HTLC
接收资金
更新通道状态
是否关闭通道?
协作关闭通道
结算链上余额

应用场景

  1. 微支付系统

    • 内容付费(按篇/按分钟付费阅读或观看)
    • 游戏内微交易
    • 物联网设备间小额支付
  2. 即时跨境支付

    • 国际汇款
    • 跨境贸易结算
    • 外汇交易
  3. 高频交易场景

    • 交易所内部结算
    • 高频交易系统
    • 自动化交易机器人
  4. 去中心化金融(DeFi)

    • 闪电网络上的流动性池
    • 去中心化交易所
    • 借贷平台
  5. 支付API和服务

    • 电商支付解决方案
    • 订阅服务
    • 流支付(按时间计费的服务)
  6. 点对点市场

    • 二手物品交易
    • 服务交易平台
    • 共享经济应用
  7. 隐私保护交易

    • 由于闪电网络交易不全部记录在区块链上,提供了额外的隐私保护

总结

闪电网络是区块链技术,特别是比特币网络的重要扩展层,通过创建链下支付通道网络解决了区块链的扩展性问题。它的核心优势在于:

  1. 高吞吐量:理论上可以支持数百万TPS,远超主链能力
  2. 低延迟:交易确认几乎实时,无需等待区块确认
  3. 低费用:大幅降低交易费用,使微支付成为可能
  4. 可扩展性:随着网络节点增加,整体容量线性增长

闪电网络的实现依赖于复杂的密码学原理和协议设计,包括多重签名、哈希时间锁定合约(HTLC)和路由算法。尽管存在一些挑战,如通道流动性管理、路由效率和安全性考虑,但闪电网络已经在实际应用中证明了其价值。

随着技术的成熟和生态系统的发展,闪电网络有望成为加密货币日常使用的关键基础设施,使区块链技术真正实现大规模商业应用。

python生成PDF文档的库reportlab
microPython的源码解析之 asmx86.c
python的PyOpenGL库如何使用,请给出详细示例代码,并用中文回答
jupyter深度理解六 之ipywidgets
python进行函数式编程的工具toolz
c#视觉应用开发中如何在C#中实现图像增强技术?
量化交易系统中+如何处理模型的过拟合和欠拟合?
NI-Motion 实现一个轴的基于速度的直线运动期间还包括速度覆盖(即在运动过程中改变速度)的操作 C语言示例代码
c#视觉应用开发中如何在C#中使用K-means算法进行图像聚类?
python用于创建和管理 IoT 物联网设备的工作流程库aiobotocore_iotthingsgraph
C#开发串口通讯软件如何如何捕获和处理串口通讯中的异常?
python的数据降维库umap
智能农业设备软件工程师如何集成和管理农业设备的系统维护
量化交易系统中+如何处理实时流数据?
c#视觉应用开发中如何在C#中进行图像特征点匹配?
microPython的源码解析之 nlrxtensa.c
c#视觉应用开发中如何在C#中进行视频处理和实时流媒体处理?
小学教育:是喜爱还是仅仅是 Python?
车载系统软件工程师如何实现车载系统的语音命令和自然语言处理
C#进行串口应用开发如何通过串口实现转换器、中继器的串口扩展
Python模拟一个垂直堆叠的物体堆,用球去碰撞
智能农业设备软件工程师如何集成和管理农业设备的传感器数据融合
microPython的源码解析之 bc.c
Python程序如何进行性能分析
python如何自动生成流程图
c++加QT,如何动态股票实时行情均值,比如动态10个行情点均值
c#视觉应用开发中如何在C#中实现图像去模糊?
microPython的源码解析之 objexcept.c
c#视觉应用开发中如何在C#中进行模板匹配?
车载系统软件工程师如何处理车载系统的实时操作需求
c#视觉应用开发中如何在C#中进行图像颜色空间转换?
C#进行串口应用开发如何实现不同厂家串口设备的标准兼容接口
microPython的源码解析之 lexer.c
量化交易系统中如何处理测试中的数据偏差和异常?
c#程序与USB HID设备进行通信
c++加QT开发linux远程终端,类似putty
python如何简单实现重试逻辑
车载系统软件工程师如何实现车载系统的虚拟仪表盘
python的ast库的使用
车载系统软件工程师如何实现车载系统的车内网络管理(CAN, LIN, Ethernet)
microPython的源码解析之 objarray.c
车载系统软件工程师如何与车载通信系统(如V2X)集成
智能农业设备软件工程师如何处理设备的兼容性测试和验证
NI-Motion如何在运动控制器上设置高速捕获,并通过RTSI线将其路由出去的C语言示例代码
R语言和python语言的区别在什么地方,各自的应用场景是什么
开源 AI库Stable Diffusion 介绍
microPython的源码解析之 parse.c
量化交易策略 做多做空策略
python如何使用Windows API 和 COM 接口
C#进行串口应用开发如何避免串口通信因缓冲区溢出丢失数据
python如何给声音增加回声效果
microPython的源码解析之 mpz.c
研究人员发现了一种影响支持推测执行的现代CPU架构的新数据泄露攻击。
webhook技术介绍
c#视觉应用开发中如何在C#中进行图像去残影?
OpenAI表示,通过GPT-4更新,AI变得更加智能,更安全,更直观
数据降维技术和算法
运动控制卡
c#视觉应用开发中如何使用OpenCV库进行计算机视觉处理?
python的mailcap库如何使用
Python的faker库,测试工作者的福音
c#如何开发一个linux远程终端工具,类似putty
车载系统软件工程师如何处理车载系统的用户身份验证和授权
python读取和编写配置文件库ConfigObj和ConfigParser
c#视觉应用开发中如何在C#中进行姿态估计?
python的smtplib
c#视觉应用开发中如何在C#中进行图像分割?
Pylint
Python是如何实现文件锁的
python web应用开发神器 入门七
python的decimal库如何使用
量化交易系统如何进行版本控制和代码管理
腾讯有哪些人工智能相关的开源代码
c#视觉应用开发中如何在C#中进行图像去干扰?
量化交易系统中+如何分析交易行为和模式?
向量数据库简介
车载系统软件工程师如何实现车载系统的远程软件更新
量化交易系统中+如何对模型进行实时监控和调整?
智能农业设备软件工程师如何实现农业设备的精准农业应用
microPython的源码解析之 objnamedtuple.c
车载系统软件工程师如何实现车载系统的音频处理和优化
c#视觉应用开发中如何在C#中进行图像格式转换?
Python如何实现速率限制,也成为限流,即控制函数和方法的调用频率
用Python模拟生物大分子
智能农业设备软件工程师如何集成和管理农业设备的传感器网络
microPython的源码解析之 modsys.c
microPython的源码解析之 objboundmeth.c
microPython的源码解析之 compile.c
python如何监控文件系统中的文件和目录的变化
量化交易系统中+如何进行成本的归因分析?
NI Motion 控制器进行单轴直线运动的 C 语言示例程序
Python在终端中以不同的颜色输出文本
microPython的源码解析之 objlist.c
智能农业设备软件工程师如何确保设备的高可靠性和可用性
python如何中捕获和处理函数调用,更加好的调试你的分析你的代码
c#视觉应用开发中如何在C#中进行图像修复?
如何使用Python开发一个度假租赁市场平台。
c#视觉应用开发中如何在C#中进行图像几何校正?
microPython的源码解析之 mpprint.c
microPython的源码解析之 emitbc.c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值