新闻详情

新闻详情

首页 / 资讯中心 / 详情

Substrate区块链开发实战:从模块化架构到无分叉升级

发布时间:2026/9/28 17:08:09来源:尧图网络
Substrate区块链开发实战:从模块化架构到无分叉升级
如果你问一个在区块链开发圈里泡了几年的老开发现在想自己动手做一条链最该从什么地方下手我的答案通常会很快落在Substrate上。不是因为它名字好听而是因为这个框架把区块链开发里最烧时间的那几块——P2P网络、区块存储、共识机制、最终性判定、Runtime升级——几乎都做成了可配置、可替换的模块。你真正要花心思的地方变成了业务逻辑和链本身的形态设计。这篇文章的思路会跟着一条链的诞生过程走先讲为什么我倾向于用Substrate而不是自己从零搓一条链再把Client和Runtime这两个核心概念掰开揉碎然后用node-template把第一条链跑起来接下来往链里加一个自定义Pallet之后把我实际踩过的编译和存储升级坑按完整排查链路记录下来最后聊一聊从demo走向可用链时共识、治理和跨链扩展该怎么选。适合两类人看一类是想进入区块链底层开发的新手另一类是已经跑过合约、准备评估应用链方案的老手。1. 为什么我把Substrate看作“区块链的模块化积木”而不是又一个框架1.1 传统开发路径的三道坎在Substrate出现之前想自己搭一条链的开发团队基本只有三条路但每条路都够呛。第一条路是从零实现。听起来很硬核实际上是把所有底层技术都重新造一遍P2P网络、密码学、Merkle树、交易池、共识引擎、存储引擎、状态机……你不仅要懂协议设计还要有足够精力把这些组件逐个调通。光是把网络层和共识层稳定下来一个五六人的团队花上一年都很正常。更麻烦的是这类系统里任何一个边界条件没处理好都可能造成网络分叉或资金损失调试成本极高。第二条路是基于以太坊这类智能合约平台做开发。你不需要造底层业务逻辑写合约就行但自由度被卡得很死底层共识不能改出块时间不能调状态迁移方式受平台限制想做定制化的治理机制、定序逻辑或者共识规则几乎不可能。以太坊上你能选的是“在别人规定好的游戏规则里做应用”而不是“自己定义一套游戏规则”。第三条路是Fork比特币或以太坊的客户端。表面上这是捷径实际上等于接了一个巨大的技术债。上游代码库动辄几十万行修改一个共识参数要顺着调用链翻遍整个代码库上游发布安全补丁时你还要手工把改动同步回来。你去改那些共识层或状态层代码时稍微碰错一个细节可能整个网络就离你而去了。这三条路我都见过团队踩过真实感受就是底层设施和业务逻辑高度耦合导致绝大多数精力都消耗在了“和区块链基础设施搏斗”上而不是创造业务价值。1.2 Substrate的真正价值基础设施预制件加业务自由组合Substrate的解法完全不同。它把区块链里那些“物理层”的东西——网络通信、数据库、共识、最终性、交易池、甚至Runtime升级机制——全部预制好并且做成可以替换的组件。开发者上手时默认拿到的是一条已经能出块的完整链然后通过组装不同的模块来定义链的业务规则。具体拆开看Substrate的几个设计点让它和一般框架拉开差距网络层直接基于libp2p节点发现、加密通信、连接复用这些不用你操心。存储层采用基于trie的数据库结构数据读写、状态根计算都是现成的。共识层可插拔开发模式用单验证人正式环境可以换Aura、BABE、Grandpa甚至PoW。核心的Runtime业务逻辑用FRAME组织每个功能模块叫一个Pallet像插件一样往Runtime里挂。Runtime编译成Wasm字节码存到链上后续可以通过链上治理走无分叉升级。光说设计理念可能抽象我举个对比表格方便你把“从零写链”“合约平台”“Substrate”放在一个维度里看维度从零写链智能合约平台Substrate开发重心底层基础设施全部自研业务合约业务逻辑加模块组装共识定制完全自己写不可修改可配置可替换升级方式硬分叉为主合约可替换无分叉Runtime升级网络和存储自己实现平台托管框架内置可替换生产验证风险高周期长成熟但定制受限已被多条生态链验证我提到这些不是为了吹这个框架有多神而是它确实把“做一条链”的门槛从“需要一支底层系统团队”降到了“一个熟悉Rust和业务逻辑的开发者”就能动手。像Acala、Moonbeam、Phala这些项目分别覆盖DeFi、以太坊兼容、隐私计算方向都是基于Substrate构建并跑过生产环境的这至少说明它不是个玩具框架。2. 入门必须先搞懂的两段式架构Client分离与Runtime的Wasm升级机制2.1 Client与Runtime一条链的两半刚开始接触Substrate时最容易把人绕晕的就是Client和Runtime的区分。我当时也花了点时间才把这层窗户纸捅破。简单说一条运行中的Substrate链由两部分组成。第一部分是Client客户端。它负责所有“执行环境”相关的事情P2P网络通信、数据库存储、区块生产、共识引擎、最终性判定、RPC接口等等。这部分无论链的业务逻辑是什么基本都是通用的。你启动节点时运行的程序本质就是这个Client。第二部分是Runtime运行时。它才是“链的业务状态机”定义了一条链具体支持哪些操作以及这些操作如何改变链上状态。比如转账怎么处理、Staking怎么结算、某个自定义业务调用怎么执行都在Runtime里。Client和Runtime之间的沟通不是靠函数直接调用而是通过一组约定好的“运行时API”和“宿主函数”。Client向Runtime发起查询或执行请求Runtime返回结果而Runtime需要访问底层能力时又通过宿主函数来调用Client提供的能力。这种边界让两半可以被独立替换。我比较喜欢用一个类比来理解Client就是主板和CPURuntime就是可更换的操作系统。主板提供电源、总线、内存插槽这些基础能力操作系统决定这台机器能跑什么应用。不同链可以共用同一个Substrate Client但Runtime千差万别。2.2 无分叉升级不是魔法从Wasm替换到治理链路传统区块链升级节点最头疼的就是硬分叉。旧节点和新节点对同一套状态规则理解不一致网络就会分裂成两条链。Substrate解决这个问题的思路是把Runtime编译成Wasm然后把这份Wasm直接放到链上存储里。升级的大致流程是先由链上治理机制通过一个升级提案然后执行一次特殊调用把新的Wasm代码写入链上存储。之后产出的新区块所有节点都会从链上读取最新的Wasm来执行旧区块已经跑过的逻辑不会受影响。这样做的结果是不需要所有节点手动停服升级二进制新的Runtime规则就能在全网生效。这听起来很优雅但有个必须记住的前提升级换的是代码不是历史状态。链上已经存在的存储数据不会跟着自动变形。如果你的新Runtime把某个存储结构从一个map改成了嵌套map或者改了编码方式那么节点读取旧数据时就会解码失败轻则panic重则链直接无法继续出块。这个点我在第5章会用一次真实的踩坑过程展开这里先埋个钩子。另外要注意虽然Runtime可以无分叉升级但Client本身如果有什么共识层或网络层的改动仍然需要节点运维方配合升级。所以在生产环境里链上治理和节点升级一般是配合着来不是某一个能包打天下。3. 跑通第一条链的完整过程从环境准备到节点启动的命令级实操3.1 环境准备系统依赖、Rust工具链与node-template获取我实际测试时用的是Ubuntu 22.04这个环境下最顺手。macOS也能跑Windows原生支持比较折腾如果你主力机是Windows建议用WSL2。先安装系统级依赖。Substrate编译要用到一堆系统库不装齐的话后边会莫名报错sudo apt update sudo apt install -y build-essential clang curl git make libssl-dev pkg-config protobuf-compiler然后安装Rust工具链。这里有一个坑Substrate并不是用最新版Rust就能编译的项目通常会在rust-toolchain.toml文件里锁定某个具体的nightly版本。node-template克隆下来之后进目录时rustup会自动读取这个文件所以你先装一个稳定版rustup就行curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh source ~/.cargo/env rustup default stable光装native工具链还不够Substrate要把Runtime编译成Wasm所以wasm32-unknown-unknown这个target必须装上。否则构建到一半就会卡住rustup target add wasm32-unknown-unknown --toolchain nightly-2023-05-21这里我以nightly-2023-05-21为例实际情况以你克隆的模板里rust-toolchain.toml锁定的版本为准。如果你不确定先别手动装进入项目目录后根据报错再装也行。获取node-template并开始编译git clone --depth 1 https://github.com/substrate-developer-hub/substrate-node-template.git cd substrate-node-template cargo build --release第一次编译会比较久我在一台8核16G内存的机器上大约花了20多分钟内存小一点的机器可能要40分钟到1小时。磁盘至少留出10GB空间。如果你不想把整个workspace的东西全编出来也可以只构建节点本身cargo build --release -p node-template这样能省一点时间但对第一次跑通来说差别不算大反正后面增删pallet时还是要重新编全集。3.2 启动节点参数含义与日志解读编译完成后直接用官方模板启动一条开发链./target/release/node-template --dev --tmp说下这两个参数的含义--dev开发模式。节点会默认使用Alice作为唯一的验证人不需要配置额外的共识节点直接就能出块。--tmp数据目录使用临时文件夹节点停止后数据清空。这是我最常用的组合跑测试、做演示都很方便。启动后你会看到类似这样的日志Substrate Node Running in dev mode Imported #211 (0x...)出现Imported且区块号在持续增长说明出块正常。默认情况下WebSocket端口是9944RPC端口是9933P2P端口是30333。其实你不改它们本地开发一般也够用。3.3 用RPC和前端模板验证链的状态日志正常不算数我建议再用RPC确认一下节点状态。打开另一个终端执行curl -H Content-Type: application/json -d {id:1,jsonrpc:2.0,method:system_health,params:[]} http://localhost:9933如果返回的内容里包含isSyncing:false和peers:0开发模式下单节点没有peer很正常说明节点是健康的。想快速确认链名可以调用system_chaincurl -H Content-Type: application/json -d {id:1,jsonrpc:2.0,method:system_chain,params:[]} http://localhost:9933前端交互我习惯直接用官方的前端模板它免去了自己写连接代码的麻烦git clone https://github.com/substrate-developer-hub/substrate-front-end-template.git cd substrate-front-end-template yarn install yarn start打开localhost:3000确认前端模板连接的是ws://localhost:9944你就能看到Alice、Bob这些内置测试账户可以转账也可以调用Runtime里的各种pallet函数。对刚入门的人来说这套组合已经足够直观。有一点要提醒如果是在VPS或远程服务器上运行前端模板默认连不上因为你要在启动参数里加--rpc-external和--ws-external并且--rpc-corsall。但这么操作等于把RPC接口暴露到公网如果你不熟悉安全加固我建议先在本地环境跑通别为了远程演示就把调试接口裸奔。4. 给链加业务逻辑亲手写一个存证Pallet并接入Runtime4.1 Pallet骨架与“宏优先”的开发方式node-template本身自带一个templatepallet但它太简单基本只是示范。我建议你从自己写一个真实业务功能开始这里我就用一个非常典型的场景哈希存证。业务规则很简单用户提交一份内容的哈希链上记录该哪个账户在什么时候存过该哈希之后任何人都可以验证某条哈希确实存在过。这个功能很适合学习因为只需要一个存储项、一个可调用函数和一个查询函数却能覆盖Pallet开发的全部核心知识点。在Substrate开发里定义一个Pallet最核心的方式是靠宏。下面这个示例代码适用于polkadot-v1.0左右的版本不同tag下宏的写法会有细节差异但整体骨架是稳定的#![cfg_attr(not(feature std), no_std)] use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; pub use pallet::*; #[frame_support::pallet] pub mod pallet { use super::*; #[pallet::config] pub trait Config: frame_system::Config { type RuntimeEvent: FromEventSelf IsTypeSelf as frame_system::Config::RuntimeEvent; type MaxProofs: Getu32; } #[pallet::pallet] pub struct PalletT(_); #[pallet::storage] pub type ProofsT: Config StorageMap _, Blake2_128Concat, T::AccountId, Vecu8 ; #[pallet::event] #[pallet::generate_deposit] pub enum EventT: Config { ProofStored(T::AccountId, Vecu8), } #[pallet::error] pub enum ErrorT { HashTooLong, ProofNotExists, } #[pallet::call] implT: Config PalletT { #[pallet::weight(10_000)] pub fn store_proof(origin: OriginForT, hash: Vecu8) - DispatchResult { let who ensure_signed(origin)?; ensure!( hash.len() T::MaxProofs::get() as usize, Error::T::HashTooLong ); Proofs::T::insert(who.clone(), hash.clone()); Self::deposit_event(Event::ProofStored(who, hash)); Ok(()) } #[pallet::weight(10_000)] pub fn verify_proof( origin: OriginForT, owner: T::AccountId, hash: Vecu8, ) - DispatchResult { let _ ensure_signed(origin)?; let stored Proofs::T::get(owner).ok_or(Error::T::ProofNotExists)?; ensure!(stored hash, Error::T::ProofNotExists); Ok(()) } } }这段代码看起来东西不多其实已经覆盖了五个关键部分Config trait定义Pallet依赖的关联类型和常量。RuntimeEvent是为了派发事件MaxProofs限制单条哈希长度。StorageMap以账户为key存其存证的哈希值。Event存证成功后通知链上。Error定义了HashTooLong和ProofNotExists两种失败原因。Call两个可调用函数store_proof做写入verify_proof做校验。这里有个我要特别说明的地方代码里的weight(10_000)是写死的常量只适合开发和测试。生产环境里一个函数的实际权重应该根据计算资源消耗来评估否则很容易被恶意高价交易刷爆区块。新手阶段用常量问题不大但心里要明白它不是最终方案。4.2 接入Runtime配置、construct_runtime与编译写好pallet代码后它还不能直接被链使用得先“挂”到Runtime上。以官方模板的runtime/src/lib.rs为例分三步走。第一步在文件顶部声明pallet模块pub use pallet_poe;第二步实现Configtrait。在impl区域里加上impl pallet_poe::Config for Runtime { type RuntimeEvent RuntimeEvent; type MaxProofs ConstU3264; }第三步在construct_runtime!宏里注册palletconstruct_runtime!( pub enum Runtime { System: frame_system, PalletPoe: pallet_poe, // ... 其他pallet } );注册完之后还需要在根目录的Cargo.toml里给runtime依赖添加pallet-poe并确保它启用了std特性。如果你漏了这一步编译时不会立刻报“缺少pallet”而是报一堆类型或宏无法解析的错误排查起来比较费时间。最后重新编译cargo build --release如果编译通过启动节点后在polkadot.js或前端模板的Extrinsics里你会看到palletPoe这个模块里面的storeProof和verifyProof已经可以调用了。4.3 单元测试先行用mock runtime验证存证逻辑区块链开发里单元测试不是可选动作而是必选项。因为Runtime一旦部署到链上改出bug的成本极高最好在本地mock环境里把逻辑验证清楚。写测试需要构造一个mock runtime。核心思路是用frame_support::construct_runtime!搭一个最小测试链然后实现pallet_poe::Config for Test。下面是一个精简版的测试代码#[cfg(test)] mod tests { use super::*; use frame_support::{assert_noop, assert_ok}; use sp_runtime::BuildStorage; frame_support::construct_runtime!( pub enum Test { System: frame_system, PalletPoe: crate::pallet, } ); // ... 这里需要实现 frame_system::Config 和 pallet_poe::Config // 以及测试用工具函数 new_test_ext() #[test] fn store_then_verify_works() { new_test_ext().execute_with(|| { assert_ok!(PalletPoe::store_proof( RuntimeOrigin::signed(1), vec![1, 2, 3] )); assert_eq!(PalletPoe::proofs(1), Some(vec![1, 2, 3])); assert_ok!(PalletPoe::verify_proof( RuntimeOrigin::signed(1), 1, vec![1, 2, 3] )); }); } #[test] fn store_too_long_rejected() { new_test_ext().execute_with(|| { let long_hash vec![0u8; 100]; assert_noop!( PalletPoe::store_proof(RuntimeOrigin::signed(1), long_hash), Error::Test::HashTooLong ); }); } }我需要说明的是官方模板里的pallet测试用的是sp-io::TestExternalities完整mock代码模板可以直接参考substrate-node-template/pallets/template/src/tests.rs。你照着那个骨架替换成自己的pallet逻辑就行不要自己从头搭mock环境很容易踩配置坑。5. 编译失败与升级时区引起的存储坑我的完整排查记录这一章我专门把实际踩过的坑按“症状 — 排查链路 — 解决方式”写出来。如果你正在学Substrate其中任何一个坑都可能让你卡上半天。5.1 Rust版本不一致引发的第一类编译问题我第一次把node-template拉下来直接cargo build --release编译开始没多久就报错error: toolchain nightly-2023-05-15-x86_64-unknown-linux-gnu is not installed这个报错很典型。原因就是项目里的rust-toolchain.toml锁定了某个具体日期的nightly而我本机根本没有装那个版本。rustup在项目目录下会自动读取锁定的工具链找不到就报错。我的排查链路是这样走的先看rust-toolchain.toml确认锁定的nightly版本。执行rustup show看当前项目目录实际使用的工具链。执行rustup toolchain list看本机已经装了哪些。最终解决方式也就两步rustup toolchain install nightly-2023-05-15 rustup target add wasm32-unknown-unknown --toolchain nightly-2023-05-15这里我特别想提醒一句不要随手把rust-toolchain.toml删掉或者改成最新nightly。Substrate生态的crate编译依赖与特定nightly的宏展开表现强相关用最新nightly经常会出现一些莫名其妙的类型推断错误或宏报错而换成项目锁定的版本就一切正常。这个问题的本质不是你的代码写错了而是Rust工具链版本和依赖的编译预期不匹配。5.2 Wasm目标缺失和编译内存不足另一种编译失败发生在构建位置更靠后的时候报错内容一般是rustc: error: unable to find the wasm32-unknown-unknown target原因很简单构建Runtime为Wasm时需要的target没装。很多新手只装了native target就以为能编译了。解决方式我已经在前面提过rustup target add wasm32-unknown-unknown --toolchain nightly-2023-05-21但还有一个更隐蔽的坑内存不足导致Wasm构建进程被系统杀掉。我在一台只配了4GB内存的云服务器上试过构建过程偶尔会突然卡住然后报SIGKILL或process didnt exit successfully。排查时如果dmesg里有OOM相关信息基本就能确认是内存不够了。两个解决思路# 降低Wasm构建的并行度 WASM_BUILD_PARALLELISM1 cargo build --release或者干脆增加Swap空间。我自己的经验是4GB内存加2GB Swap配合WASM_BUILD_PARALLELISM1虽然慢但能跑通如果有条件还是建议至少8GB内存的机器来开发。5.3 最容易被忽略的存储升级坑新旧数据结构不兼容这个坑是我认为整个Substrate开发中最值得警惕的因为它往往发生在链已经上线运行之后。事情是这样的我在测试链上已经存了一批证明数据编译了新版Runtime打算通过sudo或治理调用执行无分叉升级。升级成功后节点开始panic日志里不断出现类似这样的错误panicked at .../core/src/option.rs:...: called Option::unwrap() on a None value我一开始以为是代码里有unwrap逻辑的问题后来逐层排查才发现真正原因是我在新版本里修改了存储结构。原来的Proofs是一个StorageMapAccountId, Vecu8我把旧数据按新结构去读但链上存储的编码方式已经变了新Runtime找不到预期的数据直接panic。这里要强调一个核心机制无分叉升级替换的是Wasm代码但链上已有存储不会自动迁移。如果你的新Runtime对存储的理解和旧版本不一致读取旧数据时就会失败。这就好比你把一张二维表格改成了三维数据结构但表格里的旧数据还是二维的程序一读就炸。我的完整排查链路是这样的先看节点panic日志确认是在读取存储时炸的。构建带try-runtime特性的版本用模拟升级命令在最新链上状态上执行一次升级逻辑cargo build --release --features try-runtime ./target/release/node-template try-runtime --block-at latest on-runtime-upgrade live --uri ws://localhost:9944try-runtime会在运行时预演升级过程输出存储迁移问题的具体位置这一下就帮我定位到了存储读取失败的地方。在Runtime里注册迁移代码实现OnRuntimeUpgradetrait把旧存储读取出来写入新存储再清掉旧key。这个教训给我的收获是任何上线后的存储结构调整都要当成一次正式的数据库迁移来做。先在测试网完整演练升级流程再用try-runtime验证最后才在生产环境操作。不要因为Substrate的“无分叉升级”看起来很顺滑就忽略存储兼容性问题。6. 从demo走向可用链共识选型、治理和跨链扩展的取舍6.1 共识与最终性从小白配置到生产判断node-template默认使用的是Aura出块加Grandpa最终性这对本地开发完全够用。但真到了准备上生产环境的时候共识选型就得动脑子了。先理清两个基础概念出块Block Production决定谁来产生新的区块。Aura是固定验证人集合轮流出块BABE则更接近Polkadot原生风格出块权和验证人的随机比重相关。最终性Finality决定一个区块何时被认定为不可回滚。Grandpa是确定性最终性工具只要达到2/3以上验证人签名区块就永久固化。不同场景下的推荐组合可以参考这个表格场景推荐方案理由本地开发、功能测试Aura配置简单单验证人即可出块准备接入Polkadot生态BABE Grandpa与中继链和常用平行链的共识模型一致企业或联盟内部链Aura 自定义验证人白名单验证人数量可控出块节奏稳定教学、研究、极小规模测试PoW概念直观不需要授权验证人如何修改共识配置主要落在两个文件上chain_spec.rs里定义初始验证人集合service.rs里选择共识引擎。对新手来说我不建议一开始就动共识层先把Aura加Grandpa的组合跑熟再去研究BABE的密钥管理和随机性机制。6.2 治理模块、链上升级与多签管理开发模式下你可以直接用Sudo模块一键执行任意操作包括set_code升级Runtime。但这是开发期的偷懒手段一旦链上有了真实资产和第三方用户就没人愿意让一个特权账户随意改代码。Substrate的FRAME里自带一整套治理模块Democracy做公投Council做理事会Treasury做国库管理。你可以配置投票周期、通过阈值、提案存款等参数。要让升级流程真正走向去中心化一般是把set_code权限从Sudo转移到公投流程。团队资金管理方面utility和multisig这两个pallet值得关注。多签账户可以避免单点风险尤其适合项目方管理国库或运营资金。我的建议是从部署测试网的第一天起就把治理流程设计好别等真的需要时才去临时加模块因为新增治理模块本身也是要升级的。6.3 平行链、XCM与智能合约生态扩展的下一步最后聊聊生态扩展。如果你的目标不是做一条完全独立的孤链而是接入Polkadot生态共享安全性那么你需要考虑平行链方向。这个方向的技术核心是插槽注册和区块验证通过把中继链的安全能力引入自己的链获得跨链通信和共享验证的收益。跨链通信层面Substrate生态的XCMCross-Consensus Message Format是绕不开的概念。它不只是“跨链转账”而是一套描述跨共识系统消息的通用格式可以承载资产转移、远程调用、治理委托等复杂操作。真正要上手的时候强烈建议在本地起两条平行链走一遍XCM消息流程而不是直接在主网测试网。智能合约兼容方面FRAME提供了两条路线pallet-contracts支持Wasm合约为主要使用Rust的团队准备pallet-evm可以运行Solidity合约适合想兼容以太坊工具链的团队。选择哪条路线本质上取决于你的生态定位和开发者群体。我个人在把链从demo推向测试网的过程中最大的体会是Substrate的能力边界其实不在于技术能做什么而在于你是否想清楚链的定位和治理模型。先把最小闭环跑通把存储模型设计稳把升级路径演练顺再去追求更多模块和更复杂的跨链设计这条路才是稳的。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

