事件接口

订阅账户

  • 函数原型
  1. public BigInteger listenAccount(Identity id, IEventCallback handler, EventModelType type)
  • 请求参数
参数 必选 类型 说明
id true Identity 账户的业务 ID
handler true IEventCallback 当收到响应、超时或发生错误时回调。
type true EventModelType 事件模型类型。1:PULL,2:PUSH
  • 返回字段
返回字段 字段类型 说明
result BigInteger 返回结果。如果 result 等于 0,则表示监听失败。
  • 示例
  1. // event handler
  2. IEventCallback handler = new IEventCallback() {
  3. @Override
  4. public void onEvent(Message message) {
  5. PushAccountEvent accountEvent = (PushAccountEvent) message;
  6. //code
  7. }
  8. };
  9. // account: Tester001
  10. Identity identity = new Identity("c60a9d48105950a0cca07a4c6320b98c303ad42d694a634529e8e1a0a16fcdb5");
  11. // listen account
  12. BigInteger eventId = sdk.getEventService().listenAccount(identity, handler, EventModelType.PUSH)
  13. if (eventId.longValue() == 0) {
  14. System.out.println("listen failed");
  15. }

订阅合约

  • 函数原型
  1. public BigInteger listenContract(Identity id, IEventCallback handler, EventModelType type)
  • 请求参数
参数 必选 类型 说明
id true Identity 账户的业务 ID
handler true IEventCallback 当收到响应、超时或发生错误时回调。
type true EventModelType 事件模型类型。1:PULL,2:PUSH
  • 返回字段
返回字段 字段类型 说明
result BigInteger 返回结果。如果 result 等于 0,则表示监听失败。

  • 使用样例
  1. /event handler
  2. IEventCallback handler = new IEventCallback() {
  3. @Override
  4. public void onEvent(Message message) {
  5. PushContractEvent eventContractMessage = (PushContractEvent) message;
  6. // code
  7. }
  8. };
  9. Identity identity = new Identity("a7937b64b8caa58f03721bb6bacf5c78cb235febe0e70b1b84cd99541461a08e");
  10. //listen contract
  11. BigInteger result = sdk.getEventService().listenContract(identity, handler, EventModelType.PUSH)

订阅主题事件

  • 函数原型
  1. public BigInteger listenTopics(List<String> topics, IEventCallback handler, VMTypeEnum vmType, EventModelType type)
  • 请求参数
参数 必选 类型 说明
topics true List 订阅 Topic 列表
handler true IEventCallback 当收到响应、超时或发生错误时回调。
vmType true VMTypeEnum 合约类型。1:EVM,2:WASM
type true EventModelType 事件模型类型。1:PULL;2:PUSH
  • 返回字段
