# ChainMaker Java SDK README

## 鍩烘湰姒傚康瀹氫箟

Java SDK瀹氫箟浜哢ser銆丯ode銆丆hainClient鍜孋hainManager鍜孲dkConfig鍑犱釜绫伙紝鍒嗗埆浠嬬粛濡備笅锛�

- User: 琛ㄧず閾剧殑涓€涓敤鎴蜂俊鎭紝涓昏鍖呮嫭璇佷功鍜宲rivate key锛岀敤鏉ョ粰瑕佸彂閫佺殑浜ゆ槗payload绛惧悕鎴栬€呯粰澶氱鐨刾ayload绛惧悕銆�
- Node锛氳〃绀洪摼鐨勪竴涓妭鐐逛俊鎭紝瀹冨畾涔変簡鑺傜偣鐨勫悇绉嶅睘鎬э紝濡傝妭鐐硅繛鎺ョ殑RPC鍦板潃锛岃繛鎺ユ墍鐢ㄧ殑瀵嗛挜淇℃伅绛夛紝涓€涓狢hainClient瀵硅薄闇€瑕佸寘鍚竴涓垨澶氫釜Node锛岃繖鏍锋墠鑳藉杩囪妭鐐瑰疄鐜板悇绉嶅姛鑳姐€�
- ChainClient锛氬鎴风寮€鍙戞渶閲嶈涔熸槸浣跨敤鏈€澶氱殑绫伙紝浠h〃閫昏緫涓婄殑涓€鏉¢摼锛屾墍鏈夊鎴风瀵归摼鐨勬搷浣滄帴鍙i兘鏉ヨ嚜ChainClient銆�
- ChainManager锛氳礋璐g鐞嗘墍鏈夊垱寤鸿繃鐨勯摼锛屾槸涓€涓摼绠$悊绫伙紝閬垮厤鐢ㄦ埛鍚屼竴鏉¢摼鍒涘缓澶氫釜ChainClient銆傜敤鎴峰彲浠ヤ娇鐢–hainManager鏉ユ鏌ユ煇鏉¢摼鏄惁宸茬粡鍒涘缓锛屾垨鑰呯洿鎺ュ垱寤烘煇鏉¢摼锛屽鏋滆繖鏉¢摼宸茬粡鍒涘缓锛孋hainManager浼氱洿鎺ヨ繑鍥炰箣鍓嶅凡缁忓垱寤鸿繃鐨�
- SdkConfig: 鍒涘缓ChainClient鎵€闇€鐨勯厤缃被銆�

ChainClient瀵硅薄缁欑敤鎴蜂娇鐢ㄣ€傛暟鎹粨鏋勫畾涔夊涓嬶細

```java
public class User {
    // the organization id of the user
    private String orgId;
    // user's private key used to sign transaction
    private PrivateKey privateKey;
    // user's certificate
    private Certificate certificate;
    // user's private key used to sign transaction
    private PrivateKey tlsPrivateKey;
    // user's certificate
    private Certificate tlsCertificate;
    // the bytes of user's certificate
    private byte[] certBytes;
    // the hash of the cert
    private byte[] certHash;

    private CryptoSuite cryptoSuite;
}

public class Node {
    // node grpc address
    private String grpcUrl;
    // the organization's ca cert bytes
    private byte[][] tlsCertBytes;
    // the hostname in client certificate
    private String hostname;
    // TLS or PLAINTEXT
    private String negotiationType;
    // OPENSSL or JDK
    private String sslProvider;
    // node connect count
    private int connectCount;
}

public class ChainClient {
    // chainId is the identity of the chain
        private String chainId;
        // rpc connection Pool
        private ConnectionPool connectionPool;
        // archive config
        private ArchiveConfig archiveConfig;
        // the user used to sign transactions
        private User clientUser;
}

public class ChainManager {
    // chains' map
    private final Map<String, ChainClient> chains = new HashMap<>();
    // for singleton mode
    private static final ChainManager chainManager = new ChainManager();
}

```

## ChainClient绫绘帴鍙e畾涔�

### 1 鐢ㄦ埛鍚堢害鎺ュ彛
#### 1.1 鐢熸垚鐢ㄤ簬鍒涘缓鍚堢害鐨勫緟绛惧悕payload
**鍙傛暟璇存槑**

  - contractName: 鍚堢害鍚�
  - version: 鐗堟湰鍙�
  - runtimeType: 鍚堢害杩愯鐜
  - params: 鍚堢害鍒濆鍖栧弬鏁�
  - byteCodes: 鍚堢害瀛楄妭鏁扮粍

```java
   public Request.Payload createContractCreatePayload(String contractName, String version, byte[] byteCode,
                                                          ContractOuterClass.RuntimeType runtime, Map<String, byte[]> params)
```
    
#### 1.2 鐢熸垚鐢ㄤ簬鍗囩骇鍚堢害鐨勫緟绛惧悕payload
 **鍙傛暟璇存槑**

  - contractName: 鍚堢害鍚�
  - version: 鐗堟湰鍙�
  - runtimeType: 鍚堢害杩愯鐜
  - params: 鍚堢害鍒濆鍖栧弬鏁�
  - byteCodes: 鍚堢害瀛楄妭鏁扮粍


```java
public Request.Payload createContractUpgradePayload(String contractName, String version, byte[] byteCode,
                                                       ContractOuterClass.RuntimeType runtime, Map<String, byte[]> params)
```

#### 1.3 鐢熸垚鐢ㄤ簬鍐荤粨鍚堢害鐨勫緟绛惧悕payload
 **鍙傛暟璇存槑**

  - contractName: 鍚堢害鍚�
```java
public Request.Payload createContractFreezePayload(String contractName) {}
```
#### 1.4 鐢熸垚鐢ㄤ簬瑙e喕鍚堢害鐨勫緟绛惧悕payload
 **鍙傛暟璇存槑**

  - contractName: 鍚堢害鍚�
```java
public Request.Payload createContractUnFreezePayload(String contractName) {}
```

#### 1.5 鐢熸垚鐢ㄤ簬鍚婇攢鍚堢害鐨勫緟绛惧悕payload
 **鍙傛暟璇存槑**

  - contractName: 鍚堢害鍚�
```java
public Request.Payload createContractRevokePayload(String contractName) {}
```

#### 1.6 鍙戦€佸悎绾︽搷浣滆姹�
**鍙傛暟璇存槑**
  - payload: 鍚堢害鍐呭
  - endorsementEntries: 甯︾鍚嶇殑鍚堢害鍐呭
  - rpcCallTimeout: 璋冪敤rcp鎺ュ彛瓒呮椂鏃堕棿, 鍗曚綅锛氭绉�
  - syncResultTimeout: 鍚屾鑾峰彇鎵ц缁撴灉瓒呮椂鏃堕棿锛屽皬浜庣瓑浜�0浠h〃涓嶇瓑寰呮墽琛岀粨鏋滐紝鐩存帴杩斿洖锛堣繑鍥炰俊鎭噷鍖呭惈浜ゆ槗ID锛夛紝鍗曚綅锛氭绉�
