EIP-3664合约研究笔记05--扩展属性分析

本文介绍了EIP-3664协议如何增强NFT的灵活性,涵盖通用属性、变量属性、可转移属性、可升级属性和可进化属性的概念,以及ERC3664Generic、ERC3664Transferable、ERC3664Updatable和ERC3664Evolvable合约的设计与示例。这些合约允许更动态的游戏体验,如属性转移、升级和进化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 属性介绍
DRepublic Labs团队认为NFT721协议中的属性值都是固定不变的,不适用于复杂多变的游戏应用,提出了3664协议,希望给NFT721协议额外增加扩展属性, 目前 EIP-3664 已经实现了六种核心属性操作:可升级,可修改,可添加,可移除,可拆分,可组合。
一般的游戏属性分类:
通用属性:用于描述头像出生日期等不可变属性。
变量属性:用于描述其值会发生变化的属性,例如分身的战斗力。
可转移属性:用于描述可以转移到其他 NFT 的属性。
可升级属性:用于描述 NFT 级别并可以触发升级。
可进化属性:用于描述 NFT 可以进化,进化可以失败,如果失败的情况下,NFT 不能再使用,直到正确修复。
Erc-3664扩展了Erc-1155,并将游戏的非功能属性分为四类:
1.一般变量属性:一般指NFT攻击强度、生命值等基本属性。其功能包括增加或减少属性值。
2.可转让财产:指非功能材料在损坏或其他情况下可以转让给其他非功能材料的可转让财产。
3.可升级属性:指根据公式可以升级的NFT。玩家支付费用,这反映在等级的增加,通常伴随着其他属性值的增加。
4.可演化属性:指非功能功能函数随时间自动演化的属性(链块高度),模拟现实世界中的时间属性,使非功能函数具有时变特性。
基于以上四种属性类,我们设计了四种通用属性契约,开发人员可以根据游戏逻辑设计不同的支持合同。
2 合约类关系图

 

3 一般通用合约--ERC3664Generic 
ERC3664Generic合约相比ERC3664合约,具备权限控制(MINTER_ROLE、ATTACH_ROLE)。
在构造函数中设置了权限:  部署合约的用户注册为权限(MINTER、ATTACH),以后该用户就可以发起调用Mint、Attach函数了。
constructor() ERC3664() {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
        _setupRole(MINTER_ROLE, _msgSender());
        _setupRole(ATTACH_ROLE, _msgSender());
    }
// mint() 
    require( hasRole(MINTER_ROLE, _msgSender()), "ERC3664Generic: must have minter role to mint");
// attach()
    require( hasRole(ATTACH_ROLE, _msgSender()), "ERC3664Generic: must have attach role to attach" );
4 可转移合约--ERC3664Transferable 
这个合约比较难以理解,目的是把代币A添加的属性1转移给另一个代币B,听起来还是不明所云,举个例子看看:
假设Legoot项目tokenA具备一套装备属性,其中一个优秀属性“力量+10”。tokenB非常眼红,自己没有这个属性啊,土豪不差钱,马上买过来。 tokenA答应了,收了钱把这个属性转移给tokenB。在这个过程中就像转移属性就像基因一样转移。
转移属性需要满意一些前提条件:
  1. tokenA的拥有者是msgsender
  2. tokenA的拥有者授权属性attrId转移给tokenB
  3. tokenB作为接收方不能有属性attrId。
transferFrom转移的具体过程:
        _balances[attrId][to] = amount;    // 设置接收方的属性余额,意味着就有了该属性attrId
        delete _balances[attrId][from];    // 删除发送方的属性记录,意味着就发送方从此没有了该属性
        delete _allowances[attrId][from];  // 删除发送方的授权记录
approve的过程
 保证接收tokenId没有该项属性,才能设置授权成功
关于内置的nft: 
constructor(address nft) ERC3664Generic() {
        _nft = nft;
        _setupRole(TRANSFER_ROLE, _msgSender());
    }
modifier onlyHolder(uint256 tokenId) {
        require(
            ITokenHolder(_nft).holderOf(tokenId) == _msgSender(),
            "ERC3664Transferable: caller is not the nft holder"
        );
        _;
    }
在构造函数中需要填写一个NFT合约地址,用于后面检查发送方tokenId的所有者,需要满足 ITokenHolder接口。
这样就说明转移属性的代币合约必须实现 ITokenHolder接口,那么以前发行的普通类721合约就不能使用了,必须用实现了该接口的新721合约才行。 
如何实现 ITokenHolder接口?  没有找到相关实现代码,估计要增加map类变量进行保存和查询了。
【转移属性与合并的区别?】
通过转移操作可以得到别人的属性,通过合并操作可以得到其他NFT,也同时带来了新的属性值。 那么这二者到底有哪些异同呢?
相同点: 主体NFT都具备了新的属性
差异性: 转移过程仅仅是属性的流转,不涉及到token的所有权转移。
               合并是发生了token所有权的转移, 顺带着把子代币的主属性作为主代币的次要属性,性质是搂草打兔子。
