Java SDK文档
这里将向您介绍JAVA SDK,并通过简单的示例帮助您快速熟悉JAVA SDK的使用方法,并构建自己的应用。 这里值得注意的是,本JAVA SDK仅面向linux服务端。项目地址:xuper-java-sdk
模块介绍
使用JAVA SDK可以快速的开发与百度超级链交互的应用程序,JAVA SDK提供以下几个方向的API:
- 账户, 包括创建区块链账号,通过助记词恢复区块链账户,保存账号加密文件到本地,从本地加密文件恢复账户等
- 合约账户, 包括创建合约账户等
- 智能合约, 包括智能合约的部署、调用、查询等
- 交易, 包括转账交易,查询交易,查询余额等
Quick Start
环境配置
- 操作系统:支持Linux
- 开发语言:JAVA1.7及以上
- 编译器:GCC 4.8.x及以上
- 版本控制工具:Git
代码获取及导入
把下载的jar包放入java的lib中,如果使用maven管理工程的话可以在pom.xml中配置如下代码
<dependency>
<groupId>xchain-sdk</groupId>
<artifactId>sdk</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.4.0</version>
</dependency>
使用样例
(1)初始化方法
调用者需要创建一个区块链sdk的对象才能使用区块链sdk的能力。
// 获取sdk客户端对象
xuper.Client client = new Client();
// 获取sdk客户端对象,使用host和bcname初始化
// 如果需要和区块链服务进行交互必须使用该方式
xuper.Client client = new Client("106.12.69.229:37101","xuper");
// 设置插件服务
client.setPluginCheck("106.12.72.1:8093", "grpcdemo", "true");
// 设置本地账户
client.setAuthorizedAccount(account.PrivateKey);
(2)账号
try {
// 创建账户,需要自己将account解析成对象
String account = client.createAccount(1, 1);
System.out.println(account);
// 通过助记词恢复账户
String accountRet = client.retrieveAccount("来 璃 甚 肌 茶 饮 救 呀 婚 神 呈 即", 1);
System.out.println(accountRet);
}
catch(Exception e) {
System.out.println(e);
}
(3)合约账号
Gson gson = new Gson();
try {
// 通过助记词获取账户
String accountStr = client.retrieveAccount("玉 脸 驱 协 介 跨 尔 籍 杆 伏 愈 即", 1);
Account account = gson.fromJson(accountStr, Account.class);
// 创建合约账户
String ret = client.createContractAccount("1234567890123456", "", account.JsonPrivateKey);
System.out.println(ret);
}
catch(Exception e) {
System.out.println(e);
}
(4)转账
Gson gson = new Gson();
try {
String accountStr = client.retrieveAccount("玉 脸 驱 协 介 跨 尔 籍 杆 伏 愈 即", 1);
System.out.println(accountStr);
Account account = gson.fromJson(accountStr, Account.class);
// 转账
String toAddress = "bob";
String toAmount = "10";
String fee = "1";
String desc = "desc";
String txid = client.transfer(account.Address, account.JsonPrivateKey, toAddress, toAmount, fee, desc);
System.out.println(txid);
// 查询账户余额
String balance = client.getBalanceDetailForSpecificChain(account.Address);
System.out.println(balance);
// 查询交易
String tx = client.queryTx(txid);
System.out.println(tx);
}
catch(Exception e) {
System.out.println(e);
}
(5)智能合约
Gson gson = new Gson();
try {
String accountStr = client.retrieveAccount("玉 脸 驱 协 介 跨 尔 籍 杆 伏 愈 即", 1);
System.out.println(accountStr);
Account account = gson.fromJson(accountStr, Account.class);
// 部署wasm智能合约
String accountName = "XC1234567890123456@xuper";
String contractName = "counter";
String language = "c";
String desc = "desc";
String initArgs = "{\"creator\":\"xuper\"}";
String codepath = "。/counter.wasm";
String txid = client.deployWasmContract(accountName, contractName, language, desc, initArgs, codepath, account.JsonPrivateKey);
System.out.println(txid);
// 调用wasm智能合约
String methodName = "increase";
String args = "{\"key\":\"counter\"}";
txid = client.invokeWasmContract(accountName, contractName, methodName, desc, args, account.JsonPrivateKey);
System.out.println(txid);
// 调用wasm查询合约
methodName = "increase";
String queryArgs = "{\"key\":\"counter\"}";
String ret = client.queryWasmContract(contractName, methodName, queryArgs, account.Address);
System.out.println(ret);
}
catch(Exception e) {
System.out.println(e);
}
API详解
除用户账户相关的操作外,其余类型的操作均需要先初始化一个相关的客户端,然后通过客户端调用相关方法。这个客户端实际上维持了对应操作所需要的基础数据,一个客户端可以多次调用同类型的操作。
初始化
在使用API之前必须要初始化一个客户端对象。需要依次调用下面的几个方法。
(1)初始化对象
a)方法名称
构造方法
- public Client(String host, String bcname)
b)参数
参数名 | 含义 | 类型 |
---|---|---|
host | 区块链服务地址 | string |
bcname | 区块链链名 | string |
(2)设置插件校验的签名地址
a)方法名称
- public void setAuthorizedAccount(String strJsonPrivateKey)
b)参数
参数名 | 含义 | 类型 |
---|---|---|
strJsonPrivateKey | 区块链账户私钥 | string |
(3)设置插件地址
a)方法名称
- public void setPluginCheck(String pluginServiceHost, String plugins, String needPluginCheck)
b)参数
参数名 | 含义 | 类型 |
---|---|---|
pluginServiceHost | 插件服务地址 | string |
plugins | 要校验的插件,以逗号分隔 | string |
needPluginCheck | 是否需要插件校验,一般为true | string |
(4)账户
账户是指用户在区块链上的账户,账户一般包括地址、公私钥、助记词。其中,通过助记词可以恢复账户的公私钥和地址,助记词丢失则不可恢复,创建账户后请妥善保存自己的助记词。在创建账户时,也可以选择将私钥通过安全码加密后保存到本地的方式,使用时必须使用安全码解密,这样可以防止私钥文件的泄露。
创建账户
创建一个区块链账户,账户包括助记词、地址、公私钥,请妥善保存助记词,之后可以通过助记词来恢复账户。创建时,也可以通过参数指定助记词的强度以及助记词的语言。
(1)创建账户
a)方法名称
- public String createAccount(int strength, int language) throws Exception
b)参数
参数名 | 含义 | 类型 |
---|---|---|
strength | 助记词强度,取值可以为
|
unit8 |
language | 助记词语言,取值可以为
|
int |
c)返回
类型 | 含义 |
---|---|
String | 成员为Address, PrivateKey, PublicKey, Mnemonic的结构体json序列化的结果 |
(2)通过助记词恢复账户
使用助记词来恢复一个区块链账户
a)方法名称
- public String retrieveAccount(String mnemonic, int language) throws Exception
b)参数
参数名 | 含义 | 类型 |
---|---|---|
mnemonic | 助记词 | string |
language | 助记词语言,取值可以为
|
int |
c)返回
类型 | 含义 |
---|---|
String | 成员为Address, PrivateKey, PublicKey, Mnemonic的结构体json序列化的结果 |
(3)从本地恢复账户
通过本地加密的私钥文件以及安全码恢复账户
a)方法名称
- public String getBinaryEcdsaPrivateKeyFromFile(String path, String password) throws Exception
b)参数
参数名 | 含义 | 类型 |
---|---|---|
path | 私钥存储路径 | string |
passwd | 安全码,用来解密私钥 | string |
c)返回
类型 | 含义 |
---|---|
String | 成员为Address, PrivateKey, PublicKey, Mnemonic的结构体json序列化的结果 |
合约账户
合约账户相关的操作,目前仅提供合约账户创建的功能。合约账户是管理合约的单位,即合约必须安装在合约账户上。
(1)创建合约账户
直接创建一个合约账户,并返回创建合约账户的交易id。在创建合约账户的过程中,需要支付创建合约账户的gas,gas会根据执行的难度收取,如果想获取gas具体数值需要通过方法c预执行和d执行来创建合约账户。
a)方法名称
- public String createContractAccount(String accountName, String desc, String binaryPrivateKey) throws Exception
b)参数
参数名 | 含义 | 类型 |
---|---|---|
accountName | 合约账户名字, 规则为 16个数字,例如: "1234567890123456" | string |
desc | 交易描述信息 | string |
binaryPrivateKey | 账户的私钥 | string |
c)返回
类型 | 含义 |
---|---|
string | 创建合约账号的交易ID |
error |
|
转账
普通转账交易,可以完成区块链上价值的转移。
(1)转账交易
普通转账交易。
a)方法名称
- public String transfer(String address, String binaryPrivateKey, String toAddress, String toAmount, String fee, String desc) throws Exception
b)参数
参数名 | 含义 | 类型 |
---|---|---|
address | 转账来源地址 | string |
binaryPrivateKey | 转账来源地址的私钥 | string |
toAddress | 转账目的地址 | string |
toAmount | 转账金额 | string |
fee | 转账可选支付的手续费 | string |
desc | 交易描述信息 | string |
c)返回
类型 | 含义 |
---|---|
string | 生成的转账交易ID |
error |
|
(2)查询交易详情
根据交易id来查询交易的详情,该交易可以为普通转账交易、合约创建交易、合约调用交易等
a)方法名称
- public String queryTx(String txid) throws Exception
b)参数
参数名 | 含义 | 类型 |
---|---|---|
txid | 待查询的交易ID | string |
c)返回
类型 | 含义 |
---|---|
string | 得到交易的详细信息和状态,json序列化之后的结果 |
(3)查询用户账户余额
查询本区块链账户的链上余额
a)方法名称
- public String getBalanceDetailForSpecificChain(String address) throws Exception
b)参数
参数名 | 含义 | 类型 |
---|---|---|
address | 要查询邮件的地址 |
c)返回
类型 | 含义 |
---|---|
string | 得到所在账户的余额,和冻结的金额,json序列化之后的结果 |
智能合约
智能合约相关的操作,包括智能合约的部署、调用、查询等。合约名为区分一条链上合约的唯一标识。
(1)部署安装合约
直接部署合约,并返回部署合约的交易id。也可以通过操作c预执行+操作d执行来完成相同的操作。
a)方法名称
- public String deployWasmContract(String accountName, String contractName, String language, String desc, String initArgs, String codepath, String binaryPrivateKey) throws Exception
b)参数
参数名 | 含义 | 类型 |
---|---|---|
accountName | 合约账户名字, 规则为XC+16个数字+@链名,例如: "XC1234567890123456@xuper" | string |
contractName | 要操作的合约名称 | string |
language | 合约语言,例如'c' | string |
desc | 合约描述 | string |
initArgs | 合约部署参数,map序列化后的字符串 | string |
codepath | 合约文件位置 | string |
binaryPrivateKey | 安装合约账户的私钥 | string |
c)返回
类型 | 含义 |
---|---|
string | 创建合约账号的交易ID |
(2)调用合约
调用wasm智能合约,并返回调用智能合约交易的交易id。
a)方法名称
- public String invokeWasmContract(String accountName, String contractName, String methodName, String desc, String args, String strJsonPrivateKey) throws Exception
b)参数
参数名 | 含义 | 类型 |
---|---|---|
accountName | 合约账户名字, 规则为XC+16个数字+@链名,例如: "XC1234567890123456@xuper" | string |
contractName | 要操作的合约名称 | string |
methodName | 合约方法 | string |
desc | 合约描述 | string |
args | 合约方法参数,map序列化的字符串 | string |
strJsonPrivateKey | 安装合约账户的私钥 | string |
c)返回
类型 | 含义 |
---|---|
string | 调用合约的交易ID |
(3)查询合约
调用wasm合约查询方法,查询方法仅访问合约维护的数据,并不能将操作上链。
a)方法名称
- public String queryWasmContract(String contractName, String methodName, String args, String addr)
b)参数
参数名 | 含义 | 类型 |
---|---|---|
contractName | 要操作的合约名称 | string |
methodName | 合约方法 | string |
args | 合约方法参数,map序列化的字符串 | string |
address | 调用合约的地址 | string |
c)返回
类型 | 含义 |
---|---|
string | 合约预执行产生的结构体序列化字符串 |
词汇表
类型 | 含义 |
---|---|
区块链账户 | 普通用户,有自己的addres,公私钥 |
合约账户 | 合约账户名字, 规则为 XC+16个数字+@+链名,例如: “XC1234567890123456@xuper” |
交易 | 普通转账 |
智能合约 | 用户实现的分布式应用 |
常见问题
问题一:A用户给B用户转账10月,小费为5元,为什么完成交易后,A用户发现多扣了10元?
答:因为每笔交易会有合规性检查,需要花费10元