返回字段 字段类型 说明
result BigInteger 返回结果。如果 result 等于 0,则表示监听失败。
  • EVM 示例
  1. //Evm contract
  2. contract logAndPrecomileContract {
  3. event TEST(identity id, uint a, uint b);
  4. ...
  5. function test(identity id, uint ba) public payable returns(uint) {
  6. if (!id.send(ba / 2))
  7. throw; // also reverts the transfer to Sharer
  8. emit TEST(id, ba, id.balance);
  9. return id.balance;
  10. }
  11. ...
  12. }
  1. //deploy Evm contract
  2. // evnet handler
  3. IEventCallback handler = new IEventCallback() {
  4. @Override
  5. public void onEvent(Message message) {
  6. PushTopicsEvent eventTopicsMessage = (PushTopicsEvent) message;
  7. //code
  8. }
  9. };
  10. // add contract
  11. List<String> topics = new ArrayList<>();
  12. //系统合约,任意调用一个合约都会返回事件
  13. topics.add("call_contract");
  14. //EVM 合约,调用会触发合约内部 TEST 事件的方法
  15. IHash hashTool = HashFactory.getHash();
  16. byte[] sha256 = hashTool.hash("TEST(identity,uint256,uint256)".getBytes());
  17. topics.add(ByteUtils.toHexString(sha256));
  18. // listen topics
  19. BigInteger result = sdk.getEventService().listenTopics(topics, handler, VMTypeEnum.EVM, EventModelType.PUSH)
  20. //调用 EVM 的合约,将触发两个 topic,一个 call_contract 的事件,一个TEST 的事件
  21. EVMParameter parameters = new EVMParameter("test(identity,uint256)");
  22. parameters.addIdentity(identity);
  23. parameters.addUint(value);
  24. CallContractRequest request = new CallContractRequest(accId, contractId, parameters, BigInteger.ZERO, VMTypeEnum.EVM);
  25. sdk.getContractService().callContract(request);
  26. //结束后取消订阅主题
  27. sdk.getEventService().unListenTopics(result);
  • WASM 示例
  1. //Wasm contract
  2. class logAndPrecomileContract : public Contract {
  3. public:
  4. INTERFACE test(const Identity& id, uint64_t ba){
  5. uint64_t balance = 0;
  6. bool ret = GetBalance(id, balance);
  7. Log(pack(id), {String2Bytes("hello"), String2Bytes("abc")});
  8. Result(pack(balance));
  9. }
  10. }
  1. //deploy Wasm contract
  2. // evnet handler
  3. IEventCallback handler = new IEventCallback() {
  4. @Override
  5. public void onEvent(Message message) {
  6. PushTopicsEvent eventTopicsMessage = (PushTopicsEvent) message;
  7. //code
  8. }
  9. };
  10. // add contract
  11. List<String> topics = new ArrayList<>();
  12. //系统合约,任意调用一个合约都会返回事件
  13. topics.add("call_contract");
  14. topics.add("hello"); //监听 hello 为主题的事件
  15. topics.add("abc"); //监听 abc 为主题的事件
  16. // listen topics
  17. BigInteger result = sdk.getEventService().listenTopics(topics, handler, VMTypeEnum.WASM, EventModelType.PUSH)
  18. //调用 WASM,将触发 call_contract
  19. WASMParameter parameters = new WASMParameter("test");
  20. parameters.addIdentity(identity);
  21. parameters.addUInt64(value);
  22. CallContractRequest request = new CallContractRequest(accId, contractId, parameters, BigInteger.ZERO, VMTypeEnum.WASM);
  23. sdk.getContractService().callContract(request);
  24. //结束后取消订阅主题
  25. sdk.getEventService().unListenTopics(result);

订阅区块事件

  • 函数原型
  1. public BigInteger listenBlock(IEventCallback handler, EventModelType type)
  • 请求参数
参数 必选 类型 说明
handler true IEventCallback 当收到响应、超时或发生错误时回调。
type true EventModelType 事件模型类型。1:PULL,2:PUSH
  • 返回字段
返回字段 字段类型 说明
result BigInteger 返回结果。如果 result 等于 0,则表示监听失败。
  • 示例
  1. // event handler
  2. IEventCallback handler = new IEventCallback() {
  3. @Override
  4. public void onEvent(Message message) {
  5. // code
  6. }
  7. };
  8. // listen block
  9. BigInteger result = sdk.getEventService().listenBlock(handler, EventModelType.PUSH)

取消订阅账户事件

  • 函数原型
  1. public boolean unListenAccount(BigInteger eventId)
  • 请求参数
参数 必选 类型 说明
eventId true BigInteger 订阅的事件 ID

取消订阅合约事件

  • 函数原型
  1. public boolean unListenContract(BigInteger eventId)
  • 请求参数
参数 必选 类型 说明
eventId true BigInteger 订阅的事件 ID

取消订阅主题事件

  • 函数原型
  1. public boolean unListenTopics(BigInteger eventId)
  • 请求参数
参数 必选 类型 说明
eventId true BigInteger 订阅的事件 ID

取消订阅区块事件

  • 函数原型
  1. public boolean unListenBlock(BigInteger eventId)
  • 请求参数
参数 必选 类型 说明
eventId true BigInteger 订阅的事件 ID