```java
    public ResultOuterClass.TxResponse sendContractManageRequest(Request.Payload payload, Request.EndorsementEntry[] endorsementEntries,
                                                                     long rpcCallTimeout, long syncResultTimeout)
```

#### 1.7 鎵ц鍚堢害
**鍙傛暟璇存槑**
  - contractName: 鍚堢害鍚�
  - method: 鏂规硶鍚�
  - params: 鎵ц鍙傛暟
  - rpcCallTimeout: 璋冪敤rcp鎺ュ彛瓒呮椂鏃堕棿, 鍗曚綅锛氭绉�
  - syncResultTimeout: 鍚屾鑾峰彇鎵ц缁撴灉瓒呮椂鏃堕棿锛屽皬浜庣瓑浜�0浠h〃涓嶇瓑寰呮墽琛岀粨鏋滐紝鐩存帴杩斿洖锛堣繑鍥炰俊鎭噷鍖呭惈浜ゆ槗ID锛夛紝鍗曚綅锛氭绉�
```java
    public ResultOuterClass.TxResponse invokeContract(String contractName, String method, String txId,  Map<String, byte[]> params,
                                                          long rpcCallTimeout, long syncResultTimeout)
```

#### 1.8 鏌ヨ鍚堢害鎺ュ彛
**鍙傛暟璇存槑**
  - contractName: 鍚堢害鍚�
  - method: 鏂规硶鍚�
  - txId: 浜ゆ槗id
  - params: 鎵ц鍙傛暟
  - rpcCallTimeout: 鎵ц瓒呮椂鏃堕棿锛屽崟浣嶆绉�
```java
    public ResultOuterClass.TxResponse queryContract(String contractName, String method, String txId,
                                                         Map<String, byte[]> params, long rpcCallTimeout)
```

### 2 绯荤粺鍚堢害鎺ュ彛
#### 2.1 鏍规嵁浜ゆ槗Id鏌ヨ浜ゆ槗
**鍙傛暟璇存槑**
  - txId: 浜ゆ槗ID
  - rpcCallTimeout锛氳秴鏃舵椂闂达紝鍗曚綅姣
```java
    ChainmakerTransaction.TransactionInfo getTxByTxId(String txId, long rpcCallTimeout)
```

#### 2.2 鏍规嵁鍖哄潡楂樺害鏌ヨ鍖哄潡
**鍙傛暟璇存槑**
  - blockHeight: 鍖哄潡楂樺害
  - withRWSet: 鏄惁杩斿洖璇诲啓闆�
  - rpcCallTimeout锛氳秴鏃舵椂闂达紝鍗曚綅姣
```java
    public ChainmakerBlock.BlockInfo getBlockByHeight(long blockHeight, boolean withRWSet, long rpcCallTimeout)
```
    
#### 2.3 鏍规嵁鍖哄潡鍝堝笇鏌ヨ鍖哄潡
**鍙傛暟璇存槑**
  - blockHash: 鍖哄潡楂樺害
  - withRWSet: 鏄惁杩斿洖璇诲啓闆�
  - rpcCallTimeout锛氳秴鏃舵椂闂达紝鍗曚綅姣
```java
    public ChainmakerBlock.BlockInfo getBlockByHash(String blockHash, boolean withRWSet, long rpcCallTimeout)
```
    
#### 2.4 鏍规嵁浜ゆ槗Id鏌ヨ鍖哄潡
**鍙傛暟璇存槑**
  - txId: 浜ゆ槗Id
  - withRWSet: 鏄惁杩斿洖璇诲啓闆�
  - rpcCallTimeout锛氳秴鏃舵椂闂达紝鍗曚綅姣
```java
    public ChainmakerBlock.BlockInfo getBlockByTxId(String txId, boolean withRWSet, long rpcCallTimeout)
``` 

#### 2.5 鏌ヨ涓婁竴涓厤缃潡
**鍙傛暟璇存槑**
  - withRWSet: 鏄惁杩斿洖璇诲啓闆�
  - rpcCallTimeout锛氳秴鏃舵椂闂达紝鍗曚綅姣
```java
    ChainmakerBlock.BlockInfo getLastConfigBlock(boolean withRWSet, long rpcCallTimeout)
```

#### 2.6 鏌ヨ鑺傜偣鍔犲叆鐨勯摼淇℃伅
**鍙傛暟璇存槑**
   - timeout锛氳秴鏃舵椂闂达紝鍗曚綅姣
```java
    public Discovery.ChainList getNodeChainList(long rpcCallTimeout)
```

#### 2.7 鏌ヨ閾句俊鎭�
**鍙傛暟璇存槑**
  - rpcCallTimeout锛氳秴鏃舵椂闂达紝鍗曚綅姣
```java
     public Discovery.ChainInfo getChainInfo(long rpcCallTimeout)
```

#### 2.8 鏍规嵁txId鏌ヨ鍖哄潡楂樺害

**鍙傛暟璇存槑**
  - txId: 浜ゆ槗id
  - rpcCallTimeout锛氳秴鏃舵椂闂达紝鍗曚綅姣
```java
    public long getBlockHeightByTxId(String txId, long rpcCallTimeout) 
```    

#### 2.9 鏍规嵁blockHash鏌ヨ鍖哄潡楂樺害

**鍙傛暟璇存槑**
  - blockHash: 鍖哄潡鍝堝笇
  - rpcCallTimeout锛氳秴鏃舵椂闂达紝鍗曚綅姣
```java
    public long getBlockHeightByBlockHash(String blockHash, long rpcCallTimeout)
```

#### 2.10 鏍规嵁鍖哄潡楂樺害鏌ヨ瀹屾暣鍖哄潡

**鍙傛暟璇存槑**
  - blockHeight : 鍖哄潡楂樺害 
  - rpcCallTimeout锛氳秴鏃舵椂闂达紝鍗曚綅姣
```java
    public Store.BlockWithRWSet getFullBlockByHeight(long blockHeight, long rpcCallTimeout)
```

#### 2.11 鏌ヨ鏈€鏂板尯鍧椾俊鎭�

**鍙傛暟璇存槑**

  - withRWSet: 鏄惁杩斿洖璇诲啓闆�
  - timeout锛氳秴鏃舵椂闂达紝鍗曚綅姣
