JAVA-SDK 预编译合约文档
1. 用户权限
1.1 setSuperAdmin
接口: setSuperAdmin()
入参: 空
返回值:TransactionReceipt
Event事件:
setSuperAdmin(int code, string msg)
topic: "0x7e901ebc26b576bc08715c4d41c6a7732dd47c98452d104a8b6d4b15f0cd7cbb"
说明: 链只有一个SuperAdmin,若已设置超级管理员,则该调用无效。
调用示例:
public class Demo {
public class Config {
public static final String URL = "http://127.0.0.1:6789";
public static final String KEYFILE = "/home/user/Venachain/build/bin/data/keystore/keyfile";
public static final String PASSPHRASE = "passphrase";
public static final String CONTRACTBINARY = "/home/user/Downloads/contractBinary.wasm";
public static final String USER1NAME = "user1name";
public static final String USER1ADDRESS = "0x123456...";
public static final String USER2NAME = "user2name";
public static final String USER2ADDRESS = "0x235869...";
public static final String USER3ADDRESS = "0x354758...";
}
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
UserManagement manager = UserManagement.load(web3j, credentials, new DefaultWasmGasProvider());
String eventHash = Hash.sha3String(UserManagement.FUNC_SETSUPERADMIN);
//Filter实例化的输入,返回结果中log的Data字段是事件值的rlp编码
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, UserManagement.CONTRACT_ADDRESS).addSingleTopic(eventHash);
//订阅事件,client通过订阅事件的方式来获悉合约调用中所触发的事件
manager.setNameEventObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
//调用系统合约 UserManagement 中的 setSuperAdmin() 方法
TransactionReceipt receipt = manager.setSuperAdmin().send();
//验证结果: ["SUPER_ADMIN"]
System.out.println(manager.getRolesByAddress(Config.USER1ADDRESS).send());
//通过交易回执获取事件
List<EventResponse> respList = manager.getSetSuperAdminEvents(receipt);
for (EventResponse resp : respList) {
System.out.println("\nlog: " + resp.getLog());
System.out.println("\ntopic: " + resp.getLog().getTopics());
System.out.println("\ncode: " + resp.getCode());
System.out.println("\nmsg: " + resp.getMsg());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.2 transferSuperAdminByAddress
接口: transferSuperAdminByAddress(String address)
入参: String 地址
返回值:TransactionReceipt
Event事件:
transferSuperAdminByAddress(int code, string msg)
topic: "0x04dc07acc5837377e61181a20a86aa29043cf4f14f9877a7e6e54b8a41dc4a8c"
说明: 只有SuperAdmin可以调用该接口转让SuperAdmin身份,需要谨慎调用。
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
UserManagement manager = UserManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//调用系统合约 UserManagement 中的 transferSuperAdminByAddress() 方法
TransactionReceipt receipt = manager.transferSuperAdminByAddress(Config.USER2).send();
//返回交易回执
System.out.println(receipt);
//验证结果: ["SUPER_ADMIN"]
System.out.println(manager.getRolesByAddress(USER1ADDRESS).send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.3 getRolesByAddress
接口名称: getRolesByAddress(String address)
入参: String 地址
返回值:String 角色列表
说明:给定用户地址,获取用户的角色
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
UserManagement manager = UserManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//调用系统合约 UserManagement 中的 getRolesByAddress() 方法
System.out.println(manager.getRolesByAddress(USER1ADDRESS).send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.4 getRolesByName
接口名称: getRolesByName(String address)
入参: String 地址
返回值:String 角色列表
说明:给定用户名称,获取用户的角色
调用示例:
public class Demo {
// 参考 getRolesByAddress()
}
1.5 getAddrListOfRole
接口名称: getAddrListOfRole(String role)
入参: String 角色
返回值:String 地址列表
说明:给定角色,获取所有拥有该角色的用户的地址
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
UserManagement manager = UserManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//调用系统合约 UserManagement 中的 getAddrListOfRole() 方法
System.out.println(manager.getAddrListOfRole("SUPER_ADMIN").send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.6 addUser
接口名称: addUser(String userInfo)
入参: String 角色信息
返回值:TransactionReceipt
Event事件:
addUser(int code, string msg)
topic: "0x9ccac5649883d3dcc5360b728ec01c6ca72122f7a364e6a859896afa72b21c8b"
说明:将用户添加到用户管理系统中
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
UserManagement manager = UserManagement.load(web3j, credentials, new DefaultWasmGasProvider());
// 用户信息
String user = "{\"address\":\"0x2d25d910d50f1b13e960f5823cf3027050177751\",\"name\":\"superuser\"}";
//调用系统合约 UserManagement 中的 addUser() 方法
System.out.println("\nResult for add user:\n" + manager.addUser(user).send());
// 验证
System.out.println("\nAll users:\n" + manager.getAllUsers().send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.7 updateUserDescInfo
接口名称: updateUserDescInfo(String address, String userInfo)
入参: String 地址,用户信息 (JSON)
返回值:TransactionReceipt
Event事件:
updateUserDescInfo(int code, string msg)
topic: "0xfa385413c593ef913f0920d01d863405847947cc72f3d6c65894740a3fae7b61"
说明:
ChainAdmin可以调用该接口
更新方式为增量更新,比如如果传入参数中未包含相关字段,则维持原有信息不变。
调用示例:
public class Demo {
static class Config { /*...*/ }
public static void main(String[] args) {
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
UserManagement manager = UserManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//调用系统合约 UserManagement 中的 updateUserDescInfo() 方法
manager.updateUserDescInfo("0xahfdalkf...,", "{\"phone\":\"1100000000\",\"email\":\"gexin@wx.com\",\"organization\":\"wxbc\"}").send();
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.8 getAllUsers
接口名称: getAllUsers()
入参: 空
返回值:String 角色列表
说明:获取全部用户具体信息
调用示例:
public class Demo {
static class Config { /*...*/ }
public static void main(String[] args) {
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
UserManagement manager = UserManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//调用系统合约 UserManagement 中的 getAllUsers() 方法
System.out.println("\nResult for getting all users: \n" + manager.getAllUsers().send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.9 getUserByAddress
接口名称: getUserByAddress(String address)
入参: String 地址
返回值:String 角色信息
说明:给定用户地址,获取用户具体信息
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
UserManagement manager = UserManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//调用系统合约 UserManagement 中的 getUserByAddress() 方法
System.out.println(manager.getUserByAddress(USER1ADDRESS).send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.10 getUserByName
接口名称: getUserByAddress(String name)
入参: String 用户姓名
返回值:String 角色信息
说明:给定用户姓名,获取用户具体信息
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
UserManagement manager = UserManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//调用系统合约 UserManagement 中的 getUserByName() 方法
System.out.println(manager.getUserByName(USER1NAME).send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.11 addChainAdminByAddress
接口: addChainAdminByAddress(String address)
入参: String 地址
返回值:TransactionReceipt
Event事件:
addChainAdminByAddress(int code, string msg)
topic: "0x8bfc2a5b39cf58956d263532fd7f80deaec7bfb37f8465f1931b6980ee43cf62"
说明:只有SuperAdmin可以调用该接口
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
UserManagement manager = UserManagement.load(web3j, credentials, new DefaultWasmGasProvider());
String eventHash = Hash.sha3String(UserManagement.FUNC_ADDCHAINADMINBYADDRESS);
//Filter实例化的输入,返回结果中log的Data字段是事件值的rlp编码
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, UserManagement.CONTRACT_ADDRESS).addSingleTopic(eventHash);
//订阅事件,client通过订阅事件的方式来获悉合约调用中所触发的事件
manager.addChainAdminByAddressObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
//调用系统合约 UserManagement 中的 addChainAdminByAddress() 方法
TransactionReceipt receipt = manager.addChainAdminByAddress(Config.USER1).send();
//返回交易回执
System.out.println(receipt);
//验证结果: ["SUPER_ADMIN", "CHAIN_ADMIN"]
System.out.println(manager.getRolesByAddress(Config.USER1).send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.12 addChainAdminByName
接口: addChainAdminByName(String name)
入参: String 用户名
用户名长度不大于128,由字母、数字、下线组成(也支持中文字符,但不建议使用中文字符作为用户名)
返回值:TransactionReceipt
Event事件:
addChainAdminByName(int code, string msg)
topic: "0x7466e25f058497ccd4c4ac063be5e803e9e6d517d0a20140cbe56c3217055a85"
说明: 只有SuperAdmin可以调用该接口
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
UserManagement manager = UserManagement.load(web3j, credentials, new DefaultWasmGasProvider());
String eventHash = Hash.sha3String(UserManagement.FUNC_ADDCHAINADMINBYNAME);
//Filter实例化的输入,返回结果中log的Data字段是事件值的rlp编码
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, UserManagement.CONTRACT_ADDRESS).addSingleTopic(eventHash);
//订阅事件,client通过订阅事件的方式来获悉合约调用中所触发的事件
manager.addChainAdminByNameObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
//调用系统合约 UserManagement 中的 addChainAdminByName() 方法
TransactionReceipt receipt = manager.addChainAdminByName(Config.USER2NAME).send();
//返回交易回执
System.out.println(receipt);
//验证结果: ["CHAIN_ADMIN"]
System.out.println(manager.getRolesByAddress(Config.USER2).send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.13 delChainAdminByAddress
接口名称: delChainAdminByAddress(String address)
入参: String 地址
返回值:TransactionReceipt
Event事件:
delChainAdminByAddress(int code, string msg)
topic: "0xddbe46696d8a768320bc2fc723b1d25499a1b927df40377e8cf45a88b7485659"
说明: 只有SuperAdmin可以调用该接口
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
UserManagement manager = UserManagement.load(web3j, credentials, new DefaultWasmGasProvider());
String eventHash = Hash.sha3String(UserManagement.FUNC_DELCHAINADMINBYADDRESS);
//Filter实例化的输入,返回结果中log的Data字段是事件值的rlp编码
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, UserManagement.CONTRACT_ADDRESS).addSingleTopic(eventHash);
//订阅事件,client通过订阅事件的方式来获悉合约调用中所触发的事件
manager.delChainAdminByAddressObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
//调用系统合约 UserManagement 中的 delChainAdminByAddress() 方法
TransactionReceipt receipt = manager.delChainAdminByAddress(Config.USER1ADDRESS).send();
//返回交易回执
System.out.println(receipt);
//验证结果: ["SUPER_ADMIN"]
System.out.println(manager.getRolesByAddress(Config.USER1).send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.14 delChainAdminByName
接口名称: delChainAdminByName(String name)
入参: String 用户名
用户名长度不大于128,由字母、数字、下线组成(也支持中文字符,但不建议使用中文字符作为用户名)
返回值:TransactionReceipt
Event事件:
delChainAdminByName(int code, string msg)
topic: "0x883bbe522eb02a648a58e15aec7df01dd3fe233fd1d658d210f01d7b6b907c83"
说明: 只有SuperAdmin可以调用该接口
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
UserManagement manager = UserManagement.load(web3j, credentials, new DefaultWasmGasProvider());
String eventHash = Hash.sha3String(UserManagement.FUNC_DELCHAINADMINBYNAME);
//Filter实例化的输入,返回结果中log的Data字段是事件值的rlp编码
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, UserManagement.CONTRACT_ADDRESS).addSingleTopic(eventHash);
//订阅事件,client通过订阅事件的方式来获悉合约调用中所触发的事件
manager.delChainAdminByNameObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
//调用系统合约 UserManagement 中的 delChainAdminByName() 方法
TransactionReceipt receipt = manager.delChainAdminByName(Config.USER1NAME).send();
//返回交易回执
System.out.println(receipt);
//验证结果: ["SUPER_ADMIN"]
System.out.println(manager.getRolesByAddress(Config.USER1).send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.15 addGroupAdminByAddress
说明: 只有ChainAdmin可以调用该接口,设置用户为链管理员
public class Demo {
// 参考 addChainAdminByAddress()
}
1.16 addGroupAdminByName
说明: 只有ChainAdmin可以调用该接口,设置用户为链管理员
public class Demo {
// 参考 addChainAdminByName()
}
1.17 delGroupAdminByAddress
说明: 只有ChainAdmin可以调用该接口,设置用户为链管理员
public class Demo {
// 参考 delChainAdminByAddress()
}
1.18 delGroupAdminByName
说明: 只有ChainAdmin可以调用该接口,设置用户为链管理员
public class Demo {
// 参考 delChainAdminByName()
}
1.19 addNodeAdminByAddress
说明: 只有ChainAdmin可以调用该接口,设置用户为节点管理员
public class Demo {
// 参考 addChainAdminByAddress()
}
1.20 addNodeAdminByName
说明: 只有ChainAdmin可以调用该接口,设置用户为节点管理员
public class Demo {
// 参考 addChainAdminByName()
}
1.21 delNodeAdminByAddress
说明: 只有ChainAdmin可以调用该接口,设置用户为节点管理员
public class Demo {
// 参考 delChainAdminByAddress()
}
1.22 delNodeAdminByName
说明: 只有ChainAdmin可以调用该接口,设置用户为节点管理员
public class Demo {
// 参考 delChainAdminByName()
}
1.23 addContractAdminByAddress
说明: 只有ChainAdmin可以调用该接口,设置用户为合约管理员
public class Demo {
// 参考 addChainAdminByAddress()
}
1.24 addContractAdminByName
说明: 只有ChainAdmin可以调用该接口,设置用户为合约管理员
public class Demo {
// 参考 addChainAdminByName()
}
1.25 delContractAdminByAddress
说明: 只有ChainAdmin可以调用该接口,设置用户为合约管理员
public class Demo {
// 参考 delChainAdminByAddress()
}
1.26 delContractAdminByName
说明: 只有ChainAdmin可以调用该接口,设置用户为合约管理员
public class Demo {
// 参考 delChainAdminByName()
}
1.27 addContractDeployerByAddress
说明: ChainAdmin、ContractAdmin可以调用该接口
public class Demo {
// 参考 addChainAdminByAddress()
}
1.28 addContractDeployerByName
说明: ChainAdmin、ContractAdmin可以调用该接口
public class Demo {
// 参考 addChainAdminByName()
}
1.29 delContractDeployerByAddress
说明: ChainAdmin、ContractAdmin可以调用该接口
public class Demo {
// 参考 delChainAdminByAddress()
}
1.30 delContractDeployerByName
说明: ChainAdmin、ContractAdmin可以调用该接口
public class Demo {
// 参考 delChainAdminByName()
}
2. 参数
注解
限制:
set类方法只有ChainAdmin可以调用
get类方法都可以调用,无权限要求
2.1 setGasContractName / getGasContractName
接口: setGasContractName(String name)
入参: String 合约名
返回值:TransactionReceipt
接口: getGasContractName()
入参: 空
返回值:String
说明: 消耗特定合约代币名称参数设置
事件:
事件名:GasContractName(int code, string msg)
Topic: 0xb6d24fc9e837f5361659c92524d539907afff716cba6aea7900cf58588c1e471
(Hash.sha3String(ParamManagement.GasContractNameKey)
参数:
结果码(uint类型)
0: 成功
1: 没有权限
2: rlp编码错误
3: 无效入参
4: 合约未注册
结果消息(string类型)
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
// 事件topic
String eventHash = Hash.sha3String(ParamManagement.GasContractNameKey);
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, ParamManagement.CONTRACT_ADDRESS).addSingleTopic(eventHash);
manager.setTxGasLimitObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
//加载合约
ParamManagement manager = ParamManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//调用系统合约 ParamManagement 中的 setGasContractName() 方法
manager.setGasContractName("wxbc").send();
//验证结果
System.out.println(manager.getGasContractName().send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.2 setIsProduceEmptyBlock / getIsProduceEmptyBlock
接口: setIsProduceEmptyBlock(BigInteger value)
入参: BigInteger 1表示产生空块;0表示不产生空块;其他无效
返回值:TransactionReceipt
接口: getIsProduceEmptyBlock()
入参: 空
返回值:String
说明:空块产生参数设置
事件:
事件名:IsProduceEmptyBlock(int code, string msg)
Topic: 0xa9e21c0522cfd72cfaf98346cd66ec0af65b300d642923296c441a8c2c983c4d
Hash.sha3String(ParamManagement.IsProduceEmptyBlockKey)
参数:
结果码(uint类型)
0: 成功
1: 没有权限
2: rlp编码错误
3: 无效入参
结果消息(string类型)
调用示例:
public class Demo {
// 参考 setGasContractName / getGasContractName
// 订阅事件
String eventHash = Hash.sha3String(ParamManagement.IsProduceEmptyBlockKey);
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, ParamManagement.setIsProduceEmptyBlockObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
}
2.3 setTxGasLimit / getTxGasLimit
接口: setTxGasLimit(BigInteger gasLimit)
入参: BigInteger Gas限制 gas上限:2e9 gas下限:12771596 * 100
返回值:TransactionReceipt
接口: getTxGasLimit()
入参: 空
返回值:String
说明:交易gas限制设置
事件:
事件名:TxGasLimit(int code, string msg)
Topic: 0x5bde5fa4722a26a37dced3593fb92e3f3cf748e22c4d4e4de2f6e72d81a4673d
Hash.sha3String(ParamManagement.TxGasLimitKey)
参数:
结果码(uint类型)
0: 成功
1: 没有权限
2: rlp编码错误
3: 无效入参
结果消息(string类型)
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
ParamManagement manager = ParamManagement.load(web3j, credentials, new DefaultWasmGasProvider());
// 订阅事件
String eventHash = Hash.sha3String(ParamManagement.TxGasLimitKey);
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, ParamManagement.setTxGasLimitObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
//调用系统合约 ParamManagement 中的 setTxGasLimit() 方法
manager.setTxGasLimit(new BigInteger("2000000000")).send();
//验证结果
System.out.println(manager.getTxGasLimit().send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.4 getBlockGasLimit / setBlockGasLimit
接口: getBlockGasLimit()
入参: BigInteger gas限制 gas上限:2e10 gas下限:12771596 * 100
返回值:TransactionReceipt
接口: setBlockGasLimit(BigInteger gasLimit)
入参: 空
返回值:String
说明: 区块gas限制设置
事件:
事件名:BlockGasLimt(int code, string msg)
Topic: 0x78148ab89ff26e82fd3538bc45b5d3a8457a27c2d3c659aae6e6b12420615f73
Hash.sha3String(ParamManagement.BlockGasLimitKey)
参数:
结果码(uint类型)
0: 成功
1: 没有权限
2: rlp编码错误
3: 无效入参
结果消息(string类型)
调用示例:
public class Demo {
// 参考 setTxGasLimit / getTxGasLimit
// 订阅事件
String eventHash = Hash.sha3String(ParamManagement.BlockGasLimitKey);
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, ParamManagement.setBlockGasLimitObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
}
2.5 setCheckContractDeployPermission / getCheckContractDeployPermission
接口: setCheckContractDeployPermission(BigInteger value)
入参: BigInteger 1表示检查合约部署权限,用户具有相应权限才可以部署合约;0表示不检查合约部署权限,允许任意用户部署合约;其他无效
返回值:TransactionReceipt
接口: getCheckContractDeployPermission()
入参: 空
返回值:String
说明:检查合约部署权限设置
说明: 区块gas限制设置
事件:
事件名:IsCheckContractDeployPermission(int code, string msg)
Topic: 0x6e7dd5a4ebd11e3b3cf569ea5c6fea10966208f4a067754c17a5d5fcdf4c93de
Hash.sha3String(ParamManagement.IsCheckContractDeployPermissionKey)
参数:
结果码(uint类型)
0: 成功
1: 没有权限
2: rlp编码错误
3: 无效入参
结果消息(string类型)
调用示例:
public class Demo {
// 参考 setTxGasLimit / getTxGasLimit
// 订阅事件
String eventHash = Hash.sha3String(ParamManagement.IsCheckContractDeployPermissionKey);
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, ParamManagement.setCheckContractDeployPermissionObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
}
2.6 setIsTxUseGas / getIsTxUseGas
接口: setIsTxUseGas(BigInteger value)
入参: BigInteger 1表示交易消耗gas;0表示交易不消耗gas;其他无效
返回值:TransactionReceipt
接口: getIsTxUseGas()
入参: 空
返回值:String
说明:交易是否消耗gas设置
事件:
事件名:setIsTxUseGas(int code, string msg)
Topic: 0x56bf34d9d39c7e0b1ac3aaaffdda121743da153952eb0a7c55b1c3b37a4dadde
Hash.sha3String(ParamManagement.IsTxUseGasKey)
参数:
结果码(uint类型)
0: 成功
1: 没有权限
2: rlp编码错误
3: 无效入参
结果消息(string类型)
调用示例:
public class Demo {
// 参考 setTxGasLimit / getTxGasLimit
// 订阅事件
String eventHash = Hash.sha3String(ParamManagement.IsTxUseGasKey);
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, ParamManagement.setIsTxUseGasObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
}
2.7 setVRFParams / getVRFParams
接口: setVRFParams(String vrfParams)
入参: String VRF参数
返回值:TransactionReceipt
接口: getVRFParams()
入参: 空
返回值:String
说明:vrf参数设置
electionEpoch vrf选举区块间隔(0表示不开启vrf功能)
nextElectionBlock 下次进行vrf选举的区块高度(与electionEpoch是并行逻辑判断,用于主动发起vrf选举)
validatorCount 选举出的共识节点数量(候选节点不足时,取所有候选节点作为共识节点)
说明:交易是否消耗gas设置
事件:
Topic: 0x1754fcc737bde6a7de9f5bd6ec36edb44ec4e30dda71d84a74441f4294051684
Hash.sha3String(ParamManagement.VrfParamsKey)
参数:
结果码(uint类型)
0: 成功
1: 没有权限
2: rlp编码错误
3: 无效入参
结果消息(string类型)
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
ParamManagement manager = ParamManagement.load(web3j, credentials, new DefaultWasmGasProvider());
// 订阅事件
String eventHash = Hash.sha3String(ParamManagement.VrfParamsKey);
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, ParamManagement.setVRFParamsObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
ObjectMapper mapper = new ObjectMapper();
ObjectNode raw = mapper.createObjectNode();
raw.put("electionEpoch", 0);
raw.put("nextElectionBlock", 0);
raw.put("validatorCount", 1);
String VRFParams = mapper.writer().writeValueAsString(raw);
/* "{
"electionEpoch": 0,
"nextElectionBlock": 0,
"validatorCount": 0
}"
*/
//调用系统合约 ParamManagement 中的 setVRFParams() 方法
manager.setVRFParams(VRFParams).send();
//验证结果
System.out.println(manager.getVRFParams().send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. 节点
注解
限制:
节点名称: 全网唯一,不能重复,长度不大于128,由字母、数字、下线组成(也支持中文字符,但不建议使用中文字符作为用户名)
设置类方法,只有NodeAdmin和ChainAdmin可以调用
数据结构说明
struct NodeInfo
{
string name; //[必填] 全网唯一,不能重复。所有接口均以此为主键。
uint32 status; //[必填] 1:正常;2:删除
string publicKey; //[必填] 节点公钥,全网唯一,不能重复
uint32 p2pPort; //[必填] p2p 通讯端口
address owner; //[可选] 申请者的地址
string desc; //[可选] 【注意:最大长度100个字符, 任意字符串】节点描述
uint32 type; //[必填] 1:共识节点; 2:观察者节点;3:轻节点
string externalIP; //[必填] 外网 IP
string internalIP; //[必填] 内网 IP
uint32 rpcPort; //[可选] rpc 通讯端口
uint64 delayNum; //[可选] 共识节点延迟设置的区块高度 (可选, 默认实时设置)
}
3.1 add
接口名称: add(String nodeInfo)
入参: String NodeInfo数据结构的JSON格式
返回值:TransactionReceipt
说明:添加节点
事件:
Topic 1: 0x8cd284134f0437457b5542cb3a7da283d0c38208c497c5b4b005df47719f98a1
topic 1 为Hash.sha3String(NodeManagement.NotifyEventKey)的计算结果
参数:
结果码(int类型)
0: 成功
1: 没有权限
2: rlp编码错误
结果消息(string类型)
Topic 2: 0x4f5a8bb8492337e79bdc674d6f31ac448f8017e26cc7bfe3144fb5d886fe5369
topic 2 为Hash.sha3String(NodeManagement.FUNC_ADD)的计算结果,执行失败会有此事件发生
参数:
结果码(int类型)
0: 成功
1: 失败
结果消息(string类型)
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
NodeManagement manager = NodeManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//订阅事件
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, NodeManagement.CONTRACT_ADDRESS)
.addOptionalTopics(Hash.sha3String(NodeManagement.NotifyEventKey), Hash.sha3String(NodeManagement.FUNC_ADD));
manager.addObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
//生成node数据
ObjectMapper mapper = new ObjectMapper();
ObjectNode raw = mapper.createObjectNode();
raw.put("name", "wxbc0");
raw.put("status", 1);
raw.put("internalIP", "127.0.0.1");
raw.put("externalIP", "172.182.0.123");
raw.put("publicKey", "8d77134f633639cb1d224d96b3f01c79bd946c4d401da67c03ade9e4b05e5996ff855dda88838878eef00e318b6e072be4b5059d29d7e1739f17f531e81e07d3");
raw.put("p2pPort", 8888);
String nodeInfo = mapper.writer().writeValueAsString(raw);
//调用系统合约 NodeManagement 中的 add() 方法
manager.add(nodeInfo).send();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.2 update
接口名称: update(String nodeInfo)
入参:
String 节点名字
String 更新内容(JSON)
返回值:TransactionReceipt
说明:更新节点
事件:
Topic 1: 0x8cd284134f0437457b5542cb3a7da283d0c38208c497c5b4b005df47719f98a1
topic 1 为Hash.sha3String(NodeManagement.NotifyEventKey)的计算结果
参数:
结果码(int类型)
0: 成功
1: 没有权限
2: rlp编码错误
结果消息(string类型)
Topic 2: 0x5ef8d21b3c3919d0cb2b4728880495e379f8c1817d7867ff6b1360f2321f9598
topic 2 为Hash.sha3String(NodeManagement.FUNC_UPDATE)的计算结果,执行失败会有此事件发生
参数:
结果码(int类型)
0: 成功
1: 失败
结果消息(string类型)
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
NodeManagement manager = NodeManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//订阅事件
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, NodeManagement.CONTRACT_ADDRESS)
.addOptionalTopics(Hash.sha3String(NodeManagement.NotifyEventKey), Hash.sha3String(NodeManagement.FUNC_UPDATE));
manager.updateObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
String nodeName = "wxbc0";
ObjectMapper mapper = new ObjectMapper();
ObjectNode raw = mapper.createObjectNode();
raw.put("desc", "This is the first node.");
String nodeInfoUpdate = mapper.writer().writeValueAsString(raw);
//调用系统合约 NodeManagement 中的 update() 方法
manager.update(nodeName, nodeInfoUpdate).send();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.3 getAllNodes
接口名称: getAllNodes()
入参:空
返回值:String
说明:获取所有节点信息
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
NodeManagement manager = NodeManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//调用系统合约 NodeManagement 中的 getAllNodes() 方法
System.out.println(manager.getAllNodes().send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.4 validJoinNode
接口名称: validJoinNode()
入参:String 节点公钥
返回值:Boolean
说明:验证公钥是否已经存在
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
NodeManagement manager = NodeManagement.load(web3j, credentials, new DefaultWasmGasProvider());
String pubKey = "0xansdakl541212afaf...";
//调用系统合约 NodeManagement 中的 validJoinNode() 方法
System.out.println(manager.validJoinNode(pubKey).send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.5 getNodes
接口名称: getNodes(String filter)
入参:String NodeInfo数据结构的json格式
返回值:String NodeInfo数据结构字段的查询交集
说明:查询节点
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
NodeManagement manager = NodeManagement.load(web3j, credentials, new DefaultWasmGasProvider());
String nodeFilter = "{\"status\":2}";
//调用系统合约 NodeManagement 中的 getNodes() 方法
System.out.println(manager.getNodes(nodeFilter).send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.6 getDeletedEnodeNodes
接口名称: getDeletedEnodeNodes()
入参:空
返回值:String
说明:获取所有删除节点的enode
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
NodeManagement manager = NodeManagement.load(web3j, credentials, new DefaultWasmGasProvider());
String nodeFilter = "{\"status\":2}";
//调用系统合约 NodeManagement 中的 getDeletedEnodeNodes() 方法
System.out.println(manager.getDeletedEnodeNodes().send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.7 getNormalEnodeNodes
接口名称: getNormalEnodeNodes()
入参:空
返回值:String
说明:获取所有正常节点的enode
调用示例:
public class Demo {
// 参考 getDeletedEnodeNodes
}
3.8 nodesNum
接口名称: nodesNum(String filter)
入参:String NodeInfo数据结构的json格式
返回值:BigInteger NodeInfo数据结构字段的查询交集的节点数量
说明:获取符合条件的节点数量
调用示例:
public class Demo {
// 参考 getNodes
}
3.9 importOldNodesData
接口名称: importOldNodesData(String data)
入参:String 旧节点信息
返回值:TransactionReceipt
说明:导入原始节点管理合约中节点信息
事件:
Topic 1: 0x8cd284134f0437457b5542cb3a7da283d0c38208c497c5b4b005df47719f98a1
topic 1 为Hash.sha3String(NodeManagement.NotifyEventKey)的计算结果
参数:
结果码(int类型)
0: 成功
1: 数据反序列化错误
结果消息(string类型)
Topic 2: 0x21975ecc2e5d872379f39f70cf47dd10cc3c49da967603a799e2ad7019ebf125
topic 2 为Hash.sha3String(NodeManagement.FUNC_IMPORTOLDNODESDATA)的计算结果,执行失败会有此事件发生
参数:
结果码(int类型)
0: 成功
1: 失败
结果消息(string类型)
调用示例:
public class Demo {
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载合约
NodeManagement manager = NodeManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//订阅事件
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, NodeManagement.CONTRACT_ADDRESS)
.addOptionalTopics(Hash.sha3String(NodeManagement.NotifyEventKey), Hash.sha3String(NodeManagement.FUNC_IMPORTOLDNODESDATA));
manager.importOldNodesDataObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
ObjectMapper mapper = new ObjectMapper();
ObjectNode raw = mapper.createObjectNode();
raw.put("name", "wxbc0");
raw.put("owner", Config.SUPERUSERADDRESS);
raw.put("status", 1);
raw.put("internalIP", "127.0.0.1");
raw.put("externalIP", "172.182.0.123");
raw.put("publicKey", "8d77134f633639cb1d224d96b3f01c79bd946c4d401da67c03ade9e4b05e5996ff855dda88838878eef00e318b6e072be4b5059d29d7e1739f17f531e81e07d3");
raw.put("p2pPort", 8888);
raw.put("type", 2);
String nodeInfo = mapper.writer().writeValueAsString(raw);
System.out.println(nodeInfo);
//调用系统合约 NodeManagement 中的 importOldNodesData() 方法
TransactionReceipt ret = manager.importOldNodesData("[" + nodeInfo + "]").send();
System.out.println(ret.getStatus());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
4. CNS
数据结构说明
CNS主要数据结构如下:
type ContractInfo struct
{
Name string // 【必填】合约名称(数字下划线英文字符,长度限制:1-128位)
Version string // 【必填】合约版本号【注:注册时版本号需要递增添加】
Address common.Address // 【必填】合约地址
Origin common.Address // 【非用户填写】合约部署者地址
TimeStamp uint64 // 【非用户填写】时间戳
}
注解
限制:
用户名长度不大于128,由字母、数字、下线组成(也支持中文字符,但不建议使用中文字符作为用户名)
版本号格式为 xx.xx.xx.xx,每个字段均为数字,每个字段数字最大为3位
权限说明
写操作cnsXXX: 仅合约部署者对该合约地址有操作权限
读操作getXXX or ifRegisteredXXX: 任意用户都有查询权限
导入操作importXXX: 暂未做限制
4.1 cnsRegister
接口名称: cnsRegister(String contractName, String contractVersion, String contractAddress)
入参:
String contractName 合约名
String contractVersion 合约版本
String contractAddress 合约地址
返回值:TransactionReceipt
说明:合约注册(非初始化)
事件:
Topic 1: 0x3e8c576b2f109e49f59952e75c0a038c00d1e57c324f7923b7911ec70f16f558
topic 1 为Hash.sha3String(CnsManagement.CNSNotifyEventKey)的计算结果
参数:
结果码(int类型)
0: 成功
1: 无效调用
2: 权限错误
3: 无效入参
4: 注册失败
结果消息(string类型)
Topic 2: 0x8cd284134f0437457b5542cb3a7da283d0c38208c497c5b4b005df47719f98a1
topic 2 为Hash.sha3String(CnsManagement.NotifyEventKey)的计算结果。因无法从交易结构体中获取函数名而失败时会有此事件发生。
参数:
结果码(int类型)
0: 成功
1: 失败
结果消息(string类型)
Topic 3: 0x3e8c576b2f109e49f59952e75c0a038c00d1e57c324f7923b7911ec70f16f558
topic 2 为Hash.sha3String(CnsManagement.FUNC_CNSREGISTER)的计算结果。成功从交易结构体中获取函数名,但因其他原有交易失败时会有此事件发生。
参数:
结果码(int类型)
0: 成功
1: 失败
结果消息(string类型)
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//将合约文件转换为二进制文件
byte[] dataBytes = Files.readBytes(new File(Config.CONTRACTBINARY));
String binData = Hex.toHexString(dataBytes);
//部署合约,成功部署后,合约地址会打印在log中
MyContract.deploy(web3j, cred, binData, new DefaultWasmGasProvider()).send();
//加载已部署合约
MyContract.load("", "0xce4efe084fd855c0c5d096f8478595ff35ec7ff8", web3j, cred, new DefaultWasmGasProvider());
//加载系统合约
CnsManagement manager = CnsManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//订阅事件
EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, CnsManagement.CONTRACT_ADDRESS)
.addOptionalTopics(
Hash.sha3String(CnsManagement.NotifyEventKey),
Hash.sha3String(CnsManagement.FUNC_CNSREGISTER),
Hash.sha3String(CnsManagement.CNSNotifyEventKey));
manager.cnsRegisterObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
//调用系统合约 CnsManagement 中的 cnsRegister() 方法
//注册合约到CNS系统中
manager.cnsRegister("contractName", "0.0.0.1", "0xce4efe084fd855c0c5d096f8478595ff35ec7ff8").send();
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.2 cnsRedirect
接口名称: cnsRedirect(String contractName, String contractVersion)
入参:
String contractName 合约名
String contractVersion 合约版本
返回值:TransactionReceipt
说明:重新指定cns合约名对应的合约地址(该合约地址以及对应版本需在cns中已注册)
事件:
Topic 1: 0x3e8c576b2f109e49f59952e75c0a038c00d1e57c324f7923b7911ec70f16f558
topic 1 为Hash.sha3String(CnsManagement.CNSNotifyEventKey)的计算结果
参数:
结果码(int类型)
0: 成功
1: 无效调用
2: 权限错误
3: 无效入参
4: 注册失败
结果消息(string类型)
Topic 2: 0x8cd284134f0437457b5542cb3a7da283d0c38208c497c5b4b005df47719f98a1
topic 2 为Hash.sha3String(CnsManagement.NotifyEventKey)的计算结果。因无法从交易结构体中获取函数名而失败时会有此事件发生。
参数:
结果码(int类型)
0: 成功
1: 失败
结果消息(string类型)
Topic 3: 0x6e4176a92392f1e85402ff3f952e8d0eb504eb0dc50256bdf9cc0d2b586dd5cc
topic 2 为Hash.sha3String(CnsManagement.FUNC_CNSREDIRECT)的计算结果。成功从交易结构体中获取函数名,但因其他原有交易失败时会有此事件发生。
参数:
结果码(int类型)
0: 成功
1: 失败
结果消息(string类型)
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//部署合约,成功部署后,合约地址会打印在log中
MyContract.deploy(web3j, cred, binData, new DefaultWasmGasProvider()).send();
//加载已部署合约
MyContract.load("", "0xse5235sdgfsaf78595ff35ec7ff8", web3j, cred, new DefaultWasmGasProvider());
//加载系统合约
CnsManagement manager = CnsManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//订阅事件
EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, CnsManagement.CONTRACT_ADDRESS)
.addOptionalTopics(
Hash.sha3String(CnsManagement.NotifyEventKey),
Hash.sha3String(CnsManagement.FUNC_CNSREDIRECT),
Hash.sha3String(CnsManagement.CNSNotifyEventKey));
manager.cnsRedirectObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
//调用系统合约 CnsManagement 中的 cnsRegister() 方法
//注册合约到CNS系统中
manager.cnsRegister("contractName", "0.0.0.2", "0xse5235sdgfsaf78595ff35ec7ff8").send();
//调用系统合约 CnsManagement 中的 cnsRedirect() 方法
manager.cnsRedirect("contractName", "0.0.0.2").send();
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.3 getContractAddress
接口名称: getContractAddress(String contractName, String contractVersion)
入参:
String contractName合约名称(类型:string)
String contractVersion 版本号,格式:x.x.x.x 或 "latest"
返回值:String 合约地址,无则为空(null)
说明:合约名称地址查询
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载系统合约
CnsManagement manager = CnsManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//调用系统合约 CnsManagement 中的 getContractAddress() 方法
Stirng address = manager.getContractAddress("contractName", "latest").send();
if (address != null) {
System.out.println(address);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.4 ifRegisteredByName
接口名称: ifRegisteredByName(String contractName)
入参:
String contractName 合约名称
返回值:BigInteger
未注册:0
已注册:1
无效入参:3
说明:通过合约名查询是否注册
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载系统合约
CnsManagement manager = CnsManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//调用系统合约 CnsManagement 中的 ifRegisteredByName() 方法
System.out.println(manager.ifRegisteredByName("contractName").send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.5 ifRegisteredByAddress
接口名称: ifRegisteredByAddress(String contractAddress)
入参:
String contractAddress 合约地址
返回值:BigInteger
未注册:0
已注册:1
无效入参:3
说明:通过合约地址查询是否注册
调用示例:
public class Demo {
// 参考 ifRegisteredByName()
}
4.6 getRegisteredContracts
接口名称: getRegisteredContracts(int startIndex, int endIndex)
入参:
int startIndex 起始下标(从0开始)
int endIndex 选择范围,当值为0时代表从起始下标到尾标
返回值:String
说明:通过范围获取已注册合约信息
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载系统合约
CnsManagement manager = CnsManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//调用系统合约 CnsManagement 中的 getRegisteredContracts() 方法
//注册合约到CNS系统中
System.out.println(manager.getRegisteredContracts(0, 2).send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.7 getRegisteredContractsByName
接口名称: getRegisteredContractsByName(String contractName)
入参:
String contractName 合约名
返回值:String
说明:通过合约名称获取已注册合约信息
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载系统合约
CnsManagement manager = CnsManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//调用系统合约 CnsManagement 中的 getRegisteredContractsByName() 方法
//注册合约到CNS系统中
System.out.println(manager.getRegisteredContractsByName("contratName").send());
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.8 getRegisteredContractsByAddress
接口名称: getRegisteredContractsByAddress(String contractAddress)
入参:
String contractAddress 合约地址
返回值:String
说明:通过合约地址获取已注册合约信息
调用示例:
public class Demo {
// 参考 getRegisteredContractsByName()
}
4.9 getRegisteredContractsByOrigin
接口名称: getRegisteredContractsByOrigin(String origin)
入参:
String origin 合约注册人地址
返回值:String
说明:通过注册人地址获取已注册合约信息
调用示例:
public class Demo {
// 参考 getRegisteredContractsByName()
}
5. 合约防火墙
数据结构说明
防火墙主要数据结构如下:
type FwStatus struct {
ContractAddress common.Address // 合约地址
FwActive bool // 防火墙开启/关闭状态
AcceptedList []FwElem // 防火墙白名单
RejectedList []FwElem // 防火墙黑名单
}
type FwElem struct {
Addr common.Address // 地址
FuncName string // 合约方法名称
}
注解
限制:
设置类方法只有部署合约的人才可以操作
权限说明
查询接口__sys_FwStatus: 任何用户均有查询权限
非查询接口:仅合约部署者对该合约地址的防火墙有操作权限
导入导出接口:暂未做限制
5.1 sysFwOpen
接口名称: sysFwOpen(String contractAddress)
入参:
String contractAddress 合约地址
返回值:TransactionReceipt
说明:开启防火墙
事件:
Topic 1: 0x8cd284134f0437457b5542cb3a7da283d0c38208c497c5b4b005df47719f98a1
topic 1 为Hash.sha3String(FwManagement.NotifyEventKey)的计算结果
参数:
结果码(int类型)
0: 成功
1: 权限错误
2: 无效入参
结果消息(string类型)
Topic 2: 0x6619b1053f4847152c7e5c33165a19b9c6116674010cb4b50c0b402834546f4b
topic 2 为Hash.sha3String(FwManagement.FUNC_SYSFWOPEN)的计算结果
参数:
结果码(int类型)
0: 成功
1: 失败
结果消息(string类型)
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载系统合约
FwManagement manager = FwManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//订阅事件
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, FwManagement.CONTRACT_ADDRESS)
.addOptionalTopics(Hash.sha3String(FwManagement.NotifyEventKey), Hash.sha3String(FwManagement.FUNC_SYSFWOPEN));
manager.sysFwOpenObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
//调用系统合约 FwManagement 中的 sysFwOpen() 方法
manager.sysFwOpen("0xasdhaslf353253...").send();
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.2 sysFwClose
接口名称: sysFwClose(String contractAddress)
入参:
String contractAddress 合约地址
返回值:TransactionReceipt
说明:关闭防火墙
事件:
Topic 1: 0x8cd284134f0437457b5542cb3a7da283d0c38208c497c5b4b005df47719f98a1
topic 1 为Hash.sha3String(FwManagement.NotifyEventKey)的计算结果
参数:
结果码(int类型)
0: 成功
1: 权限错误
2: 无效入参
结果消息(string类型)
Topic 2: 0x8579b36523a7fa1486ded44370a790e016548500d00d82cbea1596a7dc576665
topic 2 为Hash.sha3String(FwManagement.FUNC_SYSFWCLOSE)的计算结果
参数:
结果码(int类型)
0: 成功
1: 失败
结果消息(string类型)
调用示例:
public class Demo {
// 参考 sys_FwOpen()
}
5.3 sysFwAdd
接口名称: sysFwAdd(String contractName, String rule, String funcNames)
入参:
String contractName 合约地址
String 防火墙黑(REJECT)/白(ACCEPT)名单
String 防火墙规则,格式:单一规则 <地址>:<合约方法>;多规则 <地址1>:<合约方法1>|<地址2>:<合约方法2>
返回值:TransactionReceipt
说明:指定防火墙黑白名单
事件:
Topic 1: 0x8cd284134f0437457b5542cb3a7da283d0c38208c497c5b4b005df47719f98a1
topic 1 为Hash.sha3String(FwManagement.NotifyEventKey)的计算结果
参数:
结果码(int类型)
0: 成功
1: 权限错误
2: 无效入数
结果消息(string类型)
Topic 2: 0x83aa60d4e3fac26899883e984b27d75df175ba9b232677b144a91780fcc2dd38
topic 2 为Hash.sha3String(FwManagement.FUNC_SYSFWADD)的计算结果
参数:
结果码(int类型)
0: 成功
1: 失败
结果消息(string类型)
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载系统合约
FwManagement manager = FwManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//订阅事件
EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, FwManagement.CONTRACT_ADDRESS)
.addOptionalTopics(Hash.sha3String(FwManagement.NotifyEventKey), Hash.sha3String(FwManagement.FUNC_SYSFWADD));
manager.sysFwAddObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
//调用系统合约 FwManagement 中的 sysFwAdd() 方法
manager.sysFwAdd("contractName", "ACCEPT", "0x33:*|*:funcName2|0x55:funcName3").send();
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.4 sysFwClear
接口名称: sysFwClear(String contractName, String rule)
入参:
String contractName 合约地址
String 防火墙黑(REJECT)/白(ACCEPT)名单
返回值:TransactionReceipt
说明:清空防火墙黑白名单
事件:
Topic 1: 0x8cd284134f0437457b5542cb3a7da283d0c38208c497c5b4b005df47719f98a1
topic 1 为Hash.sha3String(FwManagement.NotifyEventKey)的计算结果
参数:
结果码(int类型)
0: 成功
1: 权限错误
2: 无效入数
结果消息(string类型)
Topic 2: 0x4be88811f3b33d3da31d8208ddbb87371e77f042416d54099e311b18d347658f
topic 2 为Hash.sha3String(FwManagement.FUNC_SYSFWCLEAR)的计算结果
参数:
结果码(int类型)
0: 成功
1: 失败
结果消息(string类型)
调用示例:
public class Demo {
// 参考 sysFwAdd()
}
5.5 sysFwDel
接口名称: sysFwDel(String contractName, String rule, String funcNames)
入参:
String contractName 合约地址
String 防火墙黑(REJECT)/白(ACCEPT)名单
String 防火墙规则,格式:单一规则 <地址>:<合约方法>;多规则 <地址1>:<合约方法1>|<地址2>:<合约方法2>
返回值:TransactionReceipt
说明:删除防火墙黑白名单
事件:
Topic 1: 0x8cd284134f0437457b5542cb3a7da283d0c38208c497c5b4b005df47719f98a1
topic 1 为Hash.sha3String(FwManagement.NotifyEventKey)的计算结果
参数:
结果码(int类型)
0: 成功
1: 权限错误
2: 无效入数
结果消息(string类型)
Topic 2: 0xe68ff3a3fa0884b33036c599a770e875c81a28a36457ac3c8eb9dd5ca2a2151f
topic 2 为Hash.sha3String(FwManagement.FUNC_SYSFWDEL)的计算结果
参数:
结果码(int类型)
0: 成功
1: 失败
结果消息(string类型)
调用示例:
public class Demo {
// 参考 sysFwAdd()
}
5.6 sysFwSet
接口名称: sysFwSet(String contractName, String rule, String funcNames)
入参:
String contractName 合约地址
String 防火墙黑(REJECT)/白(ACCEPT)名单
String 防火墙规则,格式:单一规则 <地址>:<合约方法>;多规则 <地址1>:<合约方法1>|<地址2>:<合约方法2>
返回值:TransactionReceipt
说明:重置防火墙黑白名单
事件:
Topic 1: 0x8cd284134f0437457b5542cb3a7da283d0c38208c497c5b4b005df47719f98a1
topic 1 为Hash.sha3String(FwManagement.NotifyEventKey)的计算结果
参数:
结果码(int类型)
0: 成功
1: 权限错误
2: 无效入数
结果消息(string类型)
Topic 2: 0x7135cdbf43c8c41c86f2665c215692acf08a6d36e07e1115be48fcb06444995b
topic 2 为Hash.sha3String(FwManagement.FUNC_SYSFWSET)的计算结果
参数:
结果码(int类型)
0: 成功
1: 失败
结果消息(string类型)
调用示例:
public class Demo {
// 参考 sysFwAdd()
}
5.7 sysFwStatus
接口名称: sysFwStatus(String contractAddress)
入参:
String contractAddress 合约地址
返回值:String
说明:查询防火墙状态
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载系统合约
FwManagement manager = FwManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//调用系统合约 FwManagement 中的 sys_FwStatus() 方法
manager.sysFwStatus("0xasdhas4235423b5j...").send();
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.8 sysFwImport
接口名称: sysFwImport(String contractAddress, String config)
入参:
String contractAddress 合约地址
String 防火墙规则
返回值:TransactionReceipt
说明:导入防火墙黑白名单
事件:
Topic 1: 0x8cd284134f0437457b5542cb3a7da283d0c38208c497c5b4b005df47719f98a1
topic 1 为Hash.sha3String(FwManagement.NotifyEventKey)的计算结果
参数:
结果码(int类型)
0: 成功
1: 权限错误
2: 无效入数
结果消息(string类型)
Topic 2: 0xfb7443dc0dbc85fa5c9df6aff809506bd417b93c5abfaa28d658dc5d32916daf
topic 2 为Hash.sha3String(FwManagement.FUNC_SYSFWIMPORT)的计算结果
参数:
结果码(int类型)
0: 成功
1: 失败
结果消息(string类型)
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载系统合约
FwManagement manager = FwManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//订阅事件
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.PENDING, FwManagement.CONTRACT_ADDRESS)
.addOptionalTopics(Hash.sha3String(FwManagement.NotifyEventKey), Hash.sha3String(FwManagement.FUNC_SYSFWIMPORT));
manager.sysFwImportObservable(filter).subscribe(
r -> {
System.out.println("\nlog: " + r.getLog());
System.out.println("\ncode: " + r.getCode());
System.out.println("\nmsg: " + r.getMsg());
}
);
//调用系统合约 FwManagement 中的 sysFwImport() 方法
manager.sysFwImport("0xasdhas4235423b5j...", "{\"AcceptedList\":[{\"Addr\":\"0x16c8a21295e68f039b8406d13ee0dc6c3a481c76\",\"FuncName\":\"function1\"}],\"RejectedList\":null}").send();
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.9 sysFwExport
接口名称: sysFwExport(String contractAddress)
入参:
String contractAddress 合约地址
返回值:String
说明:导出防火墙黑白名单
调用示例:
public class Demo {
public class Config { /*...*/ }
public static void main(String[] args) {
//建立连接
Web3j web3j = Web3j.build(new HttpService(Config.URL));
try {
//加载钱包
Credentials credentials = WalletUtils.loadCredentials(Config.PASSPHRASE, Config.KEYFILE);
//加载系统合约
FwManagement manager = FwManagement.load(web3j, credentials, new DefaultWasmGasProvider());
//调用系统合约 FwManagement 中的 sysFwExport() 方法
manager.sys_FwExport("0xasdhas4235423b5j...").send();
} catch (Exception e) {
e.printStackTrace();
}
}
}