1. Go SDK 使用说明

1.1. 长安链SDK概述

  1. 整体介绍

长安链SDK是业务模块与长安链交互的桥梁,支持双向TLS认证,提供安全可靠的加密通信信道。

长安链提供了多种语言的SDK,包括:Go SDKJava SDKPython SDKNodejs SDK方便开发者根据需要进行选用。

提供的SDK接口,覆盖合约管理、链配置管理、证书管理、多签收集、各类查询操作、事件订阅等场景,满足了不同的业务场景需要。

  1. 名词概念说明

  • Node(节点):代表一个链节点的基本信息,包括:节点地址、连接数、是否启用TLS认证等信息

  • ChainClient(链客户端):所有客户端对链节点的操作接口都来自ChainClient

  • 压缩证书:可以为ChainClient开启证书压缩功能,开启后可以减小交易包大小,提升处理性能

1.2. 环境准备

1.2.1. 软件环境依赖

golang : 版本为1.16或以上

下载地址:https://golang.org/dl/

若已安装,请通过命令查看版本:

$ go version
go version go1.16 linux/amd64

1.2.2. 下载安装sdk

进入您的Go项目,执行以下命令添加对sdk的引用:

go get chainmaker.org/chainmaker/sdk-go/v2@v2.4.0

1.2.3. 长安链环境准备

创建一条证书模式的长安链,并确保相关节点网络通畅,相关教程见:《通过命令行体验链》

1.3. 怎么使用SDK

1.3.1. 示例代码

1.3.1.1. 创建节点

设置节点信息,可用作创建与该节点连接的客户端

// 创建节点
func createNode(nodeAddr string, connCnt int) *NodeConfig {
 node := NewNodeConfig(
  // 节点地址,格式:127.0.0.1:12301
  WithNodeAddr(nodeAddr),
  // 节点连接数
  WithNodeConnCnt(connCnt),
  // 节点是否启用TLS认证
  WithNodeUseTLS(true),
  // 根证书路径,支持多个
  WithNodeCAPaths(caPaths),
  // TLS Hostname
  WithNodeTLSHostName(tlsHostName),
 )

 return node
}

1.3.1.2. 以参数形式创建ChainClient

更多内容请参看:sdk_client_test.go

注:示例中证书采用路径方式去设置,也可以使用证书内容去设置,具体请参看createClientWithCaCerts方法

// 创建ChainClient
func createClient() (*ChainClient, error) {
 if node1 == nil {
  // 创建节点1
  node1 = createNode(nodeAddr1, connCnt1)
 }

 if node2 == nil {
  // 创建节点2
  node2 = createNode(nodeAddr2, connCnt2)
 }

 chainClient, err := NewChainClient(
  // 设置归属组织
  WithChainClientOrgId(chainOrgId),
  // 设置链ID
  WithChainClientChainId(chainId),
  // 设置logger句柄,若不设置,将采用默认日志文件输出日志
  WithChainClientLogger(getDefaultLogger()),
  // 设置客户端用户私钥路径
  WithUserKeyFilePath(userKeyPath),
  // 设置客户端用户证书
  WithUserCrtFilePath(userCrtPath),
  // 添加节点1
  AddChainClientNodeConfig(node1),
  // 添加节点2
  AddChainClientNodeConfig(node2),
  )

 if err != nil {
  return nil, err
 }

 //启用证书压缩(开启证书压缩可以减小交易包大小,提升处理性能)
 err = chainClient.EnableCertHash()
 if err != nil {
  log.Fatal(err)
 }

 return chainClient, nil
}

1.3.1.3. 以配置文件形式创建ChainClient

注:参数形式和配置文件形式两个可以同时使用,同时配置时,以参数传入为准

func createClientWithConfig() (*ChainClient, error) {

 chainClient, err := NewChainClient(
  WithConfPath("./testdata/sdk_config.yml"),
 )

 if err != nil {
  return nil, err
 }

 //启用证书压缩(开启证书压缩可以减小交易包大小,提升处理性能)
 err = chainClient.EnableCertHash()
 if err != nil {
  return nil, err
 }

 return chainClient, nil
}

1.3.1.4. 部署wasm合约

下文,将演示通过sdk部署wasm合约,

sdk_user_contract_claim_test.go

