bifcore-sdk-nodejs-bop-test
Version:
bifcore sdk nodejs
2,469 lines • 113 kB
Markdown
#### 兼容开发平台修改部分24.02.27
1、生成SDK实例新增apiKey、apiSecret,由开放平台新建项目生成,apikey为必填,apiSecret是否必填取决于项目设置
2、为兼容开放平台并保持原有返回内容不变修改以下接口:
getAccount、getAccountBalance、getAccountPriv、getNonce、checkContractAddress、getBlockInfo、
getBlockNumber、getTransactions、getBlockLatestInfo、getValidators、getLatestValidators、callContract、
getContractAddress、getTransactionByHash、getTxCacheSize、getTransactionCache
3、开放平台异常场景:账号未进行许可——禁止转移星火令,apikey错误、ApiKey不存在(兼容新增)或者使用的apikey不是此
网络的apikey——ApiKey不存在(兼容新增),需要apiSecret的apikey不传apiSecret——Please include apiSecret in the header
# 1.BIFCore-SDK-NodeJs使用说明
本节详细说明BIFCore-SDK-NodeJs常用接口文档。星火链提供 nodejs版 SDK供开发者使用。
**github**代码库地址:https://github.com/caict-4iot-dev/BIF-Core_SDK-JS
## 1.1 SDK概述
### 1.1.1 名词解析
+ 账户服务: 提供账户相关的有效性校验、创建与查询接口
+ 合约服务: 提供合约相关的有效性校验、创建与查询接口
+ 交易服务: 提供构建交易及交易查询接口
+ 区块服务: 提供区块的查询接口
+ 账户nonce值: 每个账户都维护一个序列号,用于用户提交交易时标识交易执行顺序的
### 1.1.2 请求参数与相应数据格式
+ **请求参数**
为了保证数字精度,请求参数中的Number类型,全都按照字符串处理,例如:
amount = 500, 那么传递参数时候就将其更改为 amount = '500' 字符串形式:
+ **响应数据**
响应数据为JavaScript对象,数据格式如下:
```js
{
errorCode:0,
errorDesc:'',
result:{}
}
```
说明:
1. errorCode: 错误码。0表示无错误,大于0表示有错误
1. errorDesc: 错误描述。
1. result: 返回结果
> 因响应数据结构固定,方便起见,后续接口说明中的`响应数据`均指`result`对象的属性
## 1.2 SDK使用方法
本节介绍SDK的使用流程。
首先需要生成SDK实现,然后调用相应服务的接口,其中服务包括账户服务、合约服务、交易服务和区块服务。
### 1.2.1 生成SDK实例
##### 传入参数:
options 是一个对象,可以包含如下属性
| 参数 | 类型 | 描述 | |
| ---- | ------ | ----------- | ---- |
| host | String | ip地址:端口 | |
| apiKey | String | 项目的apiKey | |
| apiSecret | String | 项目的apiSecret | |
##### 实例:
```js
const BIFCoreSDK = require('bifcore-sdk-nodejs')
const options = {
host: 'https://domestic-testnet.bitfactory.cn',
//需要传apiSecret的项目
apiKey: 'GBEQMLTEJF0X9SEKUC6GNSZZWZX9T303',
apiSecret:'+npQW5TJ96NReEPWgarNj5zfNeKtMAywTCyQM/yOLJ8=',
//不需要传apiSecret的项目
apiKey: 'HYD4JBC8S3ELHVEZ38QI154ZQ5Y80BGP',
}
const sdk = new BIFCoreSDK(options)
```
### 1.2.2 生成公私钥地址
+ **Ed25519算法生成**
```js
const KeyPairEntity = sdk.keypair.getBidAndKeyPair()
const encAddress = KeyPairEntity.encAddress
const encPublicKey = KeyPairEntity.encPublicKey
const encPrivateKey = KeyPairEntity.encPrivateKey
const rawPublicKey = KeyPairEntity.rawPublicKey
const rawPrivateKey = KeyPairEntity.rawPrivateKey
```
+ **SM2算法生成**
```js
const KeyPairEntitySM2 = sdk.keypair.getBidAndKeyPairBySM2()
const encAddress = KeyPairEntitySM2.encAddress
const encPublicKey = KeyPairEntitySM2.encPublicKey
const encPrivateKey = KeyPairEntitySM2.encPrivateKey
const rawPublicKey = KeyPairEntitySM2.rawPublicKey
const rawPrivateKey = KeyPairEntitySM2.rawPrivateKey
```
### 1.2.3 私钥对象使用
+ **构造对象**
```js
//签名方式构造
const privateKeyManager = sdk.keypair.privateKeyManager(sdk.keypair.CRYPTO_ED25519)
//私钥构造
const encPrivateKey = 'privbsDGan4sA9ZYpEERhMe25k4K5tnJu1fNqfEHbyKfaV9XSYq7uMcy'
const privateKeyManagerByKey = sdk.keypair.privateKeyManagerByKey(encPrivateKey)
```
+ **解析对象**
```js
//构造对象
const privateKeyManager = sdk.keypair.privateKeyManager(sdk.keypair.CRYPTO_ED25519)
//获取私钥
const encPrivateKey = privateKeyManager.encPrivateKey
//address
const encAddress = privateKeyManager.encAddress
//公钥
const encPublicKey = privateKeyManager.encPublicKey
//获取原生私钥
const rawPrivateKey = privateKeyManager.rawPrivateKey
//获取原生公钥
const rawPublicKey = privateKeyManager.rawPublicKey
```
+ **账户地址校验**
```js
const address = 'did:bid:efnVUgqQFfYeu97ABf6sGm3WFtVXHZB2'
const isAddress = sdk.keypair.isAddress(address)
```
+ **根据私钥获取公钥**
```js
const encPrivateKey = 'privbsDGan4sA9ZYpEERhMe25k4K5tnJu1fNqfEHbyKfaV9XSYq7uMcy'
const encPublicKey = sdk.keypair.getEncPublicKey(encPrivateKey)
```
+ **原生私钥转星火私钥**
```js
const encPrivateKeyByRaw = sdk.keypair.getEncPrivateKeyByRaw(rawPrivateKey,sdk.keypair.CRYPTO_ED25519)
```
+ **原生公钥转星火公钥**
```js
const encPublicKeyByRaw = sdk.keypair.getEncPublicKeyByRaw(rawPublicKey,sdk.keypair.CRYPTO_ED25519)
```
+ **签名**
```js
const privateKey = 'privbsDGan4sA9ZYpEERhMe25k4K5tnJu1fNqfEHbyKfaV9XSYq7uMcy'
const serialization = 'test'
const signature = sdk.keypair.sign(serialization,privateKey)
```
### 1.2.4 公钥对象使用
+ **构造对象**
```js
//公钥创建对象
const encPublicKey = 'b0014085888f15e6fdae80827f5ec129f7e9323cf60732e7f8259fa2d68a282e8eed51fad13f'
const publicKeyManager = sdk.keypair.publicKeyManager(encPublicKey)
```
+ **获取账号地址**
```js
const encPublicKey = 'b0014085888f15e6fdae80827f5ec129f7e9323cf60732e7f8259fa2d68a282e8eed51fad13f'
const publicKeyManager = sdk.keypair.publicKeyManager(encPublicKey)
const encAddress = publicKeyManager.encAddress
const rawPublicKey = publicKeyManager.rawPublicKey
```
+ **验签**
```js
const publicKey = 'b07a6604f00d7a00da61f975048a40db1568a3befe3eb4e69fa2d14bf3e44833db58f4761c293efcd48a912b8ee2693b4f9ae0c9a4d03ffe4fb54bb7c2a5afd758df78dd'
//签名后信息
const serialization = '59bda0c85e354ba4690b9bd8079a8e97dd18461c5d67128e46b693aef71d391ad965464c2db2c88610b3266899392703f11d047c696d17867985d0e057018450'
const verify= sdk.keypair.verify(serialization,publicKey)
```
### 1.2.5 密钥存储器
+ **生成密钥存储器**
```js
generateKeyStore(encPrivateKey,password)
```
> 请求参数
| 参数 | 类型 | 描述 |
| ------------- | ------ | ------------ |
| encPrivateKey | String | 待存储的密钥 |
| password | String | 口令 |
> 响应数据
| 参数 | 类型 | 描述 |
| -------- | ----------- | ---------------- |
| keyStore | KeyStoreEty | 存储密钥的存储器 |
> 示例
```js
const encPrivateKey = 'priSrrstxpMCKMa9G6d41rZ4iwzKbGeqJrXqeWZYXVo2pct24L'
const password = 'bif8888'
//生成密钥存储器
const keyStore = sdk.keypair.generateKeyStore(encPrivateKey,password)
```
+ **解析密钥存储器**
```
decipherKeyStore(keyStore,password);
```
> 请求参数
| 参数 | 类型 | 描述 |
| -------- | ------ | ---------------- |
| password | String | 口令 |
| keyStore | String | 存储密钥的存储器 |
> 响应数据
| 参数 | 类型 | 描述 |
| ------------- | ------ | -------------- |
| encPrivateKey | String | 解析出来的密钥 |
> 示例
```js
const password = 'bif8888'
const keyStore= '{\"cypher_text\":\"f306394e808cb422f5c0ad072f09283a4cee1fc8058ab2593397da1d375becdab05b886703d28e802353d5a659b3484f0103\",\"aesctr_iv\":\"9a1c9811fc29cfbe0b6e2160b2f7dc81\",\"scrypt_params\":{\"n\":16384,\"p\":1,\"r\":8,\"salt\":\"80454456c43bb0ed2103b990f549c15262d354cdb49a8682af1d4f618c112b9c\"},\"version\":2}'
const encPrivateKey = sdk.keypair.decipherKeyStore(keyStore,password)
console.log('decipherKeyStore()', JSON.stringify( encPrivateKey))
```
### 1.2.6 助记词(v1.0.3)
+ **生成助记词**
> 请求参数
| 参数 | 类型 | 描述 |
| ------ | ------ | ------------------------ |
| random | byte[] | 16位字节数组,必须是16位 |
> 响应数据
| 参数 | 类型 | 描述 |
| ------------- | ------------ | ------ |
| mnemonicCodes | List<String> | 助记词 |
> 示例
```js
let random = randombytes(16)
const mnemonicCodes = sdk.keypair.generateMnemonicCode(random.toString('hex'))
console.log('mnemonicCodes ',mnemonicCodes)
```
+ **根据助记词生成私钥**
> 请求参数
| 参数 | 类型 | 描述 |
| ------------- | ------------ | ----------------- |
| type | String | 选填,ED25519/SM2 |
| mnemonicCodes | List<String> | 必填,助记词 |
| hdPaths | List<String> | 必填,路径 |
> 响应数据
| 参数 | 类型 | 描述 |
| ----------- | ------------ | ---- |
| privateKeys | List<String> | 私钥 |
> 示例
```js
const mcode2 = 'attitude coyote negative library clerk copy portion bus combine gospel topic typical'
const mcode1 = 'disorder cluster crunch hood desk west double bind bomb salmon identify rate'
const hdPath_SM2 = "m/44'/2022'/0'/0/0"
const hdPath_Ed25519 = "m/44'/2022'/0'/0'/0'"
// ED25519
const privkey = sdk.keypair.privKeyFromMCodeAndCrypto(sdk.keypair.CRYPTO_ED25519, mcode2, hdPath_Ed25519)
// 私钥转对象
const privateKeyManagerByKey = await sdk.keypair.privateKeyManagerByKey(privkey)
console.log('privateKeyManagerByKey-Ed25519 ', JSON.stringify(privateKeyManagerByKey))
// SM2
const privkeySM2 = sdk.keypair.privKeyFromMCodeAndCrypto(sdk.keypair.CRYPTO_SM2, mcode1, hdPath_SM2)
const privateKeyManagerByKey2 = await sdk.keypair.privateKeyManagerByKey(privkeySM2)
console.log('privateKeyManagerByKey-SM2 ', JSON.stringify(privateKeyManagerByKey2))
const privateKey = await sdk.keypair.privateKeyFromMnemonicCode(mcode2, hdPath_Ed25519)
console.log(privateKey)
```
## 1.3 账户服务接口列表
账户服务接口主要是账户相关的接口,目前有8个接口:
| 序号 | 接口 | 说明 |
| ---- | ------------------- | ------------------------------------- |
| 1 | createAccount | 生成主链数字身份 |
| 2 | getAccount | 该接口用于获取指定的账户信息 |
| 3 | getNonce | 该接口用于获取指定账户的nonce值 |
| 4 | getAccountBalance | 该接口用于获取指定账户的星火令的余额 |
| 5 | setMetadatas | 设置metadatas |
| 6 | getAccountMetadatas | 该接口用于获取指定账户的metadatas信息 |
| 7 | setPrivilege | 设置权限 |
| 8 | getAccountPriv | 获取账户权限 |
### 1.3.1 createAccount
> 接口说明
```
该接口用于生成主链数字身份。
```
> 调用方法
```js
account.createAccount(createAccountOperation)
```
> 请求参数
| 参数 | 类型 | 描述 |
| ------------- | ------- | ------------------------------------------------------------ |
| senderAddress | string | 必填,交易源账号,即交易的发起方 |
| privateKey | String | 必填,交易源账户私钥 |
| ceilLedgerSeq | Long | 选填,区块高度限制, 如果大于0,则交易只有在该区块高度之前(包括该高度)才有效 |
| remarks | String | 选填,用户自定义给交易的备注 |
| destAddress | String | 必填,目标账户地址 |
| initBalance | Long | 必填,初始化星火令,单位glowstone,1 星火令 = 10^8 星火萤(glowstone), 大小(0, Long.MAX_VALUE] |
| gasPrice | Long | 选填,打包费用 (单位是glowstone),默认100L |
| feeLimit | Long | 选填,交易花费的手续费(单位是glowstone),默认1000000L |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ---- | ------ | -------- |
| hash | string | 交易hash |
> 错误码
| 异常 | 错误码 | 描述 |
| ------------------------- | ------ | --------------------------------------------- |
| INVALID_ADDRESS_ERROR | 11006 | Invalid address |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| PRIVATEKEY_NULL_ERROR | 11057 | PrivateKeys cannot be empty |
| INVALID_DESTADDRESS_ERROR | 11003 | Invalid destAddress |
| INVALID_INITBALANCE_ERROR | 11004 | InitBalance must between 0 and Long.MAX_VALUE |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let createAccountOperation = {
sourceAddress:'did:bid:efnVUgqQFfYeu97ABf6sGm3WFtVXHZB2',
privateKey:'priSPKkWVk418PKAS66q4bsiE2c4dKuSSafZvNWyGGp2sJVtXL',
remarks:'create account',
destAddress:'did:bid:efQMuPahc3zm7abBUBfj22xZokhZ7rED',
initBalance:'100000000000',
ceilLedgerSeq:'',
gasPrice:'',
feeLimit:'',
domainId:'20'
}
let data = await sdk.account.createAccount(createAccountOperation)
console.log('createAccount() : ', JSON.stringify(data))
```
### 1.3.2 getAccount
> 接口说明
该接口用于获取指定的账户信息。
> 调用方法
```js
account.getAccountBalance(param)
```
> 请求参数
| 参数 | 类型 | 描述 |
| -------- | ------- | --------------------------------- |
| address | String | 必填,待查询的区块链账户地址 |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ------- | ------ | ------------------------------------------------------------ |
| address | String | 账户地址 |
| balance | Long | 账户余额,单位glowstone,1 星火令 = 10^8 星火萤(glowstone), 必须大于0 |
| nonce | Long | 账户交易序列号,必须大于0 |
> 错误码
| 异常 | 错误码 | 描述 |
| ---------------------- | ------ | ------------------------------------------- |
| INVALID_ADDRESS_ERROR | 11006 | Invalid address |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let param = {
address: 'did:bid:eft6d191modv1cxBC43wjKHk85VVhQDc',
domainId: '20'
}
let data = await sdk.account.getAccountBalance(param)
console.log('getAccountBalance() : ', JSON.stringify(data))
```
### 1.3.3 getNonce
> 接口说明
该接口用于获取指定账户的nonce值。
> 调用方法
```js
getNonce(param)
```
> 请求参数
| 参数 | 类型 | 描述 |
| -------- | ------- | --------------------------------- |
| address | String | 必填,待查询的区块链账户地址 |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ----- | ---- | -------------- |
| nonce | Long | 账户交易序列号 |
> 错误码
| 异常 | 错误码 | 描述 |
| ---------------------- | ------ | ------------------------------------------- |
| INVALID_ADDRESS_ERROR | 11006 | Invalid address |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let param = {
address: 'did:bid:eft6d191modv1cxBC43wjKHk85VVhQDc',
domainId: '20'
}
let data = await sdk.account.getNonce(param)
console.log('getNonce() : ', JSON.stringify(data))
```
### 1.3.4 getAccountBalance
> 接口说明
该接口用于获取指定账户的余额。
> 调用方法
```js
account.getAccountBalance(param)
```
> 请求参数
| 参数 | 类型 | 描述 |
| -------- | ------- | --------------------------------- |
| address | String | 必填,待查询的区块链账户地址 |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ------- | ---- | ---- |
| balance | Long | 余额 |
> 错误码
| 异常 | 错误码 | 描述 |
| ---------------------- | ------ | ------------------------------------------- |
| INVALID_ADDRESS_ERROR | 11006 | Invalid address |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let param = {
address: 'did:bid:eft6d191modv1cxBC43wjKHk85VVhQDc',
domainId: '20'
}
let data = await sdk.account.getAccountBalance(param)
console.log('getAccountBalance() : ', JSON.stringify(data))
```
### 1.3.5 setMetadatas
> 接口说明
该接口用于修改账户的metadatas信息。
> 调用方法
```js
account.setMetadatas(setMetadatasOperation)
```
> 请求参数
| 参数 | 类型 | 描述 |
| ------------- | ------- | ------------------------------------------------------------ |
| senderAddress | string | 必填,交易源账号,即交易的发起方 |
| privateKey | String | 必填,交易源账户私钥 |
| ceilLedgerSeq | Long | 选填,区块高度限制, 如果大于0,则交易只有在该区块高度之前(包括该高度)才有效 |
| remarks | String | 选填,用户自定义给交易的备注 |
| key | String | 必填,metadatas的关键词,长度限制[1, 1024] |
| value | String | 必填,metadatas的内容,长度限制[0, 256000] |
| version | Long | 选填,metadatas的版本 |
| deleteFlag | Boolean | 选填,是否删除remarks |
| gasPrice | Long | 选填,打包费用 (单位是glowstone),默认100L |
| feeLimit | Long | 选填,交易花费的手续费(单位是glowstone),默认1000000L |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ---- | ------ | -------- |
| hash | string | 交易hash |
> 错误码
| 异常 | 错误码 | 描述 |
| ----------------------- | ------ | ------------------------------------------------ |
| INVALID_ADDRESS_ERROR | 11006 | Invalid address |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| PRIVATEKEY_NULL_ERROR | 11057 | PrivateKeys cannot be empty |
| INVALID_DATAKEY_ERROR | 11011 | The length of key must be between 1 and 1024 |
| INVALID_DATAVALUE_ERROR | 11012 | The length of value must be between 0 and 256000 |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let setMetadatasOperation = {
sourceAddress:'did:bid:eft6d191modv1cxBC43wjKHk85VVhQDc',
privateKey:'priSPKff1hvKVFYYFKSgfMb17wJ4dYZAHhLREarvh4Cy6fgn5b',
remarks:'create account',
key:'20211210',
value:'metadata-20211210',
version:'1',
gasPrice:'',
feeLimit:'',
ceilLedgerSeq: '',
domainId:'20'
}
let data = await sdk.account.setMetadatas(setMetadatasOperation)
console.log('setMetadatas() : ',JSON.stringify(data))
```
### 1.3.6 getAccountMetadatas
> 接口说明
该接口用于获取指定账户的metadatas信息。
> 调用方法
```js
account.getMetadatas(getMetadatasOperation)
```
> 请求参数
| 参数 | 类型 | 描述 |
| -------- | ------- | ------------------------------------------------------------ |
| address | String | 必填,待查询的账户地址 |
| key | String | 选填,metadatas关键字,长度限制[1, 1024],有值为精确查找,无值为全部查找 |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| -------------------- | -------- | ----------------- |
| metadatas | object[] | 账户 |
| metadatas[i].key | String | metadatas的关键词 |
| metadatas[i].value | String | metadatas的内容 |
| metadatas[i].version | Long | metadatas的版本 |
> 错误码
| 异常 | 错误码 | 描述 |
| ---------------------- | ------ | -------------------------------------------- |
| INVALID_ADDRESS_ERROR | 11006 | Invalid address |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| NO_METADATAS_ERROR | 11010 | The account does not have the metadatas |
| INVALID_DATAKEY_ERROR | 11011 | The length of key must be between 1 and 1024 |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let data = await sdk.account.getMetadatas({
address: 'did:bid:eft6d191modv1cxBC43wjKHk85VVhQDc',
key: '20211208',
domainId: '20'
})
console.log('getMetadatas() : ',JSON.stringify(data))
```
### 1.3.7 setPrivilege
> 接口说明
该接口用于设置权限。
> 调用方法
```js
setPrivilege(accountSetPrivilegeOperation)
```
> 请求参数
| 参数 | 类型 | 描述 |
| ----------------------- | ------- | ------------------------------------------------------------ |
| senderAddress | string | 必填,交易源账号,即交易的发起方 |
| privateKey | String | 必填,交易源账户私钥 |
| ceilLedgerSeq | Long | 选填,区块高度限制, 如果大于0,则交易只有在该区块高度之前(包括该高度)才有效 |
| remarks | String | 选填,用户自定义给交易的备注 |
| signers | list | 选填,签名者权重列表 |
| signers.address | String | 签名者区块链账户地址 |
| signers.weight | Long | 为签名者设置权重值 |
| txThreshold | String | 选填,交易门限,大小限制[0, Long.MAX_VALUE] |
| typeThreshold | list | 选填,指定类型交易门限 |
| typeThreshold.type | Long | 操作类型,必须大于0 |
| typeThreshold.threshold | Long | 门限值,大小限制[0, Long.MAX_VALUE] |
| masterWeight | String | 选填 |
| gasPrice | Long | 选填,打包费用 (单位是glowstone),默认100L |
| feeLimit | Long | 选填,交易花费的手续费(单位是glowstone),默认1000000L |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ---- | ------ | -------- |
| hash | string | 交易hash |
> 错误码
| 异常 | 错误码 | 描述 |
| ---------------------- | ------ | ------------------------------------------- |
| INVALID_ADDRESS_ERROR | 11006 | Invalid address |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| PRIVATEKEY_NULL_ERROR | 11057 | PrivateKeys cannot be empty |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let accountSetPrivilegeOperation = {
sourceAddress:'did:bid:efMrjMzYWUBBLZBwgsWtxEvdfQe5wejB',
privateKey:'priSPKqYp19ghxeCykHUrepLRkCRD3a2a9y5MJGF8Kc4qfn2aK',
txThreshold:'8',
signers: [{
address: 'did:bid:ef284xXpJLySqXnMcaLVkFWTJyJ6VhpxG',
weight: '55'
}],
typeThresholds: [{
type: '5',
threshold: '51',
}],
feeLimit: '',
gasPrice: '',
ceilLedgerSeq: '',
domainId: '20'
}
let data = await sdk.account.setPrivilege(accountSetPrivilegeOperation)
console.log('setPrivilege() : ',JSON.stringify(data))
```
### 1.3.8 getAccountPriv
> 接口说明
该接口用于获取指定的账户权限信息。
> 调用方法
```js
account.getAccountPriv(param)
```
> 请求参数
| 参数 | 类型 | 描述 |
| -------- | ------- | --------------------------------- |
| address | String | 必填,待查询的区块链账户地址 |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ------------------------------------------- | -------- | ---------------------- |
| address | String | 账户地址 |
| priv | Object | 账户权限 |
| Priv.masterWeight | Object | 账户自身权重,大小限制 |
| Priv.signers | Object | 签名者权重列表 |
| Priv.signers[i].address | String | 签名者区块链账户地址 |
| Priv.signers[i].weight | Long | 签名者权重,大小限制 |
| Priv.Thresholds | Object | |
| Priv.Thresholds.txThreshold | Long | 交易默认门限,大小限制 |
| Priv.Thresholds.typeThresholds | Object[] | 不同类型交易的门限 |
| Priv.Thresholds.typeThresholds[i].type | Long | 操作类型,必须大于0 |
| Priv.Thresholds.typeThresholds[i].threshold | Long | 门限值,大小限制 |
> 错误码
| 异常 | 错误码 | 描述 |
| ---------------------- | ------ | ------------------------------------------- |
| INVALID_ADDRESS_ERROR | 11006 | Invalid address |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let param = {
address: 'did:bid:efMrjMzYWUBBLZBwgsWtxEvdfQe5wejB',
domainId: '20'
}
let data = await sdk.account.getAccountPriv(param)
console.log('getAccountPriv() : ', JSON.stringify(data))
```
## 1.4 合约服务接口列表
合约服务接口主要是合约相关的接口,目前有6个接口:
| 序号 | 接口 | 说明 |
| ---- | -------------------- | ---------------------------------- |
| 1 | checkContractAddress | 该接口用于检测合约账户的有效性 |
| 2 | contractCreate | 创建合约 |
| 3 | getContractInfo | 该接口用于查询合约代码 |
| 4 | getContractAddress | 该接口用于根据交易Hash查询合约地址 |
| 5 | contractQuery | 该接口用于调试合约代码 |
| 6 | contractInvoke | 合约调用 |
| 7 | batchContractInvoke | 批量合约调用 |
### 1.4.1 checkContractAddress
> 接口说明
该接口用于检测合约账户的有效性。
> 调用方法
```js
contract.checkContractAddress(param)
```
> 请求参数
| 参数 | 类型 | 描述 |
| --------------- | ------- | --------------------------------- |
| contractAddress | String | 待检测的合约账户地址 |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ------- | ------- | -------- |
| isValid | Boolean | 是否有效 |
> 错误码
| 异常 | 错误码 | 描述 |
| ----------------------------- | ------ | ------------------------------------------- |
| INVALID_CONTRACTADDRESS_ERROR | 11037 | Invalid contract address |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let param = {
contractAddress: 'did:bid:efL7d2Ak1gyUpU4eiM3C9oxvbkhXr4Mu',
domainId: '20'
}
let data = await sdk.contract.checkContractAddress(param)
console.log('checkContractAddress() : ', JSON.stringify(data))
```
### 1.4.2 contractCreate
> 接口说明
该接口用于创建合约。
> 调用方法
```js
contract.createContract(createContractOperation)
```
> 请求参数
| 参数 | 类型 | 描述 |
| ------------- | ------- | ------------------------------------------------------------ |
| senderAddress | string | 必填,交易源账号,即交易的发起方 |
| feeLimit | Long | 选填,交易花费的手续费(单位是glowstone),默认1000000L |
| privateKey | String | 必填,交易源账户私钥 |
| ceilLedgerSeq | Long | 选填,区块高度限制, 如果大于0,则交易只有在该区块高度之前(包括该高度)才有效 |
| remarks | String | 选填,用户自定义给交易的备注 |
| initBalance | Long | 必填,给合约账户的初始化星火令,单位glowstone,1 星火令 = 10^8 星火萤(glowstone), 大小限制[1, Long.MAX_VALUE] |
| type | Integer | 选填,合约的类型,默认是0 , 0: javascript,1 :evm 。 |
| payload | String | 必填,对应语种的合约代码 |
| initInput | String | 选填,合约代码中init方法的入参 |
| gasPrice | Long | 选填,打包费用 (单位是glowstone),默认100L |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ---- | ------ | -------- |
| hash | string | 交易hash |
> 错误码
| 异常 | 错误码 | 描述 |
| ------------------------- | ------ | ------------------------------------------------ |
| INVALID_ADDRESS_ERROR | 11006 | Invalid address |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| PRIVATEKEY_NULL_ERROR | 11057 | PrivateKeys cannot be empty |
| INVALID_INITBALANCE_ERROR | 11004 | InitBalance must be between 0 and Long.MAX_VALUE |
| PAYLOAD_EMPTY_ERROR | 11044 | Payload cannot be empty |
| INVALID_FEELIMIT_ERROR | 11050 | FeeLimit must be between 0 and Long.MAX_VALUE |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ERRCODE_TRANSFER_NO_AUTH | 161 | 禁止转移星火令 |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let createContractOperation = {
sourceAddress:'did:bid:efQMuPahc3zm7abBUBfj22xZokhZ7rED',
privateKey:'priSPKqSR8vTVJ1y8Wu1skBNWMHPeu8nkaerZNKEzkRq3KJix4',
payload:"\"use strict\";function init(bar){/*init whatever you want*/return;}function main(input){let para = JSON.parse(input);if (para.do_foo)\n {\n let x = {\n \'hello\' : \'world\'\n };\n }\n }\n \n function query(input)\n { \n return input;\n }\n ",
initBalance:'1',
remarks:'create account',
type:0,
feeLimit:'100100000',
gasPrice:'',
ceilLedgerSeq:'',
initInput:'',
domainId: '20'
}
let data = await sdk.contract.createContract(createContractOperation)
console.log('createContract() : ', JSON.stringify(data))
```
### 1.4.3 getContractInfo
> 接口说明
该接口用于查询合约代码。
> 调用方法
```js
contract.getContractInfo(param)
```
> 请求参数
| 参数 | 类型 | 描述 |
| --------------- | ------- | --------------------------------- |
| contractAddress | String | 待查询的合约账户地址 |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ---------------- | ------- | --------------- |
| contract | object | 合约信息 |
| contract.type | Integer | 合约类型,默认0 |
| contract.payload | String | 合约代码 |
> 错误码
| 异常 | 错误码 | 描述 |
| ----------------------------------------- | ------ | ------------------------------------------- |
| INVALID_CONTRACTADDRESS_ERROR | 11037 | Invalid contract address |
| CONTRACTADDRESS_NOT_CONTRACTACCOUNT_ERROR | 11038 | contractAddress is not a contract account |
| NO_SUCH_TOKEN_ERROR | 11030 | No such token |
| GET_TOKEN_INFO_ERROR | 11066 | Failed to get token info |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let param = {
contractAddress: 'did:bid:efL7d2Ak1gyUpU4eiM3C9oxvbkhXr4Mu',
domainId: '20'
}
let data = await sdk.contract.getContractInfo(param)
console.log('getContractInfo() : ', JSON.stringify(data))
```
### 1.4.4 getContractAddress
> 接口说明
```
该接口用于根据交易Hash查询合约地址。
```
> 调用方法
```js
contract.getContractAddress(param)
```
> 请求参数
| 参数 | 类型 | 描述 |
| -------- | ------- | --------------------------------- |
| hash | String | 创建合约交易的hash |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ---------------------------------------- | ------------------------- | -------------- |
| contractAddressInfos | List<ContractAddressInfo> | 合约地址列表 |
| contractAddressInfos[i].contract_address | String | 合约地址 |
| contractAddressInfos[i].operation_index | Integer | 所在操作的下标 |
> 错误码
| 异常 | 错误码 | 描述 |
| ---------------------- | ------ | ------------------------------------------- |
| INVALID_HASH_ERROR | 11055 | Invalid transaction hash |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let param = {
hash: '59228dfa8fcd1e65b918dbe30096302f3a4b136d2762200029ed397496f96ada',
domainId: '20'
}
let data = await sdk.contract.getContractAddress(param)
console.log('getContractAddress() : ', JSON.stringify(data))
```
### 1.4.5 contractQuery
> 接口说明
该接口用于调用合约查询接口。
> 调用方法
```js
contract.contractQuery(contractQueryOperation)
```
> 请求参数
| 参数 | 类型 | 描述 |
| --------------- | ------- | ----------------------------------------------------- |
| sourceAddress | String | 选填,合约触发账户地址 |
| contractAddress | String | 必填,合约账户地址 |
| input | String | 选填,合约入参 |
| gasPrice | Long | 选填,打包费用 (单位是glowstone),默认100L |
| feeLimit | Long | 选填,交易花费的手续费(单位是glowstone),默认1000000L |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| --------- | --------- | ---------- |
| queryRets | JSONArray | 查询结果集 |
> 错误码
| 异常 | 错误码 | 描述 |
| ----------------------------------------- | ------ | ------------------------------------------------ |
| INVALID_SOURCEADDRESS_ERROR | 11002 | Invalid sourceAddress |
| INVALID_CONTRACTADDRESS_ERROR | 11037 | Invalid contract address |
| SOURCEADDRESS_EQUAL_CONTRACTADDRESS_ERROR | 11040 | SourceAddress cannot be equal to contractAddress |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let contractQueryOperation = {
sourceAddress:'',
contractAddress:'did:bid:efL7d2Ak1gyUpU4eiM3C9oxvbkhXr4Mu',
input:'',
feeLimit: '',
gasPrice: '',
domainId: '20'
}
let data = await sdk.contract.contractQuery(contractQueryOperation)
console.log('contractQuery() : ', JSON.stringify(data))
```
### 1.4.6 contractInvoke
> 接口说明
该接口用于合约调用。
> 调用方法
```js
contract.contractInvoke(contractInvokeOperation)
```
> 请求参数
| 参数 | 类型 | 描述 |
| --------------- | ------- | ------------------------------------------------------------ |
| senderAddress | string | 必填,交易源账号,即交易的发起方 |
| feeLimit | Long | 选填,交易花费的手续费(单位是glowstone),默认1000000L |
| privateKey | String | 必填,交易源账户私钥 |
| ceilLedgerSeq | Long | 选填,区块高度限制, 如果大于0,则交易只有在该区块高度之前(包括该高度)才有效 |
| remarks | String | 选填,用户自定义给交易的备注 |
| contractAddress | String | 必填,合约账户地址 |
| amount | Long | 必填,转账金额 |
| input | String | 选填,待触发的合约的main()入参 |
| gasPrice | Long | 选填,打包费用 (单位是glowstone),默认100L |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ---- | ------ | -------- |
| hash | string | 交易hash |
> 错误码
| 异常 | 错误码 | 描述 |
| ----------------------------- | ------ | --------------------------------------------- |
| INVALID_ADDRESS_ERROR | 11006 | Invalid address |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| PRIVATEKEY_NULL_ERROR | 11057 | PrivateKeys cannot be empty |
| INVALID_CONTRACTADDRESS_ERROR | 11037 | Invalid contract address |
| INVALID_AMOUNT_ERROR | 11024 | Amount must between 0 and max(int64) |
| INVALID_FEELIMIT_ERROR | 11050 | FeeLimit must be between 0 and Long.MAX_VALUE |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_GASPRICE_ERROR | 11049 | GasPrice must be between 0 and Long.MAX_VALUE |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ERRCODE_TRANSFER_NO_AUTH | 161 | 禁止转移星火令 |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let contractInvokeOperation = {
sourceAddress:'did:bid:efQMuPahc3zm7abBUBfj22xZokhZ7rED',
privateKey:'priSPKqSR8vTVJ1y8Wu1skBNWMHPeu8nkaerZNKEzkRq3KJix4',
contractAddress:'did:bid:efL7d2Ak1gyUpU4eiM3C9oxvbkhXr4Mu',
ceilLedgerSeq:'',
feeLimit:'',
gasPrice: '',
remarks:'contractInvoke',
amount:0,
input:'',
domainId: '20'
}
let data = await sdk.contract.contractInvoke(contractInvokeOperation)
console.log('contractInvoke() : ', JSON.stringify(data))
```
### 1.4.7 batchContractInvoke
> 接口说明
该接口用于批量合约调用。
> 调用方法
```java
contract.batchContractInvoke(contractInvokeRequestOperation)
```
> 请求参数
| 参数 | 类型 | 描述 |
| ------------- | -------------------------------- | ------------------------------------------------------------ |
| senderAddress | string | 必填,交易源账号,即交易的发起方 |
| gasPrice | Long | 选填,打包费用 (单位是glowstone)默认,默认100L |
| feeLimit | Long | 选填,交易花费的手续费(单位是glowstone),默认1000000L |
| privateKey | String | 必填,交易源账户私钥 |
| ceilLedgerSeq | Long | 选填,区块高度限制, 如果大于0,则交易只有在该区块高度之前(包括该高度)才有效 |
| remarks | String | 选填,用户自定义给交易的备注 |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
| operations | List<BIFContractInvokeOperation> | 必填,合约调用集合 |
| BIFContractInvokeOperation | | |
| -------------------------- | ------ | ------------------------------ |
| contractAddress | String | 必填,合约账户地址 |
| BIFAmount | Long | 必填,转账金额 |
| input | String | 选填,待触发的合约的main()入参 |
> 响应数据
| 参数 | 类型 | 描述 |
| ---- | ------ | -------- |
| hash | string | 交易hash |
> 错误码
| 异常 | 错误码 | 描述 |
| ----------------------------- | ------ | --------------------------------------------- |
| INVALID_ADDRESS_ERROR | 11006 | Invalid address |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| PRIVATEKEY_NULL_ERROR | 11057 | PrivateKeys cannot be empty |
| INVALID_CONTRACTADDRESS_ERROR | 11037 | Invalid contract address |
| INVALID_AMOUNT_ERROR | 11024 | Amount must be between 0 and Long.MAX_VALUE |
| INVALID_FEELIMIT_ERROR | 11050 | FeeLimit must be between 0 and Long.MAX_VALUE |
| SYSTEM_ERROR | 20000 | System error |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ERRCODE_TRANSFER_NO_AUTH | 161 | 禁止转移星火令 |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
let senderAddress = 'did:bid:efnVUgqQFfYeu97ABf6sGm3WFtVXHZB2'
let senderPrivateKey = 'priSPKkWVk418PKAS66q4bsiE2c4dKuSSafZvNWyGGp2sJVtXL'
let contractAddress = 'did:bid:efHtDebBjqEsgEVqyiwvHwdPWSnHmkzy'
let amount = '0'
const destAddress1 = sdk.keypair.getBidAndKeyPair().encAddress
const destAddress2 = sdk.keypair.getBidAndKeyPair().encAddress
let input1 = '{"method":"creation","params":{"document":{"@context": ["https://w3.org/ns/did/v1"],"context": "https://w3id.org/did/v1","id": "' + destAddress1 + '", "version": "1"}}}'
let input2 = '{"method":"creation","params":{"document":{"@context": ["https://w3.org/ns/did/v1"],"context": "https://w3id.org/did/v1","id": "' + destAddress2 + '", "version": "1"}}}'
let operations = []
let contractInvokeOperation1 = {
contractAddress: contractAddress,
amount: amount,
input: input1
}
let contractInvokeOperation2 = {
contractAddress: contractAddress,
amount: amount,
input: input2
}
operations.push(contractInvokeOperation1)
operations.push(contractInvokeOperation2)
let contractInvokeRequestOperation = sdk.operaction.contractInvokeRequestOperation
contractInvokeRequestOperation.setSenderAddress(senderAddress)
contractInvokeRequestOperation.setPrivateKey(senderPrivateKey)
contractInvokeRequestOperation.setRemarks('contract invoke')
contractInvokeRequestOperation.setDomainId('0')
contractInvokeRequestOperation.setCeilLedgerSeq('')
contractInvokeRequestOperation.setOperations(operations)
let data = await sdk.contract.batchContractInvoke(contractInvokeRequestOperation)
console.log('batchContractInvoke() : ', JSON.stringify(data))
```
## 1.5 交易服务接口列表
交易服务接口主要是交易相关的接口,目前有4个接口:
| 序号 | 接口 | 说明 |
| ---- | ------------------------- | ---------------------------------- |
| 1 | gasSend | 交易 |
| 2 | getTransactionInfo | 该接口用于实现根据交易hash查询交易 |
| 3 | evaluateFee | 该接口用于交易费用评估 |
| 4 | BIFSubmit | 提交交易 |
| 5 | getTxCacheSize | 该接口用于获取交易池中交易条数 |
| 6 | batchEvaluateFee | 该接口为批量费用评估接口 |
| 7 | getTxCacheData | 该接口用于获取交易池中交易数据 |
| 8 | parseBlob | blob数据解析 |
| 9 | batchGasSend | 批量发起交易 |
| 10 | getTransactionListByQuery | 查询交易数据列表 |
### 1.5.1 gasSend
> 接口说明
该接口用于发起交易。
> 调用方法
```js
transaction.gasSend(gasSendOperation)
```
> 请求参数
| 参数 | 类型 | 描述 |
| ------------- | ------- | ------------------------------------------------------------ |
| senderAddress | string | 必填,交易源账号,即交易的发起方 |
| privateKey | String | 必填,交易源账户私钥 |
| ceilLedgerSeq | Long | 选填,区块高度限制, 如果大于0,则交易只有在该区块高度之前(包括该高度)才有效 |
| remarks | String | 选填,用户自定义给交易的备注 |
| destAddress | String | 必填,发起方地址 |
| amount | Long | 必填,转账金额 |
| gasPrice | Long | 选填,打包费用 (单位是glowstone),默认100L |
| feeLimit | Long | 选填,交易花费的手续费(单位是glowstone),默认1000000L |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ---- | ------ | -------- |
| hash | string | 交易hash |
> 错误码
| 异常 | 错误码 | 描述 |
| ------------------------- | ------ | ---------------------------------------------- |
| INVALID_ADDRESS_ERROR | 11006 | Invalid address |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| PRIVATEKEY_NULL_ERROR | 11057 | PrivateKeys cannot be empty |
| INVALID_DESTADDRESS_ERROR | 11003 | Invalid destAddress |
| INVALID_GAS_AMOUNT_ERROR | 11026 | BIFAmount must be between 0 and Long.MAX_VALUE |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let gasSendOperation = {
sourceAddress:'did:bid:efnVUgqQFfYeu97ABf6sGm3WFtVXHZB2',
privateKey:'priSPKkWVk418PKAS66q4bsiE2c4dKuSSafZvNWyGGp2sJVtXL',
destAddress:'did:bid:efYhALrHoHiaVnoZgRgJbCghZZdzkQUh',
remarks:'gasSend',
amount:'100000000',
ceilLedgerSeq:'',
feeLimit: '',
gasPrice: '',
domainId: '20'
}
let data = await sdk.transaction.gasSend(gasSendOperation)
console.log('gasSend() : ', JSON.stringify(data))
```
### 1.5.2 getTransactionInfo
> 接口说明
该接口用于实现根据交易hash查询交易。
> 调用方法
```js
transaction.getTransactionInfo(param)
```
> 请求参数
| 参数 | 类型 | 描述 |
| -------- | ------- | --------------------------------- |
| hash | String | 交易hash |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ---------------------------------- | ------------------ | -------------- |
| totalCount | Long | 返回的总交易数 |
| transactions | TransactionHistory | 交易内容 |
| transactions.actual_fee | String | 交易实际费用 |
| transactions.close_time | Long | 交易确认时间 |
| transactions.error_code | Long | 交易错误码 |
| transactions.error_desc | String | 交易描述 |
| transactions.hash | String | 交易hash |
| transactions.ledger_seq | Long | 区块序列号 |
| transactions.transaction | TransactionInfo | 交易内容列表 |
| transactions.signatures | Signature | 签名列表 |
| transactions.signatures.sign_data | Long | 签名后数据 |
| transactions.signatures.public_key | Long | 公钥 |
| transactions.tx_size: 303 | Long | 交易大小 |
> 错误码
| 异常 | 错误码 | 描述 |
| ---------------------- | ------ | ------------------------------------------- |
| INVALID_HASH_ERROR | 11055 | Invalid transaction hash |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let param = {
hash: '0390905e5970f1bf262b37fc11d7b2b4b5e28d9a33006584c4940c60fd283518',
domainId: '20'
}
let data = await sdk.transaction.getTransactionInfo(param)
console.log('getTransactionInfo() : ', JSON.stringify(data))
```
### 1.5.3 evaluateFee
> 接口说明
该接口用于交易费用评估。
> 调用方法
```js
transaction.evaluateFee(info)
```
> 请求参数
| 参数 | 类型 | 描述 |
| ------------- | ----------------------- | --------------------------------------- |
| senderAddress | string | 必填,交易源账号,即交易的发起方 |
| privateKey | String | 必填,交易源账户私钥 |
| operations | [Operation](#Operation) | 必填,待提交的操作,不能为空 |
| gasPrice | Long | 必填,打包费用 (单位是glowstone) |
| feeLimit | Long | 选填,交易花费的手续费(单位是glowstone) |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
#### Operation
| 序号 | 操作 | 描述 |
| ---- | ---------------------------- | ---------------------------- |
| 1 | accountCreateOperation | 生成主链数字身份 |
| 2 | accountSetMetadataOperation | 修改账户的metadatas信息 |
| 3 | accountSetPrivilegeOperation | 设置权限 |
| 4 | contractCreateOperation | 创建合约(暂不支持EVM 合约) |
| 5 | contractInvokeOperation | 合约调用(暂不支持EVM 合约) |
| 6 | gasSendOperation | 发起交易 |
> 响应数据
| 参数 | 类型 | 描述 |
| -------- | ---- | ------------------ |
| feeLimit | Long | 交易要求的最低费用 |
| gasPrice | Long | 交易燃料单价 |
> 错误码
| 异常 | 错误码 | 描述 |
| ----------------------------- | ------ | ------------------------------------------------------- |
| INVALID_SOURCEADDRESS_ERROR | 11002 | Invalid sourceAddress |
| OPERATIONS_EMPTY_ERROR | 11051 | Operations cannot be empty |
| OPERATIONS_ONE_ERROR | 11053 | One of the operations cannot be resolved |
| INVALID_SIGNATURENUMBER_ERROR | 11054 | SignagureNumber must be between 1 and Integer.MAX_VALUE |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化参数
let privateContractCallOperation=sdk.operaction.privateContractCallOperation
privateContractCallOperation.setType(0)
privateContractCallOperation.setFrom('bDRE8iIfGdwDeQOcJqZabZQH5Nd6cfTOMOorudtgXjQ=')
privateContractCallOperation.setTo(['bwPdcwfUEtSZnaDmi2Nvj9HTwOcRvCRDh0cRdvX9BFw='])
privateContractCallOperation.setDestAddress('did:bid:efGSDpr4Fo4TEnHx1kBBSgSAfTt85kY6')
privateContractCallOperation.setInput('{\"method\":\"queryBanance\",\"params\":{\"address\":\"567890哈哈=======\"}}')
let request = {
sourceAddress: 'did:bid:efAsXt5zM2Hsq6wCYRMZBS5Q9HvG2EmK',
privateKey: 'priSPKUudyVAi5WrhHJU1vCJZYyBL5DNd36MPhbYgHuDPz5E7r',
operations: privateContractCallOperation,
feeLimit: '',
gasPrice: '',
domainId: '20'
}
let data = await sdk.transaction.evaluateFee(request)
console.log('evaluateFee() : ', JSON.stringify(data))
```
### 1.5.4 BIFSubmit(v1.0.3)
> 接口说明
该接口用于交易提交。
> 调用方法
```js
transaction.BIFSubmit(request)
```
> 请求参数
| 参数 | 类型 | 描述 |
| ------------- | ------ | ------------------ |
| serialization | String | 必填,交易序列化值 |
| signatures | String | 必填,签名数据 |
> 响应数据
| 参数 | 类型 | 描述 |
| ---- | ------ | -------- |
| hash | String | 交易hash |
> 错误码
| 异常 | 错误码 | 描述 |
| --------------------------- | ------ | -------------------------------- |
| INVALID_SERIALIZATION_ERROR | 11056 | Invalid serialization |
| SIGNATURE_EMPTY_ERROR | 11067 | The signatures cannot be empty |
| SIGNDATA_NULL_ERROR | 11059 | SignData cannot be empty |
| PUBLICKEY_NULL_ERROR | 11061 | PublicKey cannot be empty |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| SYSTEM_ERROR | 20000 | System error |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ERRCODE_TRANSFER_NO_AUTH | 161 | 禁止转移星火令 |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
- 方式一:单签名
```js
// 初始化参数
let serialization = '0a286469643a6269643a65666e5655677151466659657539374142663673476d335746745658485a4232104f22330807522f0a286469643a6269643a65665968414c72486f486961566e6f5a6752674a624367685a5a647a6b5155681080c2d72f2a0767617353656e6430c0843d3864'
let privateKey = 'priSPKkWVk418PKAS66q4bsiE2c4dKuSSafZvNWyGGp2sJVtXL'
// sign serialization
let signatures = sdk.transaction.signTransSerialization([privateKey]
, serialization)
// submit transaction
let transactionInfo = await sdk.transaction.submitTrans(
serialization,
signatures
)
console.log('submitTrans() : ', JSON.stringify(transactionInfo))
```
- 方式二:多签名
```js
// 初始化参数
let serialization = '0a286469643a6269643a65666e5655677151466659657539374142663673476d335746745658485a4232104f22330807522f0a286469643a6269643a65665968414c72486f486961566e6f5a6752674a624367685a5a647a6b5155681080c2d72f2a0767617353656e6430c0843d3864'
let privateKey1 = 'priSPKkWVk418PKAS66q4bsiE2c4dKuSSafZvNWyGGp2sJVtXL'
let privateKey2 = 'priSPKpeenYnvVLaGkCg6Lm5c8vsq85htyF62xyFz54eCkJ2rK'
// sign serialization
let signatures = sdk.transaction.signTransSerialization([privateKey1, privateKey2]
, serialization)
let request = {
serialization: serialization,
signatures: signatures
}
// submit transaction
let transactionInfo = await sdk.transaction.BIFSubmit(request)
console.log('BIFSubmit() : ', JSON.stringify(transactionInfo))
```
### 1.5.5 getTxCacheSize
> 接口说明
该接口用于获取交易池中交易条数。
> 调用方法
```js
transaction.getTxCacheSize(domainId)
```
> 请求参数
| 参数 | 类型 | 描述 |
| -------- | ------- | --------------------------------- |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ---------- | ---- | -------------------- |
| queue_size | Long | 返回交易池中交易条数 |
> 错误码
| 异常 | 错误码 | 描述 |
| -------------------- | ------ | -------------------------------- |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| SYSTEM_ERROR | 20000 | System error |
> 示例
```js
it('test getTxCacheSize', async () => {
let domainId='20'
let data = await sdk.transaction.getTxCacheSize(domainId)
console.log('getTxCacheSize() : ', JSON.stringify(data))
})
```
### 1.5.6 batchEvaluateFee
> 接口说明
该接口为批量费用评估接口。
> 调用方法
```js
transaction.batchEvaluateFee(request)
```
> 请求参数
| 参数 | 类型 | 描述 |
| ------------- | ----------------------- | --------------------------------------- |
| senderAddress | string | 必填,交易源账号,即交易的发起方 |
| privateKey | String | 必填,交易源账户私钥 |
| operations | [Operation](#Operation) | 必填,待提交的操作,不能为空 |
| gasPrice | Long | 必填,打包费用 (单位是glowstone) |
| feeLimit | Long | 选填,交易花费的手续费(单位是glowstone) |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
#### Operation
| 序号 | 操作 | 描述 |
| ---- | ----------------------- | ---------------------------- |
| 1 | contractInvokeOperation | 合约调用(暂不支持EVM 合约) |
> 响应数据
| 参数 | 类型 | 描述 |
| -------- | ---- | ------------------ |
| feeLimit | Long | 交易要求的最低费用 |
| gasPrice | Long | 交易燃料单价 |
> 错误码
| 异常 | 错误码 | 描述 |
| ----------------------------- | ------ | ------------------------------------------------------- |
| INVALID_SOURCEADDRESS_ERROR | 11002 | Invalid sourceAddress |
| OPERATIONS_EMPTY_ERROR | 11051 | Operations cannot be empty |
| OPERATIONS_ONE_ERROR | 11053 | One of the operations cannot be resolved |
| INVALID_SIGNATURENUMBER_ERROR | 11054 | SignagureNumber must be between 1 and Integer.MAX_VALUE |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
let amount = '0'
const destAddress1 = sdk.keypair.getBidAndKeyPairBySM2().encAddress
const destAddress2 = sdk.keypair.getBidAndKeyPairBySM2().encAddress
let input1 = '{"method":"creation","params":{"document":{"@context": ["https://w3.org/ns/did/v1"],"context": "https://w3id.org/did/v1","id": "' + destAddress1 + '", "version": "1"}}}'
let input2 = '{"method":"creation","params":{"document":{"@context": ["https://w3.org/ns/did/v1"],"context": "https://w3id.org/did/v1","id": "' + destAddress2 + '", "version": "1"}}}'
let operations = []
let contractInvokeOperation1 = {
contractAddress: destAddress1,
amount: amount,
input: input1
}
let contractInvokeOperation2 = {
contractAddress: destAddress2,
amount: amount,
input: input2
}
operations.push(contractInvokeOperation1)
operations.push(contractInvokeOperation2)
let request = {
sourceAddress: 'did:bid:efnVUgqQFfYeu97ABf6sGm3WFtVXHZB2',
privateKey: 'priSPKkWVk418PKAS66q4bsiE2c4dKuSSafZvNWyGGp2sJVtXL',
operations: operations,
feeLimit: '20',
gasPrice: '1',
domainId: '0'
}
let data = await sdk.transaction.batchEvaluateFee(request)
console.log('batchEvaluateFee() : ', JSON.stringify(data))
```
### 1.5.7 getTxCacheData
> 接口说明
该接口用于获取交易池中交易数据。
> 调用方法
```js
transaction.getTxCacheData(request)
```
> 请求参数
| 参数 | 类型 | 描述 |
| -------- | ------- | --------------------------------- |
| hash | String | 选填,交易hash |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
| poolType | Integer | 缓存池类型 0- 平台缓存 1- 底层链缓存,默认为1 |
> 响应数据
| 参数 | 类型 | 描述 |
| ------------------------------ | -------- | -------------------- |
| transactions | Object[] | 返回交易池中交易数据 |
| transactionsp[i].hash | String | 交易hash |
| transactionsp[i].incoming_time | String | 进入时间 |
| transactionsp[i].status | String | 状态 |
| transactionsp[i].transaction | Object | |
> 错误码
| 异常 | 错误码 | 描述 |
| ---------------------- | ------ | ------------------------------------------- |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
let request = {
domainId: '0',
hash: ''
}
let data = await sdk.transaction.getTxCacheData(request)
console.log('getTxCacheData() : ', JSON.stringify(data))
```
### 1.5.8 parseBlob
> 接口说明
该接口用于blob数据解析。
> 调用方法
```js
transaction.parseBlob(transactionBlob)
```
> 请求参数
| 参数 | 类型 | 描述 |
| ---- | ------ | ---------- |
| blob | String | 必填,BLOB |
> 响应数据
| 参数 | 类型 | 描述 |
| ------------- | -------- | -------------------------- |
| sourceAddress | String | 交易源账号,即交易的发起方 |
| nonce | String | 账户交易序列号,必须大于0 |
| fee_limit | String | 交易要求的最低费用 |
| gas_price | String | 交易燃料单价 |
| domain_id | String | blob解析出的域ID值 |
| remarks | String | 用户自定义给交易的备注 |
| operations | Object[] | 操作对象数组 |
> 错误码
| 异常 | 错误码 | 描述 |
| --------------------------- | ------ | -------------------------------- |
| INVALID_SERIALIZATION_ERROR | 11056 | Invalid serialization |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| SYSTEM_ERROR | 20000 | System error |
> 示例
```js
let transactionBlob = '0A276469643A6269643A324E4A4C46343931536431553434323270476B50715467686946664B3337751003225C080712276469643A6269643A324E4A4C46343931536431553434323270476B50715467686946664B333775522F0A276469643A6269643A32695277744E53666841753739754A73624C6B78694333374A554C437235791080A9E0870430C0843D38E807'
let data = await sdk.transaction.parseBlob(transactionBlob)
console.log('parseBlob() : ', JSON.stringify(data))
```
### 1.5.9 batchGasSend
> 接口说明
该接口用于批量发起交易。
> 调用方法
```java
transaction.batchGasSend(gasSendRequestOperation)
```
> 请求参数
| 参数 | 类型 | 描述 |
| ------------- | ------------------------- | ------------------------------------------------------------ |
| senderAddress | string | 必填,交易源账号,即交易的发起方 |
| gasPrice | Long | 选填,打包费用 (单位是glowstone)默认,默认100L |
| feeLimit | Long | 选填,交易花费的手续费(单位是glowstone),默认1000000L |
| privateKey | String | 必填,交易源账户私钥 |
| ceilLedgerSeq | Long | 选填,区块高度限制, 如果大于0,则交易只有在该区块高度之前(包括该高度)才有效 |
| remarks | String | 选填,用户自定义给交易的备注 |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
| operations | List<BIFGasSendOperation> | 必填,合约调用集合 |
| BIFGasSendOperation | | |
| ------------------- | ------ | ------------------ |
| destAddress | String | 必填,合约账户地址 |
| amount | Long | 必填,转账金额 |
> 响应数据
| 参数 | 类型 | 描述 |
| ---- | ------ | -------- |
| hash | string | 交易hash |
> 错误码
| 异常 | 错误码 | 描述 |
| ----------------------------- | ------ | --------------------------------------------- |
| INVALID_ADDRESS_ERROR | 11006 | Invalid address |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| PRIVATEKEY_NULL_ERROR | 11057 | PrivateKeys cannot be empty |
| INVALID_CONTRACTADDRESS_ERROR | 11037 | Invalid contract address |
| INVALID_AMOUNT_ERROR | 11024 | Amount must be between 0 and Long.MAX_VALUE |
| INVALID_FEELIMIT_ERROR | 11050 | FeeLimit must be between 0 and Long.MAX_VALUE |
| SYSTEM_ERROR | 20000 | System error |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
let senderAddress = 'did:bid:efnVUgqQFfYeu97ABf6sGm3WFtVXHZB2'
let senderPrivateKey = 'priSPKkWVk418PKAS66q4bsiE2c4dKuSSafZvNWyGGp2sJVtXL'
let amount = '0'
const destAddress1 = sdk.keypair.getBidAndKeyPair().encAddress
const destAddress2 = sdk.keypair.getBidAndKeyPair().encAddress
let operations = []
let gasSendOperation1 = {
destAddress: destAddress1,
amount: amount
}
let gasSendOperation2 = {
destAddress: destAddress2,
amount: amount
}
operations.push(gasSendOperation1)
operations.push(gasSendOperation2)
let gasSendRequestOperation = sdk.operaction.gasSendRequestOperation
gasSendRequestOperation.setSenderAddress(senderAddress)
gasSendRequestOperation.setPrivateKey(senderPrivateKey)
gasSendRequestOperation.setRemarks('gas send')
gasSendRequestOperation.setDomainId('0')
gasSendRequestOperation.setCeilLedgerSeq('')
gasSendRequestOperation.setOperations(operations)
let data = await sdk.transaction.batchGasSend(gasSendRequestOperation)
console.log('batchGasSend() : ', JSON.stringify(data))
```
### 1.5.10 getTransactionListByQuery
> 接口说明
查询交易数据列表。
> 调用方法
```js
transaction.getTransactionListByQuery(param)
```
> 请求参数
| 参数 | 类型 | 是否必填 | 备注 |
| ---------- | ------- | -------- | ------------------------------------------------------------ |
| bid | string | 否 | bid |
| hash | string | 否 | hash |
| tx_id | string | 否 | tx_id |
| start_time | string | 否 | 开始时间 yyyy-MM-dd HH:mm:ss 例:2023-09-14 21:21:41 |
| end_time | string | 否 | 结束时间 yyyy-MM-dd HH:mm:ss 例:2023-09-14 21:21:41 |
| tx_type | integer | 否 | 交易类型 0- 基础交易 1- 增强交易,当bid或tx_id不为空时,此参数必填 |
| page | integer | 是 | 页码 |
| page_size | integer | 是 | 每页记录数 |
| ledger_seq | Long | 否 | 块高度 |
> 响应数据
| 参数 | 类型 | 备注 |
| --------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| error_code | int | 成功0 ,失败非0 [状态码](https://test-bop-docs.bitfactory.cn/#/cn/md/apis/result-code/resultCode) |
| error_desc | string | 错误信息 |
| result | object | 数据 |
| success | boolean | 是否成功 |
| trace | string | 请求ID |
| result.total_page | long | |
| result.count | long | |
| result.transaction_bases | array([TransactionBase](https://test-bop-docs.bitfactory.cn/#/cn/md/apis/transaction-result/transactionBase?id=transactionbase交易数据)) | 基础交易 |
| result.transaction_bases.id | string | id |
| result.transaction_bases.tx_id | string | tx_id |
| result.transaction_bases.hash | string | hash |
| result.transaction_bases.api_key | string | api_key |
| result.transaction_bases.net_work_type | int | 网络类型 0-国内星火体验网 1-国内星火主网 3-国际星火体验网 4-国际星火体验网 |
| result.transaction_bases.tx_type | int | 交易类型 0- 基础交易 1- 增强交易 |
| result.transaction_bases.create_time | string | 创建时间 |
| result.transaction_bases.ledger_seq | long | 块高度 |
| result.transaction_bases.source_address | string | 交易提交地址 |
| result.transaction_bases.actual_fee | string | 交易实际花费的费用 |
| result.transaction_bases.status | int | [交易状态](https://test-bop-docs.bitfactory.cn/#/cn/md/apis/result-code/resultCode?id=交易状态) |
| result.transaction_bases.base_transactions | [TransactionHistoryBean](https://test-bop-docs.bitfactory.cn/#/cn/md/apis/transaction-result/transactionBase?id=transactionhistorybean基础交易数据) | 基础交易 |
| result.transaction_bases.enhanced_transaction | [EnhancedTransactionInfo](https://test-bop-docs.bitfactory.cn/#/cn/md/apis/transaction-result/transactionBase?id=enhancedtransactioninfo增强交易数据) | 增强交易 |
> 示例
```js
{
"trace": "37b2ee86d80040519a141106df0f5be4",
"result": {
"count": 1080,
"total_page": 540,
"transaction_bases": [
{
"id": "bc7c6b35b9d04098bd6c469ec8e0e70c",
"status": 0,
"hash": "1cdf63e14c707600c5da09b17e1714f4892cd430e366ba7c5d9f0902b41d930a",
"api_key": "46A0TV8QIMUJY0C7NYNJMCKOQEI0VJPY",
"net_work_type": 1,
"tx_type": 0,
"create_time": "2023-12-13 15:28:44",
"ledger_seq": 3468698,
"source_address": "did:bid:efC5REiFesaBuu1UXbMJWvEsqFRkQKiq",
"actual_fee": 25900,
"base_transaction": {
"blob": "0A286469643A6269643A6566433552456946657361427575315558624D4A577645737146526B514B697110F980032234080752300A296469643A6269643A656632316E64356F5A4B65436245624B6D664432365375636758736F7A4A4544461080ADE2042A086761732073656E6430C0843D3864",
"hash": "1cdf63e14c707600c5da09b17e1714f4892cd430e366ba7c5d9f0902b41d930a",
"actual_fee": 25900,
"close_time": 1702452397260839,
"error_code": 0,
"ledger_seq": 3468698,
"signatures": [
{
"sign_data": "8a07e653ffb173f8bd344a363be8b2faccddf8c34b93c41b57e6f433c0d5c00d62f40f7b471351668d2129fde1c245dc76192c9204b000e9a1d94acaa984c701",
"public_key": "b065665b6fa23dc1c00b17b8d2cd86093c86bbae4c011247310f9160351bd64bc580cc"
}
],
"transaction": {
"operations": [
{
"type": 7,
"pay_coin": {
"dest_address": "did:bid:ef21nd5oZKeCbEbKmfD26SucgXsozJEDF",
"amount": 10000000
}
}
],
"source_address": "did:bid:efC5REiFesaBuu1UXbMJWvEsqFRkQKiq",
"fee_limit": 1000000,
"gas_price": 100,
"nonce": 49273,
"metadata": "6761732073656e64"
},
"tx_size": 259
}
},
{
"id": "5a20b51baea64a52a05cbca07079fa60",
"status": 0,
"hash": "190b21da079cab3e388de8f336b85b9f63427f56ecf3635b29ba6156319fcf6a",
"api_key": "46A0TV8QIMUJY0C7NYNJMCKOQEI0VJPY",
"net_work_type": 1,
"tx_type": 0,
"create_time": "2023-12-13 10:18:07",
"ledger_seq": 3468098,
"source_address": "did:bid:efmHwsoavf2SWDkm4vwUJFwzZBWQnVV7",
"actual_fee": 35500,
"base_transaction": {
"blob": "0A286469643A6269643A65666D4877736F617666325357446B6D347677554A46777A5A4257516E565637102A228D0108075288010A286469643A6269643A6566696966354155574A3470776A6675344E53484D48656363587573483274591080C2D72F1A577B226D6574686F64223A2267657442616C616E6365222C22706172616D73223A7B2261646472657373223A226469643A6269643A65666D4877736F617666325357446B6D347677554A46777A5A4257516E565637227D7D2A0F636F6E747261637420696E766F6B6530C0843D3864",
"hash": "190b21da079cab3e388de8f336b85b9f63427f56ecf3635b29ba6156319fcf6a",
"actual_fee": 35500,
"close_time": 1702433762004204,
"error_code": 0,
"ledger_seq": 3468098,
"signatures": [
{
"sign_data": "ac6aa4e2b28e48a71c388beff565351416a8ba25ce2ad3043fb445a5d5c8267ab925a396bf476b1078e6f66d67f15b63bc024d943a29f0027cd6bc5f0a63de05",
"public_key": "b06566d63570ffa1d9a8a1cf1bb3c99c27ba6dec4f0016d9f03e7523587b71fe957d56"
}
],
"transaction": {
"operations": [
{
"type": 7,
"pay_coin": {
"dest_address": "did:bid:efiif5AUWJ4pwjfu4NSHMHeccXusH2tY",
"amount": 100000000,
"input": "{\"method\":\"getBalance\",\"params\":{\"address\":\"did:bid:efmHwsoavf2SWDkm4vwUJFwzZBWQnVV7\"}}"
}
}
],
"source_address": "did:bid:efmHwsoavf2SWDkm4vwUJFwzZBWQnVV7",
"fee_limit": 1000000,
"gas_price": 100,
"nonce": 42,
"metadata": "636f6e747261637420696e766f6b65"
},
"tx_size": 355
}
}
]
},
"success": true,
"error_code": 0,
"error_desc": "ok"
}
```
## 1.6 区块服务接口列表
区块服务接口主要是区块相关的接口,目前有6个接口:
| 序号 | 接口 | 说明 |
| ---- | ------------------- | --------------------------------------- |
| 1 | getBlockNumber | 该接口用于查询最新的区块高度 |
| 2 | getTransactions | 该接口用于查询指定区块高度下的所有交易3 |
| 3 | getBlockInfo | 该接口用于获取区块信息 |
| 4 | getBlockLatestInfo | 该接口用于获取最新区块信息 |
| 5 | getValidators | 该接口用于获取指定区块中所有验证节点数 |
| 6 | getLatestValidators | 该接口用于获取最新区块中所有验证节点数 |
### 1.6.1 getBlockNumber
> 接口说明
该接口用于查询最新的区块高度。
> 调用方法
```js
block.getBlockNumber(param)
```
> 请求参数
| 参数 | 类型 | 描述 |
| -------- | ------- | --------------------------------- |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ------------------ | ----------- | ------------------------------- |
| header | BlockHeader | 区块头 |
| header.blockNumber | Long | 最新的区块高度,对应底层字段seq |
> 错误码
| 异常 | 错误码 | 描述 |
| ---------------------- | ------ | ------------------------------------------- |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let param = {
domainId: '20'
}
let data = await sdk.block.getBlockNumber(param)
console.log('getBlockNumber() : ', JSON.stringify(data))
```
### 1.6.2 getTransactions
> 接口说明
该接口用于查询指定区块高度下的所有交易。
> 调用方法
```js
block.getTransactions(param)
```
> 请求参数
| 参数 | 类型 | 描述 |
| ----------- | ------- | ------------------------------------- |
| blockNumber | Long | 必填,最新的区块高度,对应底层字段seq |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ------------ | -------- | -------------- |
| totalCount | Long | 返回的总交易数 |
| transactions | String[] | 交易内容 |
> 错误码
| 异常 | 错误码 | 描述 |
| ------------------------- | ------ | ------------------------------------------- |
| INVALID_BLOCKNUMBER_ERROR | 11060 | BlockNumber must bigger than 0 |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let param = {
blockNumber: '1',
domainId: '20'
}
let data = await sdk.block.getTransactions(param)
console.log('getTransactions() : ', JSON.stringify(data))
```
### 1.6.3 getBlockInfo(v1.0.3)
> 接口说明
该接口用于获取指定区块信息。
> 调用方法
```js
block.getBlockInfo(param)
```
> 请求参数
| 参数 | 类型 | 描述 |
| ----------- | ------- | --------------------------------- |
| blockNumber | Long | 必填,待查询的区块高度 |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
| withLeader | boolean | 选填,出块人信息,默认false |
> 响应数据
| 参数 | 类型 | 描述 |
| ------------------ | -------------- | ---------------------------------- |
| header | BIFBlockHeader | 区块信息 |
| header.confirmTime | Long | 区块确认时间 |
| header.number | Long | 区块高度 |
| header.txCount | Long | 交易总量 |
| header.version | String | 区块版本 |
| header.hash | String | 区块HASH |
| leader | String | 出块人信息(withLeader为true时返回) |
> 错误码
| 异常 | 错误码 | 描述 |
| ------------------------- | ------ | ------------------------------------------- |
| INVALID_BLOCKNUMBER_ERROR | 11060 | BlockNumber must bigger than 0 |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let param = {
blockNumber: '61360',
domainId: '20',
withLeader: true
}
let data = await sdk.block.getBlockInfo(param)
console.log('getBlockInfo() : ', JSON.stringify(data))
```
### 1.6.4 getBlockLatestInfo
> 接口说明
```
该接口用于获取最新区块信息。
```
> 调用方法
```js
block.getBlockLatestInfo(param)
```
> 请求参数
| 参数 | 类型 | 描述 |
| -------- | ------- | --------------------------------- |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ------------------ | -------------- | ------------------------- |
| header | BIFBlockHeader | 区块信息 |
| header.confirmTime | Long | 区块确认时间 |
| header.number | Long | 区块高度,对应底层字段seq |
| header.txCount | Long | 交易总量 |
| header.version | String | 区块版本 |
| header.hash | String | 区块HASH |
> 错误码
| 异常 | 错误码 | 描述 |
| ---------------------- | ------ | ------------------------------------------- |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let param = {
domainId: '20'
}
let data = await sdk.block.getBlockLatestInfo(param)
console.log('getBlockLatestInfo() : ', JSON.stringify(data))
```
### 1.6.5 getValidators
> 接口说明
该接口用于获取指定区块中所有验证节点数。
> 调用方法
```js
block.getValidators(param)
```
> 请求参数
| 参数 | 类型 | 描述 |
| ----------- | ------- | --------------------------------- |
| blockNumber | Long | 必填,待查询的区块高度,必须大于0 |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ------------------ | -------- | ------------ |
| validators | String[] | 验证节点列表 |
| validators.address | String | 共识节点地址 |
> 错误码
| 异常 | 错误码 | 描述 |
| ------------------------- | ------ | ------------------------------------------- |
| INVALID_BLOCKNUMBER_ERROR | 11060 | BlockNumber must bigger than 0 |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let param = {
blockNumber: '1',
domainId: '20'
}
let data = await sdk.block.getValidators(param)
console.log('getValidators() : ', JSON.stringify(data))
```
### 1.6.6 getLatestValidators
> 接口说明
该接口用于获取最新区块中所有验证节点数。
> 调用方法
```js
block.getLatestValidators(param)
```
> 请求参数
| 参数 | 类型 | 描述 |
| -------- | ------- | --------------------------------- |
| domainId | Integer | 选填,指定域ID,默认主共识域id(0) |
> 响应数据
| 参数 | 类型 | 描述 |
| ------------------ | -------- | ------------ |
| validators | String[] | 验证节点列表 |
| validators.address | String | 共识节点地址 |
> 错误码
| 异常 | 错误码 | 描述 |
| ---------------------- | ------ | ------------------------------------------- |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| SYSTEM_ERROR | 20000 | System error |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |
> 示例
```js
// 初始化请求参数
let param = {
domainId: '20'
}
let data = await sdk.block.getLatestValidators(param)
console.log('getLatestValidators() : ', JSON.stringify(data))
```
## 1.7 错误码
| 异常 | 错误码 | 描述 |
| ----------------------------------------- | ------ | ------------------------------------------------------------ |
| ACCOUNT_CREATE_ERROR | 11001 | Failed to create the account |
| INVALID_SOURCEADDRESS_ERROR | 11002 | Invalid sourceAddress |
| INVALID_DESTADDRESS_ERROR | 11003 | Invalid destAddress |
| INVALID_INITBALANCE_ERROR | 11004 | InitBalance must between 0 and max(int64) |
| SOURCEADDRESS_EQUAL_DESTADDRESS_ERROR | 11005 | SourceAddress cannot be equal to destAddress |
| INVALID_ADDRESS_ERROR | 11006 | Invalid address |
| CONNECTNETWORK_ERROR | 11007 | Failed to connect to the network |
| INVALID_ISSUE_AMOUNT_ERROR | 11008 | Amount of the token to be issued must be between 1 and Long.MAX_VALUE |
| NO_METADATA_ERROR | 11010 | The account does not have the metadata |
| INVALID_DATAKEY_ERROR | 11011 | The length of key must between 1 and 1024 |
| INVALID_DATAVALUE_ERROR | 11012 | The length of value must between 0 and 256000 |
| INVALID_DATAVERSION_ERROR | 11013 | The version must be equal to or greater than 0 |
| INVALID_MASTERWEIGHT_ERROR | 11015 | MasterWeight must between 0 and max(uint32) |
| INVALID_SIGNER_ADDRESS_ERROR | 11016 | Invalid signer address |
| INVALID_SIGNER_WEIGHT_ERROR | 11017 | Signer weight must between 0 and max(uint32) |
| INVALID_TX_THRESHOLD_ERROR | 11018 | TxThreshold must between 0 and max(int64) |
| INVALID_OPERATION_TYPE_ERROR | 11019 | Type of typeThreshold is invalid |
| INVALID_TYPE_THRESHOLD_ERROR | 11020 | TypeThreshold must between 0 and max(int64) |
| INVALID_AMOUNT_ERROR | 11024 | Amount must between 0 and max(int64) |
| INVALID_CONTRACT_HASH_ERROR | 11025 | Invalid transaction hash to create contract |
| INVALID_GAS_AMOUNT_ERROR | 11026 | bifAmount must be between 0 and Long.MAX_VALUE |
| INVALID_ISSUER_ADDRESS_ERROR | 11027 | Invalid issuer address |
| INVALID_CONTRACTADDRESS_ERROR | 11037 | Invalid contract address |
| CONTRACTADDRESS_NOT_CONTRACTACCOUNT_ERROR | 11038 | ContractAddress is not a contract account |
| SOURCEADDRESS_EQUAL_CONTRACTADDRESS_ERROR | 11040 | SourceAddress cannot be equal to contractAddress |
| INVALID_FROMADDRESS_ERROR | 11041 | Invalid fromAddress |
| FROMADDRESS_EQUAL_DESTADDRESS_ERROR | 11042 | FromAddress cannot be equal to destAddress |
| INVALID_SPENDER_ERROR | 11043 | Invalid spender |
| INVALID_LOG_TOPIC_ERROR | 11045 | The length of log topic must between 1 and 128 |
| PAYLOAD_EMPTY_ERROR | 11044 | Payload cannot be empty |
| INVALID_CONTRACT_TYPE_ERROR | 11047 | Invalid contract type |
| INVALID_NONCE_ERROR | 11048 | Nonce must between 1 and max(int64) |
| INVALID_GASPRICE_ERROR | 11049 | GasPrice must be between 0 and Long.MAX_VALUE |
| INVALID_FEELIMIT_ERROR | 11050 | FeeLimit must be between 0 and Long.MAX_VALUE |
| OPERATIONS_EMPTY_ERROR | 11051 | Perations cannot be empty |
| INVALID_CEILLEDGERSEQ_ERROR | 11052 | CeilLedgerSeq must be equal to or greater than 0 |
| OPERATIONS_ONE_ERROR | 11053 | One of operations error |
| INVALID_SIGNATURENUMBER_ERROR | 11054 | SignagureNumber must between 1 and max(int32) |
| INVALID_HASH_ERROR | 11055 | Invalid transaction hash |
| INVALID_SERIALIZATION_ERROR | 11056 | Invalid serialization |
| PRIVATEKEY_NULL_ERROR | 11057 | PrivateKeys cannot be empty |
| PRIVATEKEY_ONE_ERROR | 11058 | One of privateKeys is invalid |
| SIGNDATA_NULL_ERROR | 11059 | SignData cannot be empty |
| INVALID_BLOCKNUMBER_ERROR | 11060 | BlockNumber must be bigger than 0 |
| PUBLICKEY_NULL_ERROR | 11061 | PublicKey cannot be empty |
| URL_EMPTY_ERROR | 11062 | Url cannot be empty |
| CONTRACTADDRESS_CODE_BOTH_NULL_ERROR | 11063 | ContractAddress and code cannot be empty at the same time |
| INVALID_OPTTYPE_ERROR | 11064 | OptType must between 0 and 2 |
| INVALID_SIGNATURE_ERROR | 15027 | Invalid signature |
| GET_ALLOWANCE_ERROR | 11065 | Get allowance error |
| SIGNATURE_EMPTY_ERROR | 11067 | The signatures cannot be empty |
| CONNECTN_BLOCKCHAIN_ERROR | 19999 | Failed to connect to the blockchain |
| SYSTEM_ERROR | 20000 | System error |
| REQUEST_NULL_ERROR | 12001 | Request parameter cannot be null |
| INVALID_CONTRACTBALANCE_ERROR | 12002 | ContractBalance must be between 1 and Long.MAX_VALUE |
| INVALID_PRITX_FROM_ERROR | 12003 | Invalid Private Transaction Sender |
| INVALID_PRITX_TO_ERROR | 12005 | Invalid Private Transaction recipient list |
| INVALID_PRITX_HASH_ERROR | 12006 | Invalid Private Transaction Hash |
| INVALID_NUMBER_OF_ARG | 12008 | Invalid number of arguments to the function |
| QUERY_RESULT_NOT_EXIST | 12009 | Query result not exist |
| INVALID_ARGUMENTS | 12010 | Invalid arguments to the function |
| INVALID_DOMAINID_ERROR | 12007 | Domainid must be equal to or greater than 0 |
| ERRCODE_NOT_EXIST | 4 | The object does not exist, such as not being able to query accounts, TX, blocks, etc |
| API_KEY_ERROR | 1122 | ApiKey不存在(兼容新增) |
| ERRCODE_TRANSFER_NO_AUTH | 161 | 禁止转移星火令 |
| ITEM_HEADER_MUST_API_SECRET | 1207 | Please include apiSecret in the header(兼容新增) |