Solidity

使用 .call():相互矛盾的建議

  • November 27, 2021

堅固性文件

You should avoid using .call() whenever possible when executing another contract function as it bypasses type checking, function existence check, and argument packing.

乙太坊智能合約最佳實踐

It's recommended to stop using .transfer() and .send() and instead use .call().

對哪種方法最好有共識嗎?

建議在不同的情況下:

  • Solidity 開發人員建議不要.call()在從合約中呼叫函式時使用。

在執行另一個合約函式時,您應該盡可能避免使用 .call(),因為它會繞過類型檢查、函式存在性檢查和參數打包。

在這種情況下,您應該在呼叫另一個合約時使用介面。因此編譯器可以檢查並生成正確的呼叫。

  • Consensys 指南是在 Ether 轉移的背景下進行的

.transfer()並將.send()準確的 2,300 氣體轉發給接收者。

$$ … $$ 建議停止使用.transfer()and.send()而使用.call().

他們還指出,您應該意識到您將不得不考慮重入攻擊。

請注意,.call()這對減輕重入攻擊沒有任何作用,因此必須採取其他預防措施。

沒有完美的替代方案可以.transfer()防止重入攻擊。

這些並不矛盾,你只需要仔細閱讀。

建議停止使用 .transfer() 和 .send(),而使用 .call()。

所以,使用.call()代替.transfer()and .send()

在執行另一個合約函式時,您應該盡可能避免使用 .call(),因為它會繞過類型檢查、函式存在性檢查和參數打包。

所以,如果可以避免的話,不要.call()用於執行另一個合約功能

基本上,.call()這是匯款的最佳方式,也是呼叫另一個合約函式的最差方式,除非它是呼叫另一個合約函式的唯一方式。

沒有矛盾。:)

引用自:https://ethereum.stackexchange.com/questions/79979