工作原理

本文档描述了THE-OASIS协议的工作原理

跨合约NFT转移

OASIS.MAIN 合约是触发跨合约NFT转移的操作入口,也是执行所有逻辑的上下文。

您需要先了解OASIS.MAINOASIS.ASSET 的基本原理——

时序图

整个转移过程可以分为三个阶段:

  • 转移类型判定;

  • NFT资产合法性验证;

  • NFT资产冻结与释放。

转移类型判定

在跨合约NFT转移的场景中,我们需要根据NFT当前的相关信息,判断转移场景属于以下哪一种类型:

  • Case 1:由发行合约转移至外部合约

  • Case 2:由外部合约转移至发行合约

  • Case 3:由外部合约A转移至外部合约B。

判定逻辑如下:

  1. 获取NFT当前所在合约地址。从NFT UUID中恢复发行合约地址。若两者相同,则属于Case 1;否则执行下一步;

  2. 根据参数to_world 拿到目标「世界名」,获取对应资产合约地址。若该地址与步骤1中NFT的发行合约地址相同,则属于Case 2;否则属于Case 3

NFT资产合法性验证

三种转移类型的资产合法性验证大体相同,但有微小的区别。

Case 1与Case 2

  1. 查询发行合约的transferable 数据表,判断NFT是否为可转移的资产;

  2. 查询外部合约的映射规则,判断对应的origin_symbol 与「世界名」是否合法;

  3. 判断origin_symbolOASIS.MAIN 合约中记录的NFT原始符号是否一致。

Case 3

从双方资产合约的acceptable 数据表中分别拿到new_symbol 对应的符号映射规则,包含NFT的原始符号origin_symbol 及来源 「世界名」。通过来源「世界名」获取关联合约地址,并做以下比较:

  1. 双方映射规则的origin_symbol 是否一致;

  2. 双方关联资产合约地址是否均相同,且与从NFT UUID恢复的发行合约地址相同。

共有验证逻辑

  1. 验证NFT的签名字段signature ,算法为:Verify(Sha256(uuid + uri + symbol))

  2. 验证NFT的uri 字段:domain 部分是否与 「世界名」相符;

  3. 判断NFT在双方资产合约的存在性。

以上所有验证须全部通过,否则将终止转移过程。

NFT资产冻结与释放

NFT的跨合约转移主要是通过冻结当前合约资产及在目标合约中释放资产的方式完成:

  1. 调用NFT所在合约的freeze 方法,冻结该NFT资产,并检查冻结前后,该资产发行量、持有人余额的变化;

  2. 调用目标合约的release 方法,释放该NFT资产,并检查释放前后,该资产发行量、持有人余额的变化;

  3. 以上验证均通过后,更新OASIS.MAIN 中该NFT的最新合约地址。