5 可更新合约--ERC3664Updatable
可更新合约的设计目的---增加、减少属性的余额, 移除属性。
增加属性余额:
increase()
   检查属性存在
   检查tokenId拥有属性
   余额+=amount
减小属性余额:
decrease()
   检查属性存在
   检查tokenId拥有属性
   余额-=amount
移除属性: 是attach添加属性的反操作, 把 次要属性从主体NFT中剥离出去。注意只能移除次要属性,主要属性是无法移除的。
remove()
    检查属性存在
    属性余额>0,  表示tokenId拥有属性
    删除余额
    次要属性数组中删除属性id
6 可进化合约-- ERC3664Evolvable
功能: 随着时间可以按照概率提升等级, 也可以设计成物品随着时间老化。
(1)类继承关系图:
ERC3664Evolvable  --->  ERC3664Generic  --->  ERC3664    
(2) 工作过程:
  1. mintWith   铸造主体NFT,属性元数据仓库中添加 新的属性元数据
  2. attach        给代币添加属性,设置属性的等级、诞生区块、下一个升级区块。
  3. evolutive   升级属性
  4. repair        升级失败后修复属性
铸造NFT调用顺序
ERC3664Evolvable    mintWith 
      --->   ERC3664Generic   mint
                        --->         ERC3664  _mint               
铸造NFT时要指定 升级概率和区块间隔数组。
        uint8[] memory probabilities,
        uint256[] memory evolutiveIntervals
(3) 升级计算过程
 先计算随机数
      seed = keccak256(用户地址+区块号+时间戳+区块难度系数)%100 
判断随机数是否小于等级概率值, 小于就表示幸运的升级,Level++,更新下一个升级区块号。
大于就是很不幸的升级失败,状态设置为false, 表示NFFT不能再使用啦。
(4) 修复过程
 状态恢复为true, 下一个区块号重置。
【示例】  属性的升级概率值[50, 20, 10], 升级间隔值[1000,2000,4000,8000],
意味着,Level 1 升级概率分别是50%,20%, 10%, 可升级3次,Level= 1、2、3、4 。
Level1升级必须经过1000个区块时间,  第二次升级必须再经过2000个区块时间。
【注意】概率数组和间隔数组长度不相等, 升级次数以概率数组长度决定。间隔数组长度多一个元素,不然的话最后一次升级后就无法设置正确的间隔时间了。
飞思卡尔智能车竞赛是一项备受关注的科技赛事,旨在激发学生的创新和实践能力,尤其是在嵌入式系统、自动控制和机器人技术等关键领域。其中的“电磁组”要求参赛队伍设计并搭建一辆能够自主导航的智能车,通过电磁感应线圈感知赛道路径。本压缩包文件提供了一套完整的电磁组智能车程序,这是一套经过实战验证的代码,曾在校级比赛中获得第二名的优异成绩。 该程序的核心内容可能涉及以下关键知识点: 传感器处理:文件名“4sensor”表明车辆配备了四个传感器,用于获取环境信息。这些传感器很可能是电磁感应传感器,用于探测赛道上的导电线圈。通过分析传感器信号的变化,车辆能够判断自身的行驶方向和位置。 数据采集与滤波:在实际运行中,传感器读数可能受到噪声干扰,因此需要进行数据滤波以提高精度。常见的滤波算法包括低通滤波、高斯滤波和滑动平均滤波等,以确保车辆对赛道的判断准确无误。 路径规划:车辆需要根据传感器输入实时规划行驶路径。这可能涉及PID(比例-积分-微分)控制、模糊逻辑控制或其他现代控制理论方法,从而确保车辆能够稳定且快速地沿赛道行驶。 电机控制:智能车的驱动通常依赖于直流电机或无刷电机,电机控制是关键环节。程序中可能包含电机速度和方向的调节算法,如PWM(脉宽调制)控制,以实现精准的运动控制。 嵌入式系统编程:飞思卡尔智能车的控制器可能基于飞思卡尔微处理器(例如MC9S12系列)。编程语言通常为C或C++,需要掌握微控制器的中断系统、定时器和串行通信等功能。 软件架构:智能车软件通常具有清晰的架构,包括任务调度、中断服务程序和主循环等。理解和优化这一架构对于提升整体性能至关重要。 调试与优化:程序能够在比赛中取得好成绩,说明经过了反复的调试和优化。这可能涉及代码效率提升、故障排查以及性能瓶颈的识别和解决。 团队协作与版本控制:在项目开发过程中,团队协作和版本控制工具(如Git)的应用不可或缺,能够保
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快活林高老大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值