事件监听
由于Relation Protocol中定义的事件完全继承自EIP6239,因此我们需要监听所有符合EIP6239规范的事件:
/**
* @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),这些就是包含用户行为数据的数据。
:Soul_0x0109c8ee3151bde7b6b5d9f37e9d2c4bc16930fe p:following :Soul_0x6247123ec0fe0d25feb811e3c4d4a760c1f2e63e .
使用The Graph索引
通过The Graph可以方便的将用户在区块链上产生的行为数据索引出来,具体请参照The Graph文档。
下面是我们监听到Polygon网络上的行为数据,项目地址:
https://thegraph.com/hosted-service/subgraph/relationlabs/semantic-sbt
通过The Graph提供的playground进行查询

通过The Graph提供的GraphQL Api进行查询:
eg: 查询最近两条token的信息
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}"}'
查询结果
{"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 . "}]}}
使用ethers.js索引
ethers.js是一个与以太坊及其生态进行交互的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) {}
})
Last updated