开发插件
我们利用 HashiCorp 的 go-plugin 来启用我们使用 gRPC 的基于插件的架构。
我们建议阅读 go-plugin gRPC examples . 示例。 一些进阶话题 go-plugin 在文档中未提供的将在这里介绍
生命周期
插件作为单独的进程启动,并通过 gRPC 服务接口与 GoQuorum 客户端主机进程通信。
这是通过本地机器上相互验证的 TLS 连接完成的。 实现是在 go-plugin 库中完成的。
在 golang 中开发插件时使用更简单。 对于用其他语言编写的插件,插件作者需要了解以下生命周期(有关更多信息,请参阅 Advanced topics for non-Go plugins ):
geth 从设置中读取插件定义后查找插件分发文件
geth 验证插件分发文件的完整性
geth 生成自签名证书(又名客户端证书)
g eth 使用客户端证书生成插件
该插件导入客户端证书并为其 RPC 服务器生成自签名服务器证书
该插件在握手中包含 RPC 服务器证书
geth 导入插件 RPC 服务器证书
geth 和插件使用双向 TLS 通过 RPC over TLS 进行通信
每个插件都必须实现 PluginInitializer gRPC 服务接口。
插件进程成功启动并成功建立与 GoQuorum 客户端的连接后,
GoQuorum 客户端调用 Init() gRPC 方法以使用配置数据初始化插件
从插件定义中读取 config
从设置 文件 settings 中插件定义的 config 中读取。
文件格式
插件分发文件必须是 ZIP 文件。 文件名格式为 <name>-<version>.zip. <name> 和 <version> 必须与设置文件中 PluginDefinition object 对象中定义的值相同。
元数据
插件元数据文件 plugin-meta.json 必须包含在分发 ZIP 文件中。 plugin-meta.json 包含一个有效的 JSON 对象,该对象具有带有键值对的扁平化结构。
尽管 JSON 对象可以包含任何所需的信息。 必须存在以下键值对。
非 Go 插件的进阶课题
编写非 Go 插件记录在 go-plugin GitHub 中。
此处描述了一些其他进阶课题。
Magic Cookie
Magic Cookie 键和值用作插件打算启动的基本验证。 这不是安全措施,只是 UX 功能。
Magic Cookie key 和 value 在执行插件过程时作为环境变量注入。
插件和 GoQuorum 客户端的 Magic cookie 进行了比较。 如果它们相等,则加载插件。 如果它们不相等,插件应该显示人性化的输出。
相互 TLS 认证
GoQuorum 客户端需要插件通过双向 TLS 验证和保护连接。 PLUGIN_CLIENT_CERT 环境变量填充有 GoQuorum 客户端证书( PEM 格式)。
插件需要将此证书包含到其受信任的证书池中,然后生成自签名证书并将证书的 base64 编码值(以 DER 格式)附加到 handshake 消息中。
Init.proto
每个插件都 必须 实现这个 RPC 服务
通过此服务,插件接收由 geth 发送的原始配置。 由插件来阐释和解析配置,然后进行初始化以确保插件已准备好提供服务
PluginInitializer
Required RPC 服务在插件进程成功启动后初始
信息
PluginInitialization
用于对其他消息进行逻辑分组的包装器
PluginInitialization.Request
插件的初始化数据
例 子
请访问概览页面 Overview 获取内置的 HelloWorld 插件示例。