市值: $2.796T -1.10%
體積(24小時): $128.341B -31.92%
恐懼與貪婪指數:

28 - 害怕

  • 市值: $2.796T -1.10%
  • 體積(24小時): $128.341B -31.92%
  • 恐懼與貪婪指數:
  • 市值: $2.796T -1.10%
加密
主題
加密植物
資訊
加密術
影片
頂級加密植物

選擇語言

選擇語言

選擇貨幣

加密
主題
加密植物
資訊
加密術
影片

Solidity 中的付費函數和非付費函數有什麼區別?

In Solidity, only functions marked `payable` can receive Ether, preventing accidental or malicious fund transfers and ensuring secure contract design.

2025/11/14 13:59

了解 Solidity 中的函數修飾符

在 Solidity 中,可以為智能合約中的函數分配特定的修飾符,以決定它們如何與 Ether 交互。這些修飾符在確定函數在執行期間是否可以收到資金方面發揮著至關重要的作用。付費函數和非付費函數之間的區別在於它們接受以太幣作為交易一部分的能力。

應付功能:接受以太幣轉賬

1. payable 函數顯式地標記有payable修飾符,允許它在調用時接收 Ether。

  1. 當用戶發送以太幣以及調用應付函數的交易時,資金將被轉移到合約的餘額中。
  2. 如果沒有 payable 修飾符,嘗試將 Ether 發送到函數會導致交易失敗。
  3. Payable 函數對於眾籌、捐贈或用戶通過函數調用直接貢獻資金的任何機制至關重要。
  4. 在應付函數中,開發人員可以使用msg.value訪問發送的金額,其中包含收到的 wei 數量。

不可支付功能:拒絕傳入以太幣

1. 默認情況下,Solidity 中的函數是免付費的,除非另有說明。

  1. 如果交易嘗試將以太幣發送到非支付功能,則整個交易將被還原以防止意外的資金損失。
  2. 這種行為可以保護用戶和合約邏輯免受意外的以太傳輸的影響。
  3. 非付費函數適用於僅修改狀態或讀取數據而不需要財務投入的操作。
  4. 即使函數不需要 Ether,如果未標記為應付,使用msg.value > 0調用它也會導致運行時異常。

智能合約設計的實際意義

1. 當某個功能應該接受資金時,將其錯誤地標記為不可支付可能會破壞核心功能,例如代幣購買或質押機制。

  1. 相反,將不必要的函數標記為應付會增加攻擊面,特別是在缺少圍繞msg.value 的適當驗證的情況下。
  2. 開發人員必須仔細審核所有面向外部的功能,以確保正確處理以太流。
  3. 靜態分析器和測試框架等工具有助於在部署之前檢測應付修飾符的錯誤使用。
  4. 在復雜的合約中,區分資金接收函數和實用函數可以提高代碼的清晰度和安全性。

常見問題解答

建造師可以付費嗎?是的,構造函數可以標記為應付。這允許合約在部署期間接受以太幣。如果部署交易包含價值轉移,則必須向構造函數付費以避免恢復。

如果我用以太幣調用非付費函數會發生什麼?事務將自動恢復,並且不會發生狀態更改。以太坊在 EVM 級別強制執行此規則,以防止意外將以太幣傳輸到未設計用於處理它們的函數。

有沒有辦法讓合約中的所有功能都默認支付?不可以,每個功能必須單獨聲明為應付功能。沒有全局設置可以讓每個函數都接受以太幣。這種設計確保了資金接收的有意和安全處理。

如果不支付,後備函數可以接收以太幣嗎?不,即使是後備函數也必須標記為應付以接受以太幣。不可支付的回退函數將拒絕發送到合約的任何傳入以太幣,而不指定函數調用。

免責聲明:info@kdj.com

所提供的資訊並非交易建議。 kDJ.com對任何基於本文提供的資訊進行的投資不承擔任何責任。加密貨幣波動性較大,建議您充分研究後謹慎投資!

如果您認為本網站使用的內容侵犯了您的版權,請立即聯絡我們(info@kdj.com),我們將及時刪除。

相關知識

如何使用LayerZero合約執行跨鏈消息?

如何使用LayerZero合約執行跨鏈消息?

2026-01-18 13:19:39

了解 LayerZero 架構1. LayerZero 作為一種輕量級、無需許可的互操作性協議運行,無需依賴可信中介或包裝資產即可實現區塊鏈之間的通信。 2. 它利用部署在每條鏈上的超輕節點(ULN)來驗證消息的完整性和一致性,而無需存儲完整的區塊鏈狀態。 3. 核心組件包括處理消息路由的 Endp...

如何實施EIP-712進行安全簽名驗證?

如何實施EIP-712進行安全簽名驗證?

2026-01-20 22:20:26

EIP-712 概述和核心目的1. EIP-712 定義了以太坊應用程序中類型化結構化數據哈希和簽名的標準。 2. 它使錢包能夠在簽名請求期間顯示人類可讀的域和消息字段,而不是原始的十六進製字符串。 3. 該規範通過域分隔符哈希引入域分離,防止跨不同 dApp 或鏈的簽名重放。 4. 每個簽名的有效...

如何通過新合約交互獲得空投資格?

