# java-sdk设计概要
## 简介
Java-sdk为自研链提供一个sdk工具集,旨在为第三方应用提供一个方便的可扩展的调用链网络的工具。
### 背景
### 术语和缩略语
### 参考资料
## 需求分析
### 需求差异化分析
| 需求要点 | 需求描述 | 需求涉及业务功能 | 现状系统业务规则 |
| ------------------------------- | ----------------------- | ---------------- | -------------------------------- |
| 提供一个供应用层调用链接口的sdk | 提供应用调用链接口的sdk | 权限模块 | 当前底层链没有相关功能的java-sdk |
## 架构设计
sdk 模块架构图如图所示
• 首先,获取自研链的 proto 文件,proto 文件定义了每个模块的 message 数据结构和 rpc 方法及其 grpc-gateway 的请求路径。通过 openapi-generator-cli 工具生成 openapi 文件夹openapi 文件夹下包含了每个模块所提供的 grpc-gateway 接口的具体实现和数据结构。openapi 定义了 ApiClient 结构,包含 QueryApi 和 ServiceApi 服务,以及 header、参数基本校验、错误处理等。
• 其次,sdk 目录为核心代码,根据 openapi 封装定义 interface: sdk.Client 及其实现 sdk.apiClient提供以下功能模块:auth、bank、tbft、base、jvm、permission、wasm、gorverance、upgrade
• 最后,当完成 sdk.apiClient 的实例化后, 既可使用 sdk 所提供的功能模块,通过自研链的 1317 端口与其 grpc-gateway 服务进行通信,实现与链交互。

### 功能设计
#### 给角色赋予行为
现在链初始化时会定义若干角色,每个角色下有若干行为,而行为对应的是相关链的接口。现在可以通过业务的新增需求,给角色对应增加新的行为,则可以通过该方法去改变链上角色所对应的行为。
处理流程:
1. 由应用层传入给角色赋予行为所需要的参数以及账户的助记词和密码
2. Java-sdk接收到参数之后会利用这些参数生成对应的消息体
3. 利用传进来的账户助记词生成签名所需要的私钥,利用私钥对消息体进行签名
4. 完成签名之后会将签名之后的数据通过链上grpc-gateway的交易执行接口传入到链上进行消息的处理 。
5. 链上首先会判断消息的有效性,然后会将交易放入mempool中处理打包交易然后出块。
6. 得到响应之后将响应数据反馈给java-sdk
#### 查询角色对应行为
如果有业务需求,希望查看该角色所对应的有哪些行为,则可以通过此功能查询相关数据
处理流程:
1. 应用层传入需要查看的角色
2. Java-sdk将该角色当做http请求的入参调用链上grpc-gateway相对应的查询接口
3. 链上处理完查询的请求之后将相关数据返回给java-sdk
### 接口设计
#### 给角色赋予行为
##### 接口说明
| 请求方式 | java调用|
| -------- | -------- |
| 方法名 | broadcastApproveBehavior(final Client client, final BroadcastTxRequest.ModeEnum mode, final String fromMnemonic, final String password, final List<String> roleNames,final String behavior) |
|功能说明|给角色添加行为|
##### 请求参数
| 参数 | 类型 | 说明 |
| -------- | -------- | -------- |
| client | Client | sdk客户端 |
| mode | BroadcastTxRequest.ModeEnum | 广播模式 |
| fromMnemonic | String | 账户助记词 |
| password | String | 助记词密码 |
| behavior | String | 行为 |
| roles | List<string> | 角色列表 |
#### 查询角色对应行为
##### 接口说明
| 请求方式 | java调用|
| -------- | -------- |
| 方法名 | getAccountOfRole(final Client client, final String roleName) |
|功能说明|查询角色行为|
##### 请求参数
| 参数 | 类型 | 说明 |
| -------- | -------- | -------- |
| client | Client | sdk客户端 |
| roleName | String | 角色名称 |