文档

事件接口

更新时间:

订阅账户

  • 函数原型

public BigInteger listenAccount(Identity id, IEventCallback handler, EventModelType type)
  • 请求参数

参数

必选

类型

说明

id

true

Identity

账户的业务 ID

handler

true

IEventCallback

当收到账户事件响应后回调。

type

true

EventModelType

事件模型类型。1:PULL,2:PUSH

  • 返回字段

返回字段

字段类型

说明

eventId

BigInteger

返回结果。如果 eventId 等于 0,则表示监听失败。

  • 示例

// event handler 
IEventCallback handler = new IEventCallback() {
        @Override
        public void onEvent(Message message) {
            PushAccountEvent pushAccountEvent = (PushAccountEvent) message;
            for (Account account : pushAccountEvent.getAccounts()) {
                 logger.debug("account identity: {}", account.getIdentity());
                 logger.debug("account balance: {}", account.getBalance());
            }
        }
    };

// account: Tester001
Identity identity = new Identity("c60a9d48105950a0cca07a4c6320b98c303ad42d694a634529e8e1a0a16fcdb5");

// listen account
BigInteger eventId = sdk.getEventService().listenAccount(identity, handler, EventModelType.PUSH)

if (eventId.longValue() == 0) {
    System.out.println("listen failed");
}

订阅合约

  • 函数原型

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,则表示监听失败。

  • 使用样例

/event handler
IEventCallback handler = new IEventCallback() {
    @Override
    public void onEvent(Message message) {
        PushContractEvent pushContractEvent = (PushContractEvent) message;
        for (Contract contract : pushContractEvent.getContracts()) {
             logger.debug("contract identity: {}", contract.getIdentity());
             logger.debug("contract code hash:{}", contract.getCodeHash());
        }
    }
};

Identity identity = new Identity("a7937b64b8caa58f03721bb6bacf5c78cb235febe0e70b1b84cd99541461a08e");

//listen contract
BigInteger result = sdk.getEventService().listenContract(identity, handler, EventModelType.PUSH)

订阅主题事件

  • 函数原型

public BigInteger listenTopics(List<String> topics, IEventCallback handler, VMTypeEnum vmType, EventModelType type)
  • 请求参数

参数

必选

类型

说明

topics

true

List<String>

订阅 Topic 列表

handler

true

IEventCallback

当收到主题事件响应后回调。

vmType

true

VMTypeEnum

合约类型。1:EVM,2:WASM

type

true

EventModelType

事件模型类型。1:PULL;2:PUSH

  • 返回字段

返回字段

字段类型

说明

result

BigInteger

返回结果。如果 result 等于 0,则表示监听失败。

  • EVM 示例

//Evm contract
contract logAndPrecomileContract {

    event TEST(identity id, uint a, uint b);
      ...


    function test(identity id, uint ba) public payable returns(uint) {
        if (!id.send(ba  / 2))
            throw; // also reverts the transfer to Sharer
        emit TEST(id, ba, id.balance);
        return id.balance;
    }
      ...
}
//deploy Evm contract

// evnet handler
IEventCallback handler = new IEventCallback() {
    @Override
    public void onEvent(Message message) {
        PushTopicsEvent eventTopicsMessage = (PushTopicsEvent) message;
        for (EventTopicResult result : eventTopicsMessage.getResults()) {
             logger.debug(" topic: {}", result.getTopic());
             logger.debug(" data: {}", result.getData());
        }
    }
};

// add contract
List<String> topics = new ArrayList<>();
//系统合约,任意调用一个合约都会返回事件
topics.add("call_contract");

//EVM 合约,调用会触发合约内部 TEST 事件的方法
topics.add("TEST(identity,uint256,uint256)");

// listen topics
BigInteger result = sdk.getEventService().listenTopics(topics, handler, VMTypeEnum.EVM, EventModelType.PUSH)