如何通過新合約交互獲得空投資格?

2026-01-24 21:00:23

了解合約交互要求1. 大多數空投活動都要求與部署在受支持的區塊鏈(例如以太坊、Arbitrum 或 Base)上的智能合約進行直接交互。 2. 交互通常涉及使用連接到 dApp 接口的錢包執行諸如approve() 、 stake()或mint()之類的函數。 3. 某些協議需要多種交易類型,例如將...

如何監控智能合約的安全警報?

如何監控智能合約的安全警報?

2026-01-21 07:59:57

鏈上監控工具1. Etherscan和Blockscout等區塊鏈瀏覽器允許實時檢查合約字節碼、交易日誌和內部調用。 2. 在信任任何鏈上數據之前必須確認合約驗證狀態——未經驗證的合約存在高風險。 3. 事件日誌解析可以檢測異常狀態變化,例如意外的代幣轉移或所有權修改。 4. 可以針對特定事件簽名設...

如何建立自動支付合同並為其提供資金?

如何建立自動支付合同並為其提供資金?

2026-01-26 08:59:35

了解智能合約部署1. 開發者必鬚根據gas效率和安全性要求選擇兼容的區塊鏈平台,例如以太坊、Polygon或Arbitrum。 2. Solidity 仍然是編寫支付自動化邏輯的主要語言,特別是對於定期或有條件的轉賬。 3. 在主網部署之前,使用 Hardhat 或 Foundry 等本地開發環境來...

如何使用 OpenZeppelin 合約構建安全的 dApp?

如何使用 OpenZeppelin 合約構建安全的 dApp?

2026-01-18 11:19:49

了解 OpenZeppelin 合約基礎知識1. OpenZeppelin Contracts 是一個可重用、經過社區審核的智能合約組件庫,專為以太坊和 EVM 兼容的區塊鏈而構建。 2. 庫中的每個合約都遵循嚴格的安全實踐,包括遵守“檢查-效果-交互”模式以及廣泛使用訪問控制修飾符。 3. 該庫提...

如何使用LayerZero合約執行跨鏈消息?

如何使用LayerZero合約執行跨鏈消息?

2026-01-18 13:19:39

了解 LayerZero 架構1. LayerZero 作為一種輕量級、無需許可的互操作性協議運行,無需依賴可信中介或包裝資產即可實現區塊鏈之間的通信。 2. 它利用部署在每條鏈上的超輕節點(ULN)來驗證消息的完整性和一致性,而無需存儲完整的區塊鏈狀態。 3. 核心組件包括處理消息路由的 Endp...

如何實施EIP-712進行安全簽名驗證?

如何實施EIP-712進行安全簽名驗證?

2026-01-20 22:20:26

EIP-712 概述和核心目的1. EIP-712 定義了以太坊應用程序中類型化結構化數據哈希和簽名的標準。 2. 它使錢包能夠在簽名請求期間顯示人類可讀的域和消息字段,而不是原始的十六進製字符串。 3. 該規範通過域分隔符哈希引入域分離,防止跨不同 dApp 或鏈的簽名重放。 4. 每個簽名的有效...

如何通過新合約交互獲得空投資格?

如何通過新合約交互獲得空投資格?

2026-01-24 21:00:23

了解合約交互要求1. 大多數空投活動都要求與部署在受支持的區塊鏈(例如以太坊、Arbitrum 或 Base)上的智能合約進行直接交互。 2. 交互通常涉及使用連接到 dApp 接口的錢包執行諸如approve() 、 stake()或mint()之類的函數。 3. 某些協議需要多種交易類型,例如將...

如何監控智能合約的安全警報?

如何監控智能合約的安全警報?

2026-01-21 07:59:57

鏈上監控工具1. Etherscan和Blockscout等區塊鏈瀏覽器允許實時檢查合約字節碼、交易日誌和內部調用。 2. 在信任任何鏈上數據之前必須確認合約驗證狀態——未經驗證的合約存在高風險。 3. 事件日誌解析可以檢測異常狀態變化,例如意外的代幣轉移或所有權修改。 4. 可以針對特定事件簽名設...

如何建立自動支付合同並為其提供資金?

如何建立自動支付合同並為其提供資金?

2026-01-26 08:59:35

了解智能合約部署1. 開發者必鬚根據gas效率和安全性要求選擇兼容的區塊鏈平台,例如以太坊、Polygon或Arbitrum。 2. Solidity 仍然是編寫支付自動化邏輯的主要語言,特別是對於定期或有條件的轉賬。 3. 在主網部署之前,使用 Hardhat 或 Foundry 等本地開發環境來...

如何使用 OpenZeppelin 合約構建安全的 dApp?

如何使用 OpenZeppelin 合約構建安全的 dApp?

2026-01-18 11:19:49

了解 OpenZeppelin 合約基礎知識1. OpenZeppelin Contracts 是一個可重用、經過社區審核的智能合約組件庫,專為以太坊和 EVM 兼容的區塊鏈而構建。 2. 庫中的每個合約都遵循嚴格的安全實踐,包括遵守“檢查-效果-交互”模式以及廣泛使用訪問控制修飾符。 3. 該庫提...

看所有文章

User not found or password invalid

Your input is correct