发送事件
事件由智能合约和 go plugins发出。 有两种方式订阅这些事件:
事件结构
上面展示的事件JSON在发送到事件流之前被封装在一些事务特定的元数据中。 元数据中的其他字段包括被调用地址、合约地址、合约名称和原始事务请求数据。
以下是进入redis的完整信息示例 -
{
"caller": {
"ChainID": "default",
"Local": "2DiOmpX+kSRZK0jxEgxdGuPC0eo="
},
"address": {
"ChainID": "default",
"Local": "4ojW7scVDWoi/eM/CqLYHgZZHE0="
},
"plugin": "etherboycore:0.0.1",
"blockHeight": 65,
"encodedData": "eyJPd25lciI6ImdvZGJvbGUxIiwiTWV0aG9kIjoic2F2ZXN0YXRlIiwiQWRkciI6IjJEaU9tcFgra1NSWkswanhFZ3hkR3VQQzBlbz0iLCJWYWx1ZSI6MTAxMH0=",
"rawRequest": "CglTYXZlU3RhdGUSGhIIZ29kYm9sZTEaDnsiVmFsdWUiOjEwMTB9"
}
rawRequest
和encodedData
使用标准编码进行base64编码。
通过Redis订阅
默认情况下,loom-sdk只会将事件发送到log。 要将其配置为将其发送到redis有序集合中,请将以下行添加到loom.yaml配置文件中。
EventDispatcherURI: "redis://localhost:6379"
这将开始把事件发送到名为loomevents
的有序集合中的redis服务器。每个事件都会被添加到有序集合中,得分就是区块链高度。
通过websockets订阅
Loom SDK查询端点也可用于订阅事件流。 以下是一个使用命令和wscat nodejs cli的示例订阅代码。
$ cat command.json
{
"method": "subevents",
"jsonrpc": "2.0",
"params": [],
"id": "dontcare"
}
$ wscat -k ws://localhost:46658/queryws < command.json
{
"jsonrpc": "2.0",
"id": "dontcare",
"result": {}
}{
"jsonrpc": "2.0",
"id": "0",
"result": {
"caller": {
"ChainID": "default",
"Local": "2DiOmpX+kSRZK0jxEgxdGuPC0eo="
},
"address": {
"ChainID": "default",
"Local": "4ojW7scVDWoi/eM/CqLYHgZZHE0="
},
"plugin": "etherboycore:0.0.1",
"blockHeight": 65,
"encodedData": "eyJPd25lciI6ImdvZGJvbGUxIiwiTWV0aG9kIjoic2F2ZXN0YXRlIiwiQWRkciI6IjJEaU9tcFgra1NSWkswanhFZ3hkR3VQQzBlbz0iLCJWYWx1ZSI6MTAxMH0=",
"rawRequest": "CglTYXZlU3RhdGUSGhIIZ29kYm9sZTEaDnsiVmFsdWUiOjEwMTB9"
}
}
Cli输出中的第一个json是订阅命令的响应。 以下json是来自一个处理事务的合约的事件。
示例go代码
你可以参考使用redis和websocket事件订阅的demo索引器 来读取事件并坚持弹性搜索。 (注意这个代码仅用于演示目的)。