Substrate跨链数据桥接:基于轻客户端验证的去信任数据同步方案

news2026/5/2 22:19:29
1. 项目概述Sub-Bridge一个被低估的跨链数据桥接利器在区块链这个快速迭代的领域里我们开发者常常面临一个经典困境如何让运行在不同链上的应用DApp或服务能够安全、高效地读取和验证彼此的数据尤其是在Substrate生态内部虽然Polkadot的XCMP跨链消息传递愿景宏大但在具体实现和特定场景下开发者往往需要一个更轻量、更灵活、更可控的解决方案。这就是我今天想和大家深入聊聊的buremba/sub-bridge。这个项目从名字就能看出它的核心定位sub代表 Substratebridge代表桥接。它不是一个承载巨额资产的跨链资产桥而是一个专注于跨链数据验证与传递的基础设施。简单来说它允许一条Substrate链我们称之为“目标链”或“中继链”以一种去信任的方式验证并获取另一条Substrate链“源链”上的特定状态或事件。想象一下你在一条链上开发了一个DeFi应用需要实时获取另一条链上某个预言机喂价的最新值或者验证另一条链上某个NFT的持有状态sub-bridge就是为了这类场景而生的。我第一次接触它是在为一个多链游戏项目做架构设计时我们需要在一条游戏主链上验证玩家在另一条资产链上是否持有特定的入场券NFT。当时评估了多种方案最终sub-bridge以其清晰的架构和相对轻量的实现脱颖而出。它没有试图解决所有问题而是聚焦于“数据可验证性”这个核心痛点通过引入中继器Relayer和轻客户端验证的逻辑在安全与效率之间找到了一个不错的平衡点。对于正在构建跨链互操作性的团队尤其是那些对数据一致性、状态同步有强需求的场景理解并合理运用sub-bridge能省去大量重复造轮子的时间。2. 核心架构与设计哲学拆解2.1 为什么不是简单的RPC调用在深入sub-bridge之前我们必须先厘清一个基本问题既然链上数据是公开的为什么不能直接用远程过程调用RPC从目标链去读取源链的数据这里的关键在于信任。区块链的核心价值之一是在不信任的环境中建立信任。一个来自外部RPC端点的数据对于目标链来说只是一个“声称”无法被链上逻辑所信任。攻击者完全可以提供一个伪造的RPC服务返回错误的数据从而导致目标链上的应用逻辑被恶意操纵。sub-bridge的设计哲学正是为了解决这个信任问题。它的目标不是“获取数据”而是“可验证地获取数据”。整个架构围绕如何让目标链能够独立验证源链数据的真实性展开。这套验证机制的核心是区块链领域经典的轻客户端Light Client思想。轻客户端不下载和验证整个区块链的历史而是通过跟踪区块头Block Header和验证默克尔证明Merkle Proof来相信某个特定状态是真实的。2.2 三层核心组件与数据流sub-bridge的架构可以清晰地划分为三层理解这三层的协作关系就掌握了它的命脉。第一层源链与目标链的Pallet模块这是桥接逻辑的链上部分以Substrate Pallet的形式实现。源链Pallet (pallet-bridge-grandpa或类似): 它的核心职责是“暴露可验证的信息”。它需要提供一种机制让外部能够获取到用于验证的“证据”。这通常包括权威证明Finality Proof: 在基于GRANDPA最终性算法的Substrate链中这就是指一组签名证明某个区块已经被最终确认finalized。这是数据有效性的时间基础——我们只关心已被最终确认的区块内的状态。存储证明Storage Proof: 这是一个默克尔证明证明在某个已被最终确认的区块状态下特定的存储键Storage Key对应着特定的值。这正是我们想要跨链传递的具体数据。 源链Pallet需要提供RPC方法让中继器能够获取到这些证明。目标链Pallet (pallet-bridge及相关模块): 这是桥接的“大脑”运行在目标链上。它包含几个关键状态跟踪源链的共识它维护着一个轻客户端不断验证和更新来自源链的权威证明如GRANDPA权威集的变化从而在本地确认源链的最终性。验证并提交数据它提供外部调用Extrinsic接收中继器提交的“权威证明存储证明”包并在链上运行验证逻辑。如果验证通过则将对应的数据存储值记录在目标链的存储中供其他Pallet使用。第二层中继器Relayer这是链下的主动服务是连接两链的“搬运工”。中继器持续监听源链和目标链。监听源链监控源链上我们关心的特定事件或存储变化例如某个NFT的所有权转移。收集证明当关注的事件发生时中继器从源链的RPC获取该事件所在区块的权威证明以及事件相关数据的存储证明。提交至目标链将打包好的证明作为一笔交易提交到目标链的桥接Pallet。这里有一个关键点中继器是无需信任的。它只是数据的搬运者并不产生信任。信任来源于目标链Pallet对证明的验证。即使中继器作恶提交了无效证明也会在目标链的验证环节被拒绝无法造成损害。当然中继器的可用性是否及时提交会影响系统的及时性。第三层应用层集成这是开发者直接交互的部分。开发者在自己的目标链Pallet中不再直接调用不可信的RPC而是读取经过桥接Pallet验证并存储的数据。例如一个DeFi Pallet可以安全地读取来自源链的、已经过验证的预言机价格。整个数据流可以概括为应用事件发生在源链 - 中继器捕获并打包可验证证明 - 目标链验证证明的有效性 - 验证通过后数据落地供目标链应用使用。注意sub-bridge通常假设源链和目标链都是基于Substrate且使用GRANDPA最终性。对于其他共识如PoW的链需要实现对应的轻客户端验证逻辑复杂度会显著增加。2.3 安全模型与信任假设任何跨链方案都必须明确其安全边界。sub-bridge的安全模型非常清晰信任源链的共识安全性目标链信任源链的共识机制如GRANDPA。如果源链遭遇51%攻击导致最终性回滚那么基于被回滚区块生成的证明在目标链上也会变得无效或需要复杂的应对机制。这是所有跨链桥接的底层风险。信任目标链的验证逻辑信任目标链上桥接Pallet的代码实现无漏洞能够正确验证所有证明。不信任中继器这是最大的优点。中继器可以是任何一方运行的甚至是轮流运行的其作恶只会导致数据提交失败而不会引入错误数据。这种模型特别适合联盟链之间、或同一生态内高度互信的公链之间的数据同步。它用相对简洁的密码学验证替代了对第三方中介的信任。3. 关键技术与实现细节深潜3.1 轻客户端验证GRANDPA权威证明的解析GRANDPAGHOST-based Recursive ANcestor Deriving Prefix Agreement是Substrate/Polkadot使用的最终性工具。它的“权威证明”本质上是当前权威集Validator Set对某个区块哈希的签名集合。在sub-bridge的上下文中源链需要生成一个证明表明“区块#N已经被最终确认了”。这个证明包含该区块的哈希和编号。一组来自当前权威集的加密签名这些签名共同满足了GRANDPA的投票规则通常是2/3以上权重。可能还需要包含权威集ID和权威集变更的历史证明以便目标链的轻客户端能够验证这些签名的有效性。目标链的桥接Pallet内部维护着源链的权威集状态。当它收到一个包含权威证明的提交时它会检查证明中的权威集ID是否与本地跟踪的当前或某个历史权威集匹配。验证所有签名的有效性使用对应的验证人公钥。统计签名权重判断是否达到最终性阈值。这个过程完全在链上完成消耗计算资源主要是签名验证但确保了数据的可信来源。3.2 存储证明与默克尔帕特里夏树MPT知道了某个区块是最终的接下来要证明这个区块里某个特定的存储项比如Account(Alice).balance的值是X。这就是存储证明的作用。Substrate的状态存储在一个默克尔帕特里夏树Merkle Patricia Trie, MPT中。这棵树的根哈希State Root被包含在每一个区块头中。存储证明就是从这个根哈希到目标存储键值对叶子节点的一条路径证明。一个存储证明通常包括键Key我们想要证明的存储路径。值Value声称该键对应的值。一组节点Proof Nodes从根节点到叶子节点路径上所需的所有兄弟节点哈希。目标链的验证逻辑会利用这组节点从已知的区块状态根哈希来自已验证的区块头开始一步步重新计算哈希如果最终计算出的根哈希与区块头中的状态根匹配则证明该键值对在源链的该区块状态下确实存在且值为所声称的值。实操心得生成和验证存储证明是相对昂贵的操作尤其是当证明路径较长时。因此在设计跨链数据时应尽量使用紧凑的存储结构。例如将需要频繁同步的数据打包在一个存储项里比分散在多个项中更节省Gas交易费和验证时间。3.3 中继器的实现策略与优化中继器虽然逻辑不复杂但在生产环境中保证其鲁棒性和效率至关重要。一个健壮的中继器实现通常会考虑以下几点监听策略是轮询Polling还是订阅Subscribing对于Substrate使用WebSocket订阅新区块最终化的事件是最及时的方式。监听的目标不仅是最终化的区块还要过滤出区块内包含特定事件由源链应用Pallet发出的交易。证明生成当中继器监听到目标事件后它需要调用源链的RPC来生成证明。这里通常涉及两个RPC调用chain_getBlock和grandpa_proveFinality或类似的RPC来获取区块和最终性证明。state_getReadProof来获取特定存储键的存储证明。 确保这些RPC调用被正确组装并且处理可能的RPC失败和重试逻辑。提交策略与费用管理中继器需要持有目标链的原生通证来支付交易费用。需要考虑费用估算动态估算交易费用因为存储证明的大小会影响交易体积。重试与排队如果目标链拥堵或交易暂时失败需要有重试和排队机制。多中继器协调为了避免重复提交可以设计简单的竞争机制或者让中继器们监听目标链如果某个证明已被提交则跳过。更复杂的方案可能涉及中继器轮值或质押。监控与告警中继器必须被严密监控。关键指标包括源链与目标链的同步高度差、最近一次成功提交的时间、提交失败率、RPC连接状态等。任何异常都应触发告警。4. 从零开始部署与集成实战指南假设我们有两个基于Substrate的链ChainA源链和ChainB目标链。我们需要将ChainA上某个Pallet的特定存储项同步到ChainB。4.1 环境准备与依赖引入首先确保你的Substrate节点和Runtime开发环境已就绪。sub-bridge的相关组件通常作为Pallet集成到Runtime中。对于目标链ChainB你需要在runtime/Cargo.toml中添加桥接Pallet的依赖。以pallet-bridge-grandpa用于验证GRANDPA最终性和pallet-bridge-messages用于通用消息传递其内部包含存储证明验证逻辑为例[dependencies] pallet-bridge-grandpa { git https://github.com/paritytech/parity-bridges-common.git, branch master, default-features false } pallet-bridge-messages { git https://github.com/paritytech/parity-bridges-common.git, branch master, default-features false } # 在 std feature 下也要引入 [features] std [ # ... 其他依赖 pallet-bridge-grandpa/std, pallet-bridge-messages/std, ]同时你需要在runtime/src/lib.rs中配置这些Pallet。配置项通常包括ChainA的初始权威集和ID。用于支付验证交易的“机构”账户或让任何中继器支付。消息通道的标识符、费用等参数。配置过程较为复杂需要仔细阅读对应Pallet的文档和源码中的Configtrait。4.2 源链暴露可验证事件在ChainA上你需要确保想要同步的数据变化能够以事件Event的形式发出并且这些事件所对应的存储项是可以通过RPC查询的。例如你有一个pallet-oracle负责更新价格当价格更新时它会发出PriceUpdated(asset, price)事件。中继器需要监听这个事件。同时pallet-oracle的存储结构PricesAsset必须是公开可访问的。你可能还需要在ChainA上集成一个轻量级的“桥接辅助”Pallet来提供格式更友好的RPC接口方便中继器获取特定事件相关的存储证明。不过标准的state_getReadProofRPC通常已足够。4.3 目标链集成验证与数据消费Pallet在ChainB的Runtime中除了配置好桥接Pallet你还需要编写自己的“消费者Pallet”。这个Pallet的主要职责是从桥接存储中读取已验证的数据。桥接Pallet在验证成功后会将数据存放在一个公开的存储映射里例如VerifiedDataMessageId。将外部数据转化为内部状态。例如将接收到的价格数据设置到自己Pallet的存储中或者触发本链的其他逻辑。一个简单的消费者Pallet可能包含一个调度函数由特权账户或通过治理调用来“领取”桥接过来的数据并处理。更自动化的方式是利用on_initialize钩子每个区块自动检查并处理。关键配置示例概念性: 在ChainB的Runtime配置中你需要定义消息的“路由”。告诉桥接Pallet“如果你验证了一条来自ChainA、通道为OracleChannel、消息负载是某种格式的数据请将它存到指定的存储位置并允许MyConsumerPallet来读取。”4.4 中继器服务搭建中继器通常是一个独立的Rust或Node.js应用。以下是使用Rust和substrate-api-client库的一个极简框架思路use futures::stream::StreamExt; use substrate_subxt::{Client, OnlineClient}; #[tokio::main] async fn main() - Result(), Boxdyn std::error::Error { // 1. 连接源链和目标链的WS端点 let source_client OnlineClient::SourceRuntime::from_url(ws://chain-a:9944).await?; let target_client OnlineClient::TargetRuntime::from_url(ws://chain-b:9944).await?; // 2. 订阅源链的最终化区块头 let mut blocks_sub source_client.blocks().subscribe_finalized().await?; while let Some(block) blocks_sub.next().await { let block_number block.number(); let block_hash block.hash(); // 3. 查询该区块中我们感兴趣的事件 (例如来自pallet-oracle的PriceUpdated) let events block.events().await?; for event in events.iter() { if is_target_event(event) { // 自定义过滤函数 // 4. 生成最终性证明和存储证明 let finality_proof source_client.rpc().grandpa_prove_finality(block_number).await?; let storage_keys vec![get_storage_key_for_event(event)]; // 根据事件获取对应的存储键 let read_proof source_client.rpc().state_get_read_proof(storage_keys, Some(block_hash)).await?; // 5. 构造并提交目标链交易 let call TargetRuntime::bridge_submit_data(finality_proof, read_proof); let _ target_client.tx().sign_and_submit_default(call, target_signer).await?; } } } Ok(()) }在实际项目中你需要处理错误、重试、费用估算、多个事件批量提交等复杂情况。4.5 测试与上线本地测试网首先在本地启动两个Substrate开发链--dev模式部署配置好的Runtime并运行中继器。手动在源链触发事件观察目标链状态是否同步。测试网部署将Runtime升级到公共测试网如WestendRococo进行真实网络环境下的测试。重点测试网络延迟、交易费用、中继器稳定性。监控与告警上线后建立完善的监控面板跟踪桥接延迟、提交成功率、目标链存储状态等核心指标。5. 典型问题排查与性能调优实录在实际运营中你会遇到各种各样的问题。下面记录了几个我踩过的坑和解决方案。5.1 常见错误与排查清单问题现象可能原因排查步骤与解决方案中继器日志显示“RPC调用失败”1. 源链/目标链节点RPC服务不可用。2. WS连接断开。3. 请求超时。1. 检查节点进程状态和日志。2. 检查网络连通性防火墙端口。3. 增加RPC超时配置实现指数退避重试逻辑。交易在目标链上失败错误为“InvalidProof”1. 存储证明生成错误键不对。2. 最终性证明已过期权威集已变更。3. 目标链桥接Pallet的轻客户端状态未同步到最新。1. 核对源链存储键的生成算法确保与目标链验证逻辑一致。2. 检查中继器是否使用了过旧的区块哈希来生成证明。确保始终使用最新的已最终化区块。3. 检查目标链的桥接Pallet确认其跟踪的源链权威集是最新的。可能需要先提交一个权威集更新的交易。交易成功但Gas费异常高存储证明体积过大。优化源链存储结构。将多个相关值打包到一个存储项中使用元组或结构体这样只需一个存储证明即可覆盖所有数据大幅减少证明大小。数据同步延迟很高1. 中继器处理慢。2. 目标链拥堵交易排队时间长。3. 源链最终化速度慢。1. 优化中继器代码采用异步并发处理事件。2. 提高中继器账户的Gas费用权重。3. 这是源链特性无法改变需在应用层容忍延迟。目标链消费者Pallet读取不到数据1. 桥接Pallet存储的数据格式与消费者Pallet解析格式不一致。2. 消息路由配置错误数据存到了别的存储位置。1. 在源链和中继器端确保编码格式如SCALE编码与目标链解码端完全匹配。编写编码/解码的单元测试。2. 复查Runtime配置中关于消息通道和目标处理程序的设置。5.2 性能调优要点证明压缩存储证明的原始体积可能很大。研究是否有办法对证明进行压缩。一些方案会使用更高效的默克尔树变种或者将多个证明聚合Merkle Proof Aggregation。批量提交中继器不要每监听到一个事件就提交一笔交易。可以设置一个时间窗口或数量阈值将多个事件的证明批量打包到一笔交易中提交。这能显著减少目标链的负载和中继器的费用开销。pallet-bridge-messages通常支持批量消息。中继器高可用运行多个中继器实例通过共享数据库或消息队列来协调工作避免单点故障。可以使用简单的“领导者选举”机制或者让它们同时运行但通过监听链上状态来避免重复提交。验证Gas优化目标链上验证证明的Pallet调用是消耗Gas的。在Runtime开发时可以审查和优化验证函数的逻辑特别是哈希计算部分。确保使用的加密原语如Ed25519签名验证是经过高度优化的。5.3 安全加固建议权限控制仔细配置目标链桥接Pallet的权限。例如初始化权威集、更新验证逻辑等关键操作应该通过多重签名或链上治理来控制而不是一个私钥。速率限制在目标链Pallet中可以考虑对单位时间内接收的消息数量或数据量进行限制防止恶意中继器发起垃圾数据攻击消耗链上资源。监控异常不仅要监控中继器也要监控目标链桥接Pallet的状态。例如如果突然出现大量“InvalidProof”的交易可能意味着源链出现了异常分叉或中继器被攻击。升级预案桥接逻辑一旦部署升级需要极其谨慎因为涉及两条链的协调。制定详细的升级方案包括暂停桥接、迁移状态、重新初始化等步骤。6. 进阶应用场景与生态展望sub-bridge这类数据桥接模式其应用远不止于简单的价格同步。它的本质是可验证的链上数据搬运这为许多复杂的跨链应用打开了大门。场景一跨链NFT的锁定与映射这是经典用例。用户在ChainA上将一个NFT锁定在一个托管合约即桥接Pallet的源端模块中该操作发出一个包含NFT元数据和锁定证明的事件。中继器捕获该事件将证明提交到ChainB。ChainB上的桥接Pallet验证后在本地铸造一个对应的“映射NFT”给用户。整个过程ChainB完全信任ChainA上托管合约的状态无需中心化托管方。场景二跨链治理DAO组织部署在ChainA上但希望其决策能影响到部署在ChainB上的某个金库合约。可以在ChainA的治理Pallet中当提案通过后生成一个可验证的“执行消息”。中继器将该消息传递到ChainBChainB验证后自动执行金库的相应操作如转账。这实现了治理权的跨链延伸。场景三状态通道结算两条链上的应用频繁交互可以在它们之间建立一个“状态通道”将大量中间状态更新放在链下进行。最终只需要将最终状态和双方签名的证明通过sub-bridge提交到任一条链上进行结算。这大大提升了互操作效率。生态与局限sub-bridge是Parity的parity-bridges-common仓库中的一个重要组成部分。这个仓库还包含了连接Substrate链与以太坊、比特币等其他生态的桥接方案其设计思想一脉相承。当然它也有局限。最大的挑战在于异构链桥接。连接两个GRANDPA链相对简单但连接Substrate链与以太坊PoW或比特币就需要在目标链上实现一个完整的以太坊或比特币轻客户端其复杂度和资源消耗是指数级上升的。此外桥接本身也引入了新的攻击面比如针对轻客户端的“长程攻击”Long-range Attack等需要在经济模型和密码学假设上做更多加固。对于绝大多数处于Substrate生态内的项目当你们需要可靠、去信任地在两条链之间同步关键状态时sub-bridge提供了一个经过考验、架构清晰的基础组件。它可能不像一些全功能跨链协议那样“炫酷”但它的简洁性和针对性恰恰是其在特定场景下稳定可靠的保证。我的建议是不要把它看作一个黑盒而是深入理解其“轻客户端验证”的内核。这套思想是构建真正去信任跨链应用的基石。当你吃透了它不仅能用好sub-bridge更能自己设计出适应更复杂场景的互操作方案。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…