# Thread: ShrinkSDKUnity ## Alias - `ShrinkSDKUnity` ## Status: OPEN ## Goal 持续推进 `D:\UnityBuilds\ShrinkSDK` 的 SDK 基础设施,重点围绕: - `ShrinkModFramework` - `ShrinkNetwork` - 独立服务器能力 - 权限、RPC、传输层 ## Context *Created from conversation on 2026-04-05.* 本线程当前已经落地: - `.planning/codebase/` 中文代码库地图 - `Assets/Modules/ShrinkModFramework/` - 模组声明、依赖声明、生命周期 - `RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)` 自动启动 - 外部 DLL 热插拔 - Harmony 自动补丁接入 - `Assets/Modules/ShrinkNetwork/` - `[ShrinkNetworkMessage]` - `[ShrinkNetworkSubscriber]` - `[ShrinkNetworkSubscribe]` - `RpcAsync` - 权限模型 `ShrinkNetworkAuthority / ShrinkNetworkPeerKind / Permission` - `ShrinkJsonNetworkSerializer` - `ShrinkMessagePackNetworkSerializer` - `ShrinkLoopbackTransport` - `ShrinkTcpClientTransport` - `ShrinkKcpClientTransport` - `ShrinkKcpPeer` - `ShrinkKcpTransportOptions` - `GeneratedServers/ShrinkNetwork.ServerHost/` - 独立 .NET 控制台服务器 - `TcpServerTransport` - `KcpServerTransport` - 同时监听 TCP `17001` 与 KCP `17002` ## This Round 这一轮新增与修复: - 重构 `ShrinkNetwork` 目录结构: - `Runtime/Core` - `Runtime/Metadata` - `Runtime/Routing` - `Runtime/Serialization` - `Runtime/Transport/*` - `Editor/Scaffolding` - 删除仓库内固定参考工程,改为插件模板 + 生成式独立服务器工程 - 独立服务器生成器支持扫描: - `[ShrinkNetworkMessage]` - 显式 `RegisterMessage(opcode, route)` - 新增显式状态同步范式: - `ShrinkNetworkStateSyncAttribute` - `ShrinkNetworkStateSyncRole` - LAN 演示消息补齐: - `[ShrinkNetworkMessage]` - `[ShrinkNetworkStateSync("lan", role)]` - `opcode` / `route` 冲突改为生成阶段直接报错,不由框架静默兜底 - `ShrinkNetworkService.BindTransport(...)` 自动接入可选桥接: - 自动注册 `ShrinkNetwork.Integration.EventBus` - `BindTransport(null)` 自动解绑 - `ShrinkNetwork.Integration.EventBus` 增加更易用扩展: - `session.PublishEventAsync(...)` - `session.RequestEventAsync(...)` - `service.BroadcastEventAsync(...)` - `service.UseEventBusBridge(...)` - `ShrinkEmbeddedHostNetworkDemoSceneController` 去掉手工 `RegisterService(...)` - 统一重写 README: - `Assets/Modules/ShrinkNetwork/README.md` - `Assets/Modules/ShrinkNetwork.Integration.EventBus/README.md` - `Assets/Modules/ShrinkDataSaver.Integration.EventBus/README.md` ## This Round Update 继续补齐的内容: - `ShrinkNetwork` 的 RPC 关联 id 从裸 `int rpcId` 重构为强类型 `ShrinkRequestToken` - `ShrinkRpcCallOptions` 增加: - `RequestTokenOverride` - `DebugLabel` - `ShrinkNetworkPacket / ShrinkNetworkContext / ShrinkNetworkRouter / ShrinkNetworkService` 全链路改用 `RequestToken` - `ShrinkNetwork.Integration.EventBus` 的请求结果调用默认带事件类型 `DebugLabel` - TCP 客户端在“远端正常关闭连接”时不再刷异常堆栈,降级为 warning - 独立服务器生成器继续升级: - 不只识别 `[ShrinkNetworkEvent]` - 还会区分: - 广播型网络事件 - 远端裁决网络事件 - 增量网络事件 - 对非状态同步范式接管的网络事件消息,自动生成 handler 模板并自动注册 `RegisterHandler(...)` - 同步更新当前生成产物: - `GeneratedServers/ShrinkNetwork.ServerHost/Generated/UnityGeneratedServerHandlers.g.cs` - `GeneratedServers/ShrinkNetwork.ServerHost/Generated/UnityGeneratedServerModule.g.cs` - `GeneratedServers/ShrinkNetwork.ServerHost/Generated/UNITY_GENERATED_SERVER_SCAFFOLD.md` - 模板说明补齐: - `Assets/Modules/ShrinkNetwork/Editor/Scaffolding/ServerProjectTemplate/README.md.txt` - `Assets/Modules/ShrinkNetwork/README.md` - 商业级可用性第一轮硬化: - `ShrinkNetworkService` / `ShrinkNetworkSession` 改为并发安全集合,断线时自动失败对应的挂起 RPC - TCP 客户端 / 服务端补齐最大包长保护,避免远端伪造长度直接触发大内存分配 - 运行时 `ShrinkKcpServerTransport` 补齐远端地址校验,并把会话 `conversationId` 改为随机分配 - 独立服务器模板与当前 `GeneratedServers` 宿主改为“默认拒绝匿名登录”,只有显式允许时才在缺少令牌时放行 - 同步更新: - `Assets/Modules/ShrinkNetwork/Editor/Scaffolding/ServerProjectTemplate/*` - `GeneratedServers/ShrinkNetwork.ServerHost/*` - 商业级可用性第二轮硬化: - `ShrinkNetworkPacket` 增加 `ProtocolVersion / SchemaVersion` - `ShrinkNetworkService` 增加协议版本窗口校验,必要时通过 `IShrinkNetworkSessionControlTransport` 主动断开违规会话 - `ShrinkNetworkService` 增加基础指标快照: - 会话连接/断开 - 收发包与字节数 - RPC 发起/完成/超时/取消/失败 - 协议违规、权限拒绝、处理器异常、未知 opcode、分发 miss、反序列化失败 - 独立服务器宿主新增: - `ServerHostOptions.MinProtocolVersion / MaxProtocolVersion` - `ServerHostOptions.MinSchemaVersion / MaxSchemaVersion` - `ServerHostOptions.DisconnectOnProtocolViolation` - `ServerHostOptions.DiagnosticsLogIntervalSeconds` - `Program.cs` 会定期输出指标摘要,并在 `Ctrl+C` 前打印最后一份快照 ## Verified 已做实际验证: - `dotnet build .\\Assembly-CSharp.csproj /m:1 -p:BaseIntermediateOutputPath=Temp\\CliObj\\Assembly-CSharp\\` - `dotnet build .\\Assembly-CSharp-Editor.csproj /m:1 -p:BaseIntermediateOutputPath=Temp\\CliObj\\Assembly-CSharp-Editor\\` - `dotnet build .\\GeneratedServers\\ShrinkNetwork.ServerHost\\ShrinkNetwork.ServerHost.csproj /nr:false` - `dotnet build .\\ShrinkNetwork.Runtime.csproj /m:1` - `dotnet build .\\ShrinkSDK.sln /m:1` 说明: - Unity 侧当前编译为 0 warning / 0 error - 当前 `GeneratedServers\\ShrinkNetwork.ServerHost` 可编译通过,但在 `net8.0` 宿主侧仍有一批既有 nullable warnings - 当前 `GeneratedServers\\ShrinkNetwork.ServerHost` 也已手工同步到新生成器语义 - 这轮没有做 Unity 编辑器内按钮点击与 PlayMode 回归 - 商业级硬化这一轮已额外验证: - `dotnet build .\\Assembly-CSharp.csproj /m:1 -p:BaseIntermediateOutputPath=Temp\\CliObj\\Assembly-CSharp\\` - `dotnet build .\\GeneratedServers\\ShrinkNetwork.ServerHost\\ShrinkNetwork.ServerHost.csproj /nr:false` - `dotnet build .\\ShrinkSDK.sln /m:1` ## Notes - `D:\UnityBuilds\ShrinkSDK` 是根 Git 仓库;EventBus、DataSaver 与 DataSaver.EventBus 已从 gitlink/嵌套仓库改为根仓库直接跟踪,干净克隆可恢复完整源码。 - 当前唯一架构文档是根 `DESIGN.md`;Cordis 完成态和旧 `.planning/codebase` 地图已归档到 `Docs/Archive/`。 - 独立服务器生成器已改为扫描 Unity 编译后的 Player 程序集语义,并用 SHA-256 清单保护模板托管文件。 - 当前线程里“独立服务器模板仍有 nullable 警告”的记录已过期,至少现有生成工程与解决方案编译均已清零 - PowerShell 查看 UTF-8 中文时会出现乱码,但文件本身已按 UTF-8 写入 - `ShrinkNetwork.Integration.EventBus` 当前 `HasResult` 只回传: - `EventResult` - `IsCanceled` - `ErrorCode / ErrorMessage` - 还不会自动回传事件对象其它字段的最终改动 - 当前生成器虽然已经把网络事件纳入一等公民,但生成结果仍以“可编译、可注册、可继续补业务”为目标,不会替你推断完整业务逻辑 - 当前默认安全基线已明显提高,但仍未覆盖 TLS、正式身份体系、协议版本协商、压测与故障演练 - 当前协议版本闸门与指标摘要已经具备最小生产辅助价值,但还没有 metrics 导出、trace、dashboard 或告警接入 ## Next Steps - 在 Unity 编辑器中实际点击“生成完整独立服务器工程 / 刷新 Generated 合同”并补一轮运行时回归 - 继续补商业级缺口时,优先排: - TLS / 安全信道 - 正式身份体系与令牌轮换 - 更细粒度的协议兼容协商,而不是当前这种“窗口校验 + 直接断开” - metrics 导出 / trace / dashboard / 告警 - 压测、模糊包、断线与兼容回归 - 后续修改服务器生成器时保持语义扫描、命名空间同名拒绝和模板哈希预检测试。 - 如果要继续收口代码层细节,优先处理公开 API 中残留的 nullable 语义不一致,而不是重复消化已不存在的构建警告 - 如果后续彻底放弃旧心智,可把公开 API 中残留的 `route = null` 一类签名继续做 nullable 收口 ## Last Update - 2026-08-29: 完成第三方合规排查并新增根 `THIRD-PARTY-NOTICES.md`(README 已加"第三方与合规"入口)。结论:NeoForge / Minecraft Forge 与 MessagePipe 仅为概念参考(`Docs/JustAnyProjectArchitectureAudit.md` A.3 有既有声明;EventBus 的五级优先级、`receiveCanceled`、`EventResult{DEFAULT,ALLOW,DENY}`、`Attach(object)` 对应 Forge API 语义,实现为原创未复制代码,不触发 LGPL 衍生义务);MessagePipe 未引入依赖、API 形态不构成高度相似;AlicizaX(GitHub 组织)在代码、文档、git 历史中零引用,`ShrinkInstaller` 子模块历史为自研。真正触发 MIT 归属义务的是 `Assets/Modules/ShrinkNetwork/Plugins/Kcp-CSharp.dll`(Molth/Kcp-CSharp,上游 KCP)与 `System.Runtime.CompilerServices.Unsafe.dll`,两者版权行与 MIT 全文已收录进声明文件;UniTask / MessagePack / Newtonsoft.Json 为外挂包依赖已登记。遗留:根仓库本身尚无 LICENSE(EventBus 模块已有 MIT),且 `ShrinkNetwork` 模块独立发布时需把 DLL 声明同步进该模块仓库。 - 2026-04-10: 已新增 `Assets/Modules/ShrinkTutorial/` 独立包,落地一套可复用的互动式引导系统,包含 `ShrinkTutorialManager`、`ShrinkTutorialData / ShrinkTutorialStep / ShrinkTutorialDatabase`、默认 `PlayerPrefs` 持久化、`ShrinkTutorialAnchor / ShrinkTutorialTrigger`、遮罩挖洞与提示框 UI、以及 `ShrinkSDK/引导/*` / `ShrinkSDK/Tutorial/*` 编辑器入口。 - 2026-04-10: 已新增示例场景 `Assets/Scenes/ShrinkTutorialSample.unity`,并配套生成 `Assets/Modules/ShrinkTutorial/Samples/Resources/ShrinkTutorialSettings.asset`、`Assets/Modules/ShrinkTutorial/Samples/ShrinkTutorialSampleDatabase.asset`、`Assets/Modules/ShrinkTutorial/Samples/ShrinkTutorialSampleTutorial.asset`。示例流程覆盖三类核心路径:静态目标点击、运行时动态锚点等待、`CompleteStep(customEventName)` 自定义事件完成。 - 2026-04-10: 示例场景入口脚本为 `Assets/Modules/ShrinkTutorial/Runtime/Samples/ShrinkTutorialSampleSceneController.cs`,一键重建入口为 `Assets/Modules/ShrinkTutorial/Editor/Samples/ShrinkTutorialSampleSceneBuilder.cs`,菜单为 `ShrinkSDK/引导/创建示例场景` 与 ASCII 别名 `ShrinkSDK/Tutorial/Create Sample Scene`。后续如果示例场景被手改或损坏,可直接走该菜单重建。 - 2026-04-10: 本轮已做命令行编译验证:`ShrinkTutorial.Runtime.csproj`、`ShrinkTutorial.Editor.csproj`、`ShrinkSDK.sln` 均为 `0 warning / 0 error`。Unity 侧也完成了一轮示例场景 PlayMode 烟测,并修复了 `ShrinkTutorialDialog.Initialize()` 在已有 `RectTransform` 上重复 `AddComponent()` 导致的运行时空引用。 - 2026-04-10: 当前示例场景文案已改为英文,不是产品方向选择,而是临时规避 TMP 默认字体缺少中文字形导致的方块/警告。若后续要把示例或引导系统默认文案恢复成中文,优先补一个可用的中文 TMP 字体资产,再统一改回中文,避免再次出现 `LiberationSans SDF` 缺字警告。 - 2026-04-07: 已补上给外部模组开发者使用的 `Mod SDK` 导出器。新入口是 `ShrinkSDK/Mod/导出 Mod SDK 开发包`,会先构建 `ShrinkSDK.sln`,再导出 `Libs/ + Templates/ExternalMod/SampleShrinkMod/ + README + manifest.json`;其中外部模板已改成引用导出包里的 DLL,而不再直接引用本地仓库 `csproj`。 - 2026-04-07: 因外部独立模组工程在用户 IDE 环境里仍会撞到 `Microsoft.NET.SDK.WorkloadAutoImportPropsLocator` 解析问题,已追加一条更省事的“仓库内模组模板”路径。新入口是 `ShrinkSDK/Mod/生成仓库内模组模板(推荐)`,会直接生成到当前 Unity 项目的 `Assets` 下并复用现有 `ShrinkSDK.sln` / asmdef 编译链,作为当前更推荐的模组开发入口。 - 2026-04-07: 已给 `ShrinkModFramework` 补上外部 DLL 模组模板生成器。新入口是 `ShrinkSDK/Mod/生成外部模组模板`,实现位于 `Assets/Modules/ShrinkModFramework/Editor/Scaffolding/`,会生成带 `csproj + build.ps1 + 示例模组代码 + README` 的独立模组工程,方便模组开发者直接构建 DLL 并投放到 `Mods` 目录。 - 2026-04-07: 已整理 `Assets/Modules/ShrinkModFramework/Runtime/` 目录结构,把平铺脚本拆成 `Bootstrap / Core / Metadata / Registry / Loading / Network / Integration` 七层;同时同步更新 `Assets/Modules/ShrinkModFramework/README.md` 与 `.planning/codebase/STRUCTURE.md`,把模组框架当前真实目录与推荐阅读顺序补齐。 - 2026-04-07: 用户已在实际环境中完成本轮回归,反馈当前 `ShrinkCommand` / `ShrinkNetwork` / 独立服务器生成链路“测试过了没问题”。这意味着前面“还缺 Unity 编辑器内实际回归验证”的记录对当前这条链路已过期;当前可把状态视为:代码编译全绿,且已有用户侧真实验证通过。 - 2026-04-07: 已继续把 `ShrinkCommand`/`ShrinkNetwork` 相关 nullable 收口做到当前全绿。先补齐 `Assets/Modules/ShrinkCommand.Integration.EventBus/` 与 `Assets/Modules/ShrinkCommand.Integration.Network/` 的 `#nullable enable`,再把 `Assets/Modules/ShrinkNetwork/Runtime` 的消息元数据、权限、注册器、路由器、会话、服务、序列化器、EventBus 桥接等公共类型按真实可空语义收口;同时把 `GeneratedServers/ShrinkNetwork.ServerHost/Generated/UnityGeneratedNetworkContracts.g.cs` 里 `LanJoinRoomResponse.Players` 的数组默认值补齐,并把源头生成器 `Assets/Modules/ShrinkNetwork/Editor/Scaffolding/ShrinkDedicatedServerScaffoldGenerator.cs` 的 `GetDefaultInitializer(...)` 改成对任意 `T[]` 都自动生成 `Array.Empty()`,避免后续重新生成时 warning 回弹。已实际验证:`dotnet build .\\ShrinkSDK.sln /m:1` 与 `dotnet build .\\GeneratedServers\\ShrinkNetwork.ServerHost\\ShrinkNetwork.ServerHost.csproj /nr:false` 现都为 `0 warning / 0 error`。 - 2026-04-07: 已修复 `ShrinkCommand` 在 Unity 侧的兼容性编译断点。`Assets/Modules/ShrinkCommand/Runtime/Core/ShrinkCommandService.cs` 与 `Assets/Modules/ShrinkCommand/Runtime/Metadata/ShrinkCommandTypes.cs` 现已显式开启 `#nullable enable`,并把依赖 `init` 的对象初始化属性改成 Unity 2022 当前编译链可稳定通过的 `set`,避免再次触发 `System.Runtime.CompilerServices.IsExternalInit` 缺失;同时顺手收口了 `ShrinkCommandRegHelper.cs` 与 `ShrinkCommandService.cs` 内部的几处 nullable warning。已实际验证:`dotnet build .\\ShrinkCommand.Runtime.csproj /m:1`、`dotnet build .\\GeneratedServers\\ShrinkCommand.RuntimeSmoke\\ShrinkCommand.RuntimeSmoke.csproj /nr:false` 均为 `0 warning / 0 error`;`dotnet build .\\ShrinkSDK.sln /m:1` 与 `dotnet build .\\GeneratedServers\\ShrinkNetwork.ServerHost\\ShrinkNetwork.ServerHost.csproj /nr:false` 也都恢复到 `0 error`。当前残留 warning 已不在这两个修复点本体,而是在既有的 `ShrinkCommand.Integration.*` 与 `ShrinkNetwork` nullable 收口面。 - 2026-04-06: 已补宿主文本配置文件能力。新增 `GeneratedServers/ShrinkNetwork.ServerHost/server.properties` 与模板 `server.properties.txt`,风格对齐 Minecraft 的 `key=value` 配置;`Program.cs` 启动改为先走 `ServerHostProperties.LoadOrCreate()`,首次启动缺文件时自动落默认配置,并打印配置文件路径、是否首次生成、配置告警与最终优先级。当前规则为“代码默认值 < server.properties < 环境变量”;同时补了 `SHRINK_SERVER_CONFIG_PATH` 自定义配置文件路径入口,并把 `UnityAssetsPath` / `ScanOutputDirectory` 的默认解析从易错的 `AppContext.BaseDirectory` 相对跳转改成基于宿主工程目录定位。 - 2026-04-06: 已补上运行时烟测闭环。新增 `GeneratedServers/ShrinkNetwork.RuntimeSmoke/` 轻量控制台烟测工具,直接覆盖“登录拿令牌 -> 鉴权后业务 RPC -> `server/auth/refresh` 续期 -> 篡改令牌后被宿主断链”。同时把会话令牌关键配置补成环境变量:`SHRINK_SERVER_ENABLE_SESSION_TOKENS / SHRINK_SERVER_SESSION_TOKEN_TTL_SECONDS / SHRINK_SERVER_SESSION_TOKEN_REFRESH_WINDOW_SECONDS / SHRINK_SERVER_DISCONNECT_ON_INVALID_SESSION_TOKEN`。已实际跑通:宿主在 `SHRINK_SERVER_AUTH_TOKEN=smoke-token`、TTL/续期窗口都为 `120` 秒时,烟测日志确认 `Login ok`、`Join room ok`、`Refresh ok`、`Tampered token rejected with disconnect`、`PASS`;宿主日志也确认坏令牌请求被拒绝并主动踢线。 - 2026-04-06: 已补上“正式身份/会话令牌体系”第一版。`ShrinkNetworkPacket` 新增 `SessionToken` 与到期时间戳;`ShrinkNetworkSession` 会自动持有并回传当前令牌;`ShrinkNetworkService` 新增 `IncomingPacketValidator` 与 `AuthRejectedCount` 指标。独立宿主与模板侧新增 `server/auth/refresh`,登录成功后签发内存态会话令牌,并按 `ServerHostOptions.EnableSessionTokens / SessionTokenTtlSeconds / SessionTokenRefreshWindowSeconds / DisconnectOnInvalidSessionToken` 做逐包校验与续期。已实际验证:`dotnet build .\\Assembly-CSharp.csproj /m:1 -p:BaseIntermediateOutputPath=Temp\\CliObj\\Assembly-CSharp\\`、`dotnet build .\\GeneratedServers\\ShrinkNetwork.ServerHost\\ShrinkNetwork.ServerHost.csproj /nr:false`、`dotnet build .\\ShrinkSDK.sln /m:1` 全部通过;Unity 侧与解决方案侧恢复到 `0 warning / 0 error`,宿主仍保留既有 nullable warnings;本轮尚未做真实登录-续期-断链运行时回归。 - 2026-04-06: 已补完 TCP TLS 第一版收口。`ShrinkTcpClientTransport` / `ShrinkTcpServerTransport` 与当前 `GeneratedServers`、模板宿主都已接入可选 `ShrinkTcpTlsOptions`,TCP 读包路径统一改为 `Stream` 以兼容 `SslStream`。同时把 `ShrinkTcpTlsOptions` 的实际定义移到 `Runtime/Transport/Abstractions/IShrinkNetworkTransport.cs`,原 `Runtime/Transport/Tcp/ShrinkTcpTlsOptions.cs` 仅保留占位,避免 Unity 尚未刷新工程文件时再次出现“文件已在磁盘上但类型不可见”的构建断点。 - 已补记商业级第二轮硬化:协议版本闸门、会话踢除接口、基础指标快照与宿主周期性摘要;Unity 侧命令行构建仍保持 0 warning / 0 error,独立服务器宿主仍存在既有 nullable warnings,下一续接点转向 TLS / 身份体系 / 真正的观测导出 - 2026-04-06: 宸茶ˉ涓?Minecraft 椋庢牸鐨勭嫭绔嬪懡浠ょ郴缁熶笌妗ユ帴灞傘€傛柊澧?`Assets/Modules/ShrinkCommand/` 鐙珛鍛戒护杩愯鏃讹紝鏀寔璺緞寮忓懡浠ゃ€佽礊蹇冨弬鏁般€佹潈闄愩€佹潵婧愬垽瀹氥€佸睘鎬佸紡鑷姩娉ㄥ唽锛涘悓鏃舵柊澧?`Assets/Modules/ShrinkCommand.Integration.EventBus/` 涓?`Assets/Modules/ShrinkCommand.Integration.Network/`锛屽墠鑰呮敮鎸佺敤 `ShrinkCommandExecuteRequestEvent` 璇锋眰鎵ц鍛戒护骞跺彂甯?executing / executed / failed 浜嬩欢锛屽悗鑰呮敮鎸佺敤 `command/execute` RPC 鎵ц杩滅▼鍛戒护銆傚綋鍓?`GeneratedServers/ShrinkNetwork.ServerHost` 宸叉敼涓哄叡浜?`ShrinkCommandService`锛屾帶鍒跺彴涓庣綉缁滄ˉ鎺ュ叡鐢ㄥ悓涓€濂楀懡浠わ紱瀹夸富鍦?stdin EOF 鏃朵笉鍐嶇珛鍗抽€€鍑猴紝閫傞厤鍚庡彴杩涚▼鍚姩銆傚凡瀹為檯楠岃瘉锛?`dotnet run --project .\\GeneratedServers\\ShrinkCommand.RuntimeSmoke\\ShrinkCommand.RuntimeSmoke.csproj` PASS锛?`dotnet run --project .\\GeneratedServers\\ShrinkCommand.EventBusSmoke\\ShrinkCommand.EventBusSmoke.csproj` PASS锛屼互鍙婂悗鍙板惎鍔ㄥ涓?+ `dotnet run --project .\\GeneratedServers\\ShrinkNetwork.RuntimeSmoke\\ShrinkNetwork.RuntimeSmoke.csproj -- 127.0.0.1 17777 smoke-token runtime-smoke` PASS锛屽凡鐪熷疄瑕嗙洊鈥滅櫥褰?-> 涓氬姟 RPC -> 杩滅▼ `status` 鍛戒护 -> 绡℃敼浠ょ墝鏂摼鈥濄€?