```java
    public ChainmakerBlock.BlockInfo getLastBlock(boolean withRWSet, long rpcCallTimeout)
```   
    

#### 2.12 鏌ヨ鏈€鏂板尯鍧楅珮搴�

**鍙傛暟璇存槑**

  - timeout锛氳秴鏃舵椂闂达紝鍗曚綅姣
```java
    public long getCurrentBlockHeight(long timeout) 
```

#### 2.13 鏍规嵁鍖哄潡楂樺害鏌ヨ鍖哄潡澶�

**鍙傛暟璇存槑**
  - 鍖哄潡楂樺害: blockHeight
  - rpcCallTimeout锛氳秴鏃舵椂闂达紝鍗曚綅姣
```java
    public ChainmakerBlock.BlockHeader getBlockHeaderByHeight(long blockHeight, long timeout) 
```

#### 2.14 绯荤粺鍚堢害璋冪敤

**鍙傛暟璇存槑**
   - method: 鏂规硶鍚�
   - txId: 浜ゆ槗id
   - params: 鎵ц鍙傛暟
   - rpcCallTimeout: 璋冪敤rcp鎺ュ彛瓒呮椂鏃堕棿, 鍗曚綅锛氭绉�
   - syncResultTimeout: 鍚屾鑾峰彇鎵ц缁撴灉瓒呮椂鏃堕棿锛屽皬浜庣瓑浜�0浠h〃涓嶇瓑寰呮墽琛岀粨鏋滐紝鐩存帴杩斿洖锛堣繑鍥炰俊鎭噷鍖呭惈浜ゆ槗ID锛夛紝鍗曚綅锛氭绉�
```java
    ResultOuterClass.TxResponse invokeSystemContract(String contractName, String method, String txId,  Map<String, byte[]> params,
                                                          long rpcCallTimeout, long syncResultTimeout)
```

#### 2.15 绯荤粺鍚堢害鏌ヨ

**鍙傛暟璇存槑**
   - method: 鏂规硶鍚�
   - txId: 浜ゆ槗id
   - params: 鎵ц鍙傛暟
   - rpcCallTimeout: 璋冪敤rcp鎺ュ彛瓒呮椂鏃堕棿, 鍗曚綅锛氭绉�
```java
    public ResultOuterClass.TxResponse (String contractName, String method, String txId,
                                                         Map<String, byte[]> params, long rpcCallTimeout)
```

#### 2.16 鏍规嵁浜ゆ槗Id鑾峰彇Merkle璺緞

**鍙傛暟璇存槑**
    - txId: 浜ゆ槗ID
    
```java
public byte[] getMerklePathByTxId(String txId, long rpcCallTimeout)
```

#### 2.17 寮€鏀剧郴缁熷悎绾�
**鍙傛暟璇存槑**
   - grantContractList: 闇€瑕佸紑鏀剧殑绯荤粺鍚堢害瀛楃涓叉暟缁�
```java
    public Request.Payload createNativeContractAccessGrantPayload(String[] grantContractList)
```

#### 2.18 寮冪敤绯荤粺鍚堢害
**鍙傛暟璇存槑**
   - revokeContractList: 闇€瑕佸純鐢ㄧ殑绯荤粺鍚堢害瀛楃涓叉暟缁�
```java
    public Request.Payload createNativeContractAccessRevokePayload(String[] revokeContractList)
```

#### 2.19 鏌ヨ寮冪敤鐨勭郴缁熷悎绾﹀悕鍗�
```java
public Request.Payload createGetDisabledNativeContractListPayload() 
```

#### 2.20 鏌ヨ鎸囧畾鍚堢害鐨勪俊鎭紝鍖呮嫭绯荤粺鍚堢害鍜岀敤鎴峰悎绾�
**鍙傛暟璇存槑**
   - contractName: 鎸囧畾鏌ヨ鐨勫悎绾﹀悕瀛楋紝鍖呮嫭绯荤粺鍚堢害鍜岀敤鎴峰悎绾�
   - rpcCallTimeout: 璋冪敤rcp鎺ュ彛瓒呮椂鏃堕棿, 鍗曚綅锛氭绉�
    
```java
public String getContractInfo(String contractName, long rpcCallTimeout)
```

#### 2.21 鏌ヨ鎵€鏈夌殑鍚堢害鍚嶅崟锛屽寘鎷郴缁熷悎绾﹀拰鐢ㄦ埛鍚堢害
```java
public String getContractList(long rpcCallTimeout)
```

#### 2.22 鏌ヨ宸茬鐢ㄧ殑绯荤粺鍚堢害鍚嶅崟
```java
public String getDisabledNativeContractList(long rpcCallTimeout) 
```


### 3 閾鹃厤缃帴鍙�
#### 3.1 鏌ヨ鏈€鏂伴摼閰嶇疆
```java
    ChainConfigOuterClass.ChainConfig getChainConfig(long rpcCallTimeout)
```

#### 3.2 鏍规嵁鎸囧畾鍖哄潡楂樺害鏌ヨ鏈€杩戦摼閰嶇疆
**鍙傛暟璇存槑**
   - blockHeight: 鍖哄潡楂樺害
```java
    public ChainConfigOuterClass.ChainConfig getChainConfigByBlockHeight(long blockHeight, long rpcCallTimeout)
```

#### 3.3 鏌ヨ鏈€鏂伴摼閰嶇疆搴忓彿Sequence
  - 鐢ㄤ簬閾鹃厤缃洿鏂�
```java
    public long getChainConfigSequence(long rpcCallTimeout)
```

#### 3.4 鏇存柊Core妯″潡寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**
  - txSchedulerTimeout: 浜ゆ槗璋冨害鍣ㄤ粠浜ゆ槗姹犳嬁鍒颁氦鏄撳悗, 杩涜璋冨害鐨勬椂闂达紝鍏跺€艰寖鍥翠负[0, 60]锛岃嫢鏃犻渶淇敼锛岃缃负-1
  - txSchedulerValidateTimeout: 浜ゆ槗璋冨害鍣ㄤ粠鍖哄潡涓嬁鍒颁氦鏄撳悗, 杩涜楠岃瘉鐨勮秴鏃舵椂闂达紝鍏跺€艰寖鍥翠负[0, 60]锛�
    鑻ユ棤闇€淇敼锛岃缃负-1
```java
    public Request.Payload createPayloadOfChainConfigCoreUpdate(int txSchedulerTimeout, int txSchedulerValidateTimeout, long rpcCallTimeout)
```

