Solidity.

Bài viết

Chia sẻ kiến thức của bạn.

Serpent0x.
May 31, 2024
Thảo Luậ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
0
1
Chia sẻ
Bình luận
.

Câu trả lời

1
0x0304...a958.
Aug 11 2024, 15:15

Mộ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 callgử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.

0
Bình luận
.

Bạn có biết câu trả lời không?

Hãy đăng nhập và chia sẻ nó.

Chúng tôi sử dụng cookie để đảm bảo bạn có trải nghiệm tốt nhất trên trang web của chúng tôi.
Thêm thông tin