木星链 木星链
Ctrl+D收藏木星链
首页 > XMR > 正文

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

作者:

时间:1900/1/1 0:00:00

相关文章:

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

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

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

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

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

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

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

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

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

Genesis与BitGo Trust合作开发机构托管产品:金色财经报道,加密货币托管公司 BitGo Trust 将为代表 Genesis 的机构客户持有的资产提供合格的托管与冷存储服务。BitGo 提供 2.5 亿美元保险,并持有 SOC 1 Type 2 和 SOC 2 Type 2 认证,以及衡量技术解决方案相关风险的合规工具。[2023/4/1 13:38:23]

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

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

1.循环遍历一个可被外部调用更改的数据结构

以下是一个用于给合约中注册用户“分红”的简单智能合约,其状态数据如下:

Protego Trust Bank任命Ron Totaro为公司CEO:金色财经报道,Protego Trust Bank任命金融服务资深人士Ron Totaro为首席执行官,该银行继续努力为加密和数字资产的机构客户提供服务。Totaro最近的职位是Tassat Group的首席执行官,这是一家专注于数字支付的基于区块链的科技公司。

2021年,Protego在A轮融资中筹集了7000万美元,投资者包括加密货币交易所Coinbase(COIN)和FTX以及CoinDesk的母公司Digital Currency Group。据报道,5月,Protego正在寻求在B轮融资中筹集更多资金,这将使该公司的估值达到20亿美元。[2022/9/12 13:24:45]

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

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

MetaMask集成Gnosis Safe、Hex Trust、GK8和Parfin,以满足DAO的加密托管需求:4月13日消息,Meta Mask机构部门Meta Mask Institutional(MMI)宣布将GnosisSafe、HexTrust、GK8和Parfin整合到其平台上,以满足DAO的加密托管需求。通过此次新的集成,MMI将拥有七名针对不同司法管辖区的DAO托管人。

2021年10月,MMI已添加BitGo、Qredo和Cactus Custody作为机构DeFi用户的托管人,以帮助公司满足合规要求。(coindesk)[2022/4/13 14:23:00]

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

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

Bill Miller旗下Miller Opportunity Trust:比特币作为数字黄金具有巨大的上涨潜力:9月6日消息,知名基金投资大鳄Bill Miller旗下价值型基金Miller Opportunity Trust在周五的投资者更新报告中提到其比特币敞口。在在半年报(截至2021年6月30日)中,该公司强调今年早些时候投资灰度比特币信托(GBTC)时表示,“在本季度,随着比特币下跌,该信托基金的交易价格相对其所持标的资产比特币出现较大折价,从而提供额外的上涨潜力。我们相信比特币作为一种‘数字黄金’具有巨大的上涨潜力。黄金市值超过11万亿美元,而比特币目前市值大约6000亿美元,要赶上黄金还有很长的路要走。我们处于持续采用曲线的早期,比特币将具有波动性,但我们认为风险回报是有吸引力的。”

据此前报道,根据8月27日向美国证券交易委员会提交的文件,Miller Opportunity Trust报告持有150万份灰度比特币信托(GBTC)。截至6月30日,总价值为4470万美元。(The Block)[2021/9/6 23:02:06]

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

动态 | Trust wallet宣布支持BTC:据sludgefeed报道,币安旗下以太坊移动钱包Trust wallet宣布已开始支持BTC的接收、存储和发送。目前其iOS钱包已提供segwit支持,并允许通过Bech32地址存入BTC。该功能将在2至3周后对安卓系统开放。[2018/12/11]

推荐的解决方案:

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

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

2.跨合约之间的状态依赖导致合约阻塞

合约在进行跨合约调用时,可能会对外部合约的状态存在依赖,不恰当的依赖,会导致该合约阻塞,从而可能被发起DoS攻击

下面考虑一种利用智能合约进行“竞价”的场景:

用户可以通过调用“竞价合约”中的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共同治理合约,甚至可采用多签请求的方式来替换原有的合约权限控制方案,以此实现合约的去中心化治理效果。有关智能合约中多签请求功能的设计实现,将在后续的《智能合约养成日记》中展开详细的描述。

标签:USTTRUSTTRUOWNGUSTA价格trustwallet钱包官网下载true币最新消息NEWTOWN GAMING

XMR热门资讯
WEB3:2022全球Web3生态创新云端峰会将于下周正式启动-ODAILY

高盛将Web3描述为「下一波计算机行业的潮流」,强调「在Web3框架下,现有巨头的护城河也将受到威胁」;中国证监会科技监管局局长姚前赞誉「Web3是用户与建设者共建共享的新型经济系统.

1900/1/1 0:00:00
NFT:SupraOracles:使用去中心化预言机进行资产通证化和金融化-ODAILY

预言机在传统资产所有权过渡以及在二级市场交易的数字资产方面扩大信任度并提高效率。 证券化是为非流动资产设计金融工具的过程,这些资产可以在二级市场上出售,并可能为所有者带来收益.

1900/1/1 0:00:00
SUP:SupraOracles与HashBrownSwap达成合作-ODAILY

SupraOracles很高兴地宣布与开放的跨链DeFi平台HashBrownSwap(HBS)建立合作伙伴关系。它是为所有人设计的次世代交易所和易于使用的钱包.

1900/1/1 0:00:00
STA:波卡上的数字资产是如何通过公共利益平行链Statemint部署的?-ODAILY

“波卡知识图谱”是我们针对波卡从零到一的入门级文章,我们尝试从波卡最基础的部分讲起,为大家提供全方位了解波卡的内容,当然这是一项巨大的工程,也充满了挑战.

1900/1/1 0:00:00
NFT:顶峰AscendEX:加密市场的同质化与差异化博弈-ODAILY

2021年,据Nonfungible统计显示,全球NFT交易规模已经达到176亿美元,相比前一年的8200万美元,疯狂上涨超过200倍.

1900/1/1 0:00:00
WOR:World Mobile项目周报(3月21日—3月27日)-ODAILY

2022年3月21日WorldMobile发起投票,本次投票在所有Cardano原生Token中,WMT获得最为广大用户喜爱的Token.

1900/1/1 0:00:00