Skip to content

直接调用合约 ​

DID ​

获取元数据 (metadata) ​

获取 DID 的元数据有两个接口 - getMetadata(tokenId) 和 getMetadata(name)。

返回值 ​

json
[
  "james.myterminus.com", // 名称 (name)
  "did:key:z6MkpLwxcTwhj4MRm4eKhvBadK45qHr5QEYHUXNyhCfkXJ9U#z6MkpLwxcTwhj4MRm4eKhvBadK45qHr5QEYHUXNyhCfkXJ9U", // 从助记词派生的 DID
  "OrganizationalUser", // DID 类型
  true // 是否允许创建子域?
]

获取域的所有者 ​

调用 ownerOf(tokenId) 来获取 DID 的链上控制者地址。

按创建索引获取 token ​

调用 tokenByIndex(index) 来获取指定索引的 token。它返回一个 token ID。

按所有者和索引获取 token ​

尽管从业务角度我们不允许单个钱包拥有多个 DID,但考虑到未来可能的所有权转移和 NFT 交易,合约本身是允许的。在这种情况下,可以调用 tokenOfOwnerByIndex(owner, index) 来获取指定地址拥有的、具有指定索引的 token。它返回一个 token ID。

注册 DID ​

域的所有者可以调用 register(owner, MetaData(domain, did, note, allowSubdomain)) 来注册其子域。

[!NOTE] 第一个参数 owner 是新 DID 的指定所有者,第二个参数是一个元数据结构体,包含:

  • domain: 新 DID 的完整域名,同时也是一个 Terminus Name
  • did: 从所有者钱包派生的 DID
  • note: 关于新 DID 的备注,供链下系统用于分类
  • allowSubdomain: 是否允许新 DID 注册子域

元数据在注册后不可更改。如果将来所有权发生转移,新的 DID 记录将被写入 latestDid 标签中。

标签 (Tag) ​

获取由某个名称定义的标签数量 ​

getDefinedTagCount(name) 返回由指定 TName 定义的标签数量。

获取标签名 ​

与上述接口配合使用,getDefinedTagNameByIndex(name, index) 返回单个标签名,而 getDefinedTagNames(name) 返回由指定 TName 定义的所有标签名。

结构化标签 ​

如果一个标签类型是复杂结构而不是原始值,调用 getTagType(name, tagName) 来查询结构定义,然后使用先前返回的 fieldNamesHash 调用 getFieldNamesEventBlock(fieldNamesHash) 来获取定义此标签时的区块号。最后,使用 ethers 库来获取定义中的字段名。

[!NOTE] 查询标签类型的接口返回一个 ABI 类型的编码字节,应根据代码表进行解析。查询字段名可能很复杂且容易出错,因此我们建议使用 SDK 中的函数来获取关于标签的数据,而不是手动调用合约。

获取标签类型后,调用 getTagElem(definedDidName, valueDidName, tagName, elemPath) 来获取标签的值。

[!NOTE]

  • definedDidName: 定义此标签的 TName
  • valueDidName: 你想获取其标签值的 TName
  • elemPath: 路径选择器,用于读取元组或数组中的内部元素([] 用于读取完整标签)

此接口返回 ABI 编码的数据,应根据标签类型进行解析。 同样建议使用 SDK 而不是手动调用合约。

定义标签 ​

使用 didName 的所有者调用 defineTag(didName, tagName, abiType, fieldNames) 来定义一个标签。

[!NOTE]

  • abiType: 此标签的数据类型,遵循我们的 ABI 代码格式,支持复杂结构
  • fieldNames: 此标签内部结构体的字段名,使用前序遍历扁平化为二维字符串数组

CRUD (增删改查) ​

[!NOTE] 我们建议与 Tagger 合约交互,而不是使用以下接口来执行标签操作。

  • 创建 (Create) - 调用 addTag(defineDidName, valueDidName, tagName, value) 来添加一个标签。

  • 更新 (Update) - 调用 updateTagElem(defineDidName, valueDidName, tagName, elemPath, value) 来更新标签中的一部分数据。

  • 删除 (Delete) - 调用 removeTag(defineDidName, valueDidName, tagName) 来删除一个标签。这会删除在某个 DID 上设置的标签,而不是删除标签定义本身。

  • 数组操作 (Array operations) - 如果标签类型包含数组,调用 popTagElem(defineDidName, valueDidName, tagName, elePaths) 和 pushTagElem(defineDidName, valueDidName, tagName, elePaths, value) 来执行数组特有的操作。

[!NOTE]

  • defineDidName: 定义此标签的 TName
  • valueDidName: 在其上设置标签值的 TName
  • value: ABI 编码的标签值