#### 3.5 鏇存柊Core妯″潡寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**

  - txTimestampVerify: 鏄惁闇€瑕佸紑鍚氦鏄撴椂闂存埑鏍¢獙
  - (浠ヤ笅鍙傛暟锛岃嫢鏃犻渶淇敼锛岃缃负-1)
  - txTimeout: 浜ゆ槗鏃堕棿鎴崇殑杩囨湡鏃堕棿(绉�)锛屽叾鍊艰寖鍥翠负[600, +鈭�)
  - blockTxCapacity: 鍖哄潡涓渶澶т氦鏄撴暟锛屽叾鍊艰寖鍥翠负(0, +鈭瀅
  - blockSize: 鍖哄潡鏈€澶ч檺鍒讹紝鍗曚綅MB锛屽叾鍊艰寖鍥翠负(0, +鈭瀅
  - blockInterval: 鍑哄潡闂撮殧锛屽崟浣�:ms锛屽叾鍊艰寖鍥翠负[10, +鈭瀅
```java
     public Request.Payload createPayloadOfChainConfigBlockUpdate(boolean txTimestampVerify, int txTimeout, int blockTxCapacity,
                                                            int blockSize, int blockInterval, long rpcCallTimeout)
```

#### 3.6 娣诲姞淇′换缁勭粐鏍硅瘉涔﹀緟绛惧悕payload鐢熸垚
**鍙傛暟璇存槑**
  - trustRootOrgId: 缁勭粐Id
  - trustRootCrt: 鏍硅瘉涔�
```java
    public Request.Payload createPayloadOfChainConfigTrustRootAdd(String trustRootOrgId, String[] trustRootCrt, long rpcCallTimeout)
```

#### 3.7 鏇存柊淇′换缁勭粐鏍硅瘉涔﹀緟绛惧悕payload鐢熸垚
**鍙傛暟璇存槑**
  - trustRootOrgId: 缁勭粐Id
  - trustRootCrt: 鏍硅瘉涔�
```java
    public Request.Payload createPayloadOfChainConfigTrustRootUpdate(String trustRootOrgId, String[] trustRootCrt, long rpcCallTimeout)
```

#### 3.8 鍒犻櫎淇′换缁勭粐鏍硅瘉涔﹀緟绛惧悕payload鐢熸垚
**鍙傛暟璇存槑**
  - trustRootOrgId: 缁勭粐Id
```java
    public Request.Payload createPayloadOfChainConfigTrustRootDelete(String trustRootOrgId, long rpcCallTimeout)
```

#### 3.9 娣诲姞鏉冮檺閰嶇疆寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**
  - permissionResourceName: 鏉冮檺鍚�
  - principle: 鏉冮檺瑙勫垯
```java
    public Request.Payload createPayloadOfChainConfigPermissionAdd(String permissionResourceName,
                                                              PolicyOuterClass.Policy principal, long rpcCallTimeout)
```

#### 3.10 鏇存柊鏉冮檺閰嶇疆寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**
  - permissionResourceName: 鏉冮檺鍚�
  - principle: 鏉冮檺瑙勫垯
```java
    public Request.Payload createPayloadOfChainConfigPermissionUpdate(String permissionResourceName,
                                                                 PolicyOuterClass.Policy principal, long rpcCallTimeout)
```

#### 3.11 鍒犻櫎鏉冮檺閰嶇疆寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**
  - permissionResourceName: 鏉冮檺鍚�
```java
    public Request.Payload createPayloadOfChainConfigPermissionDelete(String permissionResourceName, long rpcCallTimeout)
```

#### 3.12 娣诲姞鍏辫瘑鑺傜偣鍦板潃寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**
  - nodeOrgId: 鑺傜偣缁勭粐Id
  - nodeAddresses: 鑺傜偣鍦板潃
```java
    public Request.Payload createPayloadOfChainConfigConsensusNodeAddrAdd(String nodeOrgId, String[] nodeAddresses, long rpcCallTimeout)
```

#### 3.13 鏇存柊鍏辫瘑鑺傜偣鍦板潃寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**
  - nodeOrgId: 鑺傜偣缁勭粐Id
  - nodeOldAddress: 鑺傜偣鍘熷湴鍧€
  - nodeNewAddress: 鑺傜偣鏂板湴鍧€
```java
    public Request.Payload createPayloadOfChainConfigConsensusNodeAddrUpdate(String nodeOrgId, String nodeOldAddress,
                                                                        String nodeNewAddress, long rpcCallTimeout)
```

#### 3.14 鍒犻櫎鍏辫瘑鑺傜偣鍦板潃寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**
  - nodeOrgId: 鑺傜偣缁勭粐Id
  - nodeAddress: 鑺傜偣鍦板潃
```java
    public Request.Payload createPayloadOfChainConfigConsensusNodeAddrDelete(String nodeOrgId, String nodeAddress, long rpcCallTimeout)
```

#### 3.15 娣诲姞鍏辫瘑鑺傜偣寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**
  - nodeOrgId: 鑺傜偣缁勭粐Id
  - nodeAddresses: 鑺傜偣鍦板潃
```java
    public Request.Payload createPayloadOfChainConfigConsensusNodeOrgAdd(String nodeOrgId, String[] nodeAddresses, long rpcCallTimeout)
```

#### 3.16 鏇存柊鍏辫瘑鑺傜偣寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**

  - nodeOrgId: 鑺傜偣缁勭粐Id
  - nodeAddresses: 鑺傜偣鍦板潃
```java
    public Request.Payload createPayloadOfChainConfigConsensusNodeOrgUpdate(String nodeOrgId, String[] nodeAddresses, long rpcCallTimeout)
```

#### 3.17 鍒犻櫎鍏辫瘑鑺傜偣寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**
  - nodeOrgId: 鑺傜偣缁勭粐Id
```java
    public Request.Payload createPayloadOfChainConfigConsensusNodeOrgDelete(String nodeOrgId, long rpcCallTimeout)
```

#### 3.18 娣诲姞鍏辫瘑鎵╁睍瀛楁寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**
  - params: Map<String, String>
```java
    public Request.Payload createPayloadOfChainConfigConsensusExtAdd(Map<String, byte[]> params, long rpcCallTimeout)
```

#### 3.19 娣诲姞鍏辫瘑鎵╁睍瀛楁寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**
  - params: Map<String, String>
```java
    public Request.Payload createPayloadOfChainConfigConsensusExtUpdate(Map<String, byte[]> params, long rpcCallTimeout)
```

#### 3.20 娣诲姞鍏辫瘑鎵╁睍瀛楁寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**
  - keys: 寰呭垹闄ゅ瓧娈�
```java
    public Request.Payload createPayloadOfChainConfigConsensusExtDelete(String[] keys, long rpcCallTimeout)
```

#### 3.21 娣诲姞淇′换鎴愬憳璇佷功寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**
   - trustMemberOrgId: 缁勭粐Id
   - trustMemberNodeId: 鑺傜偣Id
   - trustMemberRole: 鎴愬憳瑙掕壊
   - trustMemberInfo: 鎴愬憳淇℃伅鍐呭
```java
    public Request.Payload createChainConfigTrustMemberAddPayload(String trustMemberOrgId, String trustMemberNodeId, String trustMemberRole,
                                                                      String trustMemberInfo, long rpcCallTimeout)
```

#### 3.22 鍒犻櫎淇′换鎴愬憳璇佷功寰呯鍚峱ayload鐢熸垚
**鍙傛暟璇存槑**
   - trustMemberInfo: 鎴愬憳淇℃伅鍐呭
```java
     public Request.Payload createChainConfigTrustMemberAddPayload(String trustMemberInfo, long rpcCallTimeout)
```
    
#### 3.23 鍙戦€侀摼閰嶇疆鏇存柊璇锋眰
```java
    public ResultOuterClass.TxResponse updateChainConfig(Request.Payload payload, Request.EndorsementEntry[] endorsementEntries,
                                              long rpcCallTimeout, long syncResultTimeout)
```

### 4 璇佷功绠$悊鎺ュ彛
#### 4.1 鐢ㄦ埛璇佷功娣诲姞
**鍙傛暟璇存槑**
  - rpcCallTimeout: 鍙戦€乺pc璇锋眰鐨勮秴鏃舵椂闂�
```java
    public ResultOuterClass.TxResponse addCert(long rpcCallTimeout) 
```

#### 4.2 鐢ㄦ埛璇佷功鍒犻櫎
**鍙傛暟璇存槑**
  - payload: 鍚堢害鍐呭
  - endorsementEntries: 甯︾鍚嶇殑鍚堢害鍐呭
```java
    public ResultOuterClass.TxResponse deleteCert(Request.Payload payload, Request.EndorsementEntry[] endorsementEntries,
                                                      long rpcCallTimeout, long syncResultTimeout)
```
   
#### 4.3 鐢ㄦ埛璇佷功鍐荤粨
**鍙傛暟璇存槑**
  - payload: 璇佷功鍐荤粨鐨刾ayload
  - endorsementEntries: 澶氱淇℃伅
```java
   ResultOuterClass.TxResponse freezeCerts(Request.Payload payload, Request.EndorsementEntry[] endorsementEntries,
                                                      long rpcCallTimeout, long syncResultTimeout)
```

#### 4.4 鐢ㄦ埛璇佷功瑙e喕
**鍙傛暟璇存槑**
  - payload: 璇佷功鍐荤粨鐨刾ayload
  - endorsementEntries: 澶氱淇℃伅
```java
   public ResultOuterClass.TxResponse unfreezeCerts(Request.Payload payload, Request.EndorsementEntry[] endorsementEntries,
                                                      long rpcCallTimeout, long syncResultTimeout)
```

#### 4.5 鐢ㄦ埛璇佷功鍚婇攢
**鍙傛暟璇存槑**
  - payload: 璇佷功鍐荤粨鐨刾ayload
  - endorsementEntries: 澶氱淇℃伅
```java
 public ResultOuterClass.TxResponse revokeCerts(Request.Payload payload, Request.EndorsementEntry[] endorsementEntries,
                                                     long rpcCallTimeout, long syncResultTimeout)
```

#### 4.6 鍐荤粨璇佷功payload
**鍙傛暟璇存槑**
  - certHashes: 鍐荤粨璇佷功鍒楄〃
```java
    public Request.Payload createCertFreezePayload(String[] certHashes)
```
#### 4.7 瑙e喕璇佷功payload
**鍙傛暟璇存槑**
  - certHashes: 鍐荤粨璇佷功鍒楄〃
```java
    public Request.Payload createPayloadOfUnfreezeCerts(String[] certHashes)
```
#### 4.8 鍚婇攢璇佷功
**鍙傛暟璇存槑**
  - certCrl: 璇佷功鍚婇攢crl
```java
    public Request.Payload createPayloadOfRevokeCerts(String certCrl)
```
#### 4.9 鐢ㄦ埛璇佷功鏌ヨ
**鍙傛暟璇存槑**
  - certHashes: 璇佷功Hash鍒楄〃
```java
    public ResultOuterClass.CertInfos queryCert(String[] certHashes, long rpcCallTimeout)
```


### 5 娑堟伅璁㈤槄鎺ュ彛
#### 5.1 鍖哄潡璁㈤槄
**鍙傛暟璇存槑**
  - startBlock: 璁㈤槄璧峰鍖哄潡楂樺害锛岃嫢涓�-1锛岃〃绀鸿闃呭疄鏃舵渶鏂板尯鍧�
  - endBlock: 璁㈤槄缁撴潫鍖哄潡楂樺害锛岃嫢涓�-1锛岃〃绀鸿闃呭疄鏃舵渶鏂板尯鍧�
  - withRwSet: 鏄惁杩斿洖璇诲啓闆�
  - onlyHeader: 鏄惁鍙繑鍥炲尯鍧楀ご
```java
    public void subscribeBlock(long startBlock, long endBlock, boolean withRwSet, boolean onlyHeader,
                                   StreamObserver<ResultOuterClass.SubscribeResult> blockStreamObserver)
```

#### 5.2 浜ゆ槗璁㈤槄
**鍙傛暟璇存槑**
  - startBlock: 璁㈤槄璧峰鍖哄潡楂樺害锛岃嫢涓�-1锛岃〃绀鸿闃呭疄鏃舵渶鏂板尯鍧�
  - endBlock: 璁㈤槄缁撴潫鍖哄潡楂樺害锛岃嫢涓�-1锛岃〃绀鸿闃呭疄鏃舵渶鏂板尯鍧�
  - txType: 璁㈤槄浜ゆ槗绫诲瀷,鑻ヤ负pb.TxType(-1)锛岃〃绀鸿闃呮墍鏈変氦鏄撶被鍨�
  - txIds: 璁㈤槄txId鍒楄〃锛岃嫢涓虹┖锛岃〃绀鸿闃呮墍鏈塼xId
```java
    public void subscribeTx(long startBlock, long endBlock, String contractName, String[] txIds,
                                StreamObserver<ResultOuterClass.SubscribeResult> txStreamObserver)
```

#### 5.3 浜嬩欢璁㈤槄
**鍙傛暟璇存槑**
  - topic: 璁㈤槄璇濋
  - contractName: 璁㈤槄鍚堢害鍚�
```java
    public void subscribeContractEvent(String topic, String contractName,
                                          StreamObserver<ResultOuterClass.SubscribeResult> contractEventStreamObserver)
```

### 6 褰掓。绫绘帴鍙�
#### 6.1 鏁版嵁褰掓。payload鐢熸垚
**鍙傛暟璇存槑**
  - targetBlockHeight: 褰掓。鍖哄潡楂樺害
```java
    public Request.Payload createArchiveBlockPayload(long targetBlockHeight)
```

#### 6.2 褰掓。鎭㈠payload鐢熸垚
**鍙傛暟璇存槑**
  - payload: 褰掓。鎭㈠payload
```java
    public ResultOuterClass.TxResponse sendRestoreBlockRequest(Request.Payload payload, long timeout)
```

#### 6.3 鍙戦€佹暟鎹綊妗h姹�
**鍙傛暟璇存槑**
  - payload: 鏁版嵁褰掓。payload
```java
    public ResultOuterClass.TxResponse sendArchiveBlockRequest(Request.Payload payload, long timeout)
```

#### 6.4 鍙戦€佸綊妗f仮澶嶈姹�
**鍙傛暟璇存槑**
  - payloadBytes: 褰掓。鎭㈠payload
```java
    public ResponseInfo sendRestoreBlockRequest(byte[] payloadBytes, long timeout) 
            throws ChainMakerCryptoSuiteException, ChainClientException {
    }
```

#### 6.5 鑾峰彇褰掓。鏁版嵁
**鍙傛暟璇存槑**
  - targetBlockHeight: 褰掓。鍖哄潡楂樺害
```java
    public Store.BlockWithRWSet getArchivedFullBlockByHeight(long blockHeight) 
            throws InvalidProtocolBufferException, SQLException, ClassNotFoundException {
    }
```

#### 6.6 鑾峰彇褰掓。鍖哄潡淇℃伅
**鍙傛暟璇存槑**
  - targetBlockHeight: 褰掓。鍖哄潡楂樺害
  - withRWSet: 鏄惁鑾峰彇璇诲啓闆�
```java
    public ChainmakerBlock.BlockInfo getArchivedBlockByHeight(long blockHeight, boolean withRWSet) 
            throws InvalidProtocolBufferException, SQLException, ClassNotFoundException {
    }
```

### 7 鍏挜韬唤绫绘帴鍙�
#### 7.1 鏋勯€犳坊鍔犲叕閽ヨ韩浠借姹�
**鍙傛暟璇存槑**
  - pubkey: 鍏挜淇℃伅
  - orgId: 缁勭粐id
  - role:   瑙掕壊锛屾敮鎸乧lient,light,common
```java  
    public Request.Payload createPubkeyAddPayload(String pubkey, String orgId, String role) 
```

#### 7.2 鏋勯€犲垹闄ゅ叕閽ヨ韩浠借姹�
**鍙傛暟璇存槑**
  - pubkey: 鍏挜淇℃伅
  - orgId: 缁勭粐id
```java  
    public Request.Payload createPubkeyDelPayload(String pubkey, String orgId)
``` 

#### 7.3 鏋勯€犳煡璇㈠叕閽ヨ韩浠借姹�
**鍙傛暟璇存槑**
  - pubkey: 鍏挜淇℃伅
```java 
    public Request.Payload createPubkeyQueryPayload(String pubkey) 
```

#### 7.4 鍙戦€佸叕閽ヨ韩浠界鐞嗚姹傦紙娣诲姞銆佸垹闄わ級
**鍙傛暟璇存槑**
  - payload: 鍚堢害鍐呭
  - endorsementEntries: 甯︾鍚嶇殑鍚堢害鍐呭
  - rpcCallTimeout: 璋冪敤rcp鎺ュ彛瓒呮椂鏃堕棿, 鍗曚綅锛氭绉�
  - syncResultTimeout: 鍚屾鑾峰彇鎵ц缁撴灉瓒呮椂鏃堕棿锛屽皬浜庣瓑浜�0浠h〃涓嶇瓑寰呮墽琛岀粨鏋滐紝鐩存帴杩斿洖锛堣繑鍥炰俊鎭噷鍖呭惈浜ゆ槗ID锛夛紝鍗曚綅锛氭绉�
```java
    public ResultOuterClass.TxResponse sendPubkeyManageRequest(Request.Payload payload, Request.EndorsementEntry[] endorsementEntries,
                                                               long rpcCallTimeout, long syncResultTimeout)
```

### 8 澶氱绫绘帴鍙�
#### 8.1 鍙戣捣澶氱璇锋眰
**鍙傛暟璇存槑**
  - payload: 澶氱payload
```java
    public ResultOuterClass.TxResponse multiSignContractReq(Request.Payload payload, long rpcCallTimeout)
```
#### 8.2 鍙戣捣澶氱鎶曠エ
**鍙傛暟璇存槑**
  - payload: 澶氱payload
  - endorsementEntry: 澶氱淇℃伅
```java
    public ResultOuterClass.TxResponse multiSignContractVote(Request.Payload payload, Request.EndorsementEntry endorsementEntry, long rpcCallTimeout)
```
#### 8.3 澶氱鏌ヨ
**鍙傛暟璇存槑**
  - txId: 浜ゆ槗id
```java
    public ResultOuterClass.TxResponse multiSignContractQuery(String txId, long rpcCallTimeout) 
```

#### 8.4 鍒涘缓澶氱璇锋眰payload
**鍙傛暟璇存槑**
  - params: 澶氱鍙傛暟
```java
    public Request.Payload createMultiSignReqPayload(Map<String, byte[]> params)
```

#### 8.5 鍒涘缓澶氱鎶曠エpayload
**鍙傛暟璇存槑**
  - params: 澶氱鍙傛暟
```java
    public Request.Payload createMultiSignVotePayload(Map<String, byte[]> params)
```

#### 8.6 鍒涘缓澶氱鏌ヨpayload
**鍙傛暟璇存槑**
  - params: 澶氱鍙傛暟
```java
    public Request.Payload createMultiSignQueryPayload(Map<String, byte[]> params) 
```


### 9 绠$悊绫绘帴鍙�
#### 9.1 SDK鍋滄鎺ュ彛锛氬叧闂繛鎺ユ睜杩炴帴锛岄噴鏀捐祫婧�
```java
public void stop()
```

### 10 gas绠$悊鐩稿叧鎺ュ彛
#### 10.1 鏋勯€犺缃甮as绠$悊鍛榩ayload
**鍙傛暟璇存槑**
  - address: gas绠$悊鍛樼殑鍦板潃
```java
public Request.Payload createSetGasAdminPayload(String address)
```

#### 10.2 鏌ヨgas绠$悊鍛�
**鍙傛暟璇存槑**
  - rpcCallTimeout: 璋冪敤rpc鎺ュ彛瓒呮椂鏃堕棿, 鍗曚綅锛氭绉�
```java
public String getGasAdmin(long rpcCallTimeout)
```

#### 10.3 鏋勯€犲厖鍊糶as璐︽埛payload
**鍙傛暟璇存槑**
  - rechargeGasList: 涓€涓猤as璐︽埛鍏呭€兼寚瀹歡as鏁伴噺
```java
public Request.Payload createRechargeGasPayload(AccountManager.RechargeGas[] rechargeGasList)
```

#### 10.4 鏌ヨgas璐︽埛浣欓锛堟牴鎹叕閽ワ級
**鍙傛暟璇存槑**
  - address: 鏌ヨgas浣欓鐨勮处鎴峰湴鍧€
  - rpcCallTimeout: 璋冪敤rpc鎺ュ彛瓒呮椂鏃堕棿, 鍗曚綅锛氭绉�
```java
public long getGasBalance(String address, long rpcCallTimeout)
```

#### 10.5 鏋勯€� 閫€杩榞as璐︽埛鐨刧as payload
**鍙傛暟璇存槑**
  - address: 閫€杩榞as鐨勮处鎴峰湴鍧€
  - amount: 閫€杩榞as鐨勬暟閲�
```java
public Request.Payload createRechargeGasPayload(AccountManager.RechargeGas[] rechargeGasList)
```

#### 10.6 鏋勯€� 鍐荤粨鎸囧畾gas璐︽埛 payload
**鍙傛暟璇存槑**
  - address: 鍐荤粨鎸囧畾gas璐︽埛鐨勮处鎴峰湴鍧€
```java
public Request.Payload createFrozenGasAccountPayload(String address)
```

#### 10.7 鏋勯€� 閫€杩榞as璐︽埛鐨刧as payload
**鍙傛暟璇存槑**
  - address: 瑙e喕鎸囧畾gas璐︽埛鐨勮处鎴峰湴鍧€
```java
public Request.Payload createUnfrozenGasAccountPayload(String address)
```

#### 10.8 鏌ヨgas璐︽埛鐨勭姸鎬�
**鍙傛暟璇存槑**
  - address: 鎸囧畾gas璐︽埛鐨勮处鎴峰湴鍧€
   - rpcCallTimeout: 璋冪敤rpc鎺ュ彛瓒呮椂鏃堕棿, 鍗曚綅锛氭绉�
```java
public boolean getGasAccountStatus(String address, long rpcCallTimeout)
```

#### 10.9 鍙戦€乬as绠$悊绫昏姹�
**鍙傛暟璇存槑**
  - payload: 浜ゆ槗payload
  - endorsementEntries: 鑳屼功绛惧悕淇℃伅鍒楄〃
  - rpcCallTimeout: 瓒呮椂鏃堕棿锛屽崟浣嶏細s锛岃嫢浼犲叆-1锛屽皢浣跨敤榛樿瓒呮椂鏃堕棿锛�10s
  - syncResultTimeout: 鏄惁鍚屾鑾峰彇浜ゆ槗鎵ц缁撴灉
```java
public ResultOuterClass.TxResponse sendGasManageRequest(Request.Payload payload, Request.EndorsementEntry[] endorsementEntries, long rpcCallTimeout, long syncResultTimeout)
```

#### 10.10 涓簆ayload娣诲姞gas limit
**鍙傛暟璇存槑**
  - payload: 浜ゆ槗payload
  - limit: gas limit
```java
public Request.Payload attachGasLimit(Request.Payload payload, Request.Limit limit)
```

#### 10.11 鍚敤鎴栧仠鐢℅as璁¤垂寮€鍏硃ayload鐢熸垚
**鍙傛暟璇存槑**
  - rpcCallTimeout: 瓒呮椂鏃堕棿锛屽崟浣嶏細s锛岃嫢浼犲叆-1锛屽皢浣跨敤榛樿瓒呮椂鏃堕棿锛�10s
```java
public Request.Payload createChainConfigEnableOrDisableGasPayload(long rpcCallTimeout)
```

### 11 鍒悕绠$悊鐩稿叧鎺ュ彛
#### 11.1 娣诲姞鍒悕
**鍙傛暟璇存槑**
  - rpcCallTimeout: 瓒呮椂鏃堕棿锛屽崟浣嶏細s锛岃嫢浼犲叆-1锛屽皢浣跨敤榛樿瓒呮椂鏃堕棿锛�10s
```java
public ResultOuterClass.TxResponse addAlias(long rpcCallTimeout)
```

#### 11.2 鏋勯€犳洿鏂板埆鍚峱ayload
**鍙傛暟璇存槑**
  - alias: 瑕佹洿鏂扮殑鍒悕
  - certPEM: 瀵瑰簲鐨勮瘉涔�
```java
public Request.Payload createUpdateAliasPayload(String alias, String certPem)
```

#### 11.3 鍙戣捣鏇存柊鍒悕浜ゆ槗
**鍙傛暟璇存槑**
  - payload: 寰呯鍚嶇殑payload
  - endorsementEntries: 鑳屼功绛惧悕淇℃伅鍒楄〃
  - rpcCallTimeout: 瓒呮椂鏃堕棿锛屽崟浣嶏細s锛岃嫢浼犲叆-1锛屽皢浣跨敤榛樿瓒呮椂鏃堕棿锛�10s
```java
public Request.Payload createUpdateAliasPayload(String alias, String certPem)
```

#### 11.4 鏌ヨ鍒悕璇︽儏浜ゆ槗
**鍙傛暟璇存槑**
  - aliasList: 瑕佹煡璇㈢殑鍒悕鍒楄〃
   - rpcCallTimeout: 瓒呮椂鏃堕棿锛屽崟浣嶏細s锛岃嫢浼犲叆-1锛屽皢浣跨敤榛樿瓒呮椂鏃堕棿锛�10s
```java
public ResultOuterClass.AliasInfos queryAlias(String[] aliasList, long rpcCallTimeout)
```

#### 11.5 鐢熸垚鍒犻櫎鍒悕payload
**鍙傛暟璇存槑**
  - aliasList: 瑕佹煡璇㈢殑鍒悕鍒楄〃
  - rpcCallTimeout: 瓒呮椂鏃堕棿锛屽崟浣嶏細s锛岃嫢浼犲叆-1锛屽皢浣跨敤榛樿瓒呮椂鏃堕棿锛�10s
```java
public Request.Payload createAliasDeletePayload(String[] aliasList)
```

#### 11.6 鍙戣捣鏇存柊鍒悕浜ゆ槗
**鍙傛暟璇存槑**
  - payload: 寰呯鍚嶇殑payload
  - endorsementEntries: 鑳屼功绛惧悕淇℃伅鍒楄〃
  - rpcCallTimeout: 瓒呮椂鏃堕棿锛屽崟浣嶏細s锛岃嫢浼犲叆-1锛屽皢浣跨敤榛樿瓒呮椂鏃堕棿锛�10s
  - syncResultTimeout: 鏄惁鍚屾鑾峰彇浜ゆ槗鎵ц缁撴灉
```java
public ResultOuterClass.TxResponse deleteAlias(Request.Payload payload, Request.EndorsementEntry[] endorsementEntries,
            long rpcCallTimeout, long syncResultTimeout)
```

## 浣跨敤杩囩▼

瀹㈡埛绔娇鐢⊿DK鐨勮繃绋嬪涓嬶細

1. 鍒涘缓SdkConfig瀵硅薄
2. 鑾峰彇ChainManager瀵硅薄
3. 浣跨敤ChainManager鑾峰彇鎴栧垱寤洪摼瀵硅薄锛屽垱寤篊hainClient鏃堕渶瑕佸皢SdkConfig瀵硅薄浣滀负鍙傛暟浼犲叆
4. 璋冪敤ChainClient瀵硅薄鐨勬帴鍙h繘琛屾搷浣�

## 浣跨敤绀轰緥

1. 鍒濆鍖栵紝鍒涘缓ChainClient

```java
   public void init() {
       Yaml yaml = new Yaml();
       InputStream in = TestBase.class.getClassLoader().getResourceAsStream(SDK_CONFIG);

       SdkConfig sdkConfig;
       sdkConfig = yaml.loadAs(in, SdkConfig.class);
       assert in != null;
       in.close();

       for (NodeConfig nodeConfig : sdkConfig.getChain_client().getNodes()) {
           List<byte[]> tlsCaCertList = new ArrayList<>();
           for (String rootPath : nodeConfig.getTrustRootPaths()){
               List<String> filePathList = FileUtils.getFilesByPath(rootPath);
               for (String filePath : filePathList) {
                   tlsCaCertList.add(FileUtils.getFileBytes(filePath));
               }
           }
           byte[][] tlsCaCerts = new byte[tlsCaCertList.size()][];
           tlsCaCertList.toArray(tlsCaCerts);
           nodeConfig.setTrustRootBytes(tlsCaCerts);
       }

       chainManager = ChainManager.getInstance();
       chainClient = chainManager.getChainClient(sdkConfig.getChain_client().getChainId());

       if (chainClient == null) {
           chainClient = chainManager.createChainClient(sdkConfig);
       }
   }
```

2. 鍒涘缓鍚堢害

```java
   public void testCreateContract() throws IOException, InterruptedException, ExecutionException, TimeoutException {
       ResultOuterClass.TxResponse responseInfo = null;
       try {
           byte[] byteCode = FileUtils.getResourceFileBytes(CONTRACT_FILE_PATH);

           // 1. create payload
           Request.Payload payload = chainClient.createContractCreatePayload(CONTRACT_NAME, "1", byteCode,
                   ContractOuterClass.RuntimeType.WASMER, null);

           //2. create payloads with endorsement
           Request.EndorsementEntry[] endorsementEntries = SdkUtils.getEndorsers(payload, new User[]{adminUser1, adminUser2, adminUser3});

           // 3. send request
           responseInfo = chainClient.sendContractManageRequest(payload, endorsementEntries, rpcCallTimeout, syncResultTimeout);
       } catch (SdkException e) {
           e.printStackTrace();
           Assert.fail(e.getMessage());
       }
       Assert.assertNotNull(responseInfo);
   }
```

3. 璋冪敤鍚堢害

```java
   public void testInvokeContract() throws Exception {
       ResultOuterClass.TxResponse responseInfo = null;
       try {
           responseInfo = chainClient.invokeContract(CONTRACT_NAME, INVOKE_CONTRACT_METHOD,
                   null, null, rpcCallTimeout, syncResultTimeout);
       } catch (Exception e) {
           e.printStackTrace();
           Assert.fail(e.getMessage());
       }
       Assert.assertNotNull(responseInfo);
   }
```

## SDK Jar鍖呭紩鐢ㄦ柟寮�

### 缂栬瘧

```
git clone -b v2.2.0 https://git.chainmaker.org.cn/chainmaker/sdk-java.git
// 璇存槑锛氶渶瑕佷娇鐢╫penjdk 1.8.151+骞舵彁鍓嶅畨瑁単radle锛屼篃鍙互浣跨敤intelliJ IDEA鎵撳紑椤圭洰杩涜缂栬瘧
cd chainamker-sdk-java
./gradlew build
```

### 浣跨敤

#### 瀵煎叆`jar`鍖�
瀵煎叆`jar`鍖咃紝杩欓噷浣跨敤`IntelliJ`涓虹ず渚嬪紩鐢╜jar`鍖咃紝灏嗙紪璇戝ソ鐨刞jar`鍖呮嫹璐濆埌闇€瑕佷娇鐢╯dk鐨勯」鐩笅锛堜竴鑸彲浠ュ湪椤圭洰涓嬪缓涓€涓猔libs`鐩綍锛夛紝鐒跺悗鎵撳紑`IntelliJ IDEA->File->Project Structures`锛屽涓嬪浘鐐瑰嚮`鈥�+鈥漙鍙凤紝閫夋嫨`JARs or Directories`锛岄€変腑`jar`鍖呯偣鍑籤open`鍗冲彲銆�

<img src="../images/chainmaker-java-sdk-add-sdk-jar.png" style="zoom:50%;" />

#### 渚濊禆搴�
瀵煎叆渚濊禆`jar`鍖咃紝闇€灏哷sdk`涓緷璧栫殑`jar`鍖呭鍏ユ湰鍦板伐绋嬩腑锛屽悓鏃讹紝闇€灏哷sdk`涓璥lib`鐩綍涓嬬殑`netty-tcnative-openssl-static-2.0.39.Final.jar`鍖呭鍏ュ伐绋嬩腑锛屼互渚块€傞厤鍥藉瘑`tls`閫氫俊銆�
`tcnative`鐨刞jar`鍖呭強鍔ㄦ€佸簱鍦板潃锛�<a href="https://git.chainmaker.org.cn/chainmaker/chainmaker-tools/-/tree/master/tls-netty"  target="_blank"> tcnative </a>

#### 寮曠敤

   鍦ㄨ浣跨敤sdk鐨勬簮鏂囦欢閲屼娇鐢╥mport寮曠敤sdk鍖咃紝濡備笅锛�

   ```
   import org.chainmaker.sdk.*;
   ```
#### 搴旂敤demo

java sdk搴旂敤绀轰緥锛岃鍙傝€�<a href="https://git.chainmaker.org.cn/chainmaker/sdk-java-demo/-/tree/v2.2.0"  target="_blank"> sdk-java-demo </a>

<br><br>