SSM+Vue前后端分离登录态实战:Session、跨域与鉴权全链路解析 2026/9/28 17:45:09

SSM+Vue前后端分离登录态实战:Session、跨域与鉴权全链路解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
从PID到ADRC:用控制论破解AI Agent可靠性困境 2026/9/28 17:44:57

从PID到ADRC:用控制论破解AI Agent可靠性困境

1. 智能体可靠性困境的本质:为什么“聪明”不等于“稳定”过去两年,我参与过不少AI Agent项目的落地,从客服自动应答到工业流程编排,从代码生成助手到多智能体协作系统。一个反复出现的现象让我印象极深:Demo阶段惊艳四…

阅读更多 →
大规模Agent训练沙箱基础设施:调度、镜像与状态恢复设计 2026/9/28 17:44:57

大规模Agent训练沙箱基础设施:调度、镜像与状态恢复设计

1. 大规模 Agent 训练为什么需要一套专门的沙箱基础设施做过 Agent 训练的人都有一个共同体会:模型本身的训练循环其实不难写,真正让人头疼的是"让成百上千个 Agent 同时跑起来、跑得稳、跑完还能把状态收回来"。DeepSeek 公开的 DSec 这套东西…

阅读更多 →
Superpowers:AI编程工具链协同配置与效能实践 2026/9/28 17:44:57

