槽位协作(SDK 面)
插件步骤与链上其他步骤(内置或其他插件)传数据的唯一通道=槽位。 本页是 SDK 作者视角的协作契约;编排语义见槽位与数据协作(站点侧)。
声明:怎么被看见
特性在清单里声明槽位(元数据级),运行期按声明裁剪投递:
"collaboration": {
"produces": [ { "slot": "acme:token-check", "scope": "public" } ],
"consumes": [ { "slot": "ctx:token-claims", "strength": "strong" } ]
}
produces[].scope:public(全链可读)|ns(本命名空间内可见)——跨 ns 仅 public;consumes[].strength:strong(三态皆无来源=编译拒绝)|weak(缺来源不阻发布);- 未声明
consumes的槽读不到——按声明裁剪既是权限面也是性能面。
读写:怎么拿值
var idx = context.SlotIndex("acme:token-check"); // 具名→编译期索引(零字符串查找)
var v = context.GetString(idx); // 强类型取值
context.SetJson(idx2, jsonElement); // 强类型写
强类型助手族(GetString/GetNumber/GetInteger/GetBool/GetJson/GetBytes+对称 Set*)
按声明类型取用;TryGetSlot<T> 兜底;GetSlotValue 取带 kind 探测的载体。
载体约定(跨边界可传的三类值)
插件 ALC 内核只共享 Contracts 程序集+框架程序集——跨插件槽位值只有三类可传:
| 载体 | 适合 | 取用 |
|---|---|---|
| BCL 基元 | string/double/long/bool/byte[] |
GetString/GetNumber/GetInteger/GetBool/GetBytes |
| 框架 JSON 模型 | 结构化数据(推荐 JsonElement) |
GetJson |
| Contracts 公共值类型 | 家族标准值对象 | GetSlotValue |
插件自定义类型跨插件传不了——ALC 隔离下强转物理不可行。内置步骤之间的 同程序集直传是宿主特权,插件作者不要依赖。
类型对齐(编译期)
- 槽位名称+类型双对齐才默认映射;同名不同型=编译拒绝(显式绑定也不放行);
- 类型词汇=JSON 类型集+
any(缺省"未承诺")——any生产时消费具体类型有护栏警告; - 平台隐式槽三类来源:链内生产/
ctx:buffered-body(链首自动注入)/ctx:token-claims·ctx:consumer-identity(认证步骤产出)。
反模式
| 症状 | 原因 | 正确形态 |
|---|---|---|
| 构造解析失败 | 用了未声明能力的服务 | 清单 capabilities 补声明(声明制授权) |
| GetJson 拿到 null | 上游写的是基元 | kind 探测(SlotKind)后按实际载体取 |
| 想传自定义 DTO 给下游插件 | ALC 边界 | 序列化为 JsonElement 写槽(JSON 是跨内核通用值模型) |