//调用 EVM 的合约,将触发两个 topic,一个 call_contract 的事件,一个TEST 的事件
EVMParameter parameters = new EVMParameter("test(identity,uint256)");
parameters.addIdentity(identity);
parameters.addUint(value);
CallContractRequest request = new CallContractRequest(accId, contractId, parameters, BigInteger.ZERO, VMTypeEnum.EVM);
sdk.getContractService().callContract(request);

//结束后取消订阅主题
sdk.getEventService().unListenTopics(result);
  • WASM 示例

//Wasm contract
class logAndPrecomileContract : public Contract {
    public:
    INTERFACE uint64_t test(const Identity& id, uint64_t ba){
        uint64_t balance = 0;
        bool ret = GetBalance(id, balance);

        Log(id, {"hello", "abc"});
        return balance;
    }
};
//deploy Wasm contract

// evnet handler
IEventCallback handler = new IEventCallback() {
    @Override
    public void onEvent(Message message) {
        PushTopicsEvent eventTopicsMessage = (PushTopicsEvent) message;
        for (EventTopicResult result : eventTopicsMessage.getResults()) {
             logger.debug(" topic: {}", result.getTopic());
             logger.debug(" data: {}", result.getData());
        }
    }
};

// add contract
List<String> topics = new ArrayList<>();
//系统合约,任意调用一个合约都会返回事件
topics.add("call_contract");
topics.add("hello"); //监听 hello 为主题的事件
topics.add("abc");   //监听 abc 为主题的事件

// listen topics
BigInteger result = sdk.getEventService().listenTopics(topics, handler, VMTypeEnum.WASM, EventModelType.PUSH)

//调用 WASM,将触发 call_contract
WASMParameter parameters = new WASMParameter("test");
parameters.addIdentity(identity);
parameters.addUInt64(value);
CallContractRequest request = new CallContractRequest(accId, contractId, parameters, BigInteger.ZERO, VMTypeEnum.WASM);
sdk.getContractService().callContract(request);

//结束后取消订阅主题
sdk.getEventService().unListenTopics(result);

订阅区块事件

  • 函数原型

public BigInteger listenBlock(IEventCallback handler, EventModelType type)
  • 请求参数

参数

必选

类型

说明

handler

true

IEventCallback

当收到区块事件响应后回调。

type

true

EventModelType

事件模型类型。1:PULL,2:PUSH

  • 返回字段

返回字段

字段类型

说明

result

BigInteger

返回结果。如果 result 等于 0,则表示监听失败。

  • 示例

// event handler
IEventCallback handler = new IEventCallback() {
    @Override
    public void onEvent(Message message) {
        PushBlockEvent pushBlockEvent = (PushBlockEvent)message;
        for (BlockHeader blockHeader : pushBlockEvent.getBlockHeaders()) {
             logger.debug("block hash:{}", blockHeader.getHash());
             logger.debug("block number:{}", blockHeader.getNumber());
             logger.debug("block parent hash:{}", blockHeader.getParentHash());
        }
    }
};
// listen block
BigInteger result = sdk.getEventService().listenBlock(handler, EventModelType.PUSH)

取消订阅账户事件

  • 函数原型

public boolean unListenAccount(BigInteger eventId)
  • 请求参数

参数

必选

类型

说明

eventId

true

BigInteger

订阅的事件 ID

取消订阅合约事件

  • 函数原型

public boolean unListenContract(BigInteger eventId)
  • 请求参数

参数

必选

类型

说明

eventId

true

BigInteger

订阅的事件 ID

取消订阅主题事件

  • 函数原型

public boolean unListenTopics(BigInteger eventId)
  • 请求参数

参数

必选

类型

说明

eventId

true

BigInteger

订阅的事件 ID

取消订阅区块事件

  • 函数原型

public boolean unListenBlock(BigInteger eventId)
  • 请求参数

参数

必选

类型

说明

eventId

true

BigInteger

订阅的事件 ID