2. Go SDK 接入指南

2.1. 下载私钥

在开放网络上创建账户后,会为用户生成加密的私钥,使用时需要使用密码解密后才可使用。

登录到开放网络后,通过控制台可以下载个人账户的私钥文件

../_images/xuperos-private-key-dl.png

2.2. 引入SDK

  1. go get github.com/xuperchain/xuper-sdk-go/v2

2.3. 加载私钥

下载私钥文件后,私钥文件是加密的,使用时需要使用密码解密才可发送交易。

注解

  • 目前开放网络不支持本次生成账户并发送交易,只能在开放网络注册账户后,使用对应的私钥才可以发送交易。

  • 开放网络不允许转账操作。

  1. package main
  2. import (
  3. fmt
  4. github.com/xuperchain/xuper-sdk-go/v2/account
  5. )
  6. func accountExample() {
  7. privateKeyFile := your private key file path
  8. password := your password
  9. yourAccount, err := account.GetAccountFromFile(privateKeyFile, password)
  10. if err != nil {
  11. fmt.Println(err)
  12. return
  13. }
  14. fmt.Println(yourAccount.Address)
  15. }

2.4. 修改配置文件

在 Go SDK 中的 conf 目录下有两个配置文件:sdk.yaml 和 sdk.testnet.yaml,一个是连接开放网络使用(sdk.yaml),另外一个连接开放测试网络使用(sdk.testnet.yaml)。

Go SDK 使用配置文件有两种方式:

  1. 默认加载 ./conf/sdk.yaml;

  2. 指定配置文件。

默认加载是指你的项目引用的 Go SDK 后,在运行目录的 ./conf 目录下,如果存在 sdk.yaml 文件,则 Go SDK 使用此配置文件,没有则用默认配置文件(不支持连接开放网络)。

指定配置文件是指在你的项目中,使用 Go SDK 创建 client 时,可以指定任意的配置文件(yaml 格式),示例代码如下:

  1. func clientConfigExample() {
  2. // 39.156.69.83:37100 为开放网络节点地址。
  3. // xuper.WithConfigFile(“yourSDK.yaml”) 设置使用的配置文件。
  4. xclient, err := xuper.New(“39.156.69.83:37100”, xuper.WithConfigFile(“yourSDK.yaml”))
  5. if err != nil {
  6. fmt.Println(err)
  7. return
  8. }
  9. status, err := xclient.QuerySystemStatus()
  10. if err != nil {
  11. fmt.Println(err)
  12. return
  13. }
  14. fmt.Println(status)
  15. }

以上两种方式都可以设置配置文件,配置文件中的内容如下(在 go sdk 的 conf 目录下已经有此文件模板),连接开放网络必须开启背书服务,进行如下配置:

  1. # endorseService Info
  2. endorseServiceHost: 39.156.69.83:37100
  3. complianceCheck:
  4. # 是否需要进行合规性背书
  5. isNeedComplianceCheck: true
  6. # 是否需要支付合规性背书费用
  7. isNeedComplianceCheckFee: true
  8. # 合规性背书费用
  9. complianceCheckEndorseServiceFee: 400
  10. # 支付合规性背书费用的收款地址
  11. complianceCheckEndorseServiceFeeAddr: aB2hpHnTBDxko3UoP2BpBZRujwhdcAFoT
  12. # 如果通过合规性检查,签发认证签名的地址
  13. complianceCheckEndorseServiceAddr: jknGxa6eyum1JrATWvSJKW3thJ9GKHA9n
  14. #创建平行链所需要的最低费用
  15. minNewChainAmount: 100
  16. crypto: xchain
  17. txVersion: 3

此时你的 SDK client 便连接到了开放网络,可以进行部署、调用合约了

2.5. 部署合约

注解

  • 开放网络目前仅支持部署EVM合约与c++ wasm合约。

  • 本文测试采用EVM counter 合约作为示例,合约内容见:Counter

  1. func main() {
  2. client, err := xuper.New(“39.156.69.83:37100”)
  3. if err != nil {
  4. fmt.Println(err)
  5. }
  6. acc, err := account.GetAccountFromFile(“开放网络私钥文件路径”, “安全码”)
  7. if err != nil {
  8. fmt.Println(err)
  9. }
  10. // contract account 合约账号使用在工作台注册的合约账号
  11. contractAccount := “”
  12. err = acc.SetContractAccount(contractAccount)
  13. if err != nil {
  14. fmt.Println(err)
  15. }
  16. // 合约编译文件
  17. abi , err := ioutil.ReadFile(“./build/Counter.abi”)
  18. bin , err := ioutil.ReadFile(“./build/Counter.bin”)
  19. // 初始化参数
  20. args := make(map[string]string)
  21. args[“creator”] = contractAccount
  22. // 发送交易
  23. tx, err := client.DeployEVMContract(acc,”Counter”,abi,bin,args)
  24. if err != nil{
  25. fmt.Println(err)
  26. }
  27. fmt.Printf(“%s”, tx.ContractResponse)
  28. }

2.6. 调用合约

注解

  • 如果合约方法修改了链上数据,如Counter合约的increase方法,请使用 InvokeEVMContract()

  • 如果合约方法仅做查询,如Counter合约的get方法,请使用 QueryEVMContract()

  1. func main() {
  2. client, err := xuper.New(“39.156.69.83:37100”)
  3. if err != nil {
  4. fmt.Println(err)
  5. }
  6. acc, err := account.GetAccountFromFile(“开放网络私钥文件路径”, “安全码”)
  7. if err != nil {
  8. fmt.Println(err)
  9. }
  10. // contract account 合约账号使用在工作台注册的合约账号
  11. // 在调用合约时,如果 SetContractAccount,那么此次调用的发起者为合约账户。即:msg.sender 为合约账户转换后的EVM地址。
  12. contractAccount := “”
  13. err = acc.SetContractAccount(contractAccount)
  14. if err != nil {
  15. fmt.Println(err)
  16. }
  17. // 合约名称
  18. contractName := Counter
  19. //此次要调用的合约方法
  20. contractMethod := increase
  21. // 合约方法参数
  22. args := make(map[string]string)
  23. args[“key”] = xuperos
  24. // 发送交易
  25. tx, err := client.InvokeEVMContract(acc,contractName,contractMethod,args)
  26. if err != nil{
  27. fmt.Println(err)
  28. }
  29. fmt.Printf(“%s”, tx.ContractResponse)
  30. }

具体接口文档参考 Go SDK 使用文档