ProtocolCanary-Fixtures
收藏资源简介:
一组版本化的规范兼容性测试数据,用于定义和测试Stellar协议的具体行为。
A set of versioned specification compatibility test data used to define and test the specific behaviors of the Stellar protocol.
ProtocolCanary-Fixtures 数据集概述
基本信息
- 数据集地址:https://github.com/StellarCanary/ProtocolCanary-Fixtures
- 许可证:Apache-2.0
- 性质:Stellar Protocol Canary 的规范性兼容性夹具(fixtures)集合
- 内容形式:版本化的声明式测试数据语料库,不包含业务逻辑、服务器、数据库或可执行夹具代码
目的
该仓库回答一个问题:Protocol Canary 应该测试哪些确切的 Stellar 协议行为?
流程关系如下:
-
协议规范 / 上游实现 → 规范性夹具 → ProtocolCanary-Fixtures(本仓库)→ Protocol-Canary → 兼容性结果
-
ProtocolCanary-Fixtures定义测试什么 -
StellarCanary/Protocol-CanaryCLI 定义如何执行测试 -
StellarCanary/ProtocolCanary-Action在 GitHub CI 中对本仓库的夹具运行该 CLI
快速开始
验证器要求 Python 3.11 或更高版本(因其导入仅在 Python 3.11 才加入标准库的 tomllib)。无需安装其他依赖。
python3 tools/validate/validate.py— 结构性夹具验证python3 -m unittest discover tests— 仓库测试套件
仓库关系
Protocol-Canary通过canary_fixtures::load_directory加载夹具,命令为:stellar-canary check --fixtures-dir <path-to-a-checkout-of-this-repo> --json- 加载器递归遍历给定目录,将每一个
*.toml文件解析为一个夹具 - 无
manifest.toml文件:加载器将每个.toml文件视为夹具,单独的发现/枚举文件会被忽略或被误解析为格式错误的夹具 - 目录名仅为装饰性:
xdr/、rpc/、soroban/、cap-0083/等仅为人类导航而存在;夹具的surface、protocol、category字段才是加载器和规划器所依据的 - 可将
--fixtures-dir指向仓库根目录或单个protocol-NN/目录
协议包(Protocol packs)
| 协议包 | 状态 | 说明 |
|---|---|---|
protocol-28/ |
活跃 | CAP-0083、CAP-0085(XDR);Protocol 28 RPC 身份;一个 Soroban 模拟冒烟夹具。按 surface 的夹具计数:4 xdr,1 rpc,1 soroban(共 6 个)。详见 docs/protocol-28.md |
protocol-27/ |
尚未填充 | 0 个夹具。夹具仅在上游行为被独立验证后才添加,绝不作为占位符 |
协议包目录命名为 protocol-<N>,其中 <N> 是该包所针对的 Stellar 协议版本。协议包仅在有已验证的上游行为可记录时才创建。仅顶层的 protocol- 包目录如此命名;包内部目录仅为人类导航,会被加载器忽略。
夹具格式
每个夹具是一个 TOML 文件,包含公共元数据及特定于 surface 的主体:
公共字段:
id— 必需,全树唯一protocol— 必需surface— 必需,取值为"xdr"|"rpc"|"soroban"category— 必需,自由文本description— 必需source_reference— 协议特定夹具必需required_capabilities— 可选,kebab-case 能力字符串数组(如soroban-contract、rpc-client);缺少某项能力的目标项目会跳过该夹具而非使其失败input_file— 可选,相对于夹具文件的路径,指向外部存储的输入;验证器检查文件存在expected_file— 可选,相对于夹具文件的路径,指向外部存储的预期输出;同样进行存在性检查
input_file 与 expected_file 目前尚未被本仓库任何夹具使用(值通过 value_base64/expected_base64 内联),但格式支持它们。
当前支持的 RPC 方法:rpc surface 目前仅接受两个方法——get-network 和 get-latest-ledger。命名任何其他方法的夹具会被验证器拒绝。
断言词汇表
每个 surface 通过一小组 kind 值声明其预期结果,其他值在夹具解析时即失败。
| Surface | 字段 | 值 | 断言内容 |
|---|---|---|---|
xdr |
kind |
decode-success |
value_base64 作为命名 type 成功解码 |
xdr |
kind |
decode-failure |
value_base64 作为命名 type 解码时被拒绝——畸形输入必须失败,绝不静默解码 |
xdr |
kind |
roundtrip |
解码 value_base64 并重新编码可复现相同字节 |
xdr |
kind |
encode-equals |
解码 value_base64 并重新编码产生恰好等于 expected_base64 的结果(用于测试规范化) |
rpc |
[[assert]].kind |
field-exists |
方法响应包含命名的 field |
rpc |
[[assert]].kind |
field-absent |
响应不包含命名的 field |
rpc |
[[assert]].kind |
field-equals |
命名的 field 恰好等于 value |
rpc |
[[assert]].kind |
field-type |
命名的 field 具有 expected_type 命名的 JSON 类型 |
soroban |
[expect].kind |
simulation-success |
simulateTransaction 成功且无错误 |
soroban |
[expect].kind |
simulation-error |
simulateTransaction 失败——可选要求错误消息中出现 message_contains |
一个 XDR 夹具携带单个顶层 kind;一个 RPC 夹具携带一个或多个 [[assert]] 表,全部必须通过;一个 Soroban 夹具携带一个 [expect] 表。夹具是声明式数据,绝非代码。
来源(Provenance)
每个协议特定夹具都引用一个 source_reference(CAP 编号、上游 XDR 定义或官方发布/API 参考),并携带头部注释说明已验证的内容、验证方式,以及(涉及实时网络调用者)何时、针对哪个端点验证。没有任何夹具断言无法追溯到权威上游来源的值。
验证
要求 Python 3.11+(验证器使用标准库 tomllib 模块);CI 固定为 3.11.16。
python3 tools/validate/validate.py— 验证架构一致性、唯一 ID、协议/surface 枚举、来源引用以及所引用文件的存在性。仅为结构性验证,绝不自行执行兼容性检查- CI(
.github/workflows/validate.yml)在每次推送和拉取请求时运行上述验证,加上python3 -m unittest discover tests以及夹具徽章新鲜度检查 schemas/fixture-v1.schema.json是本仓库面向编辑器的验证器规则镜像,由tools/validate/schema_sync.py保持同步
结构性验证并非实时网络验证:绿色 CI 仅意味着每个夹具格式良好且内部一致,并不意味任何夹具的实时网络断言刚刚针对真实网络重新检查过。protocol-28/ 中的 RPC 和 Soroban 夹具是在特定日期针对实时 soroban-testnet.stellar.org 端点手动验证的,该时间点观测仅记录在每个夹具的头部注释和 docs/protocol-28.md 中。
可用的 Makefile 目标:
| 命令 | 作用 |
|---|---|
make validate |
仅结构性夹具验证 |
make badge |
重新生成 README.md 的夹具计数徽章 |
make badge-check |
若徽章过时则失败(CI 所运行) |
make test |
仅仓库测试套件 |
make check |
按 CI 顺序执行上述全部,遇首个失败即停止 |
夹具徽章
文件顶部的徽章报告仓库当前夹具总数,其数字是生成的,非手工维护:
python3 tools/badge/badge.py— 就地重新生成 README.mdpython3 tools/badge/badge.py --check— 若徽章过时则退出非零
tools/badge/badge.py 使用与 tools/validate/validate.py 相同的发现规则统计 protocol-*/ 包下的每个 *.toml 文件,然后仅重写 README.md 中 <!-- fixtures-badge:start --> / <!-- fixtures-badge:end --> 标记之间的区域。
安全
无秘密、无私钥、无可执行夹具代码、无交易提交——夹具文件必须被任何消费者视为不受信任的输入。
维护者与社区
- 维护者:@Hollujay — 可通过本仓库的 GitHub 个人资料联系;本项目未发布其他官方联系渠道
- 社区:尚无专门社区渠道。贡献和讨论通过本仓库的 GitHub issues 和 pull requests 进行
- 贡献:参见
CONTRIBUTING.md - 安全:参见
SECURITY.md - 行为准则:参见
CODE_OF_CONDUCT.md