func testUserContractClaimCreate(t *testing.T, client *ChainClient,
 admin1, admin2, admin3, admin4 *ChainClient, withSyncResult bool, isIgnoreSameContract bool) {

 resp, err := createUserContract(client, admin1, admin2, admin3, admin4,
  claimContractName, claimVersion, claimByteCodePath, common.RuntimeType_WASMER, []*common.KeyValuePair{}, withSyncResult)
 if !isIgnoreSameContract {
  require.Nil(t, err)
 }

 fmt.Printf("CREATE claim contract resp: %+v\n", resp)
}

func createUserContract(client *ChainClient, admin1, admin2, admin3, admin4 *ChainClient,
 contractName, version, byteCodePath string, runtime common.RuntimeType, kvs []*common.KeyValuePair, withSyncResult bool) (*common.TxResponse, error) {

 payloadBytes, err := client.CreateContractCreatePayload(contractName, version, byteCodePath, runtime, kvs)
 if err != nil {
  return nil, err
 }

 // 各组织Admin权限用户签名
 signedPayloadBytes1, err := admin1.SignContractManagePayload(payloadBytes)
 if err != nil {
  return nil, err
 }

 signedPayloadBytes2, err := admin2.SignContractManagePayload(payloadBytes)
 if err != nil {
  return nil, err
 }

 signedPayloadBytes3, err := admin3.SignContractManagePayload(payloadBytes)
 if err != nil {
  return nil, err
 }

 signedPayloadBytes4, err := admin4.SignContractManagePayload(payloadBytes)
 if err != nil {
  return nil, err
 }

 // 收集并合并签名
 mergeSignedPayloadBytes, err := client.MergeContractManageSignedPayload([][]byte{signedPayloadBytes1,
  signedPayloadBytes2, signedPayloadBytes3, signedPayloadBytes4})
 if err != nil {
  return nil, err
 }

 // 发送创建合约请求
 resp, err := client.SendContractManageRequest(mergeSignedPayloadBytes, createContractTimeout, withSyncResult)
 if err != nil {
  return nil, err
 }

 err = checkProposalRequestResp(resp, true)
 if err != nil {
  return nil, err
 }

 return resp, nil

1.3.1.5. 调用wasm合约

下文,将演示通过sdk调用wasm合约,

sdk_user_contract_claim_test.go

func testUserContractClaimInvoke(client *ChainClient,
 method string, withSyncResult bool) (string, error) {

 curTime := fmt.Sprintf("%d", CurrentTimeMillisSeconds())
 fileHash := uuid.GetUUID()
 params := map[string]string{
  "time":      curTime,
  "file_hash": fileHash,
  "file_name": fmt.Sprintf("file_%s", curTime),
 }

 err := invokeUserContract(client, claimContractName, method, "", params, withSyncResult)
 if err != nil {
  return "", err
 }

 return fileHash, nil
}

func invokeUserContract(client *ChainClient, contractName, method, txId string, params map[string]string, withSyncResult bool) error {

 resp, err := client.InvokeContract(contractName, method, txId, params, -1, withSyncResult)
 if err != nil {
  return err
 }

 if resp.Code != common.TxStatusCode_SUCCESS {
  return fmt.Errorf("invoke contract failed, [code:%d]/[msg:%s]\n", resp.Code, resp.Message)
 }

 if !withSyncResult {
  fmt.Printf("invoke contract success, resp: [code:%d]/[msg:%s]/[txId:%s]\n", resp.Code, resp.Message, resp.ContractResult.Result)
 } else {
  fmt.Printf("invoke contract success, resp: [code:%d]/[msg:%s]/[contractResult:%s]\n", resp.Code, resp.Message, resp.ContractResult)
 }

 return nil
}

1.3.1.6. 创建及调用evm合约

1.3.1.7. 普通订阅及订阅优化功能

乐观订阅区块的接口,调用该接口时需要配置远端的nodes为多个,并且启动配置文件中的optimizeDetection参数(即非-1):

func (cc *ChainClient) SubscribeBlockWithOptimize(ctx context.Context, startBlock, endBlock int64, withRWSet,
	onlyHeader bool, optimizeDetection int, switchTimeDiff int64) (<-chan interface{}, error) {
	// 创建默认的payload
	payload := cc.CreateSubscribeBlockPayload(startBlock, endBlock, withRWSet, onlyHeader)
	txReq, err := cc.GenerateTxRequest(payload, nil)
	if err != nil {
		return nil, err
	}
	switchHandler := NewSubscribeBlockSwitchHandler(cc, startBlock, endBlock, withRWSet, onlyHeader)
	return cc.SubscribeWithOptimize(ctx, txReq, switchHandler, optimizeDetection, switchTimeDiff)
}

对于合约事件而言,由于从2.3.6版本开始即使一个区块中没有事件也会发送一个空的区块给客户端,所以支持乐观订阅的功能,可调用下面的接口:

func (cc *ChainClient) SubscribeContractEventWithOptimize(ctx context.Context, startBlock, endBlock int64,
	contractName, topic string, optimizeDetection int, switchTimeDiff int64) (<-chan interface{}, error) {
	// 创建默认的payload
	payload := cc.CreateSubscribeContractEventPayload(startBlock, endBlock, contractName, topic)
	txReq, err := cc.GenerateTxRequest(payload, nil)
	if err != nil {
		return nil, err
	}
	switchHandler := NewSubscribeContractEventSwitchHandler(cc, startBlock, endBlock, contractName, topic)
	return cc.SubscribeWithOptimize(ctx, txReq, switchHandler, optimizeDetection, switchTimeDiff)
}

上述两种方式的实现是基于ChainClient对象是通过配置文件或者WithOption方式构建的,但对于一些特殊的场景,例如用户的私钥信息是需要通过KMS管理的, 由于乐观订阅需要定期检查链高度等信息,所以需要用户对交易的签名,那么就需要用户手动实现SubscribeSwitchHandler接口,并调用如下接口进行订阅:

func (cc *ChainClient) SubscribeWithOptimize(ctx context.Context, txReq *common.TxRequest,
	subscribeSwitchHandler SubscribeSwitchHandler, optimizeDetection int, switchTimeDiff int64) 

SubscribeSwitchHandler接口定义如下:

type SubscribeSwitchHandler interface {
	TxRequestCreator
	// NewSubscribeTxReq 当出现连接切换时需创建新的Payload,便于重新发请求订阅
	// 如果已经满足结果则返回nil,不会再继续发送
	NewSubscribeTxReq(lastTxReq *common.TxRequest, pushedBlockHeight uint64) (*common.TxRequest, error)
}

// TxRequestCreator 交易生成器
type TxRequestCreator interface {
// CreateGetLastBlockTxRequest 获取最新区块的请求
CreateGetLastBlockTxRequest() (*common.TxRequest, error)
}

1.3.2. 更多示例和用法

更多示例和用法,请参看单元测试用例
示例: (https://git.chainmaker.org.cn/chainmaker/sdk-go/-/blob/master/examples)

功能 单测代码
用户合约 sdk_user_contract_test.go
系统合约 sdk_system_contract_test.go
链配置 sdk_chain_config_test.go
证书管理 sdk_cert_manage_test.go
消息订阅 sdk_subscribe_test.go

1.3.3. demo

sdk-go demo参考:

文件 · v2.3.2 · chainmaker / sdk-go-demo · ChainMaker

1.4. 接口说明

请参看:《chainmaker-go-sdk》 所有go-sdk接口参考: https://git.chainmaker.org.cn/chainmaker/sdk-go/-/blob/v2.4.0/sdk_interface.go

1.5. 配置文件说明

1.5.1. Cert模式

chain_client:
  # 链ID
  chain_id: "chain1"
  # 组织ID
  org_id: "wx-org1.chainmaker.org"
  # 客户端用户私钥路径(tls通信使用私钥)
  user_key_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key"
  # 客户端用户私钥密码(无密码则不需要设置)
  # user_key_pwd: "123"
  # 客户端用户证书路径(tls通信使用证书)
  user_crt_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt"
  # 客户端用户加密私钥路径(tls加密证书对应私钥,应用于国密GMTLS双证书体系;若未设置仅使用单证书)
  # user_enc_key_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.enc.key"
  # 客户端用户加密私钥密码(无密码则不需要设置)
  # user_enc_key_pwd: "123"
  # 客户端用户加密证书路径(tls加密证书,应用于国密GMTLS双证书体系;若未设置仅使用单证书)
  # user_enc_crt_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.enc.crt"
  # 客户端用户交易签名私钥路径(不允许使用tls私钥)
  user_sign_key_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.key"
  # 客户端用户交易签名私钥密码(无密码则不需要设置)
  # user_sign_key_pwd: "123"
  # 客户端用户交易签名证书路径(不允许使用tls证书)
  user_sign_crt_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.crt"
  # 节点是否仅支持异步返回的方式,默认为false,表示可以支持同步,仅有老版本的底链才仅支持(小于v2.3.3)
  node_only_async: false
  # 同步交易结果模式下,轮询获取交易结果时的最大轮询次数,删除此项或设为<=0则使用同步调用方式,默认值:20
  retry_limit: 20
  # 同步交易结果模式下,每次轮询交易结果时的等待时间,单位:ms 删除此项或设为<=0则使用,默认值:500
  retry_interval: 500
  # 当前签名证书的别名。当设置此配置项时,chain client 对象将自动检查链上是否已添加此别名,如果没有则自动上链此证书别名,
  # 并且后续所有交易都会使用别名,别名可降低交易体大小。若为空则不启用。
  # alias: my_cert_alias
  # txid配置项:默认支持TimestampKey,如果开启enableNormalKey则使用NormalKey
  enable_normal_key: false
  # 代理地址,置空为不使用代理
  # 格式为:http://[username:password@]proxyhost:proxyport,如:http://myproxy:8080
  # proxy:
  # 优化连接检查周期,单位:s,默认开启,每隔1分钟检查一次,但仅当nodes为多个时生效
  # 该值生效时,会自动获取多个node中的区块高度,并按照高度和消耗时间排序,以供用户实际使用时优先获取到最优连接
  # 该值如果设置为0,则会使用默认值:60s,如需关闭,需将该值设置为-1
  optimize_detection: 60
  # 关闭订阅区块及合约事件时的乐观处理,默认为false,表示开启,true表示关闭
  # 该值需要结合optimize_detection使用,在optimize_detection生效时该值会在默认订阅时触发
  disable_subscribe_optimize: false

  nodes:
    - # 节点地址,格式为:IP:端口:连接数
      node_addr: "127.0.0.1:12301"
      # 节点连接数
      conn_cnt: 10
      # RPC连接是否启用双向TLS认证
      enable_tls: true
      # 信任证书池路径
      trust_root_paths:
        - "./testdata/crypto-config/wx-org1.chainmaker.org/ca"
      # TLS hostname
      tls_host_name: "chainmaker.org"
      # 转发分流配置,根据配置的参数,在nginx中配置X-Server-Name的value值,分流到不同的机器或者集群上
      chain_tls_host_name: ""
    - # 节点地址,格式为:IP:端口:连接数
      node_addr: "127.0.0.1:12302"
      # 节点连接数
      conn_cnt: 10
      # RPC连接是否启用双向TLS认证
      enable_tls: true
      # 信任证书池路径
      trust_root_paths:
        - "./testdata/crypto-config/wx-org1.chainmaker.org/ca"
      # TLS hostname
      tls_host_name: "chainmaker.org"
      # 转发分流配置,根据配置的参数,在nginx中配置X-Server-Name的value值,分流到不同的机器或者集群上
      chain_tls_host_name: ""

说明如下:

  • chain_id、org_id必须正确配置;

  • 在六个私钥和证书配置中,user_sign_key_file_path和user_sign_crt_file_path是对交易签名使用,必须配置,user_key_file_path与user_crt_file_path为TLS通信证书,在需要TLS通信(node.enable_tls=true)时配置,user_enc_key_file_path与user_enc_crt_file_path是为国密TLS双证书的模式增加,只有在节点配置的是国密TLS双证书时配置;

  • nodes中的任意节点配置enable_tls为true时,表示tls生效,该值生效时,需要配置trust_root_paths和tls_host_name;

1.5.2. PK模式

chain_client:
  # 链ID
  chain_id: "chain1"
  # 客户端用户交易签名私钥路径
  user_sign_key_file_path: "./testdata/crypto-config/node1/admin/admin1/admin1.key"
  # 客户端用户交易签名私钥密码(无密码则不需要设置)
  # user_sign_key_pwd: "123"
  # 客户端用户私钥路径,用于tls连接
  # user_key_file_path: "./testdata/crypto-config/node1/client-tls/client1/client1.tls.key"
  # 客户端用户私钥密码(无密码则不需要设置)
  # user_key_pwd: "123"
  # 客户端用户证书路径,用于tls连接
  # user_crt_file_path: "./testdata/crypto-config/node1/client-tls/client1/client1.tls.crt"
  # 客户端用户加密私钥路径(tls加密证书对应私钥,应用于国密GMTLS双证书体系;若未设置仅使用单证书)
  # user_enc_key_file_path: "./testdata/crypto-config/node1/client-tls/client1/client1.tls.enc.key"
  # 客户端用户加密私钥密码(无密码则不需要设置)
  # user_enc_key_pwd: "123"
  # 客户端用户加密证书路径(tls加密证书,应用于国密GMTLS双证书体系;若未设置仅使用单证书)
  # user_enc_crt_file_path: "./testdata/crypto-config/node1/client-tls/client1/client1.tls.enc.crt"
  # 签名使用的哈希算法,和节点保持一直
  crypto:
    hash: SHA256
  auth_type: public
  # 节点是否仅支持异步返回的方式,默认为false,表示可以支持同步,仅有老版本的底链才仅支持(小于v2.3.3)
  node_only_async: false
  # 同步交易结果模式下,轮询获取交易结果时的最大轮询次数,删除此项或设为<=0则使用默认值 10
  retry_limit: 20
  # 同步交易结果模式下,每次轮询交易结果时的等待时间,单位:ms 删除此项或设为<=0则使用默认值 500
  retry_interval: 500
  # txid配置项:默认支持TimestampKey,如果开启enableNormalKey则使用NormalKey
  enable_normal_key: false
  # 代理地址,置空为不使用代理
  # 格式为:http://[username:password@]proxyhost:proxyport,如:http://myproxy:8080
  # proxy:
  # 优化连接检查周期,单位:s,默认开启,每隔1分钟检查一次,但仅当nodes为多个时生效
  # 该值生效时,会自动获取多个node中的区块高度,并按照高度和消耗时间排序,以供用户实际使用时优先获取到最优连接
  # 该值如果设置为0,则会使用默认值:60s,如需关闭,需将该值设置为-1
  optimize_detection: 60
  # 关闭订阅区块及合约事件时的乐观处理,默认为false,表示开启,true表示关闭
  # 该值需要结合optimize_detection使用,在optimize_detection生效时该值会在默认订阅时触发
  disable_subscribe_optimize: false

  nodes:
    - # 节点地址,格式为:IP:端口:连接数
      node_addr: "127.0.0.1:12301"
      # 节点连接数
      conn_cnt: 10
      # RPC连接是否启用双向TLS认证
      enable_tls: false
      # 信任证书池路径
      trust_root_paths:
        - "./testdata/crypto-config/node1/ca/wx-org1.chainmaker.org/ca"
      # TLS hostname
      tls_host_name: "chainmaker.org"
      # 转发分流配置,根据配置的参数,在nginx中配置X-Server-Name的value值,分流到不同的机器或者集群上
      chain_tls_host_name: ""

说明如下:

  • chain_id必须正确配置,与Cert不同的是,不需要配置org_id;

  • 在五个私钥和证书配置中,user_sign_key_file_path是对交易签名使用,必须配置,user_key_file_path与user_crt_file_path为TLS通信证书,在需要TLS通信(node.enable_tls=true)时配置,user_enc_key_file_path与user_enc_crt_file_path是为国密TLS双证书的模式增加,只有在节点配置的是国密TLS双证书时配置;

  • nodes中的任意节点配置enable_tls为true时,表示tls生效,该值生效时,需要配置trust_root_paths和tls_host_name;

  • auth_type必须配置为”public”模式;

  • crypto.hash配置需要与底链保持一致;

1.5.3. PWK模式

chain_client:
  # 链ID
  chain_id: "chain1"
  # 组织ID
  org_id: "wx-org1.chainmaker.org"
  # 客户端用户交易签名私钥路径
  user_sign_key_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/admin/admin.key"
  # 客户端用户交易签名私钥密码(无密码则不需要设置)
  # user_sign_key_pwd: "123"
  # 客户端用户私钥路径,用于tls连接
  # user_key_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key"
  # 客户端用户私钥密码(无密码则不需要设置)
  # user_key_pwd: "123"
  # 客户端用户证书路径,用于tls连接
  # user_crt_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt"
  # 客户端用户加密私钥路径(tls加密证书对应私钥,应用于国密GMTLS双证书体系;若未设置仅使用单证书)
  # user_enc_key_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.enc.key"
  # 客户端用户加密私钥密码(无密码则不需要设置)
  # user_enc_key_pwd: "123"
  # 客户端用户加密证书路径(tls加密证书,应用于国密GMTLS双证书体系;若未设置仅使用单证书)
  # user_enc_crt_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.enc.crt"
  # 签名使用的哈希算法,和节点保持一直
  crypto:
    hash: SHA256
  auth_type: permissionedWithKey
  # 节点是否仅支持异步返回的方式,默认为false,表示可以支持同步,仅有老版本的底链才仅支持(小于v2.3.3)
  node_only_async: false
  # 同步交易结果模式下,轮询获取交易结果时的最大轮询次数,删除此项或设为<=0则使用默认值 10
  retry_limit: 20
  # 同步交易结果模式下,每次轮询交易结果时的等待时间,单位:ms 删除此项或设为<=0则使用默认值 500
  retry_interval: 500
  # txid配置项:默认支持TimestampKey,如果开启enableNormalKey则使用NormalKey
  enable_normal_key: false
  # 代理地址,置空为不使用代理
  # 格式为:http://[username:password@]proxyhost:proxyport,如:http://myproxy:8080
  # proxy:
  # 优化连接检查周期,单位:s,默认开启,每隔1分钟检查一次,但仅当nodes为多个时生效
  # 该值生效时,会自动获取多个node中的区块高度,并按照高度和消耗时间排序,以供用户实际使用时优先获取到最优连接
  # 该值如果设置为0,则会使用默认值:60s,如需关闭,需将该值设置为-1
  optimize_detection: 60
  # 关闭订阅区块及合约事件时的乐观处理,默认为false,表示开启,true表示关闭
  # 该值需要结合optimize_detection使用,在optimize_detection生效时该值会在默认订阅时触发
  disable_subscribe_optimize: false

  nodes:
    - # 节点地址,格式为:IP:端口:连接数
      node_addr: "127.0.0.1:12301"
      # 节点连接数
      conn_cnt: 10
      # RPC连接是否启用双向TLS认证
      enable_tls: false
      # 信任证书池路径
      trust_root_paths:
        - "./testdata/crypto-config/wx-org1.chainmaker.org/ca"
      # TLS hostname
      tls_host_name: "chainmaker.org"
      # 转发分流配置,根据配置的参数,在nginx中配置X-Server-Name的value值,分流到不同的机器或者集群上
      chain_tls_host_name: ""

说明如下:

  • chain_id、org_id必须正确配置;

  • 在五个私钥和证书配置中,user_sign_key_file_path是对交易签名使用,必须配置,user_key_file_path与user_crt_file_path为TLS通信证书,在需要TLS通信(node.enable_tls=true)时配置,user_enc_key_file_path与user_enc_crt_file_path是为国密TLS双证书的模式增加,只有在节点配置的是国密TLS双证书时配置;

  • nodes中的任意节点配置enable_tls为true时,表示tls生效,该值生效时,需要配置trust_root_paths和tls_host_name;

  • auth_type必须配置为”permissionedWithKey”模式;

  • crypto.hash配置需要与底链保持一致;

1.5.4. 优化说明

在v2.4.0版本后Go-SDK引入了几个新的配置项,下面逐一说明。

1.5.4.1. node_only_async

node_only_async表示节点是否仅支持异步返回的方式,因为比较老的底链版本(小于v2.3.3)是不支持通过Sync方式发送交易请求并等待应答的, 需要通过查询交易ID的方式实现,在新版本增加该功能后,为保证兼容性做了保留,但根据交易ID查询的方式对性能要求更高,并且在retry_limit和retry_interval配置生效时是优先流程, 会导致大量资源浪费,因此增加该配置。 该配置默认为false,表示可以支持同步,仅有老版本的底链才仅支持(小于v2.3.3)异步方式,老版本底链修改为true。

1.5.4.2. proxy

proxy为正向代理配置,不填时表示不启动正向代理功能。 它的配置格式为:http://[username:password@]proxyhost:proxyport,如:http://myproxy:8080。 所谓正向代理,指的是nodes中的节点连接无法通过本SDK直接访问,需要通过一个正向代理服务来访问,本SDK可以与正向代理服务通信, 由正向代理服务转发交易请求至节点。

1.5.4.3. optimize_detection

optimize_detection为乐观检查周期,单位为秒。所谓乐观检查指的是在对端节点连接数量超过1个时(即nodes中配置了多个),系统会自动定时以 optimize_detection周期进行连接状态检查,将区块高度最高、连接状态最好的连接被优先使用。降低由于连接到了高度比较低的节点, 出现同步发送交易无法在指定时间内获取应答的情况。 如果需要关闭该功能,需要将其配置为-1。

1.5.4.4. disable_subscribe_optimize

v2.4.0版本后,基于optimize_detection功能,增加了订阅的优化能力,即订阅时会定期检查对端节点,自动连接到最高的节点,以保证订阅功能的鲁棒性。 而老的SDK版本默认提供的订阅能力是不支持的,该值为启动订阅优化的参数,默认为false,表示启动,以便于SDK在升级后无需进行代码调整。