
Canopy插件架构教程5步用Go、Kotlin或Python开发你的第一条嵌套链【免费下载链接】canopyThe official go implementation of the Canopy Network protocol项目地址: https://gitcode.com/gh_mirrors/canopy10/canopyCanopy 是一个递归架构区块链框架——链会引导链、互相独立最终组成一张停不下来的点对点启动网络。而Canopy 插件架构正是它的灵魂你无需运行虚拟机VM-less 扩展只用一个独立进程就能为嵌套链Nested Chain增加自定义交易类型、自定义状态和自定义 RPC。本教程带你用5 步基于官方 Go、Python 或 Kotlin 插件脚手架开发出你的第一条嵌套链。第1步读懂 Canopy 插件架构Unix Socket ProtobufCanopy 的插件机制非常轻核心节点FSM有限状态机和你用任意语言写的插件进程之间只靠一条Unix Socket说话消息格式是长度前缀 Protobuf[4 字节长度前缀][Protobuf 消息]插件需要响应 5 个生命周期钩子这也是你写一条链的全部骨架钩子执行时机能否读写状态Genesis创建高度 0 的创世状态✅BeginBlock每个块开始应用时✅CheckTx交易进内存池前的无状态校验只读DeliverTx交易被打包进块、真正生效时✅ 读写EndBlock每个块应用结束时✅核心实现在 lib/plugin.go其中Plugin结构体定义了无虚拟机的扩展方式节点侧则通过PluginCompatibleFSM接口把状态读写能力借给插件lib/plugin.go。 关键心智模型插件不是被调用的库而是和节点隔空对话的独立进程。所以它天然多语言——这正是 Go / Python / Kotlin / TypeScript / C# 五套脚手架并存的原因见 plugin/ 目录。第2步选择语言脚手架拿到开箱即用的插件工程仓库内置了 5 套完整插件模板各自带Makefile、Dockerfile、proto 定义和教程语言路径入口构建 Goplugin/go/main.gomake build Pythonplugin/python/main.pymake build☕ Kotlinplugin/kotlin/Main.ktmake buildJDK 17 TypeScriptplugin/typescript/main.tsmake build C#plugin/csharp/plugin.csmake build以 Go 为例核心文件只有几个结构一目了然plugin/go/ ├── main.go # 启动插件 自定义 RPC 服务器 ├── contract/ │ ├── plugin.go # Unix Socket 通信与生命周期 │ ├── contract.go # 你的合约逻辑CheckTx / DeliverTx │ └── rpc.go # 自定义链上数据 RPC 端点 ├── crypto/ # BLS12-381 签名工具 ├── proto/ # Protobuf 定义 └── TUTORIAL.md # 完整官方教程⚠️重要规则插件直接共享 Canopy FSM 的键空间单字节前缀1–15 已被核心保留账户、池、验证人、委员会等。你的自定义状态记录请使用范围外的前缀如100、101否则握手阶段节点会直接 panic 拒绝启动见 lib/plugin.go。第3步用 Protobuf 定义你的交易类型以给任意地址铸币的 Faucet 交易为例在 plugin/go/proto/tx.proto 中声明消息message MessageFaucet { bytes signer_address 1; bytes recipient_address 2; uint64 amount 3; }然后运行生成脚本 plugin/go/proto/_generate.sh把 Go 结构体输出到contract/tx.pb.go。Python 版对应make protoplugin/python/TUTORIAL.md。每个语言模板都附了一份《实现 Faucet Reward 两种交易》的完整教程plugin/go/TUTORIAL.md、plugin/python/TUTORIAL.md、plugin/kotlin/README.md照着走即可。第4步注册交易类型实现 CheckTx / DeliverTx4.1 注册。在 plugin/go/contract/contract.go 的ContractConfig中登记两个列表顺序必须一致var ContractConfig PluginConfig{ Name: go_plugin_contract, SupportedTransactions: []string{send, faucet}, TransactionTypeUrls: []string{type.googleapis.com/types.MessageSend, type.googleapis.com/types.MessageFaucet}, CustomStatePrefixes: [][]byte{faucetPrefix}, // 避开 1-15 }4.2 校验CheckTx无状态验证地址20 字节、金额非零并返回AuthorizedSigners供节点验签。4.3 执行DeliverTx此时你可以自由读写了——通过StateRead批量读账户改完余额再用StateWrite原子写回。例如 faucet 的无中生有recipient.Amount msg.Amount。4.4 进阶插件进程可以完全自持一个 HTTP 服务器暴露链上专属查询端点如/v1/query/faucets节点侧只需一个通用的QueryState只读快照通道即可lib/plugin.go。第5步构建、配置、启动见证出块 ① 构建 Canopy 节点与插件make build/canopy # 生成 canopy 二进制 cd plugin/go make build② 配置节点。编辑~/.canopy/config.json将 lib/config.go 中定义的plugin字段设为你的插件名{ plugin: go, pluginTimeoutMS: 1000 }③ 启动并观察canopy start tail -f /tmp/plugin/go-plugin.log首次启动可能看到插件重试日志几秒内完成握手后就会开始出块。想省心可直接走 Dockermake docker/plugin PLUGINgo后make docker/run-go。④ 跑集成测试cd plugin/go make test测试会自动完成创建账户 → faucet 铸币 → send 转账 → reward 发奖 → 校验余额与自定义 RPC 端点全绿即代表你的嵌套链跑通了。常见问题速查现象原因与解法message name faucet is unknownSupportedTransactions与TransactionTypeUrls未同步注册重新构建签名校验失败要对去掉签名字段后的 Protobuf 字节签名BLS12-381不是 JSON余额不更新等块出块最终化约 6–12 秒并查插件日志节点 panic 提示前缀冲突自定义状态前缀落入了 1–15 保留区换到 100小结 回顾一下这 5 步读懂 SocketProtobuf 架构 → 选语言脚手架 → Protobuf 定义交易 → 实现校验与执行 → 构建启动出块。Canopy 用无 VM 插件换来了真正的多语言自由——你的第一条嵌套链今天就可以出块。更多细节可继续阅读 plugin/go/TUTORIAL.md 与 lib/plugin.go 的完整实现。【免费下载链接】canopyThe official go implementation of the Canopy Network protocol项目地址: https://gitcode.com/gh_mirrors/canopy10/canopy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考