从 The Saudis 事件浅析 EIP-2535 钻石协议_OSM:COSMIC币

背景信息

2022年?7月10号,一个火热的NFT项目TheSaudis开启了freemint活动。而就在mint活动结束后,一位名叫RIGHTBLOCK的用户在市场上大量地抛售该NFT,项目方发现后迅速锁定到了该用户并对合约进行改动以此来将该用户手里的大量NFT转移回来,他们之后承诺会将这些NFT回馈给社区用户。

那么为什么项目方可以将该用户手里的NFT转移呢?经过我们的分析发现该NFT项目的合约采用了EIP-2535协议也叫做钻石协议,项目方利用该协议重写了合约的功能,以此来实现这些NFT的转移。接下来慢雾安全团队将会为大家介绍下这个钻石协议的细节。

DWF Labs 从 Floki 财库购买价值 500 万美元的 FLOKI 代币:5月25日消息,Shiba Inu 犬种主题项目 Floki 宣布于 Web3 投资公司 DWF Labs 建立战略合作伙伴关系,DWF Labs 已从 Floki 财库购买了价值 500 万美元的 FLOKI 代币,并将通过其网络和资源来帮助加速 FLOKI 代币的采用。[2023/5/25 10:40:31]

钻石协议介绍

EIP-2535是以太坊上一个将合约进行代码模块化组合的提案,其目的是为了让大型的智能合约突破24kb大小的最大限制,并且让合约更方便地更新功能。

要理解钻石协议,首先有几个相关的概念定义需要知道:

钻石:钻石可以理解为代理合约,也是与用户进行交互的主合约

NuCypher 已将共享策略访问周期持续时间从 24 小时延长至 7 天:据官方消息,隐私基础设施 NuCypher (NU)的关于将共享策略访问周期持续时间以提升 Worker (节点运营方和质押者)潜在回报的第一项升级提案现已获得通过,且已执行。目前,NuCypher 已将周期从 24 小时延长至 7 天,可降低 Worker 在链上作出承诺所需的累积 Gas 成本。[2021/4/15 20:21:32]

切面:正如真正的钻石有不同的侧面一样,一个钻石合约也有着不同的面,钻石合约的每个功能所需要调用的合约对应一个切面,所以也可以理解为实现合约

钻石切割:钻石协议标准扩展了一种叫钻石切割的功能,其主要作用从钻石中增加、替换或删除切面和功能,可以理解为合约的升级

放大镜:钻石协议标准中的放大镜功能主要是返回关于切面的信息和钻石存在的功能,这些信息是保存在钻石合约内部的存储结构——DiamondStorage中

Cosmos 创始人 Jae Kwon 从 AIB 及 ICF 基金会离职 全职开发 Gno 智能合约语言:Cosmos 创始人 Jae Kwon 宣布从 Cosmos 网络软件开发公司 AIB (All in Bits)及 The Interchain 基金会(ICF)离职,全职开发 Gno 智能合约语言。The Interchain 基金会是位于瑞士的非盈利基金会以支持 Cosmos 的生态建设,而 AIB 是负责开发 Cosmos 网络的软件开发公司,这意味着 Cosmos 创始人 Jae Kwon 将离开 Cosmos 生态中最核心的支持机构。Jae Kwon 表示,Gno 是适用于 Cosmos 生态的下一代的智能合约编程语言。[2021/2/15 19:47:00]

整个钻石模型类似下图:

14.7万枚LINK从 交易所转出 价值191万美元:据WhaleAlert数据显示,北京时间08月09日03:02, 14.7万枚LINK从交易所转入0x2906开头地址,按当前价格计算,价值约191万美元,交易哈希为:0xf973c51ad1718f2f42a72261ff3dc9dc4894fee329d150df39dee5cc84549cde。[2020/8/9]

通过使用钻石标准规范去创建钻石合约,这个合约可以像使用当前合约的代码一样使用任何数量的其他切面合约的代码。

在该钻石合约中不同的函数功能需要调用对应的不同的切面合约的代码来实现,并且可以利用钻石切割的功能来对钻石合约中的函数功能进行修改。

这与市面上大多数使用一个代理合约和一个实现合约来实现交互与升级的方式有所区别。

动态 | 2千万枚 USDT从 Tether Treasury转至 Bitfinex交易所:据 Whale Alert监测,刚刚2千万枚 USDT从 Tether Treasury转至 Bitfinex交易所。[2019/7/4]

事件分析

接下来回头分析下TheSaudis这次事件中的一些细节,在该项目的DiamondCutFacet.sol合约中,可以看到实现了diamondCut功能的函数。

该函数首先会调用LibDiamond库的enforceIsContractOwner函数来判断调用者是否是合约的owner,如果是owner调用的话会调用LibDiamond库的diamondCut函数来实现钻石合约的功能更新。

跟进到该函数我们发现钻石切割会根据传入的不同的action来判断进行添加、替换或删除功能,故接下来跟进看看项目方调用该函数的交易。

我们发现传入了新的切面合约0x70d8ccaf6b50b051ab1e8fa238626163e45a8b03,传入的action设置为1则应该是调用了replaceFunctions?来实现替换功能。

从replaceFunctions函数中可以分析出该函数首先会为传入的地址新增一个切面,接着从存储中循环读取传入的每个函数选择器对应的旧的切面进行删除,并为这些函数的切面添加为传入的新的切面地址。

至此可得知TheSaudis项目方就是利用了钻石切割函数来重写了转账功能,以此来将用户RIGHTBLOCK手中的NFT转移回自己的账户。

相关信息

TheSaudis合约地址:

0xe21ebcd28d37a67757b9bc7b290f4c4928a430b1

用户Rightblock地址:

0x80266b1e3f0C2cAdAE65A4Ef5Df20f3DF3707FfB

项目方更新合约的交易:

0xbc559a72f73e6c9a53416fd13a3ebaaa76dca5855ff8b79511585f514eaf2390

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

水星链

[0:0ms0-1:192ms