# 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>