Bài viết
Chia sẻ kiến thức của bạn.
Lỗ hổng tái nhập cảnh
Xin chào mọi người, tôi nhận thấy rằng hàm offer sử dụng phương thức.call {value: amount} (“”) để gửi Ether đến địa chỉ của người nhận.
Có ai có thể cung cấp thông tin chi tiết về việc liệu chức năng này có thực sự dễ bị tổn thương khi tái nhập ngũ hay không và đề xuất bất kỳ phương pháp hay sửa đổi tốt nhất nào để giảm thiểu rủi ro đó không?
function _offer(address to, uint256 amount) internal {
balance -= amount;
(bool success, ) = to.call{value: amount}("");
if (!success) {
revert TransferFailed(address(0), address(this), to, amount);
}
}
- Smart Contract
- Solidity
- Solidity Compiler
Câu trả lời
1Một trong những phương pháp hay nhất trong Solidity là CEI (Checks, Effects, Interactions). Nó mô tả thứ tự cấu trúc mã của bạn để tránh hành vi bất ngờ hoặc thực thi độc hại.
Kiểm trasẽ triển khai một số require
để đảm bảo các tham số trong hàm của bạn là chính xác. Không có bất kỳ chức năng nào trong _offer()
chức năng của bạn, nhưng bạn có thể thêm ví dụ require(balance >= amount);
(không cần thiết) ở đầu hàm của bạn để đảm bảo rằng người dùng không chi tiêu nhiều hơn những gì anh ta sở hữu.
Hiệu quảvề cơ bản là thay đổi các biến trạng thái của hợp đồng của bạn để phù hợp với những gì bạn muốn bây giờ. Ở đây, đó là dòngbalance -= amount;
, làm giảm số dư của người dùng.
Tương táclà các cuộc gọi đến các hợp đồng/địa chỉ khác có thể kích hoạt một số mã không xác định (ví dụ: khi bạn call
gửi tiền, nó có thể kích hoạt một receive()
chức năng của hợp đồng thông minh gọi hàm của bạn).
Bởi vì bạn tuân theo quy tắc này trong mã này, nên không thể tái nhập cảnh.
Bạn có biết câu trả lời không?
Hãy đăng nhập và chia sẻ nó.
Solidity is an object-oriented, high-level language for implementing smart contracts. It is a curly-bracket language designed to target the Ethereum Virtual Machine (EVM).
- My ERC721 contract successfully deploys, but I can't verify the contract's source code with hardhat21
- Solidity và ethers.js Tính toán các địa chỉ khác nhau từ cùng một chữ ký21
- không thể hiểu các vị trí là gì (uint256)22
- Làm thế nào để đảo ngược keccak256 trong độ rắn22
- Làm rõ về hoàn tiền gas và so sánh giữa “yêu cầu” và “hoàn lại” trong hợp đồng thông minh21