链资讯 链资讯
Ctrl+D收藏链资讯
首页 > ETH > 正文

UST:Rust智能合约养成日记(6)_DontPlaywithKitty

作者:

时间:

相关文章:

Rust智能合约养成日记合约状态数据定义与方法实现

Rust智能合约养成日记编写Rust智能合约单元测试

Rust智能合约养成日记Rust智能合约部署,函数调用及Explorer的使用

Rust智能合约养成日记Rust智能合约整数溢出

Rust智能合约养成日记拒绝服务攻击

拒绝服务攻击又称DoS(DenialofService)攻击,该类型的攻击将使得智能合约在一段时间内(甚至永久)无法被用户正常使用。

目前已知的原因大致可分为如下两类:

合约逻辑中存在的某些缺陷。如某一public函数,其实现没有考虑到计算复杂度。用户调用该函数时,实际所需消耗的Gas会超出NEAR公链创世区块配置文件(genesis_config.json)中所定义的"max_total_prepaid_gas":300000000000000`(300TGas),导致交易失败。

数字资产托管机构Aegis Trust新增支持Cosmos生态资产:12月9日消息,数字资产托管机构Aegis Trust宣布新增支持Cosmos生态资产,允许项目通过其提供的基础设施和合规解决方案托管协议财库资产。此前,加密货币托管机构Aegis Trust宣布推出NFT保险服务,将为机构投资者、对冲基金和交易所持有的代币化资产提供高达2500万美元的保险。[2022/12/10 21:34:46]

某些跨合约调用情形中,合约的执行依赖于其他外部合约的执行状态。而外部合约的执行并非总是可靠,以至于本合约的执行可能被外部合约阻塞,无法照常运行。该类问题的发生可表现为合约用户在合约中的资金被锁定,以至于无法正常的充值或提现。

除了合约逻辑的缺陷,DoS现象发生的原因还可以归因于人为因素:典型的如:合约的所有者丢失了自己的私钥,以至于合约中部分only_owner可执行的特权函数无法被调用,使得合约中某些重要的系统状态值无法及时的更新,这将有可能对项目造成较大的损失。

Crust Network激励测试网第十阶段将进行2项重要测试:1月17日消息,波卡生态中的分布式存储项目Crust Network官方发文公布其激励测试网“盈利方舟”(Profit Ark)进展。官方表示,第九阶段激励性测试网运行成功。到第十阶段,开发团队将在测试网上进行2项重要测试:1.将验证器总数增加至400-500个,以测试链的运行成本和性能;2.在Profit Ark结束的前一天,将测试创新的A/B在线升级机制。该机制扩展了Polkadot的链上升级机制,允许sWorker模块随链进行升级。[2021/1/17 16:22:42]

为方便读者更加深刻地了解智能合约中的DoS攻击漏洞,本文后续将结合具体DoS攻击的例子展开描述与分析。本文代码已上传至BlockSec官方github,读者可以自行下载https://github.com/blocksecteam/near_demo/tree/main/DoSDemo

波卡生态项目Crust将于11月30日启动方舟计划激励测试网第一阶段:11月25日,基于波卡平行链构建的去中心化存储项目Crust Network (CRU)宣布开放测试网方舟计划(Profit Ark)的激励性测试网,并计划于11月30日启动该测试网的第一阶段。在第一阶段中将分发价值约30万枚CRU的奖励,其中 50%为CRU,50%为CRU18 (锁定状态的CRU,将会在主网上线后18个月内线性解锁)。此外,每隔5天Crust Network将对前5天的积分进行一次统计,并按比例以ERC20的方式发放奖励。目前,用户有5日的时间来重新进行配置和预测试。此前消息,Crust方舟计划激励测试网于2020 年11月12日进入封闭测试阶段,目前已结束封闭测试。[2020/11/26 22:12:48]

用户可通过调用pubfnregister_account()函数进行注册并初始化。

动态 | TrustED推出教育背景调查区块链平台:据coinjournal报道,澳大利亚创业公司TrustED推出了基于区块链的学术证书验证服务。该平台利用区块链技术使教育机构和毕业生能够为雇主存储和认证成绩和证书,简化了学术证书在确保合法性的同时得到验证的过程。[2018/11/22]

后续该合约的管理者将调用pubfndistribute_token函数来为系统中用户进行"分红"。“分红”的方式为遍历用户数组self.registered,并通过跨合约调用向每一个用户转入指定额度amount的代币以做奖励。

然而该合约状态数据(self.registered)的大小没有限制,并且可以被恶意用户所操控,使得该合约数据的大小变得过大。以至于DISTRIBUTOR用户在调用该合约方法时,可能消耗的Gas费用过高,超出了GASLIMIT。

如下是该合约在实际NEARLocalnet中测试的结果

动态 | 美国信托公司Prime Trust将提供ERC-20令牌的冷藏服务:据内华达州信托公司Prime Trust透露,他们已于7月中旬开始为BTC提供冷藏服务,并且将在下周宣布,他们可以提供ETH以及以太坊ERC-20令牌的冷藏服务。[2018/8/15]

可以看到当系统中注册的用户较多时,实际在distribute_token执行的过程中,所设置的prepaid_gas将不足以满足所有用户的转账操作,以至于本次交易失败。

推荐的解决方案:

由于GasLimit的限制,合约方法在执行过程中不建议遍历一个较大的数据结构(该数据结构的大小可被外部用户操纵)。确需遍历的,也需要限制该数据结构的大小,并保证当该数据结构的大小达到该最大值时,也不会触及GasLimit的限制。

因此推荐采用withdrawal模式对上述合约进行改造。即要求合约方不主动地对所有的用户逐一发放奖励,而是先记账,并设置一个withdraw函数,让单一用户通过该函数方法的调用,自行取回“分红”奖励。此时合约方也只需要维护逐一用户已经取回的奖励数额或者还能取回的奖励数额即可。

用户可以通过调用“竞价合约”中的pubfnregister_account函数方法注册账户,为参与后续的竞价做准备

用户还可以通过如下接口函数查询当前系统中目前为止出价最高的用户ID,及其所出的价格。

用户还可以通过如下接口函数查询当前系统中目前为止出价最高的用户ID,及其所出的价格。

当竞价合约收到token时,会通过ft_on_transfer函数调用到如下bid函数。

在该出价函数中,函数的执行逻辑将首先检查本次用户的出价是否高于之前出价最高用户的出价值。如果满足该条件,将执行self.refund_exe()从“竞价合约”中退回之前出价最高用户的出价代币。随后更新目前为止出价最高的用户ID及其所出的价格。

实际的情况是,根据该合约的逻辑定义:必须要退回之前出价最高用户的出价代币,才能将目前为止出价最高的用户ID进行更替。

在该出价函数中,函数的执行逻辑将首先检查本次用户的出价是否高于之前出价最高用户的出价值。如果满足该条件,将执行self.refund_exe()从“竞价合约”中退回之前出价最高用户的出价代币。随后更新目前为止出价最高的用户ID及其所出的价格。

实际的情况是,根据该合约的逻辑定义:必须要退回之前出价最高用户的出价代币,才能将目前为止出价最高的用户ID进行更替。

此时测试模拟了“竞价系统”的参与的用户:user0、user1和user2

他们分别拥有10000个初始代币。user0首先在“竞价系统”中出价1000,此时查询可知current_leader:user0.test.nearhighest_bid:1000。随后user0立即将剩余的9000个代币转给了user2,并销毁了代币账户。

此后,当user1出价2000时,系统将打算退回user0之前的出价值。但由于此时user0的账户已不存在,系统将提示"CannotRefund",始终无法成功完成后续的交易更新状态。

此时第二位出价者想出价2000:

解决方法:

如果合约的状态的转化需要依赖于外部合约的调用处理,则需要考虑外部合约调用可能失败的情形,防止合约的执行逻辑被阻塞而拒绝服务,即我们需要实现合理的错误处理手段。在本例子中,我们可以将无法退回的代币寄存于合约新增的lost_found用户组中,当后续用户满足条件refund条件时,再由用户本身来进一步取回代币(同样可以实现withdraw函数)。

3.Owner私钥丢失

去中性化智能合约项目中往往也存在部分中心化的现象:如存在合约的owner。部分合约函数的执行被设置为仅owner可以执行,用以对合约中某些关键系统变量值的进行设置更改。我们可以将此类函数称之为only_owner类型函数。

例如前文在“分红”合约中所定义的pubfndistribute_token,该函数即为only_owner函数。当合约的owner无法履行职能(私钥丢失)时,资金将一直被锁定在合约之中,无法分发给其他用户。另有大多数的情况下,only_owner函数还可以用来暂停或者重启合约中的所有交易,可见owner正常履行其职能的重要性。

解决方法:

为避免上述owner个人“失能”情形的发生,我们可增设多位合约的owner共同治理合约,甚至可采用多签请求的方式来替换原有的合约权限控制方案,以此实现合约的去中心化治理效果。有关智能合约中多签请求功能的设计实现,将在后续的《智能合约养成日记》中展开详细的描述。

标签:USTISTUNDITHtrustwallet钱包ARISTO币adfundsDontPlaywithKitty

ETH热门资讯
DAOVC:VC新潮流,Tiger DAO VC以DAO形式入侵_PieDAO USD

风险投资正在成为早期,中小型初创企业获得资金的重要方式之一。现代意义上的风险投资通常被简称为VC,是指向早期初创企业提供资金支持并取得该公司股份的一种投资方式,VC是私人股权投资的一种形式.

COM:XT.COM關於暫停ANY3L/USDT, ANY3S/USDT交易的公告_comp币价格

尊敬的XT.COM用戶:XT.COM现已暫停ANY3L/USDT,ANY3S/USDT交易。給您帶來的不便,請您諒解!外媒:Bithumb、Coinone和Gopax上曾共出现6亿美元规模的Lu.

IST:雪梨交易所:SkyMavis团队就赔偿Ronin事件进行讨论_MAV

AnimocaBrands联合创始人YatSiu表示,近日针对AxieInfinity侧链Ronin的黑客攻击可能会改变风险投资家对加密领域投资的态度和责任.

BIT:“愚”快体验金,充值&交易分享$50,000_creditbit

什么是合约体验金? 体验金,可以用于任意交易对的合约交易。可用于保证金、填补亏损使用。体验金不可提现,产生的盈利部分,可以提现.

MET:38万粉丝的SHIB推特大V公开给META元宇宙项目站台_元宇宙

近期非常火爆的META元宇宙项目上线第一天就上了币安新闻,如今38万粉丝的SHIB推特大V也公开站台META,目前正是元宇宙的风口,META作为元宇宙的项目,现在是前期,非常适合埋伏.

GMT:ZT ETF板即將上線GMT 3倍杠杆产品_SUSHIBEAR币

親愛的ZT用戶: ZTETF板即將上線GMTBULL,GMTBEAR,並開啟GMTBULL/USDT,GMTBEAR/USDT交易對.