
在Web3领域,开发者面临的风险是天文数字级别的。智能合约中的一个漏洞不仅会导致404错误;它可能导致用户资金数百万美元不可逆转的损失。区块链的不可变性意味着没有重来的机会。安全不是一项功能;而是在这个领域构建任何东西的绝对先决条件。
本指南概述了每位智能合约开发者都必须知道的最关键的安全最佳实践。它涵盖了常见的攻击向量以及缓解这些风险所需的防御性编程模式。
这可以说是Solidity中用于防止一种常见且具有毁灭性的漏洞——重入攻击——最重要的设计模式。
require(msg.sender == owner))。
2. 生效: 其次,更新你的合约状态(例如,balances[msg.sender] = 0)。
3. 交互: 最后,与任何外部合约进行交互(例如,(bool sent, ) = msg.sender.call{value: amount}(""))。通过在发送资金之前更新状态,你可以确保即使外部合约回调,你的合约状态也已经是正确的,攻击者无法多次提取资金。
call进行外部调用,而非transfer或send当从合约发送以太币时,应始终优先使用.call{value: amount}(""),而不是.transfer()或.send()。
.transfer()和.send()函数会固定转发2300 gas的津贴。这原本是作为一种安全措施,但可能在未来网络升级导致gas成本变化时导致合约失败。如果一个接收合约的回退函数逻辑稍复杂,可能会耗尽gas,导致交易回滚。.call{value: amount}("")会转发所有剩余的gas,使你的合约更具未来适用性。然而,这也使得检查-生效-交互模式变得更加关键,因为它增加了重入攻击的风险。在Solidity 0.8.0版本之前,算术运算在溢出或下溢时不会回滚。
uint8(取值范围0-255)的值为255,你再加1,它会回绕到0。攻击者可能利用此点操纵余额或其他关键值。pragma solidity ^0.8.0;。在这个版本及更高版本中,算术运算在溢出/下溢时会自动回滚,从而有效解决了问题。永远不要假设内存池中的交易顺序会与它们在区块中的执行顺序一致。恶意行为者可以看到你的交易,并支付更高的gas费来让自己的交易首先执行。这是MEV(最大可提取价值) 的一种形式。
不要重复造轮子,尤其是对于像代币这样的标准组件。
在Web3中进行构建需要偏执思维。假设每个外部合约都是恶意的,并且复杂的参与者会试图利用任何弱点。通过遵守这些安全最佳实践,你可以显著降低漏洞风险,并为用户构建安全的应用程序。
CSD0tFqvECLokhw9aBeRqjqYfDJdW3nZR2MolY56cOSJb+wEwzPnCsyAovIBj0UNlkr5z0IoywnTXzNNwl81Hks71zonRGQJnSGats1/ZZAlzoOenWPUVepQVT/mrpMqhVJCjrZmWeffUJ5yCLNCOQ==
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。