Skip to main content

Rust 客户端

面临的问题#

诸如Bench-tps之类的高级测试是根据客户端特征编写的。 将这些测试作为测试套件的一部分执行时,我们将使用低级的BankClient实现。 当需要对集群运行相同的测试时,我们使用ThinClient(轻客户端)实现。 这种方法的问题在于,它意味着该特性将不断扩展,从而包括新的实用程序功能,并且其所有实现都需要添加新功能。 通过将面向用户的对象与抽象化网络接口的特征分离,我们可以扩展面向用户的对象,以包括各种有用的功能,例如RpcClient的“spinner”,而无需担心扩展特征及其实现。

拟定的解决方案#

代替实现客户端特征,应使用其实现来构造ThinClient。 这样,当前具有客户端特征的所有实用程序功能都可以移至ThinClient中。 然后,ThinClient可以移至solana-sdk中,因为它的所有网络相关性都在Client的实现中。 然后,我们将添加一个名为Client的新实现,称为ClusterClient,并将其存在于ThinClient当前所在的Solana-client工具箱中。

重组之后,任何需要客户端的代码都将以ThinClient的形式编写。 在单元测试中,将使用ThinClient<BankClient>调用该功能,而main()函数、基准测试和集成测试将通过ThinClient<ClusterClient>调用该功能。

如果更高级别的组件需要比BankClient能够实现的功能更广,则应按照与此处所述相同的模式,通过实现第二个特征的第二个对象来实现。

错误处理#

客户端应使用现有的TransportError枚举来进行错误处理,除了Custom(String)字段应更改为Custom(Box<dyn Error>)

实施战略#

  1. solana-sdkRpcClientTng中添加新对象,其中Tng后缀是临时的,代表“TheNextGeneration”
  2. SyncClient的实现来初始化RpcClientTng
  3. 将新对象添加到solana-sdkThinClientTng中;使用RpcClientTngAsyncClient实现对其进行初始化
  4. 将所有单元测试从BankClient移至ThinClientTng<BankClient>
  5. 添加ClusterClient
  6. ThinClient用户移到ThinClientTng<ClusterClient>
  7. 删除ThinClient并将ThinClientTng重命名为ThinClient
  8. RpcClient用户移到新的ThinClient<ClusterClient>
  9. 删除RpcClient并将RpcClientTng重命名为RpcClient