546  
开发插件
作者: 姜天雨 于 2021年07月14日 发布在分类 / 区块链基础知识 / 底层框架资料 / GoQuorum 下,并于 2021年07月14日 编辑

开发插件

我们利用 HashiCorp go-plugin   来启用我们使用 gRPC 的基于插件的架构。

我们建议阅读 go-plugin  gRPC examples . 示例。 一些进阶话题 go-plugin  在文档中未提供的将在这里介绍

生命周期

插件作为单独的进程启动,并通过 gRPC 服务接口与 GoQuorum 客户端主机进程通信。

这是通过本地机器上相互验证的 TLS 连接完成的。 实现是在  go-plugin  库中完成的。

golang 中开发插件时使用更简单。 对于用其他语言编写的插件,插件作者需要了解以下生命周期(有关更多信息,请参阅 Advanced topics for non-Go plugins ):

  1. geth  从设置中读取插件定义后查找插件分发文件

  2. geth  验证插件分发文件的完整性

  3. geth  生成自签名证书(又名客户端证书)

  4. g eth  使用客户端证书生成插件

  5. 该插件导入客户端证书并为其 RPC 服务器生成自签名服务器证书

  6. 该插件在握手中包含 RPC 服务器证书

  7. geth  导入插件 RPC 服务器证书

  8. 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 插件示例。






 推荐知识

 历史版本

修改日期 修改人 备注
2021-07-14 16:06:17[当前版本] 姜天雨 修改内容
2021-07-14 16:05:45 姜天雨 创建版本

 附件

附件类型

PNGPNG

  目录
    区块链服务网络发展联盟