1. 功能介绍
本文档详细说明BubiChain Java SDK常用接口文档, 使开发者更方便地操作和查询BubiChain区块链。
2. 准备工作
2.1. 环境要求
JDK要求8或更高版本。
3. 安装
需要以下两步来完成,下面以4.1.1版本为例说明。
首先在Maven的配置文件中添加 BubiChain 的以下远程仓库
<repository>
<id>releases</id>
<url>http://maven.bubidev.cn/content/repositories/releases/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
在pom.xml的配置文件中添加相应版本的依赖包
<dependency>
<groupId>cn.bubi.sdk</groupId>
<artifactId>bubichain-sdk</artifactId>
<version>4.1.1</version>
</dependency>
调用SDK的接口getInstance
来生成SDK实例,如下:
String url = "http://seed1-node.bubi.cn";
SDK sdk = SDK.getInstance(url);
调用Keypair.generator
接口生成账户,具体调用如下:
Keypair keypair = Keypair.generator();
System.out.println(keypair.getPrivateKey());
System.out.println(keypair.getPublicKey());
System.out.println(keypair.getAddress());
至此,链信息以及账户信息准备完成,接下来就可以进行更加深入的操作了。
4. 使用说明
如何使用sdk发送交易,分为以下几步。
4.1. 实例化SDK
String url = "http://seed1-node.bubi.cn";
SDK sdk = SDK.getInstance(url);
4.2. 获取账户nonce值
nonce
用于防止重放攻击并确保交易顺序。每个账户都有一个与之相关的nonce
值,表示该账户已发送的交易数量。每发送一笔交易,nonce
值会递增1。这意味着每笔交易都有一个唯一的nonce
值,从而避免同一交易被多次执行。还可以确保交易按照特定的顺序被处理。调用如下:
// 初始化请求参数
String senderAddress = "adxSa4oENoQCc66JRouZu1rKu4RWjgS69YD4S";
AccountGetNonceRequest getNonceRequest = new AccountGetNonceRequest();
getNonceRequest.setAddress(senderAddress);
// 调用getNonce接口
AccountGetNonceResponse getNonceResponse = sdk.getAccountService().getNonce(getNonceRequest);
// 赋值nonce
if (getNonceResponse.getErrorCode() == 0) {
AccountGetNonceResult result = getNonceResponse.getResult();
System.out.println("nonce: " + result.getNonce());
}
else {
System.out.println("error" + getNonceResponse.getErrorDesc());
}
4.3. 构建操作
操作是指在交易中做的动作,详细信息请参阅SDK接口/操作结构,例如,转移Gas操作,接口调用如下:
String senderAddress = "adxSa4oENoQCc66JRouZu1rKu4RWjgS69YD4S";
String destAddress = "adxSgTxU1awVzNUeR8xcnd3K75XKU8ziNHcWW";
Long eaAmount = ToBaseUnit.ToUGas("10.9");
GasSendOperation operation = new GasSendOperation();
operation.setSourceAddress(senderAddress);
operation.setDestAddress(destAddress);
operation.setAmount(eaAmount);
4.4. 序列化交易
该接口用于序列化交易,并生成交易Blob串,便于网络传输。其中nonce和operation是上面接口得到的,调用如下:
// 初始化变量
String senderAddress = "adxSa4oENoQCc66JRouZu1rKu4RWjgS69YD4S";
Long gasPrice = 1000L;
Long feeLimit = ToBaseUnit.ToUGas("0.01");
// 初始化请求参数
TransactionBuildBlobRequest buildBlobRequest = new TransactionBuildBlobRequest();
buildBlobRequest.setSourceAddress(senderAddress);
buildBlobRequest.setNonce(nonce + 1);
buildBlobRequest.setFeeLimit(feeLimit);
buildBlobRequest.setGasPrice(gasPrice);
buildBlobRequest.addOperation(operation);
// 调用buildBlob接口
TransactionBuildBlobResponse buildBlobResponse = sdk.getTransactionService().buildBlob(buildBlobRequest);
if (buildBlobResponse.getErrorCode() == 0) {
TransactionBuildBlobResult result = buildBlobResponse.getResult();
System.out.println("txHash: " + result.getHash() + ", blob: " + result.getTransactionBlob());
} else {
System.out.println("error: " + buildBlobResponse.getErrorDesc());
}
4.5. 签名交易
该接口用于交易发起者使用其账户私钥对交易进行签名。其中transactionBlob是上面接口得到的,调用如下:
// 初始化请求参数
String senderPrivateKey = "privbwAQyE2vWwzt9NuC8vecqpZm7DS8kfiMPsKPcrTatUkmkxkVhfaf";
String []signerPrivateKeyArr = {senderPrivateKey};
TransactionSignRequest signRequest = new TransactionSignRequest();
signRequest.setBlob(transactionBlob);
for (int i = 0; i < signerPrivateKeyArr.length; i++) {
signRequest.addPrivateKey(signerPrivateKeyArr[i]);
}
// 调用sign接口
TransactionSignResponse signResponse = sdk.getTransactionService().sign(signRequest);
if (signResponse.getErrorCode() == 0) {
TransactionSignResult result = signResponse.getResult();
System.out.println(JSON.toJSONString(result, true));
} else {
System.out.println("error: " + signResponse.getErrorDesc());
}
4.6. 提交交易
该接口用于向BubiChain区块链发送交易请求,触发交易的执行。其中transactionBlob和signResult是上面接口得到的,调用如下:
// 初始化请求参数
TransactionSubmitRequest submitRequest = new TransactionSubmitRequest();
submitRequest.setTransactionBlob(transactionBlob);
submitRequest.setSignatures(signResult.getSignatures());
// 调用submit接口
TransactionSubmitResponse response = sdk.getTransactionService().submit(submitRequest);
if (0 == response.getErrorCode()) {
System.out.println("交易广播成功,hash=" + response.getResult().getHash());
} else {
System.out.println("error: " + response.getErrorDesc());
}
4.7. 查询交易结果
根据提交交易获取到的返回值hash字段进行查询。
public void getTransactionInfo() {
TransactionGetInfoRequest request = new TransactionGetInfoRequest();
request.setHash("0d67997af3777b977deb648082c8288b4ba46b09d910d016f0942bcd853ad518");
TransactionGetInfoResponse response = sdk.getTransactionService().getInfo(request);
if (response.getErrorCode() == 0) {
System.out.println(JSON.toJSONString(response.getResult(), true));
} else {
System.out.println("error: " + response.getErrorDesc());
}
}
5. SDK接口
5.1. 交易服务
交易服务提供交易相关的接口,目前有5个接口:buildBlob、evaluateFee、sign、submit、getInfo。
- buildBlob
接口说明
该接口用于序列化交易,生成交易Blob串,便于网络传输
调用方法
TransactionBuildBlobResponse buildBlob(TransactionBuildBlobRequest);
请求参数
参数 | 类型 | 描述 |
---|---|---|
sourceAddress | String | 必填,发起该操作的源账户地址 |
nonce | Long | 必填,待发起的交易序列号,函数里+1,大小限制[1, Long.MAX_VALUE] |
gasPrice | Long | 必填,交易费用单价,按字节收费,单位UGas,1 Gas = 10^8 UGas,大小限制[1000, Long.MAX_VALUE] |
feeLimit | Long | 必填,交易要求的最低的手续费,单位UGas,1 Gas = 10^8 UGas,大小限制[1, Long.MAX_VALUE] |
operation | BaseOperation[] | 必填,待提交的操作列表,不能为空 |
ceilLedgerSeq | long | 选填,距离当前区块高度指定差值的区块内执行的限制,当区块超出当时区块高度与所设差值的和后,交易执行失败。必须大于等于0,是0时不限制 |
metadata | String | 选填,备注 |
响应数据
字段名称 | 类型 | 描述 |
---|---|---|
transactionBlob | String | Transaction序列化后的16进制字符串 |
hash | String | 交易hash |
示例
// 初始化变量
String senderAddresss = "adxSYQ8iMyZ7Dkj1oX1kjGMV55WXvoPKcLEK3";
String destAddress = "adxSgTxU1awVzNUeR8xcnd3K75XKU8ziNHcWW";
Long eaAmount = ToBaseUnit.ToUGas("10.9");
Long gasPrice = 1000L;
Long feeLimit = ToBaseUnit.ToUGas("0.01");
Long nonce = 1L;
// 构建sendGas操作
GasSendOperation operation = new GasSendOperation();
operation.setSourceAddress(senderAddresss);
operation.setDestAddress(destAddress);
operation.setAmount(eaAmount);
// 初始化请求参数
TransactionBuildBlobRequest request = new TransactionBuildBlobRequest();
request.setSourceAddress(senderAddresss);
request.setNonce(nonce);
request.setFeeLimit(feeLimit);
request.setGasPrice(gasPrice);
request.addOperation(operation);
// 调用buildBlob接口
String transactionBlob = null;
TransactionBuildBlobResponse response = sdk.getTransactionService().buildBlob(request);
if (response.getErrorCode() == 0) {
TransactionBuildBlobResult result = response.getResult();
System.out.println(JSON.toJSONString(result, true));
} else {
System.out.println("error: " + response.getErrorDesc());
}
- evaluateFee
接口说明
该接口实现交易的费用评估。
调用方法
TransactionEvaluateFeeResponse evaluateFee (TransactionEvaluateFeeRequest);
请求参数
参数 | 类型 | 描述 |
---|---|---|
sourceAddress | String | 必填,发起该操作的源账户地址 |
nonce | Long | 必填,待发起的交易序列号,大小限制[1, Long.MAX_VALUE] |
operation | BaseOperation[] | 必填,待提交的操作列表,不能为空 |
signtureNumber | Integer | 选填,待签名者的数量,默认是1,大小限制[1, Integer.MAX_VALUE] |
ceilLedgerSeq | Long | 选填,距离当前区块高度指定差值的区块内执行的限制,当区块超出当时区块高度与所设差值的和后,交易执行失败。必须大于等于0,是0时不限制 |
metadata | String | 选填,备注 |
响应数据
参数 | 类型 | 描述 |
---|---|---|
txs | TestTx[] | 评估交易集 |
示例
// 初始化变量
String senderAddresss = "adxSa4oENoQCc66JRouZu1rKu4RWjgS69YD4S";
String destAddress = "adxSYQ8iMyZ7Dkj1oX1kjGMV55WXvoPKcLEK3";
Long eaAmount = ToBaseUnit.ToUGas("10.9");
Long gasPrice = 1000L;
Long feeLimit = ToBaseUnit.ToUGas("0.01");
Long nonce = 51L;
// 构建sendGas操作
GasSendOperation gasSendOperation = new GasSendOperation();
gasSendOperation.setSourceAddress(senderAddresss);
gasSendOperation.setDestAddress(destAddress);
gasSendOperation.setAmount(eaAmount);
// 初始化评估交易请求参数
TransactionEvaluateFeeRequest request = new TransactionEvaluateFeeRequest();
request.addOperation(gasSendOperation);
request.setSourceAddress(senderAddresss);
request.setNonce(nonce);
request.setSignatureNumber(1);
request.setMetadata(HexFormat.byteToHex("evaluate fees".getBytes()));
// 调用evaluateFee接口
TransactionEvaluateFeeResponse response = sdk.getTransactionService().evaluateFee(request);
if (response.getErrorCode() == 0) {
TransactionEvaluateFeeResult result = response.getResult();
System.out.println(JSON.toJSONString(result, true));
} else {
System.out.println("error: " + response.getErrorDesc());
}
- sign
接口说明
该接口用于实现交易的签名
调用方法
TransactionSignResponse sign(TransactionSignRequest);
请求参数
参数 | 类型 | 描述 |
---|---|---|
blob | String | 必填,待签名的交易Blob |
privateKeys | String[] | 必填,私钥列表 |
响应数据
参数 | 类型 | 描述 |
---|---|---|
signatures | Signature[] | 签名后的数据列表 |
示例
// 初始化请求参数
String issuePrivateKey = "privbwAQyE2vWwzt9NuC8vecqpZm7DS8kfiMPsKPcrTatUkmkxkVhfaf";
String []signerPrivateKeyArr = {issuePrivateKey};
String transactionBlob = "0A246275516E6E5545425245773268423670574847507A77616E5837643238786B364B566370102118C0843D20E8073A56080712246275516E6E5545425245773268423670574847507A77616E5837643238786B364B566370522C0A24627551426A4A443142534A376E7A41627A6454656E416870466A6D7852564545746D78481080A9E08704";
TransactionSignRequest request = new TransactionSignRequest();
request.setBlob(transactionBlob);
for (int i = 0; i < signerPrivateKeyArr.length; i++) {
request.addPrivateKey(signerPrivateKeyArr[i]);
}
TransactionSignResponse response = sdk.getTransactionService().sign(request);
if(0 == response.getErrorCode()){
System.out.println(JSON.toJSONString(response.getResult(), true));
}else{
System.out.println("error: " + response.getErrorDesc());
}
- submit
接口说明
该接口用于实现交易的提交。
调用方法
TransactionSubmitResponse submit(TransactionSubmitRequest);
请求参数
参数 | 类型 | 描述 |
---|---|---|
blob | String | 必填,交易blob |
signature | Signature[] | 必填,签名列表 |
响应数据
参数 | 类型 | 描述 |
---|---|---|
hash | String | 交易hash |
示例
// 初始化请求参数
String transactionBlob = "0A246275516E6E5545425245773268423670574847507A77616E5837643238786B364B566370102118C0843D20E8073A56080712246275516E6E5545425245773268423670574847507A77616E5837643238786B364B566370522C0A24627551426A4A443142534A376E7A41627A6454656E416870466A6D7852564545746D78481080A9E08704";
Signature signature = new Signature();
signature.setSignData("D2B5E3045F2C1B7D363D4F58C1858C30ABBBB0F41E4B2E18AF680553CA9C3689078E215C097086E47A4393BCA715C7A5D2C180D8750F35C6798944F79CC5000A");
signature.setPublicKey("b0011765082a9352e04678ef38d38046dc01306edef676547456c0c23e270aaed7ffe9e31477");
TransactionSubmitRequest request = new TransactionSubmitRequest();
request.setTransactionBlob(transactionBlob);
request.addSignature(signature);
// 调用submit接口
TransactionSubmitResponse response = sdk.getTransactionService().submit(request);
if (0 == response.getErrorCode()) { // 交易提交成功
System.out.println(JSON.toJSONString(response.getResult(), true));
} else{
System.out.println("error: " + response.getErrorDesc());
}
- getInfo
接口说明
该接口用于实现根据交易hash查询交易。
调用方法
TransactionGetInfoResponse getInfo (TransactionGetInfoRequest);
请求参数
参数 | 类型 | 描述 |
---|---|---|
hash | String | 交易hash |
响应数据
参数 | 类型 | 描述 |
---|---|---|
totalCount | Long | 返回的总交易数 |
transactions | TransactionHistory[] | 交易内容 |
示例
// 初始化请求参数
String txHash = "1653f54fbba1134f7e35acee49592a7c29384da10f2f629c9a214f6e54747705";
TransactionGetInfoRequest request = new TransactionGetInfoRequest();
request.setHash(txHash);
// 调用getInfo接口
TransactionGetInfoResponse response = sdk.getTransactionService().getInfo(request);
if (response.getErrorCode() == 0) {
System.out.println(JSON.toJSONString(response.getResult(), true));
} else {
System.out.println("error: " + response.getErrorDesc());
}
5.2. 操作结构
操作是指在交易在要做的事情,在构建操作之前,需要构建操作。目前操作有10种,分别是 AccountActivateOperation、AccountSetMetadataOperation、 AccountSetPrivilegeOperation、 AssetIssueOperation、 AssetSendOperation、 GasSendOperation、 ContractCreateOperation、 ContractInvokeByAssetOperation、 ContractInvokeByGasOperation、 LogCreateOperation。
BaseOperation
BaseOperation是buildBlob接口中所有操作的基类。
成员变量 | 类型 | 描述 |
---|---|---|
sourceAddress | String | 选填,操作源账户地址 |
metadata | String | 选填,备注 |
- AccountActivateOperation
功能
该操作用于激活账户。AccountActivateOperation继承于BaseOperation。
费用
FeeLimit目前固定是0.01 Gas。
成员
成员变量 | 类型 | 描述 |
---|---|---|
sourceAddress | String | 选填,操作源账户地址 |
destAddress | String | 必填,目标账户地址 |
initBalance | Long | 必填,初始化资产,单位UGas,1 Gas = 10^8 UGas, 大小(0, Long.MAX_VALUE] |
metadata | String | 选填,备注 |
-
AccountSetMetadataOperation
功能
该操作用于设置账户metadata。AccountSetMetadataOperation继承于BaseOperation。
费用
FeeLimit目前固定是0.01 Gas。
成员
成员变量 | 类型 | 描述 |
---|---|---|
sourceAddress | String | 选填,操作源账户地址 |
key | String | 必填,metadata的关键词,长度限制[1, 1024] |
value | String | 必填,metadata的内容,长度限制[0, 256000] |
version | Long | 选填,metadata的版本 |
deleteFlag | Boolean | 选填,是否删除metadata |
metadata | String | 选填,备注 |
-
AccountSetPrivilegeOperation
功能
该操作用于设置账户权限。AccountSetPrivilegeOperation继承于BaseOperation。
费用
feeLimit目前固定是0.01 Gas。
成员
成员变量 | 类型 | 描述 |
---|---|---|
sourceAddress | String | 选填,操作源账户地址 |
masterWeight | String | 选填,账户自身权重,大小限制[0, (Integer.MAX_VALUE * 2L + 1)] |
signers | Signer[] | 选填,签名者权重列表 |
txThreshold | String | 选填,交易门限,大小限制[0, Long.MAX_VALUE] |
typeThreshold | TypeThreshold[] | 选填,指定类型交易门限 |
metadata | String | 选填,备注 |
-
AssetIssueOperation
功能
该操作用于发行资产。AssetIssueOperation继承于BaseOperation。
费用
FeeLimit目前固定是50.01 Gas。
成员
成员变量 | 类型 | 描述 |
---|---|---|
sourceAddress | String | 选填,操作源账户地址 |
code | String | 必填,资产编码,长度限制[1, 64] |
assetAmount | Long | 必填,资产发行数量,大小限制[0, Long.MAX_VALUE] |
metadata | String | 选填,备注 |
-
AssetSendOperation
注意:若目标账户未激活,必须先调用激活账户操作。
功能
该操作用于转移资产。AssetSendOperation继承于BaseOperation。
费用
FeeLimit目前固定是0.01 Gas。
成员
成员变量 | 类型 | 描述 |
---|---|---|
sourceAddress | String | 选填,操作源账户地址 |
destAddress | String | 必填,目标账户地址 |
code | String | 必填,资产编码,长度限制[1, 64] |
issuer | String | 必填,资产发行账户地址 |
assetAmount | Long | 必填,资产数量,大小限制[0, Long.MAX_VALUE] |
metadata | String | 选填,备注 |
-
GasSendOperation
注意:若目标账户未激活,该操作也可使目标账户激活。
功能
该操作用于转移Gas。GasSendOperation继承于BaseOperation。
费用
FeeLimit目前固定是0.01 Gas。
成员
成员变量 | 类型 | 描述 |
---|---|---|
sourceAddress | String | 选填,操作源账户地址 |
destAddress | String | 必填,目标账户地址 |
gasAmount | Long | 必填,资产发行数量,大小限制[0, Long.MAX_VALUE] |
metadata | String | 选填,备注 |
-
ContractCreateOperation
功能
该操作用于创建合约。ContractCreateOperation继承于BaseOperation。
费用
FeeLimit目前固定是10.01 Gas。
成员
成员变量 | 类型 | 描述 |
---|---|---|
sourceAddress | String | 选填,操作源账户地址 |
initBalance | Long | 必填,给合约账户的初始化资产,单位UGas,1 Gas = 10^8 UGas, 大小限制[1, Long.MAX_VALUE] |
type | Integer | 选填,合约的语种,默认是0 |
payload | String | 必填,对应语种的合约代码 |
initInput | String | 选填,合约代码中init方法的入参 |
metadata | String | 选填,备注 |
-
ContractInvokeByAssetOperation
注意:若合约账户不存在,必须先创建合约账户。
功能
该操作用于转移资产并触发合约。ContractInvokeByAssetOperation继承于BaseOperation。
费用
FeeLimit要根据合约中执行交易来做添加手续费,首先发起交易手续费目前是0.01Gas,然后合约中的交易也需要交易发起者添加相应交易的手续费。
成员
成员变量 | 类型 | 描述 |
---|---|---|
sourceAddress | String | 选填,操作源账户地址 |
contractAddress | String | 必填,合约账户地址 |
code | String | 选填,资产编码,长度限制[0, 64];当为空时,仅触发 合约; |
issuer | String | 选填,资产发行账户地址,当null时,仅触发合约 |
assetAmount | Long | 选填,资产数量,大小限制[0, Long.MAX_VALUE],当是0时,仅触发合约 |
input | String | 选填,待触发的合约的main()入参 |
metadata | String | 选填,备注 |
-
ContractInvokeByGasOperation
注意:若目标账户非合约账户且未激活,该操作也可使目标账户激活。
功能
该操作用于转移Gas并触发合约。ContractInvokeByGasOperation继承于BaseOperation。
费用
FeeLimit要根据合约中执行交易来做添加手续费,首先发起交易手续费目前是0.01Gas,然后合约中的交易也需要交易发起者添加相应交易的手续费。
成员
成员变量 | 类型 | 描述 |
---|---|---|
sourceAddress | String | 选填,操作源账户地址 |
contractAddress | String | 必填,合约账户地址 |
gasAmount | Long | 选填,资产发行数量,大小限制[0, Long.MAX_VALUE],当0时仅触发合约 |
input | String | 选填,待触发的合约的main()入参 |
metadata | String | 选填,备注 |
-
LogCreateOperation
功能
该操作用于记录日志。LogCreateOperation继承于BaseOperation。
费用
FeeLimit目前固定是0.01 Gas。
成员
成员变量 | 类型 | 描述 |
---|---|---|
sourceAddress | String | 选填,操作源账户地址 |
topic | String | 必填,日志主题,长度限制[1, 128] |
datas | List | 必填,日志内容,每个字符串长度限制[1, 1024] |
metadata | String | 选填,备注 |
5.3. 账户服务
账 户服务提供账户相关的接口,包括6个接口: checkValid、getInfo、getNonce、getBalance、getAssets、getMetadata。
-
checkValid
接口说明
该接口用于检查区块链账户地址的有效性
调用方法
AccounCheckValidResponse checkValid(AccountCheckValidRequest)
请求参数
参数 | 类型 | 描述 |
---|---|---|
address | String | 必填,待检查的区块链账户地址 |
响应数据
参数 | 类型 | 描述 |
---|---|---|
isValid | Boolean | 是否有效 |
示例
// 初始化请求参数
String address = "adxSdV6qWfyhJAmzrPbv3btsPPT6aFrqBku3C";
AccountCheckValidRequest request = new AccountCheckValidRequest();
request.setAddress(address);
// 调用checkValid
AccountCheckValidResponse response = sdk.getAccountService().checkValid(request);
if(0 == response.getErrorCode()) {
System.out.println(response.getResult().isValid());
} else {
System.out.println("error: " + response.getErrorDesc());
}
-
getInfo-Account
接口说明
该接口用于获取指定的账户信息
调用方法
AccountGetInfoResponse GetInfo(AccountGetInfoRequest);
请求参数
参数 | 类型 | 描述 |
---|---|---|
address | String | 必填,待检查的区块链账户地址 |
响应数据
参数 | 类型 | 描述 |
---|---|---|
address | String | 账户地址 |
balance | Long | 账户余额,单位UGas,1 Gas = 10^8 UGas, 必须大于0 |
nonce | Long | 账户交易序列号,必须大于0 |
priv | Priv | 账户权限 |
示例
// 初始化请求参数
String accountAddress = "adxSdV6qWfyhJAmzrPbv3btsPPT6aFrqBku3C";
AccountGetInfoRequest request = new AccountGetInfoRequest();
request.setAddress(accountAddress);
// 调用getInfo接口
AccountGetInfoResponse response = sdk.getAccountService().getInfo(request);
if (response.getErrorCode() == 0) {
AccountGetInfoResult result = response.getResult();
System.out.println("账户信息: \n" + JSON.toJSONString(result, true));
} else {
System.out.println("error: " + response.getErrorDesc());
}
-
getNonce
接口说明
该接口用于获取指定账户的nonce值
调用方法
AccountGetNonceResponse getNonce(AccountGetNonceRequest);
请求参数
参数 | 类型 | 描述 |
---|---|---|
address | String | 必填,待查询的区块链账户地址 |
响应数据
参数 | 类型 | 描述 |
---|---|---|
nonce | Long | 账户交易序列号 |
示例
// 初始化请求参数
String accountAddress = "adxSk9MTT6aGoMxjAxuEGt1agRvWWnng25RF2";
AccountGetNonceRequest request = new AccountGetNonceRequest();
request.setAddress(accountAddress);
// 调用getNonce接口
AccountGetNonceResponse response = sdk.getAccountService().getNonce(request);
if(0 == response.getErrorCode()){
System.out.println("账户nonce:" + response.getResult().getNonce());
} else {
System.out.println("error: " + response.getErrorDesc());
}
-
getBalance
接口说明
该接口用于获取指定账户的Gas的余额
调用方法
AccountGetBalanceResponse getBalance(AccountGetBalanceRequest);
请求参数
参数 | 类型 | 描述 |
---|---|---|
address | String | 必填,待查询的区块链账户地址 |
响应数据
参数 | 类型 | 描述 |
---|---|---|
balance | Long | Gas的余额,单位UGas,1 Gas = 10^8 UGas |
示例
// 初始化请求参数
String accountAddress = "adxSk9MTT6aGoMxjAxuEGt1agRvWWnng25RF2";
AccountGetBalanceRequest request = new AccountGetBalanceRequest();
request.setAddress(accountAddress);
// 调用getBalance接口
AccountGetBalanceResponse response = sdk.getAccountService().getBalance(request);
if(0 == response.getErrorCode()){
AccountGetBalanceResult result = response.getResult();
System.out.println("Gas余额:" + ToBaseUnit.ToUGas(result.getBalance().toString()) + " Gas");
} else {
System.out.println("error: " + response.getErrorDesc());
}
-
getAssets
接口说明
该接口用于获取指定账户的所有资产信息
调用方法
AccountGetAssets getAssets(AccountGetAssetsRequest);
请求参数
参数 | 类型 | 描述 |
---|---|---|
address | String | 必填,待查询的账户地址 |
响应数据
参数 | 类型 | 描述 |
---|---|---|
asset | AssetInfo[] | 账户资产 |
示例
// 初始化请求参数
AccountGetAssetsRequest request = new AccountGetAssetsRequest();
request.setAddress("adxSmZHjDopQam2y5ntvHhGk4XEkiXc9MnFWZ");
// 调用getAssets接口
AccountGetAssetsResponse response = sdk.getAccountService().getAssets(request);
if (response.getErrorCode() == 0) {
AccountGetAssetsResult result = response.getResult();
System.out.println(JSON.toJSONString(result, true));
} else {
System.out.println("error: " + response.getErrorDesc());
}
-
getMetadata
接口说明
该接口用于获取指定账户的metadata信息
调用方法
AccountGetMetadataResponse getMetadata(AccountGetMetadataRequest);
请求参数
参数 | 类型 | 描述 |
---|---|---|
address | String | 必填,待查询的账户地址 |
key | String | 选填,metadata关键字,长度限制[1, 1024] |
响应数据
参数 | 类型 | 描述 |
---|---|---|
metadata | MetadataInfo | 账户 |
示例
// 初始化请求参数
String accountAddress = "adxSmZHjDopQam2y5ntvHhGk4XEkiXc9MnFWZ";
AccountGetMetadataRequest request = new AccountGetMetadataRequest();
request.setAddress(accountAddress);
request.setKey("20180704");
// 调用getMetadata接口
AccountGetMetadataResponse response = sdk.getAccountService().getMetadata(request);
if (response.getErrorCode() == 0) {
AccountGetMetadataResult result = response.getResult();
System.out.println(JSON.toJSONString(result, true));
} else {
System.out.println("error: " + response.getErrorDesc());
}
5.4. 资产服务
账户服务提供资产相关的接口,目前有1个接口:getInfo
-
getInfo-Asset
接口说明
该接口用于获取指定账户的指定资产信息
调用方法
AssetGetInfoResponse getInfo(AssetGetInfoRequest);
请求参数
参数 | 类型 | 描述 |
---|---|---|
address | String | 必填,待查询的账户地址 |
code | String | 必填,资产编码,长度限制[1, 64] |
issuer | String | 必填,资产发行账户地址 |
响应数据
参数 | 类型 | 描述 |
---|---|---|
asset | AssetInfo[] | 账户资产 |
示例
// 初始化请求参数
AssetGetInfoRequest request = new AssetGetInfoRequest();
request.setAddress("adxSmZHjDopQam2y5ntvHhGk4XEkiXc9MnFWZ");
request.setIssuer("adxSdV6qWfyhJAmzrPbv3btsPPT6aFrqBku3C");
request.setCode("HNC");
// 调用getInfo消息
AssetGetInfoResponse response = sdk.getAssetService().getInfo(request);
if (response.getErrorCode() == 0) {
AssetGetInfoResult result = response.getResult();
System.out.println(JSON.toJSONString(result, true));
} else {
System.out.println("error: " + response.getErrorDesc());
}
5.5. 合约服务
合约服务提供合约相关的接口,目前有4个接口:checkValid、getInfo、getAddress、call
-
checkValid-Contract
接口说明
该接口用于检测合约账户的有效性
调用方法
ContractCheckValidResponse checkValid(ContractCheckValidRequest)
请求参数
参数 | 类型 | 描述 |
---|---|---|
contractAddress | String | 待检测的合约账户地址 |
响应数据
参数 | 类型 | 描述 |
---|---|---|
isValid | Boolean | 是否有效 |
示例
// 初始化请求参数
ContractCheckValidRequest request = new ContractCheckValidRequest();
request.setContractAddress("adxSYQ8iMyZ7Dkj1oX1kjGMV55WXvoPKcLEK3");
// 调用checkValid接口
ContractCheckValidResponse response = sdk.getContractService().checkValid(request);
if (response.getErrorCode() == 0) {
ContractCheckValidResult result = response.getResult();
System.out.println(result.getValid());
} else {
System.out.println("error: " + response.getErrorDesc());
}
-
getInfo-Contract
接口说明
该接口用于查询合约代码
调用方法
ContractGetInfoResponse getInfo (ContractGetInfoRequest);
请求参数
参数 | 类型 | 描述 |
---|---|---|
contractAddress | String | 待查询的合约账户地址 |
响应数据
参数 | 类型 | 描述 |
---|---|---|
contract | ContractInfo | 合约信息 |
示例
// 初始化请求参数
ContractGetInfoRequest request = new ContractGetInfoRequest();
request.setContractAddress("adxSYQ8iMyZ7Dkj1oX1kjGMV55WXvoPKcLEK3");
// 调用getInfo接口
ContractGetInfoResponse response = sdk.getContractService().getInfo(request);
if (response.getErrorCode() == 0) {
System.out.println(JSON.toJSONString(response.getResult(), true));
} else {
System.out.println("error: " + response.getErrorDesc());
}
-
getAddress
接口说明
该接口用于查询合约地址
调用方法
ContractGetAddressResponse getInfo (ContractGetAddressRequest);
请求参数
参数 | 类型 | 描述 |
---|---|---|
hash | String | 创建合约交易的hash |
响应数据
参数 | 类型 | 描述 |
---|---|---|
contractAddressList | List | 合约地址列表 |
示例
// 初始化请求参数
ContractGetAddressRequest request = new ContractGetAddressRequest();
request.setHash("44246c5ba1b8b835a5cbc29bdc9454cdb9a9d049870e41227f2dcfbcf7a07689");
// 调用getAddress接口
ContractGetAddressResponse response = sdk.getContractService().getAddress(request);
if (response.getErrorCode() == 0) {
System.out.println(JSON.toJSONString(response.getResult(), true));
} else {
System.out.println("error: " + response.getErrorDesc());
}
-
call
接口说明
该接口用于调试合约代码
调用方法
ContractCallesponse call(ContractCallRequest);
请求参数
参数 | 类型 | 描述 |
---|---|---|
sourceAddress | String | 选填,合约触发账户地址 |
contractAddress | String | 选填,合约账户地址,与code不能同时为空 |
code | String | 选填,合约代码,与contractAddress不能同时为空,长度限制[1, 64] |
input | String | 选填,合约入参 |
contractBalance | String | 选填,赋予合约的初始 Gas 余额, 单位UGas,1 Gas = 10^8 UGas, 大小限制[1, Long.MAX_VALUE] |
optType | Integer | 必填,0: 调用合约的读写接口 init, 1: 调用合约的读写接口 main, 2 :调用 只读接口 query |
feeLimit | Long | 交易要求的最低手续费, 大小限制[1, Long.MAX_VALUE] |
gasPrice | Long | 交易费用单价,按字节收费,大小限制[1000, Long.MAX_VALUE] |
响应数据
参数 | 类型 | 描述 |
---|---|---|
logs | JSONObject | 日志信息 |
queryRets | JSONArray | 查询结果集 |
stat | ContractStat | 合约资源占用信息 |
txs | TransactionEnvs[] | 交易集 |
示例
// 初始化请求参数
ContractCallRequest request = new ContractCallRequest();
request.setCode("\"use strict\";log(undefined);function query() { getBalance(thisAddress); }");
request.setFeeLimit(1000000000L);
request.setOptType(2);
// 调用call接口
ContractCallResponse response = sdk.getContractService().call(request);
if (response.getErrorCode() == 0) {
ContractCallResult result = response.getResult();
System.out.println(JSON.toJSONString(result, true));
} else {
System.out.println("error: " + response.getErrorDesc());
}