-
Notifications
You must be signed in to change notification settings - Fork 2
Gosdk 使用文档
此SDK文档面向Hyperchain和flato的区块链平台的应用开发者,提供Hyperchain和flato GoSDK的使用指南。
所有配置文件、证书都应放在一个文件夹下,默认配置文件夹名为conf
,hpc.toml
在配置文件夹下根目录,所有配置为文件路径都应相对于配置文件夹存放,例如我们以默认文件夹名conf
为例:
conf
├── certs
│ ├── sdkcert.cert
│ ├── sdkcert.priv
│ ├── unique.priv
│ └── unique.pub
│ ├── tls
│ │ ├── tls_peer.cert
│ │ ├── tls_peer.priv
│ │ └── tlsca.ca
└── hpc.toml
我们通过读取hpc.toml文件来加载配置
title = "GoSDK configuratoin file"
namespace = "global"
#发送重新连接请求间隔(/ms)
reConnectTime = 10000
[jsonRPC]
# local environment
nodes = ["localhost","localhost","localhost","localhost"]
# JsonRpc connect port
# local ports
ports = ["8081", "8082", "8083", "8084"]
# set node used priority, we will send request to nodes with this list
priority = [0, 0, 0, 0]
[webSocket]
# webSocket connect port
ports = ["10001", "10002", "10003", "10004"]
[polling]
#重发次数
resendTime = 10
#第一次轮训时间间隔 unit /ms
firstPollingInterval = 100
#发送一次,第一次轮训的次数
firstPollingTimes = 10
#第二次轮训时间间隔 unit /ms
secondPollingInterval = 1000
#发送一次,第二次轮训的次数
secondPollingTimes = 10
[privacy]
#send Tcert during the request or not
sendTcert = true
#if sendTcert is true , you should add follow path.
#the paths followed are relative to conf root path
sdkcertPath = "certs/sdkcert.cert"
sdkcertPrivPath = "certs/sdkcert.priv"
# sdkcertPath = "certs/sdkcert_cfca.cert"
# sdkcertPrivPath = "certs/sdkcert_cfca.priv"
uniquePubPath = "certs/unique.pub"
uniquePrivPath = "certs/unique.priv"
cfca = true
[security]
#Use Https
https = false
#If https is true, you shoule add follow properties
#the paths followed are relative to conf root path
tlsca = "certs/tls/tlsca.ca"
tlspeerCert = "certs/tls/tls_peer.cert"
tlspeerPriv = "certs/tls/tls_peer.priv"
[log]
#设置日志输出门槛
#"CRITICAL","ERROR","WARNING","NOTICE","INFO","DEBUG",
log_level = "INFO"
#存放日志文件夹
log_dir = "../logs"
[transport]
# MaxIdleConns controls the maximum number of idle (keep-alive)
# connections across all hosts. Zero means no limit.
maxIdleConns = 0
# MaxIdleConnsPerHost, if non-zero, controls the maximum idle
# (keep-alive) connections to keep per-host. If zero,
# DefaultMaxIdleConnsPerHost is used.
maxIdleConnsPerHost = 10
[inspector]
enable = true
defaultAccount = "keystore/0xfc546753921c1d1bc2d444c5186a73ab5802a0b4"
accountType = "ecdsa"
[tx]
# if it is use for hyperchain, please use 1.0 to replace default
# if use for flato, please use 2.0 to replace default
version = "2.5"
一级 | 二级 | 释义 | 默认值 |
---|---|---|---|
namespace | 为初始化时传入的namespace | “global” | |
jsonRPC | nodes | 表示平台各节点的IP | ["localhost","localhost","localhost","localhost"] |
ports | 各节点rpc服务的端口 | ["8081", "8082", "8083", "8084"] | |
webSocket | ports | 为事件订阅服务的端口 | ["10001", "10002", "10003", "10004"] |
polling | resendTime | 重发次数 | 10 |
firstPollingInterval | 第一次轮询的间隔,单位 ms | 100 | |
firstPollingTimes | 第一次轮询的次数 | 10 | |
secondPollingInterval | 第二次轮询的间隔,单位 ms | 1000 | |
secondPollingTimes | 第二次轮询的次数 | 10 | |
privacy | sendTcert | 是否开启Tcert认证, 布尔值 | true |
sdkcertPath | 开启Tcert认证时签名用的公钥路径 | "certs/sdkcert.cert" | |
sdkcertPrivPath | 开启Tcert认证时签名用的私钥路径 | "certs/sdkcert.priv" | |
uniquePubPath | 表示请求tcert时所使用的请求体公钥路径 | "certs/unique.pub" | |
uniquePrivPath | 表示请求tcert时所使用的请求体私钥路径 | "certs/unique.priv" | |
cfca | 是否开启ca证书, 布尔值 | true | |
log | log_level | 日志等级, 分为"CRITICAL","ERROR","WARNING","NOTICE","INFO","DEBUG" | "INFO" |
log_dir | 存放日志文件的目录 | "../logs" | |
transport | maxIdleConns | 所有节点一共最大空闲活跃rpc连接数,如果为0,表示不设限制 | 0 |
maxIdleConnsPerHost | 每个节点最大空闲活跃rpc连接数, 如果为0,表示使用系统默认配置 | 10 | |
tx | version | sdk所对应的平台版本号 | 2.5 |
-
namespace
为初始化时传入的namespace; -
[jspnRPC]模块:
nodes
表示平台各节点的IP;ports
也就是平台发送消息的端口。 -
webSocket模块:
ports
为事件订阅连接的端口,他们分别对应着node中配置的IP。 -
polling模块:
resendTime
参数表示重发次数;pollingInterval
表示轮训去获取交易的时间间隔(分为第一次和第二次),单位为毫秒;pollingTimes
表示发送一次交易的轮训次数(分为第一次和第二次)。 -
privacy模块:
sendTcert
表示开启Tcert,请配合平台一起使用;sdkcertPath
和sdkcertPrivPath
表示请求tcert时需要用来签名的公私钥对;uniquePubPath
和uniquePrivPath
表示请求tcert时所使用的请求体公私钥对;cfca
表示开启cfca证书。需要注意证书路径均相对于**hpc.toml**
文件。 -
security模块:
https
开启后则请求都会使用https来发送,tlsca
表示客户端需要验证的服务器ca,tlspeerCert
表示服务器需要验证的SDK的ca的公钥,tlspeerPriv
则为对应的ca公钥的私钥。 -
log模块:
log_level
表示输出的日志级别。log_dir
表示存放日志的文件夹路径。 -
【transport】模块:
maxRecvMsgSize
: 通过grpc双向流从节点接受的信息最大size,此处配置必须小于等于节点配置的值,单位是比特 -
txVersion 需要和平台版本对应
账户分为普通账户和DID账户,而根据加密方式可分为国密和非国密类型。目前根据加密方式不同一共有19种类型账户
非国密账户有:
参数名 | 编码 |
---|---|
ECKDF2 | 0x01(暂不支持) |
ECDES | 0x02 |
ECRAW | 0x03 |
ECAES | 0x04 |
EC3DES | 0x05 |
ED25519DES | 0x21 |
ED25519RAW | 0x22 |
ED25519AES | 0x23 |
ED255193DES | 0x24 |
ECKDF2R1 | 0x011(暂不支持) |
ECDESR1 | 0x021 |
ECRAWR1 | 0x031 |
ECAESR1 | 0x041 |
EC3DESR1 | 0x051 |
国密账户有:
参数名 | 编码 |
---|---|
SMSM4 | 0x11 |
SMDES | 0x12 |
SMRAW | 0x13 |
SMAES | 0x14 |
SM3DES | 0x15 |
2.1.1.1 通过账户类型创建账户
方法签名:func NewAccountJson(acType, password string) (string, error)
参数 | |
---|---|
参数1 (acType) | 加密方式 |
参数2 (password) | 账户密码 |
返回值 | |
返回值1 | 账户JSON串 |
返回值2 | error, 详情见第七章 |
应用实例
ac, err := account.NewAccountJson(account.ECDES, "123")
2.1.1.2 创建国密账户
方法签名: func NewAccountSm2(password string) (string, error)
说明: 创建sm2国密算法的accountJSON
参数 | |
---|---|
参数 password | 账户密码,不为空则采用SMDES方式加密,为空则采用SMRAW方式加密(即不加密) |
返回值 | |
返回值1 | 账户JSON串 |
返回值2 | error, 详情见第七章 |
应用实例
ac, err := account.NewAccountSm2("123")
2.1.1.3 通过pfx格式的证书创建账户
方法签名: NewAccountJsonFromPfx(password string, pfx []byte) (string, error)
参数 | |
---|---|
参数1 | 账户密码 |
参数2 | pfx格式证书 |
返回值 | |
返回值1 | 账户JSON串 |
返回值2 | error, 详情见第七章 |
应用实例
temp, err := ioutil.ReadFile("idcert.pfx")
if err != nil {
return
}
ac, err := account.NewAccountJsonFromPfx("123", temp)
if err != nil {
return
}
2.1.1.4 创建ed25519类型账户
方法签名: func NewAccountED25519(password string) (string, error)
参数 | |
---|---|
参数1 (password) | 账户密码,若为空,则采用ED25519RAW方式加密, 否则采用ED25519DES方式加密 |
返回值 | |
返回值1 | 账户JSON串 |
返回值2 | error, 详情见第七章 |
应用实例
ac, err := account.NewAccountED25519("123")
2.1.1.5 创建ecdsa账户
方法签名: func NewAccount(password string) (string, error)
参数 | |
---|---|
参数1 (password) | 账户密码,若为空,则采用ECRAW方式加密, 否则采用ECDES方式加密 |
返回值 | |
返回值1 | 账户JSON串 |
返回值2 | error, 详情见第七章 |
应用实例
ac, err := account.NewAccount("123")
2.1.1.6 创建R1账户
方法签名: func NewAccountR1(password string) (string, error)
参数 | |
---|---|
参数1 (password) | 账户密码,若为空,则采用ECRAWR1方式加密, 否则采用ECDESR1方式加密 |
返回值 | |
返回值1 | 账户JSON串 |
返回值2 | error, 详情见第七章 |
应用实例
ac, err := account.NewAccountR1("123")
方法签名: func GenKeyFromAccountJson(accountJson, password string) (key interface{}, err error)
参数 | |
---|---|
参数1 (accountJson) | 账户json串 |
参数2 (password) | 账户密码 |
返回值 | |
返回值1 | 账户key |
返回值2 | error, 详情见第七章 |
应用实例
accountJson := `{"address":"0x4037f0011a9a5db6e426d702b14861e65b4f2a46","algo":"0x12","version":"4.0","publicKey":"0x040e15655c836ce58be6b5b3da93bd257d817809ec5a621b01d1024e1b6de7b38d0f12309accb6cd1a91faadffeabda0f8d2b835606daf01022e0b26ea0b9a3125","privateKey":"9de41e04445dc3024c3713a9cf043d55f6d8509fbfe6b3ebb108b89d83669328feb959b7d4642fcb"}`
password := "12345678"
key, err := account.GenKeyFromAccountJson(accountJson, password)
did账户与普通账户在国密场景一致,仅需要对非国密情况进行区分,由此带来的变化如下
2.2.1.1 通过ecdsa创建账户
方法签名: func NewAccountDID(password string) (string, error)
参数 | |
---|---|
参数1 (password) | 账户密码,若为空,则采用ECRAW方式加密, 否则采用ECDES方式加密 |
返回值 | |
返回值1 | 账户JSON串 |
返回值2 | error, 详情见第七章 |
应用实例
ac, err := account.NewAccountDID("123")
2.2.1.2 通过加密类型创建账户
方法签名: func NewDIDAccountJson(acType, password string) (string, error)
参数 | |
---|---|
参数1 (acType) | 加密方式 |
参数2 (password) | 账户密码 |
返回值 | |
返回值1 | 账户JSON串 |
返回值2 | error, 详情见第七章 |
应用实例
ac, err := account.NewDIDAccountJson(account.ECDES, "123")
2.2.1.2 通过key生成DID账户
方法签名:
func NewDIDAccount(key Key, chainID, suffix string) (didKey *DIDKey)
参数 | |
---|---|
参数1 | 账户key |
参数2 | 链唯一的chainId |
参数3 | DID账户的后缀,用于构成did账户的地址 |
返回值 | |
返回值1 | DID账户 |
应用实例
password := "hyper"
accountJson, _ = account.NewAccountSm2(password)
chainId := "chainId_01"
//生成普通账户key
key, _ := account.GenKeyFromAccountJson(accountJson, password)
suffix := "didAddr_suffix"
didKey := account.NewDIDAccount(key.(account.Key), chainId, suffix)
2.2.2.1 通过账户json生成key
方法签名:
func GenDIDKeyFromAccountJson(accountJson, password string) (key interface{}, err error)
参数 | |
---|---|
参数1 (accountJson) | 账户json串 |
参数2 (password) | 账户密码 |
返回值 | |
返回值1 | 账户key |
返回值2 | error, 详情见第七章 |
应用实例
accountJson := `{"address":"0x4037f0011a9a5db6e426d702b14861e65b4f2a46","algo":"0x12","version":"4.0","publicKey":"0x040e15655c836ce58be6b5b3da93bd257d817809ec5a621b01d1024e1b6de7b38d0f12309accb6cd1a91faadffeabda0f8d2b835606daf01022e0b26ea0b9a3125","privateKey":"9de41e04445dc3024c3713a9cf043d55f6d8509fbfe6b3ebb108b89d83669328feb959b7d4642fcb"}`
password := "12345678"
key, err := account.GenDIDKeyFromAccountJson(accountJson, password)
交易是与hyperchain交互的重要形式,在GoSDK中,交易由Transaction结构体代表。GoSDK中交易体用户可配置参数共有如下(以下字段名首字母大写即为该字段的设值函数):
【from】:交易发起方账户地址。必填。
【to】:交易接收方地址,合约调用时为合约地址。默认0x0。
【value】:转账金额。默认为0。
【payload】:交易荷载,在部署、调用、更新合约时使用。默认为空字符串。
【opcode】:操作码,在合约管理时使用,1代表更新合约,2代表冻结合约,3代表解冻合约。默认为0。
【extra】:存证信息,可以在交易中附带一些信息。默认为空字符串。
【simulate】:配置当前交易是否为模拟交易。若为true,则交易数据不会存入链上数据库。默认为false。
【vmType】:当前交易针对的虚拟机,目前支持配置EVM、HVM、KVSQL、BVM、TRANSFER五种。默认为EVM。
【ExtraIdString】:指定交易extraId的值,类型为数组,数组元素string
// TransactionInfo is packaged result of TransactionInfo
type TransactionInfo struct {
Version string
Hash string
BlockNumber uint64
BlockHash string
TxIndex uint64
From string
To string
CName string
Amount uint64
Timestamp uint64
Nonce uint64
ExecuteTime int64
Payload string
Extra string
Invalid bool
InvalidMsg string
BlockTimestamp int64
BlockWriteTime int64
ExtraIdString []interface{}
}
// TxReceipt is packaged result of transaction receipt
type TxReceipt struct {
TxHash string
PrivTxHash string
ContractAddress string
ContractName string
Ret string
Log []TxLog
VMType string
Version string
Valid bool
ErrorMsg string
GasUsed int64
}
方法签名: func NewTransaction(from string) *Transaction
参数 | |
---|---|
参数1 | 交易发起方地址, |
返回值 | |
返回值1 | 交易体 |
应用实例
trans := rpc.NewTransaction(address)
方法签名
func (t *Transaction) Nonce(nonce int64) *Transaction
func (t *Transaction) SetNonce(nonce int64)
应用实例
trans.Nonce(1)
// or
trans.SetNonce(1)
方法签名:
func (t *Transaction) Timestamp(timestamp int64) *Transaction
应用实例
trans.Timestamp(time.Now().Unix())
方法签名
func (t *Transaction) Simulate(simulate bool) *Transaction
应用实例
trans.Simulate(true)
方法签名:
func (t *Transaction) VMType(vmType VMType) *Transaction
参数 | |
---|---|
参数1(vmType) | 虚拟机类型,EVM, HVM, BVM, TRANSFER, KVSQL |
返回值 | |
返回值1 | 交易体实例 |
应用实例
trans = trans.VMType(rpc.KVSQL)
方法签名
func (t *Transaction) Transfer(to string, value int64) *Transaction
参数 | |
---|---|
参数1(to) | 收款方地址 |
参数2 (value) | 转账数 |
返回值 | |
返回值1 | 交易体实例 |
应用实例
trans.Transfer("bfa5bd992e3eb123c8b86ebe892099d4e9efb783", int64(0))
方法签名
func (t *Transaction) Maintain(op int64, to, payload string) *Transaction
参数 | |
---|---|
参数1(op) | 操作码, 1 合约升级, 2 冻结合约, 3 解冻合约 |
参数2 (to) | 操作的合约地址 |
参数3 (payload) | 合约bin, 可为空字符串 |
返回值 | |
返回值1 | 交易体实例 |
应用实例
contractAddress := "0x421a1fb06bd9c9fae9b8cdaf8a662cf3c41ffa10" // 合约部署后地址
trans = trans.Maintain(1, contractAddress, "")
方法签名
func (t *Transaction) MaintainByName(op int64, name, payload string) *Transaction
说明 | 调用该方法前需要调用一笔bvm交易给合约设定名字,详情参照4.2部分 |
---|---|
参数 | |
参数1 (op) | 操作码, 1 合约升级, 2 冻结合约, 3 解冻合约 |
参数2 (name) | 合约名 |
参数3 (payload) | 合约bin, 可为空字符串 |
返回值 | |
返回值1 | 交易体实例 |
应用实例
// 绑定合约名
contractAddr := "0x421a1fb06bd9c9fae9b8cdaf8a662cf3c41ffa10"
contractName := "demo"
setCName(contractAddr, contractName)
trans.MaintainByName(2, contractName, "")
方法签名
func (t *Transaction) Deploy(payload string) *Transaction
参数 | |
---|---|
参数1 (payload) | 编码后的合约。根据合约类型不同,传不同的值,具体参照第四章部分。(例如:若为solidity合约,该字段为合约编译后的bin,参照4.1部分;若为hvm合约,该字段为jar包处理后的值,参照4.3部分) |
返回值 | |
返回值1 | 交易体实例 |
应用实例
trans.Deploy("0x60606040526000805463ffffffff19169055341561001957fe5b5b61012a806100296000396000f300606060405263ffffffff60e060020a6000350416633ad14af38114603e57806348fe842114605c578063569c5f6d14606b578063d09de08a146091575bfe5b3415604557fe5b605a63ffffffff6004358116906024351660a0565b005b3415606357fe5b605a60c2565b005b3415607257fe5b607860d2565b6040805163ffffffff9092168252519081900360200190f35b3415609857fe5b605a60df565b005b6000805463ffffffff808216850184011663ffffffff199091161790555b5050565b6000805463ffffffff191690555b565b60005463ffffffff165b90565b6000805463ffffffff8082166001011663ffffffff199091161790555b5600a165627a7a72305820caa934a33fe993d03f87bdf39706fada68ddde78182e0110fd43e8c323d5984a0029")
方法签名
func (t *Transaction) DeployArgs(abiString string, args ...interface{}) *Transaction
说明 | 对于存在初始化参数的合约,需要给其传参时调用 |
---|---|
参数 | |
参数1 (abiString) | 合约abi对应构造函数的字符串 |
参数2 (args) | 合约初始化参数 |
返回值 | |
返回值1 | 交易体实例 |
应用实例
abi := `[
{
"inputs": [
{
"internalType": "uint32",
"name": "a",
"type": "uint32"
},
{
"internalType": "uint32",
"name": "b",
"type": "uint32"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"internalType": "int256",
"name": "a",
"type": "int256"
},
{
"internalType": "int256",
"name": "b",
"type": "int256"
}
],
"name": "add",
"outputs": [
{
"internalType": "int256",
"name": "",
"type": "int256"
}
],
"stateMutability": "pure",
"type": "function"
}
]
`
trans.DeployArgs(abi[0], 1, 2)
方法签名
func (t *Transaction) DeployStringArgs(abiString string, args ...interface{}) *Transaction
说明 | 对于存在初始化参数,且参数为字符串或者切片的合约,需要给其传参时调用 |
---|---|
参数 | |
参数1 (abiString) | 合约abi对应构造函数的字符串 |
参数2 (args) | 参数列表 |
返回值 | |
返回值1 | 交易体实例 |
应用实例
abi := `[
{
"inputs": [
{
"internalType": "address",
"name": "a",
"type": "address"
},
{
"internalType": "uint32",
"name": "b",
"type": "uint32"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"internalType": "int256",
"name": "a",
"type": "int256"
},
{
"internalType": "int256",
"name": "b",
"type": "int256"
}
],
"name": "add",
"outputs": [
{
"internalType": "int256",
"name": "",
"type": "int256"
}
],
"stateMutability": "pure",
"type": "function"
}
]
`
trans.DeployStringArgs(abi[0], "1", 1)
方法签名
func (t *Transaction) Invoke(to string, payload []byte) *Transaction
参数 | |
---|---|
参数 1 (to) | 合约地址 |
参数2 (payload) | 合约负载,根据合约类型不同传入的值不同,具体参照第4章节(例如: 若为solidity合约,则为abi.Pack编码后的值;若为hvm合约则为hvm.GenPayload编码之后的值) |
返回值 | |
返回值1 | 交易体实例 |
应用实例
contractAddr := "0x421a1fb06bd9c9fae9b8cdaf8a662cf3c41ffa10"
ABI, _ := abi.JSON(strings.NewReader(abiContract))
packed, _ := ABI.Pack("getMul")
trans.Invoke(contractAddr, packed)
方法签名
func (t *Transaction) InvokeSql(to string, payload []byte) *Transaction
参数 | |
---|---|
参数1 | 合约地址 |
参数2 | sql语句的byte数组 |
返回值 | |
返回值1 | 交易体实例 |
应用实例
str := "CREATE TABLE IF NOT EXISTS testTable (id bigint(20) NOT NULL, name varchar(32) NOT NULL, exp bigint(20), money double(16,2) NOT NULL DEFAULT '99', primary key (id), unique key name (name));"
trans.InvokeSql(contractAddr, []byte(str))
方法签名
func (t *Transaction) InvokeByName(name string, payload []byte) *Transaction
说明 | 此方法调用需要先发送一笔bvm交易将合约地址与name绑定 |
---|---|
参数 | |
参数1 | 合约名字 |
参数2 | 合约负载,设定规则与3.2.11部分相同 |
返回值 | |
返回值1 | 交易体实例 |
应用实例
name := "demo"
contractAddr := "0x421a1fb06bd9c9fae9b8cdaf8a662cf3c41ffa10"
// 省略绑定过程
ABI, _ := abi.JSON(strings.NewReader(abiContract))
packed, _ := ABI.Pack("getMul")
trans.InvokeByName(name, packed)
方法签名
func (t *Transaction) Extra(extra string) *Transaction
应用实例
trans.Extra("demo extra")
方法签名
func (t *Transaction) KVExtra(kvExtra *KVExtra) *Transaction
参数 | |
---|---|
参数1 | KVExtra, kv类型的extra |
返回值 | |
返回值1 | 交易体实例 |
应用实例
kvExtra := NewKVExtra()
kvExtra.AddKV("name", "ice")
kvExtra.AddKV("friend", map[string]string{
"name": "ice",
"age": "24",
})
trans.KVExtra(kvExtra)
方法签名
func (t *Transaction) To(to string) *Transaction
应用实例
trans.To("0x421a1fb06bd9c9fae9b8cdaf8a662cf3c41ffa10")
方法签名
func (t *Transaction) Payload(payload string) *Transaction
应用实例
trans.Payload("demo payload")
方法签名
func (t *Transaction) Value(value int64) *Transaction
应用实例
trans.Value(123)
方法签名
func (t *Transaction) OpCode(op int64) *Transaction
参数 | |
---|---|
参数1 | 设定交易体的操作码,目前的操作码如下 |
返回值 | |
返回值1 | 交易体实例 |
应用实例
trans.OpCode(rpc.UPDATE)
方法签名
func (t *Transaction) Register(document *DIDDocument) *Transaction
说明 | 注册did账户 |
---|---|
参数 | |
参数1 | did账户结构 |
返回值 | |
返回值1 | 交易体实例 |
应用实例
password := ""
chainID := "chainID_01"
accountJson, _ = account.NewAccountED25519(password)
key, _ := account.GenKeyFromAccountJson(accountJson, password)
suffix := common.RandomString(10)
didKey := account.NewDIDAccount(key.(account.Key), chainID, suffix)
puKey, _ := rpc.GenDIDPublicKeyFromDIDKey(didKey)
document := rpc.NewDIDDocument(didKey.GetAddress(), puKey, admins)
trans.Register(document)
方法签名
func (t *Transaction) MaintainDID(to string, op int64) *Transaction
参数 | |
---|---|
参数1 | did账户地址 |
参数2 | 操作码 |
应用实例
password := ""
chainID := "chainID_01"
accountJson, _ = account.NewAccountED25519(password)
key, _ := account.GenKeyFromAccountJson(accountJson, password)
suffix := common.RandomString(10)
ac := account.NewDIDAccount(key.(account.Key), chainID, suffix)
//这里省略了将did账户ac注册的步骤
trans.Maintain(ac.GetAddress, rpc.DID_FREEZE)
方法签名:
func (t *Transaction) UpdatePublicKey(to string, puKey *DIDPublicKey) *Transaction
参数 | |
---|---|
参数1 | did账户地址 |
参数 | did账户公钥 |
返回值 | |
返回值1 | 交易体实例 |
应用实例
// 注册DID账户ac, 然后重新生成新的did账户tempAc
newPubkey, _ := rpc.GenDIDPublicKeyFromDIDKey(tempAc)
trans.UpdatePublicKey(ac.GetAddress(). newPubkey)
方法签名
func (t *Transaction) UpdateAdmins(to string, admins []string) *Transaction
参数 | |
---|---|
参数1 | did账户地址 |
参数2 | 管理员地址列表 |
返回值 | |
返回值1 | 交易体实例 |
应用实例
// 注册一个DID账户ac, 更改其管理员为admin1, admin2, ac
trans.UpdateAdmins(ac.GetAddress(), []string{
admin1.GetAddress(),
admin2.GetAddress(),
ac.GetAddress(),
})
方法签名
func (t *Transaction) UploadCredential(credential *DIDCredential) *Transaction
说明 | 凭证创建并签名后,可以构建上传交易 |
---|---|
参数 | |
参数1 | 签名后的凭证结构体 |
返回值 | |
返回值1 | 交易体实例 |
应用实例
//按照上文DID账户注册的步骤,注册DID账户issuer和holder
//issuer为签发者,holder为持有者
cred := rpc.NewDIDCredential("type", issuer.GetAddress(), holder.GetAddress(), "credential message", time.Now().UnixNano(), time.Now().UnixNano()+1e11)
//签发者签发凭证,即给凭证签名
cred.Sign(issuer)
//构建凭证上传的交易
tx := rpc.NewTransaction(holder.GetAddress()).UploadCredential(cred)
方法签名
func (t *Transaction) DownloadCredential(credentialID string) *Transaction
参数 | |
---|---|
参数1 | 凭证id |
返回值 | |
返回值1 | 交易体实例 |
应用实例
//issuer 为签发者账户,credID为凭证id
tx := rpc.NewTransaction(issuer.GetAddress()).DownloadCredential(credID)
方法签名
func (t *Transaction) DestroyCredential(credentialID string) *Transaction
参数 | |
---|---|
参数1 | 凭证id |
返回值 | |
返回值1 | 交易体实例 |
应用实例
//issuer 为签发者账户,credID为凭证id
tx := rpc.NewTransaction(issuer.GetAddress()).DestroyCredential(credID)
func (t *Transaction) GetTransactionHash(gasLimit int64) string
参数 | |
---|---|
参数1 | gas消耗上限 |
返回值 | |
返回值1 | 交易体hash |
应用实例
tx.GetTransactionHash(1000)
func (t *Transaction) DIDSetExtra(to, key, value string) *Transaction
参数 | |
---|---|
参数1 | did账户地址 |
参数2 | extra信息的key |
参数3 | extra信息value |
返回值 | |
返回值1 | 交易体 |
应用实例
rpc := NewRPC()
from := registerDIDAccount(rpc, nil)
to := registerDIDAccount(rpc, []string{from.GetAddress()})
key := "key_test"
value := "value_test"
tx := NewTransaction(from.GetAddress()).DIDSetExtra(to.GetAddress(), key, value)
_, err := rpc.SendDIDTransaction(tx, from)
func (t *Transaction) DIDGetExtra(to, key string) *Transaction
参数 | |
---|---|
参数1 | did账户地址 |
参数2 | extra信息的key |
返回值 | |
返回值1 | 交易体 |
应用实例
rpc := NewRPC()
from := registerDIDAccount(rpc, nil)
to := registerDIDAccount(rpc, []string{from.GetAddress()})
key := "key_test"
tx := NewTransaction(from.GetAddress()).DIDGetExtra(to.GetAddress(), key)
_, err := rpc.SendDIDTransaction(tx, from)
方法签名:
func (t *Transaction) Sign(key interface{})
说明 | 所有通过gosdk发往平台的交易都需要进行签名 |
---|---|
参数 | |
参数1 | 账户key |
应用实例
trans.Sign(key)
方法签名
func (t *Transaction) SignWithBatchFlag(key interface{})
说明 | 批量签名 |
---|---|
参数 | |
参数1 |
应用实例
// key 账户
tx.SignWithBatchFlag(key)
EVM对应的合约为solidity,解析合约abi为如下struct
type ABI struct {
Constructor Method
Methods map[string]Method
Events map[string]Event
// Fields that record overloaded methods and events
allMethods map[string]Method
allEvents map[string]Event
}
方法签名:
func JSON(reader io.Reader) (ABI, error)
参数 | |
---|---|
参数1 | 合约的io流 |
返回值 | |
返回值1 | ABI结构体 |
返回值2 | error,详见第七章 |
应用实例
// abiContract 合约编码后的abi
ABI, serr := abi.JSON(strings.NewReader(abiContract))
4.1.1.1 合约方法获取
func (abi ABI) GetMethod(methodSig string) (*Method, error)
4.1.1.2 合约event获取
func (abi ABI) GetEvent(eventSig string) (*Event, error)
4.1.1.3 将方法以及参数转为binary
func (abi ABI) GetPayload(funcName string, args ...string) string
4.1.1.4 编码调用的方法和参数
func (abi ABI) Pack(name string, args ...interface{}) ([]byte, error)
应用实例
packed, _ = ABI.Pack("testOverload", args...)
packed, _ = ABI.Pack("testOverload(int24,bool[])", args...)
说明:
-
若调用时仅仅使用方法名称,则默认调用无参同名方法,若未找到无参同名方法,则调用最后一个匹配到的方法,即最后声明的同名方法;
-
方法签名的构造方式为:
"MethodName(inputType1,inputType2,...inputTypeN)"
即在方法名称之后使用括号将传参类型统一包括,类型之间以逗号分隔。
-
方法签名括号中规定了方法传参类型,传参类型之间必须使用“,”分隔,传参类型必须与abi中inputs里对应的type一致,且数量和顺序必须保持一致。
-
事件签名构造同理:
"EventName(inputType1,inputType2,...inputTypeN)"
4.1.1.5 返回值解析
方法签名
func (abi *ABI) UnpackResult(v interface{}, name, data string) (err error)
得到返回值结果后,获得状态码可以判断是否调用成功,若调用成功,解析返回值可看到调用之后的结果。
// decode
//返回值解析
var result string
if err = ABI.UnpackResult(&result, "get", txInvoke1.Ret); err != nil {
fmt.Println(err)
return
}
fmt.Println("get返回值:", result)
4.1.1.6 反序列化
func (abi *ABI) UnmarshalJSON(data []byte) error
4.1.1.7 通过方法的id获取方法
func (abi *ABI) MethodById(sigdata []byte) (*Method, error)
BVM全称是 built-in virtual machine ,是用于处理内置合约的虚拟机类型。BVM的出现使得开发者可以自定义一些内置合约,提供一些固定的功能。
内置合约,即是合约代码由开发人员预先写好,在平台启动时就直接创建对象加载,不需要用户手动部署的合约。由于合约随着平台预先创建加载, 所以合约地址固定不变,且相比普通合约有以下特性:
-
不需部署(也可以理解为平台刚启动就被 ”部署“ 在某个固定地址上)。
-
目前功能单一(只支持两份),但之后可以不断地进行扩展。
-
做合约修改或增加新的内置合约需要平台兼容做调整。
-
不属于任何人,及任何用户都不可以对该合约进行升级或冻结、解冻的相关操作。
目前支持以下5种内置合约
a) **提案相关,**ProposalContract 合约地址为:0x0000000000000000000000000000000000ffff02
b) **hash相关, **HashContract合约地址为: 0x0000000000000000000000000000000000ffff01
c) did相关, 合约地址为0x0000000000000000000000000000000000ffff06
d) 证书相关, 合约地址为0x0000000000000000000000000000000000ffff05
e) 账户相关, 合约地址为0x0000000000000000000000000000000000ffff04
4.2.1.1 将操作编码成payload
方法签名
func EncodeOperation(ope Operation) []byte
参数 | |
---|---|
参数1 | 操作 |
返回值 | |
返回值1 | 对应交易体的payload |
应用实例
opt := bvm.NewDIDSetChainIDOperation("chainID_01")
payload := bvm.EncodeOperation(opt)
4.2.1.2 返回值解码
方法签名
func Decode(ret string) *Result
// Result represent the execute result of BVM
type Result struct {
Success bool
Ret []byte
Err string
}
说明 | 对BVM交易回执进行解析 |
---|---|
参数 | |
参数1 | 交易回执里面的Ret |
返回值 | |
返回值1 | Result结构体 |
应用实例
// 发送交易拿到回执后,取ret字段
retStr := `0x7b2253756363657373223a747275652c22526574223a22573373695932396b5a5349364d6a417766537837496d4e765a4755694f6a49774d48307365794a6a6232526c496a6f794d4442394c4873695932396b5a5349364d6a41776656303d222c22457272223a22227d`
res := bvm.Decode(retStr)
4.2.1.3 提案code解码
type ProposalData struct {
Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
Code []byte `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"`
Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
Timeout int64 `protobuf:"varint,4,opt,name=timeout,proto3" json:"timeout,omitempty"`
Status ProposalData_Status `protobuf:"varint,5,opt,name=status,proto3,enum=bvm.ProposalData_Status" json:"status,omitempty"`
Assentor []*VoteInfo `protobuf:"bytes,6,rep,name=assentor,proto3" json:"assentor,omitempty"`
Objector []*VoteInfo `protobuf:"bytes,7,rep,name=objector,proto3" json:"objector,omitempty"`
Threshold uint32 `protobuf:"varint,8,opt,name=threshold,proto3" json:"threshold,omitempty"`
Score uint32 `protobuf:"varint,9,opt,name=score,proto3" json:"score,omitempty"`
Creator string `protobuf:"bytes,10,opt,name=creator,proto3" json:"creator,omitempty"`
Version string `protobuf:"bytes,11,opt,name=version,proto3" json:"version,omitempty"`
Type ProposalData_PType `protobuf:"varint,12,opt,name=type,proto3,enum=bvm.ProposalData_PType" json:"type,omitempty"`
Completed []byte `protobuf:"bytes,13,opt,name=completed,proto3" json:"completed,omitempty"`
Cancel []byte `protobuf:"bytes,14,opt,name=cancel,proto3" json:"cancel,omitempty"`
}
解码提案数据的code字段
方法签名
func DecodeProposalCode(code []byte) (string, error)
应用实例
proposalHexString := "08011284030000000a0000000f53657446696c746572456e61626c65000000010000000566616c73650000000e53657446696c74657252756c6573000000010000001f5b7b22616c6c6f775f616e796f6e65223a66616c73652c226964223a307d5d00000015536574436f6e73656e737573426174636853697a65000000010000000331303000000014536574436f6e73656e737573506f6f6c53697a65000000010000000332303000000013536574436f6e73656e73757353657453697a65000000010000000235300000001453657450726f706f73616c5468726573686f6c640000000100000001340000001253657450726f706f73616c54696d656f7574000000010000000c3438303030303030303030300000001253657450726f706f73616c54696d656f7574000000010000000c34383030303030303030303000000018536574436f6e7472616374566f74655468726573686f6c6400000001000000013300000015536574436f6e7472616374566f7465456e61626c6500000001000000047472756518d0bbb4bbebcec4d11620d0abc786c9d7c4d116280132720a2a3078303030663161376130386363633438653564333066383038353063663163663238336161336162641242307831366133313237363930393565323832633130323861376138376634336563623864623937653765643166386234663466626438393435356363353266386666180140064801522a3078303030663161376130386363633438653564333066383038353063663163663238336161336162645a05302e312e30"
a := common.Hex2Bytes(proposalHexString)
var pro bvm.ProposalData
proto.Unmarshal(a, &pro) // 提案数据解码
code, err := bvm.DecodeProposalCode(pro.Code) // 提案code字段解码
- 提案总共有六个状态:等待投票、驳回、等待执行、已完成、取消和超时。
- 只有创建者有权取消提案
- 提案创建后通过投票可进入等待执行、驳回状态
- 处于等待执行的提案可有发起者发起执行操作,执行完成进入已完成状态
- 提案处于等待投票、等待执行状态时无法创建新的提案
- 目前提案的默认阈值为链级管理员的总个数,每个链级管理员均可以对此提案进行投票,若此提案获得的票数大于等于阈值则通过投票
- 目前提案的默认超时时间为5分钟(当设置当超时时间小于5分钟时,会设置为5分钟),即创建提案的交易打包时间+5分钟则为提案超时时间
- 每次执行提案交易都会拿到当前系统中最新的提案,将当前执行的交易的打包时间与提案的超时时间进行对比,如果大于超时时间,则将提案状态置为超时。(不能单纯的认为提案创建后,过了超时时长就一定超时了,没过超时时长就一定没超时。交易的打包时间是主节点中打包交易时取的当前系统时间,主节点的系统时间可能不是正常的时间序列,例如:如果提案创建后发生了viewchange,viewchange之前的主节点在当前时刻的系统时间为1:00,viewchange之后的主节点中当前时刻的系统时间为1:30,这时即使提案创建之后没有超过超时时长,对提案进行投票,由于新的主节点的时间为1:30,打包的时间戳也为1:30对应的时间戳,在执行提案对比是否超时时,判断的结果就为超时。目前主节点时间变更除了viewchange之外,还有主节点主动作恶、或根据需要主动变更系统时间。)
根据提案的状态以及对提案的操作,可得出一个提案的状态迁移如下图所示:
对于提案可根据提案内容划分为以下几类:
- 配置类, ptype为 `config` ,data则为配置项操作列表;
- 权限类,ptype为`permission` ,data为权限操作列表;
- 节点类,ptype为`node` ,data为节点操作列表;
- 合约命名类,ptype为`cns` ,data为合约命名操作列表;
- 合约生命周期管理类,ptype为`contract` ,data为合约生命周期管理操作列表;
4.2.2.1 合约提案创建
func NewProposalCreateOperationForContract(ops ...ContractOperation) BuiltinOperation
说明 | 创建合约类型的提案 |
---|---|
参数 | |
参数1 (opts) | 一组合约类型的操作 |
应用实例
ope := bvm.NewContractDeployContractOperation(source, common.Hex2Bytes(bin), "evm", nil)
contractOpt := bvm.NewProposalCreateOperationForContract(ope)
4.2.2.2 命名提案创建
func NewProposalCreateOperationForCNS(ops ...CNSOperation) BuiltinOperation
说明 | 创建合约命名类型的提案 |
---|---|
参数 | |
参数1 (opts) | 一组合约命名类型的操作 |
应用实例
// addr 合约地址
// name 命名
setCNameOpt := bvm.NewCNSSetCNameOperation(addr, name)
cnsOpt := bvm.NewProposalCreateOperationForCNS(setCNameOpt)
4.2.2.3 节点类型的提案创建
func NewProposalCreateOperationForNode(ops ...NodeOperation) BuiltinOperation
说明 | 创建类型类型的提案 |
---|---|
参数 | |
参数1 (opts) | 一组节点类型的操作 |
应用实例
var operations []bvm.NodeOperation
operations = append(operations, bvm.NewNodeAddNodeOperation([]byte("pub"), "node1", "vp", "global"))
operations = append(operations, bvm.NewNodeAddVPOperation("node1", "global"))
operations = append(operations, bvm.NewNodeRemoveVPOperation("node1", "global"))
proposalCreateOperation := bvm.NewProposalCreateOperationForNode(operations...)
4.2.2.4 权限类型的提案创建
func NewProposalCreateOperationForPermission(ops ...PermissionOperation) BuiltinOperation
说明 | 创建权限类型的提案 |
---|---|
参数 | |
参数1 (opts) | 一组权限类型的操作 |
应用实例
var operations []bvm.PermissionOperation
operations = append(operations, bvm.NewPermissionCreateRoleOperation(managerRole))
operations = append(operations, bvm.NewPermissionGrantOperation(managerRole, notAdminAddress))
operations = append(operations, bvm.NewPermissionRevokeOperation(managerRole, notAdminAddress))
operations = append(operations, bvm.NewPermissionDeleteRoleOperation(managerRole))
proposalCreateOperation := bvm.NewProposalCreateOperationForPermission(operations...)
payload := bvm.EncodeOperation(proposalCreateOperation)
4.2.2.5 通过配置内容创建配置提案
func NewProposalCreateOperationForConfig(config []byte) (BuiltinOperation, error)
参数 | |
---|---|
参数1 | 配置内容 |
应用实例
var config = `
[filter]
enable = false
[[filter.rules]]
allow_anyone = false
authorized_roles = ["admin"]
forbidden_roles = ["20"]
id = 0
name = "bvm auth"
to = ["0x0000000000000000000000000000000000ffff02"]
vm = ["bvm"]
[consensus]
algo = "RBFT"
[consensus.pool]
batch_size = 20
pool_size = 3000
[consensus.set]
set_size = 20
[proposal]
timeout = "15m"
threshold = 3
`
operation, _ := bvm.NewProposalCreateOperationForConfig([]byte(config))
payload := bvm.EncodeOperation(operation)
4.2.2.6 通过配置类型操作创建配置提案
func NewProposalCreateOperationByConfigOps(ops ...ConfigOperation) BuiltinOperation
参数 | |
---|---|
参数1 | 一组配置类型的操作 |
应用实例
bvm.NewProposalCreateOperationByConfigOps(bvm.NewSetProposalThreshold(7))
4.2.2.7 提案投票
func NewProposalVoteOperation(proposalID int, vote bool) BuiltinOperation
说明 | 提案投票开关管理 |
---|---|
参数 | |
参数1 | 提案id |
参数2 | 是否开启投票 |
应用实例
operation := bvm.NewProposalVoteOperation(int(proposal.Id), false)
4.2.2.8 提案取消
func NewProposalCancelOperation(proposalID int) BuiltinOperation
参数 | |
---|---|
参数1 | 提案id |
应用实例
operation := bvm.NewProposalCancelOperation(2)
4.2.2.9 提案执行
func NewProposalExecuteOperation(proposalID int) BuiltinOperation
参数 | |
---|---|
参数1 | 提案id |
应用实例
operation := bvm.NewProposalExecuteOperation(2)
4.2.2.10 权限类型的操作----创建角色
func NewPermissionCreateRoleOperation(role string) PermissionOperation
参数 | |
---|---|
参数1 | 角色名 |
应用实例
managerRole := "manager"
bvm.NewPermissionCreateRoleOperation(managerRole)
4.2.2.11 权限类型的操作----删除角色
func NewPermissionDeleteRoleOperation(role string) PermissionOperation
参数 | |
---|---|
参数1 | 角色名 |
应用实例
managerRole := "manager"
bvm.NewPermissionCreateRoleOperation(managerRole)
4.2.2.12 权限类型的操作----权限授予
func NewPermissionGrantOperation(role string, address string) PermissionOperation
说明 | 给账户授予角色权限 |
---|---|
参数 | |
参数1 | 角色名 |
参数2 | 账户地址 |
应用实例
pwd := "12345678"
nonAdminAcc, _ := account.NewAccount(pwd)
key, _ := account.GenKeyFromAccountJson(nonAdminAcc, pwd)
addr := key.(account.Key).GetAddress().Hex()
createRole := bvm.NewPermissionGrantOperation(role, addr)
operation := bvm.NewProposalCreateOperationForPermission(createRole)
payload := bvm.EncodeOperation(operation)
4.2.2.13 权限类型的操作----删除权限
func NewPermissionRevokeOperation(role string, address string) PermissionOperation
说明 | 给账户角色权限删除 |
---|---|
参数 | |
参数1 | 角色名 |
参数2 | 账户地址 |
应用实例
pwd := "12345678"
nonAdminAcc, _ := account.NewAccount(pwd)
key, _ := account.GenKeyFromAccountJson(nonAdminAcc, pwd)
addr := key.(account.Key).GetAddress().Hex()
revokeRole := bvm.NewPermissionRevokeOperation(role, addr)
operation := bvm.NewProposalCreateOperationForPermission(revokeRole)
payload := bvm.EncodeOperation(operation)
4.2.2.14 节点类型的操作----添加节点
func NewNodeAddNodeOperation(pub []byte, hostname, role, namespace string) NodeOperation
参数 | |
---|---|
参数1 | 对应节点公钥或者证书的byte数组 |
参数2 | 节点名 |
参数3 | 节点角色 |
参数4 | 节点namespace |
应用实例
bvm.NewNodeAddNodeOperation([]byte("pub"), "node1", "vp", "global")
4.2.2.15 节点类型的操作----启动vp
func NewNodeAddVPOperation(hostname, namespace string) NodeOperation
参数 | |
---|---|
参数1 | 节点名 |
参数2 | 节点namespace |
应用实例
bvm.NewNodeAddVPOperation("node1", "global")
4.2.2.16 节点类型的操作----删除vp
func NewNodeRemoveVPOperation(hostname, namespace string) NodeOperation
参数 | |
---|---|
参数1 | 节点名 |
参数2 | 节点namespace |
应用实例
bvm.NewNodeRemoveVPOperation("node1", "global")
4.2.2.17 合约命名类型的操作----设定合约名
func NewCNSSetCNameOperation(address string, cnsName string) CNSOperation
参数 | |
---|---|
参数1 | 合约地址 |
参数2 | 合约名 |
应用实例
addr := "0x0000000000000000000000000000000000ffff01"
name := "HashContract"
setCNameOpt := bvm.NewCNSSetCNameOperation(addr, name)
4.2.2.18 合约类型的操作----部署合约
func NewContractDeployContractOperation(source, bin []byte, vmType string, compileOpts map[string]string) ContractOperation
参数 | |
---|---|
参数1 | 合约源文件 |
参数2 | 合约编译后bin |
参数3 | 虚拟机类型 |
参数4 | 编译选项 |
应用实例
source, _ := ioutil.ReadFile("../conf/contract/Accumulator.sol")
ope := bvm.NewContractDeployContractOperation(source, common.Hex2Bytes(binContract), "evm", nil)
4.2.2.19 合约类型的操作----升级合约
func NewContractUpgradeContractOperation(source, bin []byte, vmType, contractAddress string, compileOpts map[string]string) ContractOperation
说明 | 升级已部署的合约 |
---|---|
参数 | |
参数1 | 合约源文件 |
参数2 | 合约编译后bin |
参数3 | 虚拟机类型 |
参数4 | 已部署的合约地址 |
参数5 | 编译选项 |
应用实例
source, _ := ioutil.ReadFile("../conf/contract/Accumulator.sol")
// contractAddress 已部署合约地址
ope := bvm.NewContractUpgradeContractOperation(source, common.Hex2Bytes(binContract), "evm", contractAddr, nil)
4.2.2.20 合约类型的操作----通过合约名升级合约
func NewContractUpgradeOperationByName(source, bin []byte, vmType, contractName string, compileOpts map[string]string) ContractOperation
说明 | 升级已部署的合约 |
---|---|
参数 | |
参数1 | 合约源文件 |
参数2 | 合约编译后bin |
参数3 | 虚拟机类型 |
参数4 | 已部署的合约名 |
参数5 | 编译选项 |
应用实例
source, _ := ioutil.ReadFile("../conf/contract/Accumulator.sol")
// contractName 已部署合约名
ope := bvm.NewContractUpgradeOperationByName(source, common.Hex2Bytes(binContract), "evm", contractName, nil)
4.2.2.21 合约类型的操作----管理合约
func NewContractMaintainContractOperation(contractAddress, vmType string, opcode int) ContractOperation
参数 | |
---|---|
参数1 | 合约地址 |
参数2 | 虚拟机类型 |
参数3 | 操作码, 1 合约升级, 2 冻结合约, 3 解冻合约 |
应用实例
// contractAddr 合约地址
bvm.NewContractMaintainContractOperation(contractAddr, "evm", 2)
4.2.2.22 合约类型的操作----通过合约名管理合约
func NewContractMaintainOperationByName(contractName, vmType string, opcode int) ContractOperation
参数 | |
---|---|
参数1 | 合约名 |
参数2 | 虚拟机类型 |
参数3 | 操作码, 1 合约升级, 2 冻结合约, 3 解冻合约 |
应用实例
// contractName 合约名
bvm.NewContractMaintainOperationByName(contractName, "evm", 2)
4.2.3.1 set
func NewHashSetOperation(key, value string) BuiltinOperation
参数 | |
---|---|
参数1 | 存储的键 |
参数2 | 存储的值 |
返回值 | |
返回值1 | BuiltinOperation |
应用实例
operation := bvm.NewHashSetOperation("0x1231", "0x456")
payload := bvm.EncodeOperation(operation)
4.2.3.2 get
func NewHashGetOperation(key string) BuiltinOperation
参数 | |
---|---|
参数1 | 存储的键 |
返回值 | |
返回值1 | BuiltinOperation |
应用实例
operation := bvm.NewHashGetOperation("0x1231")
payload := bvm.EncodeOperation(operation)
4.2.4.1 账户注册
func NewAccountRegisterOperation(address string, cert []byte) BuiltinOperation
参数 | |
---|---|
参数1 | 合约地址 |
参数2 | 证书byte数组 |
应用实例
addr := "0x42a815e75604dd69707ba4aa9d350a59d1e530e7"
cert1 := []byte(`-----BEGIN CERTIFICATE-----
MIICMTCCAd2gAwIBAgIIcB4Bo1m3X4wwCgYIKoZIzj0EAwIwdDEJMAcGA1UECBMA
MQkwBwYDVQQHEwAxCTAHBgNVBAkTADEJMAcGA1UEERMAMQ4wDAYDVQQKEwVmbGF0
bzEJMAcGA1UECxMAMQ4wDAYDVQQDEwVub2RlMTELMAkGA1UEBhMCWkgxDjAMBgNV
BCoTBWVjZXJ0MB4XDTIwMTAxOTAwMDAwMFoXDTIwMTAxOTAwMDAwMFowPTELMAkG
A1UEBhMCQ04xDjAMBgNVBAoTBWZsYXRvMQ4wDAYDVQQDEwVub2RlMTEOMAwGA1UE
KhMFZWNlcnQwVjAQBgcqhkjOPQIBBgUrgQQACgNCAASN1aGLwcwb/1c4NCaT6vAY
A38Z5394RgUES1SlmrYWFCxwpOkpozPgMqZ+tS5PhFRt857ChrUujXzb6PWi6XVh
o4GSMIGPMA4GA1UdDwEB/wQEAwIB7jAxBgNVHSUEKjAoBggrBgEFBQcDAgYIKwYB
BQUHAwEGCCsGAQUFBwMDBggrBgEFBQcDBDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQW
BBSl7MAm0apBmKIN7fyBLcS7Y/w6hTAPBgNVHSMECDAGgAQBAgMEMAwGAypWAQQF
ZWNlcnQwCgYIKoZIzj0EAwIDQgDJ3kJ3uX/23BM9JqCwlDpympv6Eu0OPriz4KgG
72Hr7xRJOrmZ14waO/I4jAvba7+J1uaNIv0K6EDjJplNzvPEAA==
-----END CERTIFICATE-----
`)
bvm.NewAccountRegisterOperation(addr, cert1)
4.2.4.2 删除账户
func NewAccountAbandonOperation(address string, sdkCert []byte) BuiltinOperation
参数 | |
---|---|
参数1 | 合约地址 |
参数2 | 证书byte数组 |
addr := "0x42a815e75604dd69707ba4aa9d350a59d1e530e7"
cert1 := []byte(`-----BEGIN CERTIFICATE-----
MIICMTCCAd2gAwIBAgIIcB4Bo1m3X4wwCgYIKoZIzj0EAwIwdDEJMAcGA1UECBMA
MQkwBwYDVQQHEwAxCTAHBgNVBAkTADEJMAcGA1UEERMAMQ4wDAYDVQQKEwVmbGF0
bzEJMAcGA1UECxMAMQ4wDAYDVQQDEwVub2RlMTELMAkGA1UEBhMCWkgxDjAMBgNV
BCoTBWVjZXJ0MB4XDTIwMTAxOTAwMDAwMFoXDTIwMTAxOTAwMDAwMFowPTELMAkG
A1UEBhMCQ04xDjAMBgNVBAoTBWZsYXRvMQ4wDAYDVQQDEwVub2RlMTEOMAwGA1UE
KhMFZWNlcnQwVjAQBgcqhkjOPQIBBgUrgQQACgNCAASN1aGLwcwb/1c4NCaT6vAY
A38Z5394RgUES1SlmrYWFCxwpOkpozPgMqZ+tS5PhFRt857ChrUujXzb6PWi6XVh
o4GSMIGPMA4GA1UdDwEB/wQEAwIB7jAxBgNVHSUEKjAoBggrBgEFBQcDAgYIKwYB
BQUHAwEGCCsGAQUFBwMDBggrBgEFBQcDBDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQW
BBSl7MAm0apBmKIN7fyBLcS7Y/w6hTAPBgNVHSMECDAGgAQBAgMEMAwGAypWAQQF
ZWNlcnQwCgYIKoZIzj0EAwIDQgDJ3kJ3uX/23BM9JqCwlDpympv6Eu0OPriz4KgG
72Hr7xRJOrmZ14waO/I4jAvba7+J1uaNIv0K6EDjJplNzvPEAA==
-----END CERTIFICATE-----
`)
bvm.NewAccountAbandonOperation(addr, cert1)
4.2.5.1 证书吊销
func NewCertRevokeOperation(cert, priv []byte) (BuiltinOperation, error)
参数 | |
---|---|
参数1 | 证书byte数组 |
参数2 | 证书私钥byte数组 |
返回值 | |
返回值1 | 内置合约操作BuiltinOperation |
返回值2 | error |
应用实例
ecert := []byte("-----BEGIN CERTIFICATE-----\nMIICHzCCAcSgAwIBAgIIapt5s0h7G4owCgYIKoEcz1UBg3UwPTELMAkGA1UEBhMC\nQ04xEzARBgNVBAoTCkh5cGVyY2hhaW4xDjAMBgNVBAMTBW5vZGUxMQkwBwYDVQQq\nEwAwIBcNMjEwMzI1MDAwMDAwWhgPMjEyMTAzMjUwMDAwMDBaMEQxCzAJBgNVBAYT\nAkNOMRMwEQYDVQQKEwpIeXBlcmNoYWluMQ4wDAYDVQQDEwVub2RlNTEQMA4GA1UE\nKhMHc2RrY2VydDBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABG401JscKfKj0rT3\nxN8Dwyen8mVCnXC3GBNkaENJEnqOO4jw0wT331CcX47bHMcSMRfpprbbv4cUj8cV\ncXNa9J6jgaQwgaEwDgYDVR0PAQH/BAQDAgHuMDEGA1UdJQQqMCgGCCsGAQUFBwMC\nBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEMAwGA1UdEwEB/wQCMAAwHQYD\nVR0OBBYEFPT6cvqWN9MBuhhlnmPrCQZG2iKoMB8GA1UdIwQYMBaAFJq1kzm0Q76P\nxf84+ZRlfrWBKy27MA4GAypWAQQHc2RrY2VydDAKBggqgRzPVQGDdQNJADBGAiEA\n3vcQvDi91E5GTsvV/IhKqrfuLkrnudN+3+QtocUX2IMCIQC6Ct1CS4c60SaE59tI\n3a/wjXSyWIYGN6Rwt0k0KFbF+w==\n-----END CERTIFICATE-----\n")
priv := []byte("-----BEGIN EC PRIVATE KEY-----\nMHgCAQECIQClNEoZsGgZLfdMgYyMCWH8I0PLZynFp2U+wnsSzJ6z+6AKBggqgRzP\nVQGCLaFEA0IABG401JscKfKj0rT3xN8Dwyen8mVCnXC3GBNkaENJEnqOO4jw0wT3\n31CcX47bHMcSMRfpprbbv4cUj8cVcXNa9J4=\n-----END EC PRIVATE KEY-----\n")
operation, ferr := bvm.NewCertRevokeOperation(ecert, priv)
4.2.5.2 证书冻结
func NewCertFreezeOperation(cert, priv []byte) (BuiltinOperation, error)
参数 | |
---|---|
参数1 | 证书byte数组 |
参数2 | 证书私钥byte数组 |
返回值 | |
返回值1 | 内置合约操作BuiltinOperation |
返回值2 | error |
应用实例
ecert := []byte("-----BEGIN CERTIFICATE-----\nMIICHzCCAcSgAwIBAgIIapt5s0h7G4owCgYIKoEcz1UBg3UwPTELMAkGA1UEBhMC\nQ04xEzARBgNVBAoTCkh5cGVyY2hhaW4xDjAMBgNVBAMTBW5vZGUxMQkwBwYDVQQq\nEwAwIBcNMjEwMzI1MDAwMDAwWhgPMjEyMTAzMjUwMDAwMDBaMEQxCzAJBgNVBAYT\nAkNOMRMwEQYDVQQKEwpIeXBlcmNoYWluMQ4wDAYDVQQDEwVub2RlNTEQMA4GA1UE\nKhMHc2RrY2VydDBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABG401JscKfKj0rT3\nxN8Dwyen8mVCnXC3GBNkaENJEnqOO4jw0wT331CcX47bHMcSMRfpprbbv4cUj8cV\ncXNa9J6jgaQwgaEwDgYDVR0PAQH/BAQDAgHuMDEGA1UdJQQqMCgGCCsGAQUFBwMC\nBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEMAwGA1UdEwEB/wQCMAAwHQYD\nVR0OBBYEFPT6cvqWN9MBuhhlnmPrCQZG2iKoMB8GA1UdIwQYMBaAFJq1kzm0Q76P\nxf84+ZRlfrWBKy27MA4GAypWAQQHc2RrY2VydDAKBggqgRzPVQGDdQNJADBGAiEA\n3vcQvDi91E5GTsvV/IhKqrfuLkrnudN+3+QtocUX2IMCIQC6Ct1CS4c60SaE59tI\n3a/wjXSyWIYGN6Rwt0k0KFbF+w==\n-----END CERTIFICATE-----\n")
priv := []byte("-----BEGIN EC PRIVATE KEY-----\nMHgCAQECIQClNEoZsGgZLfdMgYyMCWH8I0PLZynFp2U+wnsSzJ6z+6AKBggqgRzP\nVQGCLaFEA0IABG401JscKfKj0rT3xN8Dwyen8mVCnXC3GBNkaENJEnqOO4jw0wT3\n31CcX47bHMcSMRfpprbbv4cUj8cVcXNa9J4=\n-----END EC PRIVATE KEY-----\n")
operation, ferr := bvm.NewCertFreezeOperation(ecert, priv)
4.2.5.3 证书解冻
func NewCertUnfreezeOperation(cert, priv []byte) (BuiltinOperation, error)
参数 | |
---|---|
参数1 | 证书byte数组 |
参数2 | 证书私钥byte数组 |
返回值 | |
返回值1 | 内置合约操作BuiltinOperation |
返回值2 | error |
应用实例
ecert := []byte("-----BEGIN CERTIFICATE-----\nMIICHzCCAcSgAwIBAgIIapt5s0h7G4owCgYIKoEcz1UBg3UwPTELMAkGA1UEBhMC\nQ04xEzARBgNVBAoTCkh5cGVyY2hhaW4xDjAMBgNVBAMTBW5vZGUxMQkwBwYDVQQq\nEwAwIBcNMjEwMzI1MDAwMDAwWhgPMjEyMTAzMjUwMDAwMDBaMEQxCzAJBgNVBAYT\nAkNOMRMwEQYDVQQKEwpIeXBlcmNoYWluMQ4wDAYDVQQDEwVub2RlNTEQMA4GA1UE\nKhMHc2RrY2VydDBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABG401JscKfKj0rT3\nxN8Dwyen8mVCnXC3GBNkaENJEnqOO4jw0wT331CcX47bHMcSMRfpprbbv4cUj8cV\ncXNa9J6jgaQwgaEwDgYDVR0PAQH/BAQDAgHuMDEGA1UdJQQqMCgGCCsGAQUFBwMC\nBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEMAwGA1UdEwEB/wQCMAAwHQYD\nVR0OBBYEFPT6cvqWN9MBuhhlnmPrCQZG2iKoMB8GA1UdIwQYMBaAFJq1kzm0Q76P\nxf84+ZRlfrWBKy27MA4GAypWAQQHc2RrY2VydDAKBggqgRzPVQGDdQNJADBGAiEA\n3vcQvDi91E5GTsvV/IhKqrfuLkrnudN+3+QtocUX2IMCIQC6Ct1CS4c60SaE59tI\n3a/wjXSyWIYGN6Rwt0k0KFbF+w==\n-----END CERTIFICATE-----\n")
priv := []byte("-----BEGIN EC PRIVATE KEY-----\nMHgCAQECIQClNEoZsGgZLfdMgYyMCWH8I0PLZynFp2U+wnsSzJ6z+6AKBggqgRzP\nVQGCLaFEA0IABG401JscKfKj0rT3xN8Dwyen8mVCnXC3GBNkaENJEnqOO4jw0wT3\n31CcX47bHMcSMRfpprbbv4cUj8cVcXNa9J4=\n-----END EC PRIVATE KEY-----\n")
operation, ferr := bvm.NewCertUnfreezeOperation(ecert, priv)
4.2.5.4 证书检查
func NewCertCheckOperation(cert []byte) BuiltinOperation
参数 | |
---|---|
参数1 | 证书byte数组 |
返回值 | |
返回值1 | 内置合约操作BuiltinOperation |
应用实例
ecert := []byte("-----BEGIN CERTIFICATE-----\nMIICHzCCAcSgAwIBAgIIapt5s0h7G4owCgYIKoEcz1UBg3UwPTELMAkGA1UEBhMC\nQ04xEzARBgNVBAoTCkh5cGVyY2hhaW4xDjAMBgNVBAMTBW5vZGUxMQkwBwYDVQQq\nEwAwIBcNMjEwMzI1MDAwMDAwWhgPMjEyMTAzMjUwMDAwMDBaMEQxCzAJBgNVBAYT\nAkNOMRMwEQYDVQQKEwpIeXBlcmNoYWluMQ4wDAYDVQQDEwVub2RlNTEQMA4GA1UE\nKhMHc2RrY2VydDBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABG401JscKfKj0rT3\nxN8Dwyen8mVCnXC3GBNkaENJEnqOO4jw0wT331CcX47bHMcSMRfpprbbv4cUj8cV\ncXNa9J6jgaQwgaEwDgYDVR0PAQH/BAQDAgHuMDEGA1UdJQQqMCgGCCsGAQUFBwMC\nBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEMAwGA1UdEwEB/wQCMAAwHQYD\nVR0OBBYEFPT6cvqWN9MBuhhlnmPrCQZG2iKoMB8GA1UdIwQYMBaAFJq1kzm0Q76P\nxf84+ZRlfrWBKy27MA4GAypWAQQHc2RrY2VydDAKBggqgRzPVQGDdQNJADBGAiEA\n3vcQvDi91E5GTsvV/IhKqrfuLkrnudN+3+QtocUX2IMCIQC6Ct1CS4c60SaE59tI\n3a/wjXSyWIYGN6Rwt0k0KFbF+w==\n-----END CERTIFICATE-----\n")
operation, ferr := bvm.NewCertCheckOperation(ecert, priv)
4.2.6.1 设置chainId
func NewDIDSetChainIDOperation(chainID string) BuiltinOperation
说明 | 通过创世账户来设置链的chainId,来激活DID服务 |
---|
应用实例
accountJson := `{"address":"0xfbca6a7e9e29728773b270d3f00153c75d04e1ad","version":"4.0","algo":"0x13","publicKey":"049c330d0aea3d9c73063db339b4a1a84d1c3197980d1fb9585347ceeb40a5d262166ee1e1cb0c29fd9b2ef0e4f7a7dfb1be6c5e759bf411c520a616863ee046a4","privateKey":"5f0a3ea6c1d3eb7733c3170f2271c10c1206bc49b6b2c7e550c9947cb8f098e3"}`
key, _ := account.GenKeyFromAccountJson(accountJson, "")
opt := bvm.NewDIDSetChainIDOperation("chainID_01")
payload := bvm.EncodeOperation(opt)
// 发送交易
tx := rpc.NewTransaction(key.(account.Key).GetAddress().Hex()).Invoke(opt.Address(), payload).VMType(BVM)
rpc.SignAndInvokeContract(tx, key)
abi解析后的结构如下
type BeanAbi struct {
BeanVersion Version `json:"version"`
BeanName string `json:"beanName"`
Inputs []Entry `json:"inputs"`
Output Entry `json:"output"`
ClassBytes string `json:"classBytes"`
Structs []Entry `json:"structs"`
BeanType BeanType `json:"beanType"`
}
type Entry struct {
Name string `json:"name"`
EntryType Type `json:"type"`
Properties []Entry `json:"properties,omitempty"`
StructName string `json:"structName,omitempty"`
}
4.3.1.1 通过abiJson字符串解析合约
func GenAbi(abiJson string) (Abi, error)
应用实例
abiPath := "../hvmtestfile/fibonacci/hvm.abi"
abiJson, rerr := common.ReadFileAsString(abiPath)
abi, gerr := hvm.GenAbi(abiJson)
4.3.1.2 获取待调用的方法
func (abi Abi) GetBeanAbi(beanName string) (*BeanAbi, error)
参数 | |
---|---|
参数1 | 方法在abi中的名字 |
返回值 | |
返回值1 | beanAbi结构体 |
返回值2 | error |
应用实例
methodInvokeAbi := "../hvmtestfile/methodInvoke/hvm.abi"
abiJson, err := common.ReadFileAsString(methodInvokeAbi)
abi, err := hvm.GenAbi(abiJson)
easyBean := "invoke.InvokeFibonacci"
beanAbi, err := abi.GetBeanAbi(easyBean)
func (abi Abi) GetMethodAbi(methodName string) (*BeanAbi, error)
参数 | |
---|---|
参数1 | 合约方法签名 |
返回值 | |
返回值1 | beanAbi结构体 |
返回值2 | error |
应用实例
methodInvokeAbi := "../hvmtestfile/methodInvoke/hvm.abi"
abiJson, err := common.ReadFileAsString(methodInvokeAbi)
abi, err := hvm.GenAbi(abiJson)
_, err = abi.GetMethodAbi("Hello")
methodAbi3, err := abi.GetMethodAbi("Hello(java.lang.String)")
methodAbi4, err := abi.GetMethodAbi("Hello(int,java.lang.String)")
4.3.1.3 编码beanAbi
func GenPayload(beanAbi *BeanAbi, params ...interface{}) ([]byte, error)
参数 | |
---|---|
参数1 | beanAbi的实例 |
参数2 | beanAbi对应的合约方法的参数 |
返回值 | |
返回值1 | 编码后的beanAbi |
返回值2 | error |
应用实例
methodInvokeAbi := "../hvmtestfile/methodInvoke/hvm.abi"
abiJson, err := common.ReadFileAsString(methodInvokeAbi)
abi, err := hvm.GenAbi(abiJson)
easyBean := "invoke.InvokeFibonacci"
beanAbi, err := abi.GetBeanAbi(easyBean)
payload, err := hvm.GenPayload(beanAbi)
4.3.1.4 payload解码
type PayLoad struct {
InvokeBeanName string `json:"invokeBeanName"`
InvokeArgs string `json:"invokeArgs"`
InvokeMethods []string `json:"invokeMethods"`
}
func DecodePayload(pl string) (*PayLoad, error)
参数 | |
---|---|
参数1 | payload的十六进制字符串 |
返回值 | |
返回值1 | PayLoad结构体 |
返回值2 | error |
应用实例
result, err := hvm.DecodePayload("0xfefffbce00087472616e736665720010000000036a6176612e6c616e672e537472696e674141410010000000036a6176612e6c616e672e537472696e674242420004000000036c6f6e67313030")
jar包部署合约需要对jar包进行编码
func DecompressFromJar(filepath string) ([]byte, error)
参数 | |
---|---|
参数1 | jar包文件路径 |
返回值 | |
返回值1 | 编码后的byte数组 |
返回值2 | error |
应用实例
jarPath := "../hvmtestfile/hvm-first-1.0.jar"
payload, sysErr := rpc.DecompressFromJar(jarPath)
transaction := rpc.NewTransaction(ecKey.GetAddress().Hex()).Deploy(common.Bytes2Hex(payload)).VMType(rpc.HVM)
type ResultSet struct {
columnCount uint32
lastInsertID uint64
updatedCount uint32
rowNumber int // the number of rows
resChunk *resultChunk
columnInfo []*Field
}
4.4.1.1 解回执为ResultSet
func DecodeRecordSet(buf []byte) *ResultSet
参数 | |
---|---|
参数1 | 交易回执的ret字段解码成byte数组 |
返回值 | |
返回值1 | sql执行结果的结构体实例 |
应用实例
b, _ := hexutil.Decode(res.Ret)
rs := kvsql.DecodeRecordSet(b)
4.1.1.2 获取列数
func (c ResultSet) ColumnCount() uint32
answer := "0x0035000000053654333354053654333354066175746f4964066175746f49643f000b000000030502000536543333540536543333540574797065300574797065303f000b000000030300000536543333540536543333540574797065310574797065313f000a000000032000000536543333540536543333540574797065320574797065323f0014000000080000000536543333540536543333540574797065330574797065333f0014000000082800000536543333540536543333540574797065340574797065343f000c0000000408001f0536543333540536543333540574797065350574797065353f00ff0000000408001e0536543333540536543333540574797065360574797065363f00ff0000000408001e0536543333540536543333540574797065370574797065373f00160000000508001f0536543333540536543333540574797065380574797065383f00ff0000000500001e0536543333540536543333540574797065390574797065393f000b000000f600000005365433335405365433335406747970653130067479706531303f0020000000f600001e05365433335405365433335406747970653131067479706531313f000b000000f600000005365433335405365433335406747970653132067479706531323f0016000000f600001405365433335405365433335406747970653133067479706531333f00090000000900000005365433335405365433335406747970653134067479706531343f00080000000920000005365433335405365433335406747970653135067479706531353f00060000000200000005365433335405365433335406747970653136067479706531363f00040000000100000005365433335405365433335406747970653137067479706531373f00030000000120000005365433335405365433335406747970653138067479706531383f00050000000220000005365433335405365433335406747970653139067479706531393f000a0000000a80000005365433335405365433335406747970653230067479706532303f00130000000c80000005365433335405365433335406747970653231067479706532313f000a0000000b80000005365433335405365433335406747970653232067479706532323f00130000000780000005365433335405365433335406747970653233067479706532333f00040000000d60000005365433335405365433335406747970653234067479706532342e0000000000fe00000005365433335405365433335406747970653235067479706532352e0004000000fe00000005365433335405365433335406747970653236067479706532362e00fc030000fe00000005365433335405365433335406747970653237067479706532372e0000000000fd00000005365433335405365433335406747970653238067479706532382e0004000000fd00000005365433335405365433335406747970653239067479706532392e00fc030000fd00000005365433335405365433335406747970653330067479706533303f0000000000fe80000005365433335405365433335406747970653331067479706533313f0001000000fe80000005365433335405365433335406747970653332067479706533323f00ff000000fe80000005365433335405365433335406747970653333067479706533333f00ffff0000fc80000005365433335405365433335406747970653334067479706533343f00ff000000f980000005365433335405365433335406747970653335067479706533353f00ffffff00fa80000005365433335405365433335406747970653336067479706533362e0058020000fc00000005365433335405365433335406747970653337067479706533372e00fcffff03fa00000005365433335405365433335406747970653338067479706533383f0001000000fd80000005365433335405365433335406747970653339067479706533392e0000000000fe00000005365433335405365433335406747970653430067479706534302e0004000000fe00000005365433335405365433335406747970653431067479706534312e0010000000fe00000005365433335405365433335406747970653432067479706534322e0000000000fe00000005365433335405365433335406747970653433067479706534332e0004000000fe00000005365433335405365433335406747970653434067479706534342e00d4030000fe00000005365433335405365433335406747970653435067479706534353f00010000001020000005365433335405365433335406747970653436067479706534363f00400000001020000005365433335405365433335406747970653437067479706534373f00010000000100000005365433335405365433335406747970653438067479706534382e00fcffff03fa00000005365433335405365433335406747970653439067479706534392e00fcffff03fa00000005365433335405365433335406747970653530067479706535302e0004000000fe00000005365433335405365433335406747970653531067479706535312e0004000000fd00000001000000040907000001010100000000049e732b7b010101000000000415d0870701010100000000083aa1ffffffffffff010101000000000871575519bfcd04020101010000000004ba0f9f3e01010100000000044d6d6e3f0101010000000004d66cc3be0101010000000008a4a6c8fae881e83f0101010000000008aba76123a72be63f01010100000000052d313731340101020000000005000000212d302e3233363530303030303030303030303030303030303030303030303030300101020000000021000000062d3531343132010102000000000600000016302e383433303030303030303030303030303030303001010200000000160000000453d955000101010000000004c3d1180001010100000000024b2d0101010000000001660101010000000001170101010000000002282d01010100000000080e0000000054c91d0101010000000008000000287342f21d0101010000000008001ef1cdf239000001010100000000080100007524a8b01f0101010000000002770701010100000000000101020000000000000000013001010200000000010000006436383036323439363639373332383534303836393332373339363837343432383138343539323234343837313936333534323934343333343031373936333438363830353736303134373133383232343632323236353730393639323939303039353035010102000000006400000000010102000000000000000001640101020000000001000000fcff007a4f3979704e654c456e63684f69784944304b527637704134794e6638346e6649317076333252367a737a6246486a34527479447645574e644772557738715161576573774552307464454f50746b4d5a506b50673669564c585551445464486d71674e6736487351665639637134636772735436686e557063736463416e3041584f684f596c65636f34426a44464c7a62424e5276516c6c644632684b413355636c4a7350757738726c616363517872763663655851556c74427a414861773264456b4c4252597a53444e4d5a3033735534456b52666e6a48454e564e6730416f6c5a66355356753059486a426768563148355930654b4b7661735a473101010200000000ff000000000101020000000000000000012a0101020000000001000000fcff00ccd82dbce2a48abe65f391308024cff5bb3971c2aa2761f10c52476cc9e3235206b47528a36eb3767dc50852ed3ebfa5b17a0b47ed2a5a2b56ead26c5b96c805ca65e22eaabbc7af1560e71e57ca734ca952ed17f54285d4feecd11c0d5ba0e679c464cf1196373f427c41a8e9f5c157f78834f2e57c06aa5d5af0682504349f796518eca8f4f33dbf53a9dfa30e1f4232106825d8695817ae992d70fc0a30c8b4f9d232701d948d6a9199acd8e5ce94b5aa50af5929555b91f124167fde826315ba922120d8d4f6c5d1fcbdb08708521f9f91a7e84366f08b90bccbb18186660fe49d5ca270dbe476b3f4c7a7418b51d37cf38c7c55e5c784257dde277a4f01010200000000ff00000064279e9d01d72ec83ad3ae46ce057466371ba263f62a726018347135ec8619bc835e5f215431902b181ff2e41c6a28115a1e01b50ed33faad7601416032c3d2911b00b25e051f1f3676b082aa98d618f251c5b984976c4a89f7ed84ad8ef0ff22cdf05f1c50101020000000064000000189bc7836679d2fb8bf55d01daa0c7b7791a01b2d9359ec8ea010102000000001800000064892df41245164975050a48fdc2a262b012f29e95763cb507bd5df48b339d1539a988202f99d31cfe072df1696a58529b7813d848a4edcf9133bdbe67b4449b0718b07839471e35a6a798f9f17d6db70aee9b989e88d19dc9e363fc5906c4abb7d1bae32a0101020000000064000000143635363636373638363937303731373237333734010102000000001400000014363836393730373137323733373437353736373701010200000000140000000116010102000000000100000000010002000000000000000001610101020000000001000000046132373501010200000000040000000001000200000000000000000001000200000000000000000c61302c61312c61322c613630010102000000000c00000001000101020000000001000000087fffffffffffffff01010200000000080000000150010101000000001437323733373437353736373737383739383038310101020000000014000000143635363636373638363937303731373237333734010102000000001400000001390101020000000001000000016b0101020000000001000000"
b, _ := hexutil.Decode(answer)
rs := kvsql.DecodeRecordSet(b)
rs.ColumnCount()
4.1.1.3 获取lastInsertId
func (c ResultSet) LastInsertID() uint64
answer := "0x0035000000053654333354053654333354066175746f4964066175746f49643f000b000000030502000536543333540536543333540574797065300574797065303f000b000000030300000536543333540536543333540574797065310574797065313f000a000000032000000536543333540536543333540574797065320574797065323f0014000000080000000536543333540536543333540574797065330574797065333f0014000000082800000536543333540536543333540574797065340574797065343f000c0000000408001f0536543333540536543333540574797065350574797065353f00ff0000000408001e0536543333540536543333540574797065360574797065363f00ff0000000408001e0536543333540536543333540574797065370574797065373f00160000000508001f0536543333540536543333540574797065380574797065383f00ff0000000500001e0536543333540536543333540574797065390574797065393f000b000000f600000005365433335405365433335406747970653130067479706531303f0020000000f600001e05365433335405365433335406747970653131067479706531313f000b000000f600000005365433335405365433335406747970653132067479706531323f0016000000f600001405365433335405365433335406747970653133067479706531333f00090000000900000005365433335405365433335406747970653134067479706531343f00080000000920000005365433335405365433335406747970653135067479706531353f00060000000200000005365433335405365433335406747970653136067479706531363f00040000000100000005365433335405365433335406747970653137067479706531373f00030000000120000005365433335405365433335406747970653138067479706531383f00050000000220000005365433335405365433335406747970653139067479706531393f000a0000000a80000005365433335405365433335406747970653230067479706532303f00130000000c80000005365433335405365433335406747970653231067479706532313f000a0000000b80000005365433335405365433335406747970653232067479706532323f00130000000780000005365433335405365433335406747970653233067479706532333f00040000000d60000005365433335405365433335406747970653234067479706532342e0000000000fe00000005365433335405365433335406747970653235067479706532352e0004000000fe00000005365433335405365433335406747970653236067479706532362e00fc030000fe00000005365433335405365433335406747970653237067479706532372e0000000000fd00000005365433335405365433335406747970653238067479706532382e0004000000fd00000005365433335405365433335406747970653239067479706532392e00fc030000fd00000005365433335405365433335406747970653330067479706533303f0000000000fe80000005365433335405365433335406747970653331067479706533313f0001000000fe80000005365433335405365433335406747970653332067479706533323f00ff000000fe80000005365433335405365433335406747970653333067479706533333f00ffff0000fc80000005365433335405365433335406747970653334067479706533343f00ff000000f980000005365433335405365433335406747970653335067479706533353f00ffffff00fa80000005365433335405365433335406747970653336067479706533362e0058020000fc00000005365433335405365433335406747970653337067479706533372e00fcffff03fa00000005365433335405365433335406747970653338067479706533383f0001000000fd80000005365433335405365433335406747970653339067479706533392e0000000000fe00000005365433335405365433335406747970653430067479706534302e0004000000fe00000005365433335405365433335406747970653431067479706534312e0010000000fe00000005365433335405365433335406747970653432067479706534322e0000000000fe00000005365433335405365433335406747970653433067479706534332e0004000000fe00000005365433335405365433335406747970653434067479706534342e00d4030000fe00000005365433335405365433335406747970653435067479706534353f00010000001020000005365433335405365433335406747970653436067479706534363f00400000001020000005365433335405365433335406747970653437067479706534373f00010000000100000005365433335405365433335406747970653438067479706534382e00fcffff03fa00000005365433335405365433335406747970653439067479706534392e00fcffff03fa00000005365433335405365433335406747970653530067479706535302e0004000000fe00000005365433335405365433335406747970653531067479706535312e0004000000fd00000001000000040907000001010100000000049e732b7b010101000000000415d0870701010100000000083aa1ffffffffffff010101000000000871575519bfcd04020101010000000004ba0f9f3e01010100000000044d6d6e3f0101010000000004d66cc3be0101010000000008a4a6c8fae881e83f0101010000000008aba76123a72be63f01010100000000052d313731340101020000000005000000212d302e3233363530303030303030303030303030303030303030303030303030300101020000000021000000062d3531343132010102000000000600000016302e383433303030303030303030303030303030303001010200000000160000000453d955000101010000000004c3d1180001010100000000024b2d0101010000000001660101010000000001170101010000000002282d01010100000000080e0000000054c91d0101010000000008000000287342f21d0101010000000008001ef1cdf239000001010100000000080100007524a8b01f0101010000000002770701010100000000000101020000000000000000013001010200000000010000006436383036323439363639373332383534303836393332373339363837343432383138343539323234343837313936333534323934343333343031373936333438363830353736303134373133383232343632323236353730393639323939303039353035010102000000006400000000010102000000000000000001640101020000000001000000fcff007a4f3979704e654c456e63684f69784944304b527637704134794e6638346e6649317076333252367a737a6246486a34527479447645574e644772557738715161576573774552307464454f50746b4d5a506b50673669564c585551445464486d71674e6736487351665639637134636772735436686e557063736463416e3041584f684f596c65636f34426a44464c7a62424e5276516c6c644632684b413355636c4a7350757738726c616363517872763663655851556c74427a414861773264456b4c4252597a53444e4d5a3033735534456b52666e6a48454e564e6730416f6c5a66355356753059486a426768563148355930654b4b7661735a473101010200000000ff000000000101020000000000000000012a0101020000000001000000fcff00ccd82dbce2a48abe65f391308024cff5bb3971c2aa2761f10c52476cc9e3235206b47528a36eb3767dc50852ed3ebfa5b17a0b47ed2a5a2b56ead26c5b96c805ca65e22eaabbc7af1560e71e57ca734ca952ed17f54285d4feecd11c0d5ba0e679c464cf1196373f427c41a8e9f5c157f78834f2e57c06aa5d5af0682504349f796518eca8f4f33dbf53a9dfa30e1f4232106825d8695817ae992d70fc0a30c8b4f9d232701d948d6a9199acd8e5ce94b5aa50af5929555b91f124167fde826315ba922120d8d4f6c5d1fcbdb08708521f9f91a7e84366f08b90bccbb18186660fe49d5ca270dbe476b3f4c7a7418b51d37cf38c7c55e5c784257dde277a4f01010200000000ff00000064279e9d01d72ec83ad3ae46ce057466371ba263f62a726018347135ec8619bc835e5f215431902b181ff2e41c6a28115a1e01b50ed33faad7601416032c3d2911b00b25e051f1f3676b082aa98d618f251c5b984976c4a89f7ed84ad8ef0ff22cdf05f1c50101020000000064000000189bc7836679d2fb8bf55d01daa0c7b7791a01b2d9359ec8ea010102000000001800000064892df41245164975050a48fdc2a262b012f29e95763cb507bd5df48b339d1539a988202f99d31cfe072df1696a58529b7813d848a4edcf9133bdbe67b4449b0718b07839471e35a6a798f9f17d6db70aee9b989e88d19dc9e363fc5906c4abb7d1bae32a0101020000000064000000143635363636373638363937303731373237333734010102000000001400000014363836393730373137323733373437353736373701010200000000140000000116010102000000000100000000010002000000000000000001610101020000000001000000046132373501010200000000040000000001000200000000000000000001000200000000000000000c61302c61312c61322c613630010102000000000c00000001000101020000000001000000087fffffffffffffff01010200000000080000000150010101000000001437323733373437353736373737383739383038310101020000000014000000143635363636373638363937303731373237333734010102000000001400000001390101020000000001000000016b0101020000000001000000"
b, _ := hexutil.Decode(answer)
rs := kvsql.DecodeRecordSet(b)
rs.LastInsertID()
4.1.1.4 获取修改的行数
func (c ResultSet) UpdatedCount() uint32
answer := "0x0035000000053654333354053654333354066175746f4964066175746f49643f000b000000030502000536543333540536543333540574797065300574797065303f000b000000030300000536543333540536543333540574797065310574797065313f000a000000032000000536543333540536543333540574797065320574797065323f0014000000080000000536543333540536543333540574797065330574797065333f0014000000082800000536543333540536543333540574797065340574797065343f000c0000000408001f0536543333540536543333540574797065350574797065353f00ff0000000408001e0536543333540536543333540574797065360574797065363f00ff0000000408001e0536543333540536543333540574797065370574797065373f00160000000508001f0536543333540536543333540574797065380574797065383f00ff0000000500001e0536543333540536543333540574797065390574797065393f000b000000f600000005365433335405365433335406747970653130067479706531303f0020000000f600001e05365433335405365433335406747970653131067479706531313f000b000000f600000005365433335405365433335406747970653132067479706531323f0016000000f600001405365433335405365433335406747970653133067479706531333f00090000000900000005365433335405365433335406747970653134067479706531343f00080000000920000005365433335405365433335406747970653135067479706531353f00060000000200000005365433335405365433335406747970653136067479706531363f00040000000100000005365433335405365433335406747970653137067479706531373f00030000000120000005365433335405365433335406747970653138067479706531383f00050000000220000005365433335405365433335406747970653139067479706531393f000a0000000a80000005365433335405365433335406747970653230067479706532303f00130000000c80000005365433335405365433335406747970653231067479706532313f000a0000000b80000005365433335405365433335406747970653232067479706532323f00130000000780000005365433335405365433335406747970653233067479706532333f00040000000d60000005365433335405365433335406747970653234067479706532342e0000000000fe00000005365433335405365433335406747970653235067479706532352e0004000000fe00000005365433335405365433335406747970653236067479706532362e00fc030000fe00000005365433335405365433335406747970653237067479706532372e0000000000fd00000005365433335405365433335406747970653238067479706532382e0004000000fd00000005365433335405365433335406747970653239067479706532392e00fc030000fd00000005365433335405365433335406747970653330067479706533303f0000000000fe80000005365433335405365433335406747970653331067479706533313f0001000000fe80000005365433335405365433335406747970653332067479706533323f00ff000000fe80000005365433335405365433335406747970653333067479706533333f00ffff0000fc80000005365433335405365433335406747970653334067479706533343f00ff000000f980000005365433335405365433335406747970653335067479706533353f00ffffff00fa80000005365433335405365433335406747970653336067479706533362e0058020000fc00000005365433335405365433335406747970653337067479706533372e00fcffff03fa00000005365433335405365433335406747970653338067479706533383f0001000000fd80000005365433335405365433335406747970653339067479706533392e0000000000fe00000005365433335405365433335406747970653430067479706534302e0004000000fe00000005365433335405365433335406747970653431067479706534312e0010000000fe00000005365433335405365433335406747970653432067479706534322e0000000000fe00000005365433335405365433335406747970653433067479706534332e0004000000fe00000005365433335405365433335406747970653434067479706534342e00d4030000fe00000005365433335405365433335406747970653435067479706534353f00010000001020000005365433335405365433335406747970653436067479706534363f00400000001020000005365433335405365433335406747970653437067479706534373f00010000000100000005365433335405365433335406747970653438067479706534382e00fcffff03fa00000005365433335405365433335406747970653439067479706534392e00fcffff03fa00000005365433335405365433335406747970653530067479706535302e0004000000fe00000005365433335405365433335406747970653531067479706535312e0004000000fd00000001000000040907000001010100000000049e732b7b010101000000000415d0870701010100000000083aa1ffffffffffff010101000000000871575519bfcd04020101010000000004ba0f9f3e01010100000000044d6d6e3f0101010000000004d66cc3be0101010000000008a4a6c8fae881e83f0101010000000008aba76123a72be63f01010100000000052d313731340101020000000005000000212d302e3233363530303030303030303030303030303030303030303030303030300101020000000021000000062d3531343132010102000000000600000016302e383433303030303030303030303030303030303001010200000000160000000453d955000101010000000004c3d1180001010100000000024b2d0101010000000001660101010000000001170101010000000002282d01010100000000080e0000000054c91d0101010000000008000000287342f21d0101010000000008001ef1cdf239000001010100000000080100007524a8b01f0101010000000002770701010100000000000101020000000000000000013001010200000000010000006436383036323439363639373332383534303836393332373339363837343432383138343539323234343837313936333534323934343333343031373936333438363830353736303134373133383232343632323236353730393639323939303039353035010102000000006400000000010102000000000000000001640101020000000001000000fcff007a4f3979704e654c456e63684f69784944304b527637704134794e6638346e6649317076333252367a737a6246486a34527479447645574e644772557738715161576573774552307464454f50746b4d5a506b50673669564c585551445464486d71674e6736487351665639637134636772735436686e557063736463416e3041584f684f596c65636f34426a44464c7a62424e5276516c6c644632684b413355636c4a7350757738726c616363517872763663655851556c74427a414861773264456b4c4252597a53444e4d5a3033735534456b52666e6a48454e564e6730416f6c5a66355356753059486a426768563148355930654b4b7661735a473101010200000000ff000000000101020000000000000000012a0101020000000001000000fcff00ccd82dbce2a48abe65f391308024cff5bb3971c2aa2761f10c52476cc9e3235206b47528a36eb3767dc50852ed3ebfa5b17a0b47ed2a5a2b56ead26c5b96c805ca65e22eaabbc7af1560e71e57ca734ca952ed17f54285d4feecd11c0d5ba0e679c464cf1196373f427c41a8e9f5c157f78834f2e57c06aa5d5af0682504349f796518eca8f4f33dbf53a9dfa30e1f4232106825d8695817ae992d70fc0a30c8b4f9d232701d948d6a9199acd8e5ce94b5aa50af5929555b91f124167fde826315ba922120d8d4f6c5d1fcbdb08708521f9f91a7e84366f08b90bccbb18186660fe49d5ca270dbe476b3f4c7a7418b51d37cf38c7c55e5c784257dde277a4f01010200000000ff00000064279e9d01d72ec83ad3ae46ce057466371ba263f62a726018347135ec8619bc835e5f215431902b181ff2e41c6a28115a1e01b50ed33faad7601416032c3d2911b00b25e051f1f3676b082aa98d618f251c5b984976c4a89f7ed84ad8ef0ff22cdf05f1c50101020000000064000000189bc7836679d2fb8bf55d01daa0c7b7791a01b2d9359ec8ea010102000000001800000064892df41245164975050a48fdc2a262b012f29e95763cb507bd5df48b339d1539a988202f99d31cfe072df1696a58529b7813d848a4edcf9133bdbe67b4449b0718b07839471e35a6a798f9f17d6db70aee9b989e88d19dc9e363fc5906c4abb7d1bae32a0101020000000064000000143635363636373638363937303731373237333734010102000000001400000014363836393730373137323733373437353736373701010200000000140000000116010102000000000100000000010002000000000000000001610101020000000001000000046132373501010200000000040000000001000200000000000000000001000200000000000000000c61302c61312c61322c613630010102000000000c00000001000101020000000001000000087fffffffffffffff01010200000000080000000150010101000000001437323733373437353736373737383739383038310101020000000014000000143635363636373638363937303731373237333734010102000000001400000001390101020000000001000000016b0101020000000001000000"
b, _ := hexutil.Decode(answer)
rs := kvsql.DecodeRecordSet(b)
rs.UpdatedCount()
4.1.1.5 获取列
func (c ResultSet) Columns() []string
answer := "0x0035000000053654333354053654333354066175746f4964066175746f49643f000b000000030502000536543333540536543333540574797065300574797065303f000b000000030300000536543333540536543333540574797065310574797065313f000a000000032000000536543333540536543333540574797065320574797065323f0014000000080000000536543333540536543333540574797065330574797065333f0014000000082800000536543333540536543333540574797065340574797065343f000c0000000408001f0536543333540536543333540574797065350574797065353f00ff0000000408001e0536543333540536543333540574797065360574797065363f00ff0000000408001e0536543333540536543333540574797065370574797065373f00160000000508001f0536543333540536543333540574797065380574797065383f00ff0000000500001e0536543333540536543333540574797065390574797065393f000b000000f600000005365433335405365433335406747970653130067479706531303f0020000000f600001e05365433335405365433335406747970653131067479706531313f000b000000f600000005365433335405365433335406747970653132067479706531323f0016000000f600001405365433335405365433335406747970653133067479706531333f00090000000900000005365433335405365433335406747970653134067479706531343f00080000000920000005365433335405365433335406747970653135067479706531353f00060000000200000005365433335405365433335406747970653136067479706531363f00040000000100000005365433335405365433335406747970653137067479706531373f00030000000120000005365433335405365433335406747970653138067479706531383f00050000000220000005365433335405365433335406747970653139067479706531393f000a0000000a80000005365433335405365433335406747970653230067479706532303f00130000000c80000005365433335405365433335406747970653231067479706532313f000a0000000b80000005365433335405365433335406747970653232067479706532323f00130000000780000005365433335405365433335406747970653233067479706532333f00040000000d60000005365433335405365433335406747970653234067479706532342e0000000000fe00000005365433335405365433335406747970653235067479706532352e0004000000fe00000005365433335405365433335406747970653236067479706532362e00fc030000fe00000005365433335405365433335406747970653237067479706532372e0000000000fd00000005365433335405365433335406747970653238067479706532382e0004000000fd00000005365433335405365433335406747970653239067479706532392e00fc030000fd00000005365433335405365433335406747970653330067479706533303f0000000000fe80000005365433335405365433335406747970653331067479706533313f0001000000fe80000005365433335405365433335406747970653332067479706533323f00ff000000fe80000005365433335405365433335406747970653333067479706533333f00ffff0000fc80000005365433335405365433335406747970653334067479706533343f00ff000000f980000005365433335405365433335406747970653335067479706533353f00ffffff00fa80000005365433335405365433335406747970653336067479706533362e0058020000fc00000005365433335405365433335406747970653337067479706533372e00fcffff03fa00000005365433335405365433335406747970653338067479706533383f0001000000fd80000005365433335405365433335406747970653339067479706533392e0000000000fe00000005365433335405365433335406747970653430067479706534302e0004000000fe00000005365433335405365433335406747970653431067479706534312e0010000000fe00000005365433335405365433335406747970653432067479706534322e0000000000fe00000005365433335405365433335406747970653433067479706534332e0004000000fe00000005365433335405365433335406747970653434067479706534342e00d4030000fe00000005365433335405365433335406747970653435067479706534353f00010000001020000005365433335405365433335406747970653436067479706534363f00400000001020000005365433335405365433335406747970653437067479706534373f00010000000100000005365433335405365433335406747970653438067479706534382e00fcffff03fa00000005365433335405365433335406747970653439067479706534392e00fcffff03fa00000005365433335405365433335406747970653530067479706535302e0004000000fe00000005365433335405365433335406747970653531067479706535312e0004000000fd00000001000000040907000001010100000000049e732b7b010101000000000415d0870701010100000000083aa1ffffffffffff010101000000000871575519bfcd04020101010000000004ba0f9f3e01010100000000044d6d6e3f0101010000000004d66cc3be0101010000000008a4a6c8fae881e83f0101010000000008aba76123a72be63f01010100000000052d313731340101020000000005000000212d302e3233363530303030303030303030303030303030303030303030303030300101020000000021000000062d3531343132010102000000000600000016302e383433303030303030303030303030303030303001010200000000160000000453d955000101010000000004c3d1180001010100000000024b2d0101010000000001660101010000000001170101010000000002282d01010100000000080e0000000054c91d0101010000000008000000287342f21d0101010000000008001ef1cdf239000001010100000000080100007524a8b01f0101010000000002770701010100000000000101020000000000000000013001010200000000010000006436383036323439363639373332383534303836393332373339363837343432383138343539323234343837313936333534323934343333343031373936333438363830353736303134373133383232343632323236353730393639323939303039353035010102000000006400000000010102000000000000000001640101020000000001000000fcff007a4f3979704e654c456e63684f69784944304b527637704134794e6638346e6649317076333252367a737a6246486a34527479447645574e644772557738715161576573774552307464454f50746b4d5a506b50673669564c585551445464486d71674e6736487351665639637134636772735436686e557063736463416e3041584f684f596c65636f34426a44464c7a62424e5276516c6c644632684b413355636c4a7350757738726c616363517872763663655851556c74427a414861773264456b4c4252597a53444e4d5a3033735534456b52666e6a48454e564e6730416f6c5a66355356753059486a426768563148355930654b4b7661735a473101010200000000ff000000000101020000000000000000012a0101020000000001000000fcff00ccd82dbce2a48abe65f391308024cff5bb3971c2aa2761f10c52476cc9e3235206b47528a36eb3767dc50852ed3ebfa5b17a0b47ed2a5a2b56ead26c5b96c805ca65e22eaabbc7af1560e71e57ca734ca952ed17f54285d4feecd11c0d5ba0e679c464cf1196373f427c41a8e9f5c157f78834f2e57c06aa5d5af0682504349f796518eca8f4f33dbf53a9dfa30e1f4232106825d8695817ae992d70fc0a30c8b4f9d232701d948d6a9199acd8e5ce94b5aa50af5929555b91f124167fde826315ba922120d8d4f6c5d1fcbdb08708521f9f91a7e84366f08b90bccbb18186660fe49d5ca270dbe476b3f4c7a7418b51d37cf38c7c55e5c784257dde277a4f01010200000000ff00000064279e9d01d72ec83ad3ae46ce057466371ba263f62a726018347135ec8619bc835e5f215431902b181ff2e41c6a28115a1e01b50ed33faad7601416032c3d2911b00b25e051f1f3676b082aa98d618f251c5b984976c4a89f7ed84ad8ef0ff22cdf05f1c50101020000000064000000189bc7836679d2fb8bf55d01daa0c7b7791a01b2d9359ec8ea010102000000001800000064892df41245164975050a48fdc2a262b012f29e95763cb507bd5df48b339d1539a988202f99d31cfe072df1696a58529b7813d848a4edcf9133bdbe67b4449b0718b07839471e35a6a798f9f17d6db70aee9b989e88d19dc9e363fc5906c4abb7d1bae32a0101020000000064000000143635363636373638363937303731373237333734010102000000001400000014363836393730373137323733373437353736373701010200000000140000000116010102000000000100000000010002000000000000000001610101020000000001000000046132373501010200000000040000000001000200000000000000000001000200000000000000000c61302c61312c61322c613630010102000000000c00000001000101020000000001000000087fffffffffffffff01010200000000080000000150010101000000001437323733373437353736373737383739383038310101020000000014000000143635363636373638363937303731373237333734010102000000001400000001390101020000000001000000016b0101020000000001000000"
b, _ := hexutil.Decode(answer)
rs := kvsql.DecodeRecordSet(b)
rs.Columns()
4.1.1.6 获取行数
func (c ResultSet) RowNumber() int
answer := "0x0035000000053654333354053654333354066175746f4964066175746f49643f000b000000030502000536543333540536543333540574797065300574797065303f000b000000030300000536543333540536543333540574797065310574797065313f000a000000032000000536543333540536543333540574797065320574797065323f0014000000080000000536543333540536543333540574797065330574797065333f0014000000082800000536543333540536543333540574797065340574797065343f000c0000000408001f0536543333540536543333540574797065350574797065353f00ff0000000408001e0536543333540536543333540574797065360574797065363f00ff0000000408001e0536543333540536543333540574797065370574797065373f00160000000508001f0536543333540536543333540574797065380574797065383f00ff0000000500001e0536543333540536543333540574797065390574797065393f000b000000f600000005365433335405365433335406747970653130067479706531303f0020000000f600001e05365433335405365433335406747970653131067479706531313f000b000000f600000005365433335405365433335406747970653132067479706531323f0016000000f600001405365433335405365433335406747970653133067479706531333f00090000000900000005365433335405365433335406747970653134067479706531343f00080000000920000005365433335405365433335406747970653135067479706531353f00060000000200000005365433335405365433335406747970653136067479706531363f00040000000100000005365433335405365433335406747970653137067479706531373f00030000000120000005365433335405365433335406747970653138067479706531383f00050000000220000005365433335405365433335406747970653139067479706531393f000a0000000a80000005365433335405365433335406747970653230067479706532303f00130000000c80000005365433335405365433335406747970653231067479706532313f000a0000000b80000005365433335405365433335406747970653232067479706532323f00130000000780000005365433335405365433335406747970653233067479706532333f00040000000d60000005365433335405365433335406747970653234067479706532342e0000000000fe00000005365433335405365433335406747970653235067479706532352e0004000000fe00000005365433335405365433335406747970653236067479706532362e00fc030000fe00000005365433335405365433335406747970653237067479706532372e0000000000fd00000005365433335405365433335406747970653238067479706532382e0004000000fd00000005365433335405365433335406747970653239067479706532392e00fc030000fd00000005365433335405365433335406747970653330067479706533303f0000000000fe80000005365433335405365433335406747970653331067479706533313f0001000000fe80000005365433335405365433335406747970653332067479706533323f00ff000000fe80000005365433335405365433335406747970653333067479706533333f00ffff0000fc80000005365433335405365433335406747970653334067479706533343f00ff000000f980000005365433335405365433335406747970653335067479706533353f00ffffff00fa80000005365433335405365433335406747970653336067479706533362e0058020000fc00000005365433335405365433335406747970653337067479706533372e00fcffff03fa00000005365433335405365433335406747970653338067479706533383f0001000000fd80000005365433335405365433335406747970653339067479706533392e0000000000fe00000005365433335405365433335406747970653430067479706534302e0004000000fe00000005365433335405365433335406747970653431067479706534312e0010000000fe00000005365433335405365433335406747970653432067479706534322e0000000000fe00000005365433335405365433335406747970653433067479706534332e0004000000fe00000005365433335405365433335406747970653434067479706534342e00d4030000fe00000005365433335405365433335406747970653435067479706534353f00010000001020000005365433335405365433335406747970653436067479706534363f00400000001020000005365433335405365433335406747970653437067479706534373f00010000000100000005365433335405365433335406747970653438067479706534382e00fcffff03fa00000005365433335405365433335406747970653439067479706534392e00fcffff03fa00000005365433335405365433335406747970653530067479706535302e0004000000fe00000005365433335405365433335406747970653531067479706535312e0004000000fd00000001000000040907000001010100000000049e732b7b010101000000000415d0870701010100000000083aa1ffffffffffff010101000000000871575519bfcd04020101010000000004ba0f9f3e01010100000000044d6d6e3f0101010000000004d66cc3be0101010000000008a4a6c8fae881e83f0101010000000008aba76123a72be63f01010100000000052d313731340101020000000005000000212d302e3233363530303030303030303030303030303030303030303030303030300101020000000021000000062d3531343132010102000000000600000016302e383433303030303030303030303030303030303001010200000000160000000453d955000101010000000004c3d1180001010100000000024b2d0101010000000001660101010000000001170101010000000002282d01010100000000080e0000000054c91d0101010000000008000000287342f21d0101010000000008001ef1cdf239000001010100000000080100007524a8b01f0101010000000002770701010100000000000101020000000000000000013001010200000000010000006436383036323439363639373332383534303836393332373339363837343432383138343539323234343837313936333534323934343333343031373936333438363830353736303134373133383232343632323236353730393639323939303039353035010102000000006400000000010102000000000000000001640101020000000001000000fcff007a4f3979704e654c456e63684f69784944304b527637704134794e6638346e6649317076333252367a737a6246486a34527479447645574e644772557738715161576573774552307464454f50746b4d5a506b50673669564c585551445464486d71674e6736487351665639637134636772735436686e557063736463416e3041584f684f596c65636f34426a44464c7a62424e5276516c6c644632684b413355636c4a7350757738726c616363517872763663655851556c74427a414861773264456b4c4252597a53444e4d5a3033735534456b52666e6a48454e564e6730416f6c5a66355356753059486a426768563148355930654b4b7661735a473101010200000000ff000000000101020000000000000000012a0101020000000001000000fcff00ccd82dbce2a48abe65f391308024cff5bb3971c2aa2761f10c52476cc9e3235206b47528a36eb3767dc50852ed3ebfa5b17a0b47ed2a5a2b56ead26c5b96c805ca65e22eaabbc7af1560e71e57ca734ca952ed17f54285d4feecd11c0d5ba0e679c464cf1196373f427c41a8e9f5c157f78834f2e57c06aa5d5af0682504349f796518eca8f4f33dbf53a9dfa30e1f4232106825d8695817ae992d70fc0a30c8b4f9d232701d948d6a9199acd8e5ce94b5aa50af5929555b91f124167fde826315ba922120d8d4f6c5d1fcbdb08708521f9f91a7e84366f08b90bccbb18186660fe49d5ca270dbe476b3f4c7a7418b51d37cf38c7c55e5c784257dde277a4f01010200000000ff00000064279e9d01d72ec83ad3ae46ce057466371ba263f62a726018347135ec8619bc835e5f215431902b181ff2e41c6a28115a1e01b50ed33faad7601416032c3d2911b00b25e051f1f3676b082aa98d618f251c5b984976c4a89f7ed84ad8ef0ff22cdf05f1c50101020000000064000000189bc7836679d2fb8bf55d01daa0c7b7791a01b2d9359ec8ea010102000000001800000064892df41245164975050a48fdc2a262b012f29e95763cb507bd5df48b339d1539a988202f99d31cfe072df1696a58529b7813d848a4edcf9133bdbe67b4449b0718b07839471e35a6a798f9f17d6db70aee9b989e88d19dc9e363fc5906c4abb7d1bae32a0101020000000064000000143635363636373638363937303731373237333734010102000000001400000014363836393730373137323733373437353736373701010200000000140000000116010102000000000100000000010002000000000000000001610101020000000001000000046132373501010200000000040000000001000200000000000000000001000200000000000000000c61302c61312c61322c613630010102000000000c00000001000101020000000001000000087fffffffffffffff01010200000000080000000150010101000000001437323733373437353736373737383739383038310101020000000014000000143635363636373638363937303731373237333734010102000000001400000001390101020000000001000000016b0101020000000001000000"
b, _ := hexutil.Decode(answer)
rs := kvsql.DecodeRecordSet(b)
rs.RowNumber()
4.1.1.7 获取指定行数据
func (rs *ResultSet) GetRow(rowIndex int) Row
answer := "0x0035000000053654333354053654333354066175746f4964066175746f49643f000b000000030502000536543333540536543333540574797065300574797065303f000b000000030300000536543333540536543333540574797065310574797065313f000a000000032000000536543333540536543333540574797065320574797065323f0014000000080000000536543333540536543333540574797065330574797065333f0014000000082800000536543333540536543333540574797065340574797065343f000c0000000408001f0536543333540536543333540574797065350574797065353f00ff0000000408001e0536543333540536543333540574797065360574797065363f00ff0000000408001e0536543333540536543333540574797065370574797065373f00160000000508001f0536543333540536543333540574797065380574797065383f00ff0000000500001e0536543333540536543333540574797065390574797065393f000b000000f600000005365433335405365433335406747970653130067479706531303f0020000000f600001e05365433335405365433335406747970653131067479706531313f000b000000f600000005365433335405365433335406747970653132067479706531323f0016000000f600001405365433335405365433335406747970653133067479706531333f00090000000900000005365433335405365433335406747970653134067479706531343f00080000000920000005365433335405365433335406747970653135067479706531353f00060000000200000005365433335405365433335406747970653136067479706531363f00040000000100000005365433335405365433335406747970653137067479706531373f00030000000120000005365433335405365433335406747970653138067479706531383f00050000000220000005365433335405365433335406747970653139067479706531393f000a0000000a80000005365433335405365433335406747970653230067479706532303f00130000000c80000005365433335405365433335406747970653231067479706532313f000a0000000b80000005365433335405365433335406747970653232067479706532323f00130000000780000005365433335405365433335406747970653233067479706532333f00040000000d60000005365433335405365433335406747970653234067479706532342e0000000000fe00000005365433335405365433335406747970653235067479706532352e0004000000fe00000005365433335405365433335406747970653236067479706532362e00fc030000fe00000005365433335405365433335406747970653237067479706532372e0000000000fd00000005365433335405365433335406747970653238067479706532382e0004000000fd00000005365433335405365433335406747970653239067479706532392e00fc030000fd00000005365433335405365433335406747970653330067479706533303f0000000000fe80000005365433335405365433335406747970653331067479706533313f0001000000fe80000005365433335405365433335406747970653332067479706533323f00ff000000fe80000005365433335405365433335406747970653333067479706533333f00ffff0000fc80000005365433335405365433335406747970653334067479706533343f00ff000000f980000005365433335405365433335406747970653335067479706533353f00ffffff00fa80000005365433335405365433335406747970653336067479706533362e0058020000fc00000005365433335405365433335406747970653337067479706533372e00fcffff03fa00000005365433335405365433335406747970653338067479706533383f0001000000fd80000005365433335405365433335406747970653339067479706533392e0000000000fe00000005365433335405365433335406747970653430067479706534302e0004000000fe00000005365433335405365433335406747970653431067479706534312e0010000000fe00000005365433335405365433335406747970653432067479706534322e0000000000fe00000005365433335405365433335406747970653433067479706534332e0004000000fe00000005365433335405365433335406747970653434067479706534342e00d4030000fe00000005365433335405365433335406747970653435067479706534353f00010000001020000005365433335405365433335406747970653436067479706534363f00400000001020000005365433335405365433335406747970653437067479706534373f00010000000100000005365433335405365433335406747970653438067479706534382e00fcffff03fa00000005365433335405365433335406747970653439067479706534392e00fcffff03fa00000005365433335405365433335406747970653530067479706535302e0004000000fe00000005365433335405365433335406747970653531067479706535312e0004000000fd00000001000000040907000001010100000000049e732b7b010101000000000415d0870701010100000000083aa1ffffffffffff010101000000000871575519bfcd04020101010000000004ba0f9f3e01010100000000044d6d6e3f0101010000000004d66cc3be0101010000000008a4a6c8fae881e83f0101010000000008aba76123a72be63f01010100000000052d313731340101020000000005000000212d302e3233363530303030303030303030303030303030303030303030303030300101020000000021000000062d3531343132010102000000000600000016302e383433303030303030303030303030303030303001010200000000160000000453d955000101010000000004c3d1180001010100000000024b2d0101010000000001660101010000000001170101010000000002282d01010100000000080e0000000054c91d0101010000000008000000287342f21d0101010000000008001ef1cdf239000001010100000000080100007524a8b01f0101010000000002770701010100000000000101020000000000000000013001010200000000010000006436383036323439363639373332383534303836393332373339363837343432383138343539323234343837313936333534323934343333343031373936333438363830353736303134373133383232343632323236353730393639323939303039353035010102000000006400000000010102000000000000000001640101020000000001000000fcff007a4f3979704e654c456e63684f69784944304b527637704134794e6638346e6649317076333252367a737a6246486a34527479447645574e644772557738715161576573774552307464454f50746b4d5a506b50673669564c585551445464486d71674e6736487351665639637134636772735436686e557063736463416e3041584f684f596c65636f34426a44464c7a62424e5276516c6c644632684b413355636c4a7350757738726c616363517872763663655851556c74427a414861773264456b4c4252597a53444e4d5a3033735534456b52666e6a48454e564e6730416f6c5a66355356753059486a426768563148355930654b4b7661735a473101010200000000ff000000000101020000000000000000012a0101020000000001000000fcff00ccd82dbce2a48abe65f391308024cff5bb3971c2aa2761f10c52476cc9e3235206b47528a36eb3767dc50852ed3ebfa5b17a0b47ed2a5a2b56ead26c5b96c805ca65e22eaabbc7af1560e71e57ca734ca952ed17f54285d4feecd11c0d5ba0e679c464cf1196373f427c41a8e9f5c157f78834f2e57c06aa5d5af0682504349f796518eca8f4f33dbf53a9dfa30e1f4232106825d8695817ae992d70fc0a30c8b4f9d232701d948d6a9199acd8e5ce94b5aa50af5929555b91f124167fde826315ba922120d8d4f6c5d1fcbdb08708521f9f91a7e84366f08b90bccbb18186660fe49d5ca270dbe476b3f4c7a7418b51d37cf38c7c55e5c784257dde277a4f01010200000000ff00000064279e9d01d72ec83ad3ae46ce057466371ba263f62a726018347135ec8619bc835e5f215431902b181ff2e41c6a28115a1e01b50ed33faad7601416032c3d2911b00b25e051f1f3676b082aa98d618f251c5b984976c4a89f7ed84ad8ef0ff22cdf05f1c50101020000000064000000189bc7836679d2fb8bf55d01daa0c7b7791a01b2d9359ec8ea010102000000001800000064892df41245164975050a48fdc2a262b012f29e95763cb507bd5df48b339d1539a988202f99d31cfe072df1696a58529b7813d848a4edcf9133bdbe67b4449b0718b07839471e35a6a798f9f17d6db70aee9b989e88d19dc9e363fc5906c4abb7d1bae32a0101020000000064000000143635363636373638363937303731373237333734010102000000001400000014363836393730373137323733373437353736373701010200000000140000000116010102000000000100000000010002000000000000000001610101020000000001000000046132373501010200000000040000000001000200000000000000000001000200000000000000000c61302c61312c61322c613630010102000000000c00000001000101020000000001000000087fffffffffffffff01010200000000080000000150010101000000001437323733373437353736373737383739383038310101020000000014000000143635363636373638363937303731373237333734010102000000001400000001390101020000000001000000016b0101020000000001000000"
b, _ := hexutil.Decode(answer)
rs := kvsql.DecodeRecordSet(b)
rs.GetRow(0)
4.1.1.8 解具体的列(字段)的值
解具体字段的值,需要弄清楚自己定义的表字段类型以及希望获取的字段下标,并调用以下方法与之一一对应。比如字符串类型字段调用GetString(index)来解。若类型对应错误会导致解出来的值不对,更严重的会导致panic。
表字段类型 | 解码方法 |
---|---|
tinyint | GetInt8 |
tinyint unsigned | GetUint8 |
smallint | GetInt16 |
smallint unsigned | GetUint16 |
int | GetInt32 |
unsigned int | GetUint32 |
bigint | GetInt64 |
unsigned bigint | GetUint64 |
float | GetFloat32 |
dobule | GetFloat64 |
decimal | GetDecimal |
varchar | GetString |
bit, blob(字节类型) | GetBytes |
DateTime, timestamp, date | GetTime |
time | GetDuration |
enum | GetEnum |
set | GetSet |
func (r Row) GetInt8(colIdx int) int8
func (r Row) GetUint8(colIdx int) uint8
func (r Row) GetInt16(colIdx int) int16
func (r Row) GetUint16(colIdx int) uint16
func (r Row) GetInt32(colIdx int) int32
func (r Row) GetUint32(colIdx int) uint32
func (r Row) GetInt64(colIdx int) int64
func (r Row) GetUint64(colIdx int) uint64
func (r Row) GetFloat32(colIdx int) float32
func (r Row) GetFloat64(colIdx int) float64
func (r Row) GetString(colIdx int) string
func (r Row) GetBytes(colIdx int) []byte
func (r Row) GetTime(colIdx int) types.Time
func (r Row) GetDuration(colIdx int, fillFsp int) types.Duration
func (r Row) GetEnum(colIdx int) types.Enum
func (r Row) IsNull(colIdx int) bool
func (r Row) GetDecimal(colIdx int) *types.MyDecimal
func (r Row) GetSet(colIdx int) types.Set
示例:
answer := "0x0035000000053654333354053654333354066175746f4964066175746f49643f000b000000030502000536543333540536543333540574797065300574797065303f000b000000030300000536543333540536543333540574797065310574797065313f000a000000032000000536543333540536543333540574797065320574797065323f0014000000080000000536543333540536543333540574797065330574797065333f0014000000082800000536543333540536543333540574797065340574797065343f000c0000000408001f0536543333540536543333540574797065350574797065353f00ff0000000408001e0536543333540536543333540574797065360574797065363f00ff0000000408001e0536543333540536543333540574797065370574797065373f00160000000508001f0536543333540536543333540574797065380574797065383f00ff0000000500001e0536543333540536543333540574797065390574797065393f000b000000f600000005365433335405365433335406747970653130067479706531303f0020000000f600001e05365433335405365433335406747970653131067479706531313f000b000000f600000005365433335405365433335406747970653132067479706531323f0016000000f600001405365433335405365433335406747970653133067479706531333f00090000000900000005365433335405365433335406747970653134067479706531343f00080000000920000005365433335405365433335406747970653135067479706531353f00060000000200000005365433335405365433335406747970653136067479706531363f00040000000100000005365433335405365433335406747970653137067479706531373f00030000000120000005365433335405365433335406747970653138067479706531383f00050000000220000005365433335405365433335406747970653139067479706531393f000a0000000a80000005365433335405365433335406747970653230067479706532303f00130000000c80000005365433335405365433335406747970653231067479706532313f000a0000000b80000005365433335405365433335406747970653232067479706532323f00130000000780000005365433335405365433335406747970653233067479706532333f00040000000d60000005365433335405365433335406747970653234067479706532342e0000000000fe00000005365433335405365433335406747970653235067479706532352e0004000000fe00000005365433335405365433335406747970653236067479706532362e00fc030000fe00000005365433335405365433335406747970653237067479706532372e0000000000fd00000005365433335405365433335406747970653238067479706532382e0004000000fd00000005365433335405365433335406747970653239067479706532392e00fc030000fd00000005365433335405365433335406747970653330067479706533303f0000000000fe80000005365433335405365433335406747970653331067479706533313f0001000000fe80000005365433335405365433335406747970653332067479706533323f00ff000000fe80000005365433335405365433335406747970653333067479706533333f00ffff0000fc80000005365433335405365433335406747970653334067479706533343f00ff000000f980000005365433335405365433335406747970653335067479706533353f00ffffff00fa80000005365433335405365433335406747970653336067479706533362e0058020000fc00000005365433335405365433335406747970653337067479706533372e00fcffff03fa00000005365433335405365433335406747970653338067479706533383f0001000000fd80000005365433335405365433335406747970653339067479706533392e0000000000fe00000005365433335405365433335406747970653430067479706534302e0004000000fe00000005365433335405365433335406747970653431067479706534312e0010000000fe00000005365433335405365433335406747970653432067479706534322e0000000000fe00000005365433335405365433335406747970653433067479706534332e0004000000fe00000005365433335405365433335406747970653434067479706534342e00d4030000fe00000005365433335405365433335406747970653435067479706534353f00010000001020000005365433335405365433335406747970653436067479706534363f00400000001020000005365433335405365433335406747970653437067479706534373f00010000000100000005365433335405365433335406747970653438067479706534382e00fcffff03fa00000005365433335405365433335406747970653439067479706534392e00fcffff03fa00000005365433335405365433335406747970653530067479706535302e0004000000fe00000005365433335405365433335406747970653531067479706535312e0004000000fd00000001000000040907000001010100000000049e732b7b010101000000000415d0870701010100000000083aa1ffffffffffff010101000000000871575519bfcd04020101010000000004ba0f9f3e01010100000000044d6d6e3f0101010000000004d66cc3be0101010000000008a4a6c8fae881e83f0101010000000008aba76123a72be63f01010100000000052d313731340101020000000005000000212d302e3233363530303030303030303030303030303030303030303030303030300101020000000021000000062d3531343132010102000000000600000016302e383433303030303030303030303030303030303001010200000000160000000453d955000101010000000004c3d1180001010100000000024b2d0101010000000001660101010000000001170101010000000002282d01010100000000080e0000000054c91d0101010000000008000000287342f21d0101010000000008001ef1cdf239000001010100000000080100007524a8b01f0101010000000002770701010100000000000101020000000000000000013001010200000000010000006436383036323439363639373332383534303836393332373339363837343432383138343539323234343837313936333534323934343333343031373936333438363830353736303134373133383232343632323236353730393639323939303039353035010102000000006400000000010102000000000000000001640101020000000001000000fcff007a4f3979704e654c456e63684f69784944304b527637704134794e6638346e6649317076333252367a737a6246486a34527479447645574e644772557738715161576573774552307464454f50746b4d5a506b50673669564c585551445464486d71674e6736487351665639637134636772735436686e557063736463416e3041584f684f596c65636f34426a44464c7a62424e5276516c6c644632684b413355636c4a7350757738726c616363517872763663655851556c74427a414861773264456b4c4252597a53444e4d5a3033735534456b52666e6a48454e564e6730416f6c5a66355356753059486a426768563148355930654b4b7661735a473101010200000000ff000000000101020000000000000000012a0101020000000001000000fcff00ccd82dbce2a48abe65f391308024cff5bb3971c2aa2761f10c52476cc9e3235206b47528a36eb3767dc50852ed3ebfa5b17a0b47ed2a5a2b56ead26c5b96c805ca65e22eaabbc7af1560e71e57ca734ca952ed17f54285d4feecd11c0d5ba0e679c464cf1196373f427c41a8e9f5c157f78834f2e57c06aa5d5af0682504349f796518eca8f4f33dbf53a9dfa30e1f4232106825d8695817ae992d70fc0a30c8b4f9d232701d948d6a9199acd8e5ce94b5aa50af5929555b91f124167fde826315ba922120d8d4f6c5d1fcbdb08708521f9f91a7e84366f08b90bccbb18186660fe49d5ca270dbe476b3f4c7a7418b51d37cf38c7c55e5c784257dde277a4f01010200000000ff00000064279e9d01d72ec83ad3ae46ce057466371ba263f62a726018347135ec8619bc835e5f215431902b181ff2e41c6a28115a1e01b50ed33faad7601416032c3d2911b00b25e051f1f3676b082aa98d618f251c5b984976c4a89f7ed84ad8ef0ff22cdf05f1c50101020000000064000000189bc7836679d2fb8bf55d01daa0c7b7791a01b2d9359ec8ea010102000000001800000064892df41245164975050a48fdc2a262b012f29e95763cb507bd5df48b339d1539a988202f99d31cfe072df1696a58529b7813d848a4edcf9133bdbe67b4449b0718b07839471e35a6a798f9f17d6db70aee9b989e88d19dc9e363fc5906c4abb7d1bae32a0101020000000064000000143635363636373638363937303731373237333734010102000000001400000014363836393730373137323733373437353736373701010200000000140000000116010102000000000100000000010002000000000000000001610101020000000001000000046132373501010200000000040000000001000200000000000000000001000200000000000000000c61302c61312c61322c613630010102000000000c00000001000101020000000001000000087fffffffffffffff01010200000000080000000150010101000000001437323733373437353736373737383739383038310101020000000014000000143635363636373638363937303731373237333734010102000000001400000001390101020000000001000000016b0101020000000001000000"
b, _ := hexutil.Decode(answer)
rs := kvsql.DecodeRecordSet(b)
row := rs.GetRow(0)
row.GetString(49)
GoSDK中和网络相关的RPC、grpc调用均返回StdError类型的错误。StdError为一个接口。
type StdError interface {
fmt.Stringer
error
Code() int
}
所以,该结构提供三种方法:
func (re *RetError) Error() string
-
说明:实现了error接口。
-
返回【返回值1】:返回错误描述。
func (re *RetError) String() string
-
说明:实现了fmt.Stringer接口。
-
返回【返回值1】:将会返回以下格式字符串"error code: %d, error reason: %s", re.Code(), re.Error(),即错误码加错误描述。
func (re *RetError) Code() int {
-
说明:返回错误码。
-
返回【返回值1】:错误码。错误码表如下。
code | 含义 |
---|---|
0 | 请求成功 |
-32700 | 服务端接收到无效的json。该错误发送于服务器尝试解析json文本 |
-32600 | 无效的请求(比如非法的JSON格式) |
-32601 | 方法不存在或者无效 |
-32602 | 无效的方法参数 |
-32603 | JSON-RPC内部错误 |
-32605 | cvp在报错前的拦截器 |
-32606 | cvp在报错后的拦截器 |
-32000 | Hyperchain内部错误或者空指针或者节点未安装solidity环境 |
-32001 | 请求的数据不存在 |
-32002 | 余额不足 |
-32003 | 签名非法 |
-32004 | 合约部署出错 |
-32005 | 合约调用出错 |
-32006 | 系统繁忙 |
-32007 | 交易重复 |
-32008 | 合约操作权限不够 |
-32009 | (合约)账户不存在 |
-32010 | namespace不存在 |
-32011 | 账本上无区块产生,查询最新区块的时候可能抛出该错误 |
-32012 | 订阅不存在 |
-32013 | 数据归档、快照相关错误 |
-32014 | 未能解锁本地节点帐户 |
-32015 | 调用原生合约失败 |
-32016 | 无效的参与者节点哈希 |
-32017 | 不可用的peer |
-32018 | 不一致的peer |
-32019 | 没有collection信息的非法的私有交易 |
-32020 | ACO服务不可用 |
-32021 | 废弃的接口 |
-32022 | did调用失败 |
-32023 | cvp不支持此方法 |
-32024 | 共识状态非正常 |
-32025 | 进程已满 |
-32026 | QPS 受限 |
-32027 | simulate受限 |
-32028 | sql执行出错 |
-32096 | http请求处理超时 |
-32097 | Hypercli用户令牌无效 |
-32098 | 请求未带cert或者错误cert导致认证失败 |
-32099 | 请求tcert失败 |
-9995 | 请求失败(通常是请求体过长) |
-9996 | 请求失败(通常是请求消息错误) |
-9997 | 异步请求失败 |
-9998 | 请求超时 |
-9999 | 获取平台响应失败 |
pragma solidity 0.8.0;
contract SetHash{
mapping(string => string) hashMapping;
function insert(string memory key,string memory value) public {
hashMapping[key] = value;
}
function get(string memory key) public view returns(string memory) {
return hashMapping[key];
}
}
// abi
[
{
"inputs": [
{
"internalType": "string",
"name": "key",
"type": "string"
}
],
"name": "get",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "key",
"type": "string"
},
{
"internalType": "string",
"name": "value",
"type": "string"
}
],
"name": "insert",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]
// bin
608060405234801561001057600080fd5b5061056a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806306e63ff81461003b578063693ec85e14610057575b600080fd5b610055600480360381019061005091906102ba565b610087565b005b610071600480360381019061006c9190610279565b6100be565b60405161007e91906103a7565b60405180910390f35b806000836040516100989190610390565b908152602001604051809103902090805190602001906100b992919061016e565b505050565b60606000826040516100d09190610390565b908152602001604051809103902080546100e990610493565b80601f016020809104026020016040519081016040528092919081815260200182805461011590610493565b80156101625780601f1061013757610100808354040283529160200191610162565b820191906000526020600020905b81548152906001019060200180831161014557829003601f168201915b50505050509050919050565b82805461017a90610493565b90600052602060002090601f01602090048101928261019c57600085556101e3565b82601f106101b557805160ff19168380011785556101e3565b828001600101855582156101e3579182015b828111156101e25782518255916020019190600101906101c7565b5b5090506101f091906101f4565b5090565b5b8082111561020d5760008160009055506001016101f5565b5090565b600061022461021f846103fa565b6103c9565b90508281526020810184848401111561023c57600080fd5b610247848285610451565b509392505050565b600082601f83011261026057600080fd5b8135610270848260208601610211565b91505092915050565b60006020828403121561028b57600080fd5b600082013567ffffffffffffffff8111156102a557600080fd5b6102b18482850161024f565b91505092915050565b600080604083850312156102cd57600080fd5b600083013567ffffffffffffffff8111156102e757600080fd5b6102f38582860161024f565b925050602083013567ffffffffffffffff81111561031057600080fd5b61031c8582860161024f565b9150509250929050565b60006103318261042a565b61033b8185610435565b935061034b818560208601610460565b61035481610523565b840191505092915050565b600061036a8261042a565b6103748185610446565b9350610384818560208601610460565b80840191505092915050565b600061039c828461035f565b915081905092915050565b600060208201905081810360008301526103c18184610326565b905092915050565b6000604051905081810181811067ffffffffffffffff821117156103f0576103ef6104f4565b5b8060405250919050565b600067ffffffffffffffff821115610415576104146104f4565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b82818337600083830152505050565b60005b8381101561047e578082015181840152602081019050610463565b8381111561048d576000848401525b50505050565b600060028204905060018216806104ab57607f821691505b602082108114156104bf576104be6104c5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f830116905091905056fea264697066735822122022f216ab2a903b000b9ef84705051fed53aecd3e515879d46fd8372ba6f2cef364736f6c63430008000033
package main
import (
"fmt"
"github.com/hyperchain/gosdk/abi"
"github.com/hyperchain/gosdk/account"
"github.com/hyperchain/gosdk/rpc"
"strings"
)
const (
abiContract = `[
{
"constant": false,
"inputs": [
{
"name": "key",
"type": "string"
},
{
"name": "value",
"type": "string"
}
],
"name": "insert",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "key",
"type": "string"
}
],
"name": "get",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]`
binContract = "608060405234801561001057600080fd5b50610444806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306e63ff814610051578063693ec85e14610100575b600080fd5b34801561005d57600080fd5b506100fe600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101e2565b005b34801561010c57600080fd5b50610167600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610266565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101a757808201518184015260208101905061018c565b50505050905090810190601f1680156101d45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b806000836040518082805190602001908083835b60208310151561021b57805182526020820191506020810190506020830392506101f6565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390209080519060200190610261929190610373565b505050565b60606000826040518082805190602001908083835b6020831015156102a0578051825260208201915060208101905060208303925061027b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103675780601f1061033c57610100808354040283529160200191610367565b820191906000526020600020905b81548152906001019060200180831161034a57829003601f168201915b50505050509050919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106103b457805160ff19168380011785556103e2565b828001600101855582156103e2579182015b828111156103e15782518255916020019190600101906103c6565b5b5090506103ef91906103f3565b5090565b61041591905b808211156104115760008160009055506001016103f9565b5090565b905600a165627a7a7230582001a711c918e9f0c995f05f63b0f98e6ee752d4e014717372d11bab848cbe4bae0029"
)
func main() {
// new account
//创建账户
accountJson, err := account.NewAccountSm2("123")
if err != nil {
fmt.Println(err)
return
}
fmt.Println("accountJson:", accountJson)
key, err := account.GenKeyFromAccountJson(accountJson, "123")
if err != nil {
fmt.Println(err)
return
}
newAddress := key.(*account.SM2Key).GetAddress()
fmt.Println("account address:", newAddress)
rpcAPI := rpc.NewRPCWithPath("./conf")
// deploy
//部署合约
tranDeploy := rpc.NewTransaction(newAddress.Hex()).Deploy(binContract)
txDeploy, stdErr := rpcAPI.SignAndDeployContract(tranDeploy, key)
if stdErr != nil {
fmt.Println(stdErr)
return
}
fmt.Println("contract address:", txDeploy.ContractAddress)
// invoke contract
//调用合约
ABI, _ := abi.JSON(strings.NewReader(abiContract))
packed, err := ABI.Pack("insert", "key1", "value1")
tranInvoke := rpc.NewTransaction(newAddress.Hex()).Invoke(txDeploy.ContractAddress, packed)
txInvoke, stdErr := rpcAPI.SignAndInvokeContract(tranInvoke, key)
if stdErr != nil {
fmt.Println(stdErr)
return
}
fmt.Println("invoke transaction hash:", txInvoke.TxHash)
// invoke contract
//调用合约
packed1, err := ABI.Pack("get", "key1")
tranInvoke1 := rpc.NewTransaction(newAddress.Hex()).Invoke(txDeploy.ContractAddress, packed1)
txInvoke1, err := rpcAPI.SignAndInvokeContract(tranInvoke1, key)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("invoke transaction hash:", txInvoke1.TxHash)
// decode
//返回值解析
var result string
if err = ABI.UnpackResult(&result, "get", txInvoke1.Ret); err != nil {
fmt.Println(err)
return
}
fmt.Println("get返回值:", result)
}
本节展示了使用GoSDK操作HVM合约的完整例子。在使用gosdk之前,请到http://hvm.internal.hyperchain.cn/上学习如何编写HVM合约
通过一个SetHash 合约来展示如果通过gosdk 发送hvm合约交易。更多的HVM合约Demo 可参考下面链接中的示例
http://thoughts.hyperchain.cn:8099/workspaces/5b6c3babbe825b41b446a307/docs/5ed787cac98cc900016b726e
package invoke;
import cn.hyperchain.contract.BaseInvoke;
import logic.ISetHash;
/**
* @author Lam
* @ClassName InvokeSetHash
* @date 2019-10-11
*/
public class InvokeSetHash implements BaseInvoke<String, ISetHash> {
private String key;
private String value;
public InvokeSetHash() {
}
public InvokeSetHash(String key, String value) {
this.key = key;
this.value = value;
}
@Override
public String invoke(ISetHash iSetHash) {
iSetHash.setHash(key, value);
return null;
}
}
package logic;
import cn.hyperchain.contract.BaseContractInterface;
/**
* @author Lam
* @ClassName ISetHash
* @date 2019-10-11
*/
public interface ISetHash extends BaseContractInterface {
void setHash(String key, String value);
}
package logic;
import cn.hyperchain.annotations.StoreField;
import cn.hyperchain.contract.BaseContract;
import cn.hyperchain.core.HyperMap;
/**
* @author Lam
* @ClassName SetHash
* @date 2019-10-11
*/
public class SetHash extends BaseContract implements ISetHash {
@StoreField
HyperMap<String, String> map = new HyperMap<String, String>();
@Override
public void setHash(String key, String value) {
map.put(key, value);
if (key.equals("error")) {
throw new RuntimeException("error!!!");
}
}
public String getHash(String key) {
return map.get(key);
}
}
合约编译方式可以参考HVM上述HVM合约使用链接,这里只介绍HVM合约ABI 生成方式。
利用我们提供的HVM ABI 生成maven 插件即可编译生成HVM合约的ABI , 需要在合约项目pom 文件中加入下面的依赖
<plugin>
<groupId>cn.hyperchain.hvm</groupId>
<artifactId>hvm-maven-plugin</artifactId>
<version>0.0.2</version>
<configuration>
<jarFile>${project.basedir}/target/sethash-1.0-sethash.jar</jarFile>
<invokeBeanPath>${project.basedir}/target/classes</invokeBeanPath>
<invokeBeanPackages>
<param>invoke.InvokeSetHash</param>
</invokeBeanPackages>
<outputFile>${project.basedir}/target/hvm.abi</outputFile>
</configuration>
</plugin>
其中
-
中是hvm合约的jar包
-
是hvm合约的class字节码文件夹
-
中包含很多标签,每个标签中都是一个实现BaseInvoke接口的类的全路径。
-
中存放的是生成的.abi的存放目录
在合约编译完成后,执行下面的命令,即可生成HVM合约的ABI
mvn hvm:abi
在生成的hvm.abi中
-
version代表hvm.abi的版本
-
beanName代表实现BaseInvoke接口的类的名称
-
inputs代表invoke方法的参数 其中
-
name 代表变量名称
-
type代表变量类型
-
如果是结构体则structname代表结构体类的名称
-
output代表invoke方法的返回值
-
structs里面包含HVM合约中的结构体
示例hvm.abi如下
[{"version":"v1","beanName":"invoke.InvokeSetHash","inputs":[{"name":"key","type":"String","structName":"java.lang.String"},{"name":"value","type":"String","structName":"java.lang.String"}],"output":{"name":"java.lang.String","type":"String","structName":"java.lang.String"},"classBytes":"cafebabe0000003400280a0008001e090007001f09000700200b000500210700220a000700230700240700250700260100036b65790100124c6a6176612f6c616e672f537472696e673b01000576616c75650100063c696e69743e010003282956010004436f646501000f4c696e654e756d6265725461626c650100124c6f63616c5661726961626c655461626c65010004746869730100164c696e766f6b652f496e766f6b65536574486173683b010027284c6a6176612f6c616e672f537472696e673b4c6a6176612f6c616e672f537472696e673b2956010006696e766f6b65010024284c6c6f6769632f49536574486173683b294c6a6176612f6c616e672f537472696e673b01000869536574486173680100104c6c6f6769632f49536574486173683b010042284c636e2f6879706572636861696e2f636f6e74726163742f42617365436f6e7472616374496e746572666163653b294c6a6176612f6c616e672f4f626a6563743b0100095369676e61747572650100594c6a6176612f6c616e672f4f626a6563743b4c636e2f6879706572636861696e2f636f6e74726163742f42617365496e766f6b653c4c6a6176612f6c616e672f537472696e673b4c6c6f6769632f49536574486173683b3e3b01000a536f7572636546696c65010012496e766f6b65536574486173682e6a6176610c000d000e0c000a000b0c000c000b0c0027001401000e6c6f6769632f49536574486173680c00150016010014696e766f6b652f496e766f6b65536574486173680100106a6176612f6c616e672f4f626a656374010021636e2f6879706572636861696e2f636f6e74726163742f42617365496e766f6b65010007736574486173680021000700080001000900020002000a000b00000002000c000b000000040001000d000e0001000f0000003300010001000000052ab70001b10000000200100000000a00020000000f0004001000110000000c0001000000050012001300000001000d00140001000f00000059000200030000000f2ab700012a2bb500022a2cb50003b1000000020010000000120004000000120004001300090014000e001500110000002000030000000f0012001300000000000f000a000b00010000000f000c000b00020001001500160001000f0000004800030002000000102b2ab400022ab40003b90004030001b00000000200100000000a000200000019000e001a001100000016000200000010001200130000000000100017001800011041001500190001000f0000003300020002000000092a2bc00005b60006b00000000200100000000600010000000b00110000000c0001000000090012001300000002001a00000002001b001c00000002001d","structs":[]}]
func main() {
//创建账户
accountJson, err := account.NewAccountSm2("123")
if err != nil {
fmt.Println(err)
return
}
fmt.Println("accountJson:", accountJson)
key, err := account.GenKeyFromAccountJson(accountJson, "123")
if err != nil {
fmt.Println(err)
return
}
newAddress := key.(*account.SM2Key).GetAddress()
fmt.Println("account address:", newAddress)
rpcAPI := rpc.NewRPCWithPath("./conf")
jarPath := "./conf/contract/sethash-1.0-sethash.jar"
payload, sysErr := rpc.DecompressFromJar(jarPath)
if sysErr != nil {
fmt.Println(sysErr)
return
}
transaction := rpc.NewTransaction(newAddress.Hex()).Deploy(common.Bytes2Hex(payload)).VMType(rpc.HVM)
receipt, sysErr := rpcAPI.SignAndDeployContract(transaction, key)
if sysErr != nil {
fmt.Println(sysErr)
return
}
fmt.Println("contract address:", receipt.ContractAddress)
//read abi
abiPath := "./conf/contract/hvm.abi"
abiJson, sysErr := common.ReadFileAsString(abiPath)
if sysErr != nil {
fmt.Println(sysErr)
return
}
abi, sysErr := hvm.GenAbi(abiJson)
if sysErr != nil {
fmt.Println(sysErr)
return
}
invokeBean := "invoke.InvokeSetHash"
beanAbi, sysErr := abi.GetBeanAbi(invokeBean)
if sysErr != nil {
fmt.Println(sysErr)
return
}
invokePayload, sysErr := hvm.GenPayload(beanAbi, "key1", "value1")
invokeTx := rpc.NewTransaction(newAddress.Hex()).Invoke(receipt.ContractAddress, invokePayload).VMType(rpc.HVM)
invokeRe, sysErr := rpcAPI.SignAndInvokeContract(invokeTx, key)
if sysErr != nil {
fmt.Println(sysErr)
return
}
fmt.Printf("java log 解码前: %s\n", invokeRe.TxHash)
fmt.Printf("java log 解码后:%s\n", java.DecodeJavaResult(invokeRe.Ret))
}
hrpc := rpc.NewRPCWithPath("../conf")
js, err := account.NewAccountSm2("12345678")
gmAcc, err := account.GenKeyFromAccountJson(js, "12345678")
newAddress := gmAcc.(*account.SM2Key).GetAddress()
transaction := NewTransaction(newAddress.Hex()).
VMType(KVSQL).
Deploy(hexutil.Encode([]byte("KVSQL")))
// 建库
txReceipt, err := hrpc.SignAndDeployContract(transaction, gmAcc)
// 建表
str := "CREATE TABLE IF NOT EXISTS testTable (id bigint(20) NOT NULL, name varchar(32) NOT NULL, exp bigint(20), money double(16,2) NOT NULL DEFAULT '99', primary key (id), unique key name (name));"
tranInvoke := NewTransaction(newAddress.Hex()).InvokeSql(txReceipt.ContractAddress, []byte(str))
tranInvoke.VMType(KVSQL)
res, err := hrpc.SignAndInvokeContract(tranInvoke, gmAcc)
// 插入
in := "insert into testTable (id, name, exp, money) values (1, 'test', 1, 1.1);"
tranInvoke2 := NewTransaction(newAddress.Hex()).InvokeSql(txReceipt.ContractAddress, []byte(in))
tranInvoke2.VMType(KVSQL)
_, err = hrpc.SignAndInvokeContract(tranInvoke2, gmAcc)
// 获取
sl := "select * from testTable where id = 1;"
tranInvoke3 := NewTransaction(newAddress.Hex()).InvokeSql(txReceipt.ContractAddress, []byte(sl))
tranInvoke3.VMType(KVSQL)
res, err = hrpc.SignAndInvokeContract(tranInvoke3, gmAcc)
b, _ := hexutil.Decode(res.Ret)
rs := kvsql.DecodeRecordSet(b)
rpc := NewRPC()
const genesisAccountJson = `{"address":"0x000f1a7a08ccc48e5d30f80850cf1cf283aa3abd","version":"4.0", "algo":"0x03","publicKey":"0400ddbadb932a0d276e257c6df50599a425804a3743f40942d031f806bf14ab0c57aed6977b1ad14646672f9b9ce385f2c98c4581267b611f48f4b7937de386ac","privateKey":"16acbf6b4f09a476a35ebd4c01e337238b5dceceb6ff55ff0c4bd83c4f91e11b"}`
key, _ := account.GenKeyFromAccountJson(genesisAccountJson, "")
opt := bvm.NewDIDSetChainIDOperation("chainID_01")
payload := bvm.EncodeOperation(opt)
tx := NewTransaction(key.(account.Key).GetAddress().Hex()).Invoke(opt.Address(), payload).VMType(BVM)
_, err := rpc.SignAndInvokeContract(tx, key)
hrp := rpc.NewRPC()
accountJSON, _ := account.NewAccountSm2("12345678")
aKey, syserr := account.GenKeyFromAccountJson(accountJSON, "12345678")
newAddress2 := aKey.(*account.SM2Key).GetAddress()
transaction1 := rpc.NewTransaction(newAddress2.Hex()).Transfer(address, int64(0))
transaction1.Sign(aKey)
receipt1, err := hrp.SignAndSendTx(transaction1, aKey)