Superpowers:AI编程工具链协同配置与效能实践

1. “Superpowers”不是超能力,而是新一代AI编程工具链的统称最近在开发者圈子里,“superpowers”这个词出现频率高得有点反常——它既不是某个新发布的超级英雄电影,也不是某家科技公司的神秘代号,而是一群正在悄悄改变写代码方式…

阅读更多 →
从PID到ADRC:用控制论打造稳定可靠的AI Agent 2026/9/28 17:44:56

从PID到ADRC:用控制论打造稳定可靠的AI Agent

智能体开发做到第三个月的时候,我遇到了一个特别典型的问题:一个用来做数据清洗的Agent,在测试集上跑得漂漂亮亮,任务完成率能到92%,但只要上游数据格式稍微抖一下——比如某个字段从字符串变成了数字,或者…

阅读更多 →
Alluxio v2.9.4分布式缓存实践:让Spark更快访问HDFS与S3 2026/9/28 17:44:50

Alluxio v2.9.4分布式缓存实践:让Spark更快访问HDFS与S3

简介:Alluxio 2.9.4 是面向大数据生态的分布式虚拟存储系统源码包,适合Hadoop开发者、存储工程师以及需要统一异构存储访问入口的数据平台团队,用于理解读写加速、透明命名空间、分层存储与底层存储对接的实现机制。包体约16.3MB,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