波场TRON-Rich团队的UsdtBank合约简介

当前位置:首页 > 币圈百科 > 波场TRON-Rich团队的UsdtBank合约简介

波场TRON-Rich团队的UsdtBank合约简介

2022-12-09币圈百科280

随着波场DApp生态的不断发展,DApp开发者和用户数量快速增加,经济效益快速积累。提高智能合约的抗攻击能力成为DApp发展的重要考虑因素。因此,波场向社区收集了DApp的开源代码,结合其合约源代码,以实用的方式讲解了一些波场智能合约开发时应该注意的安全细节。更多源代码收集方法请参考附录。

TRON-Rich团队的UsdtBank合约收在这个小类里。在对合同进行分析之前,首先要通过合同验证平台验证其是否为真正的开源合同。接下来我们就用简短的篇幅分析一下社区的https://troneye.com(以下简称TRON-Eye)来选择合同验证平台。

契约验证的原理是,Solidity契约编译的字节码由可执行字节码和元哈希组成。同一个契约源代码在同一个编译环境下编译几次,生成的是同一个字节码。正确的契约验证方法应该是与字节码进行对比,从而验证蓑衣网小编2022源代码是否与链契约完全一致。

(TRON-Eye的源代码提交页面)

TRON-Eye详细阐述了其验证思路,同时还支持用户在合约源代码展示页面进行字节码的编译和比较,提高了可信度。所以我们选择TRON-Eye作为小课堂的验证平台,验证合同是否真的开源。

( TRON-Eye的合同源代码显示页面)

如图2所示,这个要检查的合同是TRON-Rich团队的UsdtBank合同代码。接下来,从安全角度对源代码进行详细解读。

如非必要,应禁止被其他契约调用

允许被其他契约调用,容易被发起回退攻击,尤其是即时返回结果的博彩游戏。攻击契约可以在其契约函数中调用目标契约。如果目标契约立即返回结果,当攻击契约发现返回的结果对自己不利时,就会主动还原,回滚交易。从而实现“只赢不输”。

/**?只有?人类?是吗?允许吗?去哪?打电话?这个?合同*/修改人?isHuman()?{require((bytes32(msg.sender))?==?(bytes 32(tx . origin));_;}

美元银行采用上述代码判断是否为合同。原理是如果是契约调用,msg.sender是外层契约的地址,tx.origin是契约调用方。当然,这段代码中,address被强制先bytes32,很浪费能量。建议直接用msg . sender==tx . origin

函数?投资蓑衣网小编2022(uint256?_ referrerCode,uint256?_planId,uint256?_value)?公共?whenNotPaused?伊舒曼?{如果?(_invest(msg.sender,_planId,_ referrerCode,_value))?{emit?onInvest(msg.sender,_ value);}}

判断一个地址是否是合同地址

这里是UsdtBank如何使用这个修饰符。可以发现,这个修饰语只适用于限制被呼叫者为普通用户。那么,如果需要判断一个传入地址参数是一个人,而不是一个合同,就需要用另外一种方式了。

函数?isContract(地址?账号)?内部?观点?退货?(bool)?{uint256?尺寸;组装?{?尺寸?=?extcodesize(账户)?}返回?尺寸?0;}

问:那么为什么修饰语isHuman()不用这种方式呢?

答:这是因为通过extcodesize判断一个地址是否是合同地址并不准确。在其他契约的构造函数中读取extcodesize时,该值始终为0。

更多:波场提交了一个关于添加address.type的小技巧,可以直观准确的判断一个地址类型。欢迎参与本提示的讨论。

小结论:要将契约中的调用者和契约中的address参数完全限定为Human,目前最好的办法是结合前面提到的isHuman()修饰符和isContract()。

如何通过合约处理TRC20的转让

选择UsdtBank解释这个问题的一个重要原因是

有一些与美元银行和USDT投注相关的代码:

itrc 20 publicsusdtaddr _;功能?setUsdtAddr(地址?_ usdtAddr)?公共?onlyOwner?{require(地址(usdtAddr _)?==?地址(0x 00));要求(地址(_ usdtAddr)?=?蓑衣网小编2022地址(0x 00));usdtAddr_?=?itrc 20(_ ustaddr);}

以上代码表示usdtAddress在初始化时只允许设置一次(拒绝run _)。

函数?_invest(地址?_addr,uint256?_planId,uint256?_ referrerCode,uint256?_ amount)privatenotContract(_ addr)返回?(bool){ ustaddr _。transferFrom(_addr,地址(这个),_金额);}

因为TRC20 token和TRC10 token最大的区别就是TRX和TRC10的余额存放在address的账户里,而TRC20 token的余额存放在TRC20契约里。通过直接调用TRC20契约的转账函数,可以将自己的余额转移到另一个地址,但实际上只是修改了TRC20契约中的余额字段的值。因此,要用标准TRC20下注,必须使用Approve和TransferFrom两步分离法。虽然这将导致用户两次签名。

波场TRON-Rich团队的UsdtBank合约简介 | 分享给朋友: