# 事件监听

由于Relation Protocol中定义的事件完全继承自[EIP6239](http://eips.ethereum.org/EIPS/eip-6239)，因此我们需要监听所有符合EIP6239规范的事件：

```solidity
/**
 * @title Semantic Soulbound Token
 * Note: the EIP-165 identifier for this interface is 0xfbafb698
 */
interface ISemanticSBT {
    /**
     * @dev This emits when minting a Semantic Soulbound Token.
     * @param tokenId The identifier for the Semantic Soulbound Token.
     * @param rdfStatements The RDF statements for the Semantic Soulbound Token. An RDF statement is the statement made by an RDF triple.
     */
    event CreateRDF (
        uint256 indexed tokenId,
        string rdfStatements
    );
    /**
     * @dev This emits when updating the RDF data of Semantic Soulbound Token. RDF data is a collection of RDF statements that are used to represent information about resources.
     * @param tokenId The identifier for the Semantic Soulbound Token.
     * @param rdfStatements The RDF statements for the semantic soulbound token. An RDF statement is the statement made by an RDF triple.
     */
    event UpdateRDF (
        uint256 indexed tokenId,
        string rdfStatements
    );
    /**
     * @dev This emits when burning or revoking Semantic Soulbound Token.
     * @param tokenId The identifier for the Semantic Soulbound Token.
     * @param rdfStatements The RDF statements for the Semantic Soulbound Token. An RDF statement is the statement made by an RDF triple.
     */
    event RemoveRDF (
        uint256 indexed tokenId,
        string rdfStatements
    );
    /**
     * @dev Returns the RDF statements of the Semantic Soulbound Token. An RDF statement is the statement made by an RDF triple.
     * @param tokenId The identifier for the Semantic Soulbound Token.
     */
    function rdfOf(uint256 tokenId) external view returns (string memory);
}
```

* CreateRDF：当一个包含RDF语义的SBT被创建的时候会发出此事件。
* UpdateRDF：当一个包含RDF语义的SBT被更新的时候会发出此事件。
* RemoveRDF：当一个包含RDF语义的SBT被销毁的时候会发出此事件。

通过监听链上的这些事件，将会得到一条条包含语义的RDF数据（例如：代码块7-1），这些就是包含用户行为数据的数据。

{% code title="代码块：7-1" %}

```
:Soul_0x0109c8ee3151bde7b6b5d9f37e9d2c4bc16930fe p:following :Soul_0x6247123ec0fe0d25feb811e3c4d4a760c1f2e63e .
```

{% endcode %}

## 使用The Graph索引

通过[The Graph](https://thegraph.com/)可以方便的将用户在区块链上产生的行为数据索引出来，具体请参照[The Graph文档](https://thegraph.com/docs/en/developing/creating-a-subgraph/)。

下面是我们监听到Polygon网络上的行为数据，项目地址：

<https://thegraph.com/hosted-service/subgraph/relationlabs/semantic-sbt>

* 通过The Graph提供的playground进行查询

<figure><img src="/files/Y7QW7GbpePqEG9GzZG35" alt=""><figcaption><p>图 7-2 使用playground进行查询</p></figcaption></figure>

* 通过The Graph提供的GraphQL Api进行查询：

eg: 查询最近两条token的信息

{% code overflow="wrap" %}

```shell
curl --location --request POST 'https://api.thegraph.com/subgraphs/name/relationlabs/semantic-sbt' \
--header 'Content-Type: application/json' \
--data-raw '{"query":"{\n  turtles(first: 2) {\n    id\n    owner\n    tokenId\n    turtle\n  }\n}"}'
```

{% endcode %}

查询结果

{% code overflow="wrap" %}

```shell
{"data":{"turtles":[{"id":"33456276423","owner":"0x16ff7821a8d293cd2ea07b650fc69ea9206d0615","tokenId":"1","turtle":":Activity1 p:name \"Activity_2049_1\" . :Activity1 p:level 1 . "},{"id":"33456276425","owner":"0x16ff7821a8d293cd2ea07b650fc69ea9206d0615","tokenId":"2","turtle":":Activity2 p:name \"Activity_2049_2\" . :Activity2 p:level 2 . "}]}}
```

{% endcode %}

## 使用ethers.js索引

[ethers.js](https://github.com/ethers-io/ethers.js)是一个与以太坊及其生态进行交互的JavaScript库。

例如：

```javascript
const ethers = require('ethers')
const rpc = 'https://polygon-mumbai.blockpi.network/v1/rpc/public'
let abi = ['event CreateRDF(uint256 indexed tokenId, string rdfStatements)']
const provider = new ethers.JsonRpcProvider(rpc)
const iface = new ethers.Interface(abi)
const filter = {}

// listen
provider.on(filter, (e) => {
  try {
    let event = iface.parseLog(e)
    console.log(event)
    // parse ...
  } catch (error) {}
})
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://relationlabs.gitbook.io/protocol/protocol-zh/indexer/event-listener.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
