Table of Contents

槽位协作(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 是跨内核通用值模型)