本文摘要自 20 Common Solidity Beginner Mistakes。
2024/10/12 Solidity v0.8.26
(隨著科技進步,有些坑會被填起來,有新的坑會出現。)slither 可以簡單幫你分析合約的安全漏洞: https://github.com/crytic/slither
(公司產品建議找專業 Audit 團隊審核)
Install slither-analyzer:
python3 -m pip install slither-analyzer
Usage:
slither src/Counter.sol
interest = principal / 3_333 * 10_000
interest = principal * 10_000 / 3_333
。transfer
或 send
,用 call
。
transfer
會對接收者可能執行的邏輯進行 gas 限制,為了避免 reentrancy attack,但這可能也會導致某些正當邏輯無法被執行。tx.origin
,用 msg.sender
wallet
-> malicious intermediate contract
-> final contract
: tx.origin
會指向 wallet
,導致惡意人士能夠使用中介合約來互動。using SafeERC20 for IERC20
來避開不同 ERC20 代幣實作的錯誤回傳。setProtocolFee
: 對於 owner 可設定的費用設置一個合理的上限。pragma solidity ^0.8.0
是給 library 用的。pragma solidity 0.8.26
application 請指定特定版本部署。indexed
100/3
得 33 儘管正確答案是 33.3333。
forge fmt
或 solfmt
_msgSender()
僅用於 Meta Transactions 的情境,不然的話用 msg.sender
就好deposit
內寫 balance[msg.sender] = msg.value;
會複寫每次投入合約的錢,要用 balance[msg.sender] += msg.value
。