比特幣行情 比特幣行情
Ctrl+D 比特幣行情
ads
首頁 > SOL > Info

GAS:停止使用 Solidity 的 transfer()

Author:

Time:1900/1/1 0:00:00

譯文出自:登鏈翻譯計劃

譯者:翻譯小組

校對:Tiny熊

由于EIP1884已經在伊斯坦布爾硬分叉實施,EIP1884增加了SLOAD操作的Gas成本,因此_破壞了一些現有的智能合約_。

這些合約將被破壞,因為它們的fallback函數以前消耗的Gas不到2300,而現在會消耗更多。為什么2300Gas這么重要?這是合約的fallback函數通過Solidity的transfer()或send()方法調用時可使用的Gas量。

剛才是簡化的描述,2300是Gas”津貼“,如果是非零的以太幣量轉賬,則Gas”津貼“明確傳遞給CALL。Solidity的transfer()將Gas參數設置為0,如果以太幣的轉賬量為非零。在加上gas”津貼“后,一共是2300。如果是零以太幣轉賬,Solidity明確地將Gas參數設置為2300,因此在兩種情況下都會是2300Gas。

自推出以來,transfer()通常被安全界推薦,因為它有助于防范重入攻擊。在Gas成本不會改變的假設下,這一指導意見是有意義的,但事實證明這一假設是不正確的。我們現在建議避免使用transfer()和send()。

Gas成本可以改變

EVM支持的每個操作碼都有相關的Gas成本。例如,SLOAD,從存儲中讀取一個字,在EIP1884中gas由200修改為800。

Gas費用不是隨意的。它們旨在反映組成以太坊的節點上每個操作所消耗的基本資源。

zkSync移動支付錢包Numio宣布將停止運營:金色財經報道,基于zkSync的移動支付錢包Numio在官方博客表示,由于無法成功籌集到繼續進行開發所需的資金,將關閉該項目并結束開發。

據悉,Numio是一個在GooglePlay上支持zkRollups的產品,用于即時和低費用轉賬,旨在讓人們能夠更好地控制他們的資金和數字身份,是首批支持在zkSync上進行本地交易的錢包之一。

2021年7月,該項目曾獲得HashKey Capital領投的125萬美元融資,LD Capital、Youbi Capital等參投。[2023/2/8 11:53:11]

來自EIP的動機部分。

操作的價格和資源消耗之間的不平衡有幾個缺點:

可能被用于攻擊,通過用低Gas操作填充區塊,導致區塊處理時間過長。

價格過低的操作碼會歪曲區塊Gas限制,有時區塊完成得很快,但其他Gas使用量相似的區塊完成得很慢。

如果操作定價更均衡,我們可以最大限度地提高塊Gas限制,并有一個更穩定的處理時間。

SLOAD歷來價格偏低,EIP1884糾正了這一問題。

智能合約不能依賴Gas成本

如果Gas成本是可以變化的,那么智能合約就不能依賴于任何特定的Gas成本。

任何使用transfer()或send()的智能合約,都是通過轉發固定數量的Gas來而產生2300Gas成本的硬性依賴。

因此建議停止在代碼中使用transfer()和send(),而改用call()。

美國加州監管機構命令MyConstant停止加密借貸服務:12月22日消息,由于涉嫌違反美國加利福尼亞州證券法和加州消費者金融保護法,加州金融保護與創新部 (DFPI) 已下令加密借貸平臺MyConstant停止提供一些加密相關產品并要求其關閉貸款經紀服務和計息加密資產賬戶。

此外,加州金融保護與創新部還指出MyConstant從事“無牌貸款經紀”業務,也沒有獲得在加州運營的許可。(Cointelegraph)[2022/12/22 22:00:53]

contractVulnerable{functionwithdraw(uint256amount)external{//Thisforwards2300gas,whichmaynotbeenoughiftherecipient//isacontractandgascostschange

}contractFixed{functionwithdraw(uint256amount)external{//Thisforwardsallavailablegas

}

除了轉發固定的2300Gas之外,這兩個合約是等價的。

關于重入攻擊怎么辦?

重入攻擊,希望是你看到上述代碼后的第一反應。引入transfer()和send()的全部原因是為了解決TheDAO上臭名昭著的黑客事件的原因。當時的想法是,2300Gas足夠觸發一個日志條目,但不足以進行再重入的調用來修改存儲狀態。

不過請記住,Gas成本是會變化的,這意味著無論如何這都不是解決再重入攻擊的好辦法。19年初,君士坦丁堡分叉被推遲,就是因為gas成本的降低,導致以前重入攻擊安全的代碼不再安全。

動態 | BTCP否認欺詐指控,要求交易所停止BTCP交易:據CCN報道,Bitcoin Private(BTCP)已經確認了昨日CoinMetrics有關有人憑空創造了200萬個BTCP代幣的指控,稱他們從“數學上看是準確的”,但否認了欺詐指控。開發團隊表示團隊中沒有人知道額外的代幣在哪里。CoinMetrics則表示,其中至少有30萬個已經通過交易所轉移。BTCP公司對這種情況進行了全面的審計,并確定了責任在于一個稱為airk42的開發人員,但不相信這名開發人員會利用他自己的錯誤。相反,他們認為一個身份不明的人在建立BTCP區塊鏈期間利用了這個漏洞。根據有關情況的官方聲明,BTCP要求所有交易所立即停止BTCP的存款和取款。[2018/12/26]

如果我們不打算再使用transfer()和send(),我們就必須用更強大的方式來防止重入。幸運的是,這個問題有很好的解決辦法。

檢查-生效-交互模式

消除重入性bug最簡單的方法是使用檢查-生效-交互(checks-effects-interactions)。這是一個典型的重入bug的例子:

contractVulnerable{..

}

如果msg.sender是一個智能合約,它在第6行有機會在第7行發生之前再次調用withdraw()。在那第二次調用中,balanceOf還是原來的金額,所以會再次轉賬。這可以根據需要重復多次,以耗盡智能合約。

檢查-生效-交互模式的想法是確保你所有的交互都發生在最后。上述代碼的典型修復方法如下:

分析 | BTC大額轉賬數量停止增長趨勢 鏈上活躍度有所降低:根據Searchain.io數據分析:昨日BTC圍繞4300點小幅震蕩。昨日反映內部BTC價值的基礎指標新增地址較前日略有增長。從鏈上交易指標來看,交易用戶的活躍度有所下降,交易所流入下降20.06%,流出下降28.28%,成交量下降13.79%;大額流入率上漲44.08%,大額流出率下降15.79%,大額轉賬數量暫時停止上漲趨勢,下降8.15%。綜合基礎指標和交易指標來看,近期BTC內部價值沒有明顯增加,鏈上活躍度也沒有因為近兩日的行情上漲同時增加。總體而言,BTC行情雖有所上漲,但其內部價值和上漲動力沒有持續增加。獨立分析師Edward對近期BTC市場呈較為悲觀狀態。[2018/11/30]

1contractFixed{2...34functionwithdraw()external{5uint256amount=balanceOf;6balanceOf=0;7(boolsuccess,)=msg.sender.call.value(amount)("");8require(success,"Transferfailed.");9}10}

請注意,在這段代碼中,余額在轉賬之前就被清零了,所以試圖對withdraw()進行重入調用對攻擊者來說沒有收益。

使用重入防護

另一種防止重入的方法是明確地檢查和拒絕這種調用。下面是一個簡單版的重入防護,大家可以看看思路:

1contractGuarded{2...34boollocked=false;56functionwithdraw()external{7require(!locked,"Reentrantcalldetected!");8locked=true;9...10locked=false;11}12}

動態 | 今日ETH大額轉賬轉出賬戶為9月宣布停止運營的Cofound.it:據searchain數據顯示, 北京時間19:29:23,Cofound.it向0xe24e9942863b3d4a359363cccf18e85cf5eb2fc2地址轉入約5001枚ETH。此前消息,眾包風險投資公司Cofound.it于9月14日決定停止運營并分配其資產。[2018/10/10]

在這段代碼中,如果嘗試重入調用,第7行的require將拒絕它,因為lock仍然被設置為true。

在OpenZeppelin的ReentrancyGuard合約中可以找到一個更復雜、更節省gas的版本。如果你繼承了ReentrancyGuard,你只需要用nonReentrant來修飾函數,防止重入。

請注意,這個方法只應該用于保護重入,如果你明確地將其應用于所有正確的函數。由于需要在儲存中保持一個值,它也會增加Gas成本。

Vyper語言有出現這個情況嗎?

Vyper的send()函數與Solidity的transfer()一樣使用硬編碼Gas”津貼“,所以也要避免使用。你可以使用raw_call代替。

Vyper內置了一個@nonreentrant()修飾器,其工作原理類似于OpenZeppelin的ReentrancyGuard。

總結

在Gas成本不變的假設下,推薦transfer()是有道理的。

但Gas成本不是不變的。智能合約應該有力地應對這一事實。

Solidity的transfer()和send()使用一個硬編碼的Gas成本。

這些方法應避免使用。使用.call.value(...)("")代替。

這就存在著重入的風險。一定要使用現有的一種強大的方法來防止重入漏洞。

Vyper的send()也有同樣的問題。

本翻譯由CellNetwork贊助支持。

來源:https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/

參考資料

登鏈翻譯計劃:https://github.com/lbc-team/Pioneer

翻譯小組:https://learnblockchain.cn/people/412

Tiny熊:https://learnblockchain.cn/people/15

EIP1884:https://learnblockchain.cn/docs/eips/eip-1884.html

伊斯坦布爾硬分叉:https://learnblockchain.cn/2019/11/21/istanbul-update

EIP1884:https://learnblockchain.cn/docs/eips/eip-1884.html

破壞了一些現有的智能合約:https://docs.google.com/presentation/d/1IiRYSjwle02zQUmWId06Bss8GrxGyw6nQAiZdCRFEPk/edit

fallback函數:https://learnblockchain.cn/docs/solidity/contracts.html#fallback

Solidity的transfer()或send()方法:https://solidity.readthedocs.io/en/v0.5.11/units-and-global-variables.html#members-of-address-types

動機部分:https://eips.ethereum.org/EIPS/eip-1884#motivation

重入攻擊:https://learnblockchain.cn/docs/solidity/security-considerations.html#re-entance

TheDAO:https://learnblockchain.cn/2019/04/07/dao

君士坦丁堡分叉被推遲:https://blog.ethereum.org/2019/01/15/security-alert-ethereum-constantinople-postponement/

檢查-生效-交互(checks-effects-interactions):https://learnblockchain.cn/docs/solidity/security-considerations.html#checks-effects-interactions

OpenZeppelin的ReentrancyGuard:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol

Vyper的send()函數:https://vyper.readthedocs.io/en/v0.1.0-beta.12/built-in-functions.html#send

raw_call:https://vyper.readthedocs.io/en/v0.1.0-beta.10/built-in-functions.html#raw-call

@nonreentrant()修飾器:https://vyper.readthedocs.io/en/v0.1.0-beta.12/structure-of-a-contract.html#decorators

CellNetwork:https://www.cellnetwork.io/?utm_souce=learnblockchain

免責聲明:作為區塊鏈信息平臺,本站所發布文章僅代表作者個人觀點,與鏈聞ChainNews立場無關。文章內的信息、意見等均僅供參考,并非作為或被視為實際投資建議。

本文來源于非小號媒體平臺:

登鏈社區

現已在非小號資訊平臺發布105篇作品,

非小號開放平臺歡迎幣圈作者入駐

入駐指南:

/apply_guide/

本文網址:

/news/9729855.html

免責聲明:

1.資訊內容不構成投資建議,投資者應獨立決策并自行承擔風險

2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表非小號的觀點或立場

上一篇:

盤點零知識證明代表性項目:如何影響和塑造區塊鏈生態系統?

Tags:GASTRARANHTTPegasCoinDecentral Games [new]3X Long Algorand Tokenhtt幣價格今日行情

SOL
比特幣:在這一輪大洗牌中,波卡生態值得期待,它將會是3月熱點

在這一輪大洗牌中,波卡系表現不錯2021年2月22日和23號,對于幣圈的人來講真是心驚肉跳,即使到今天,整個大盤依舊很不穩,很多喊單的大V在這種的行情下也都閉嘴了,半夏木直接宣布合約暫停營業了.

1900/1/1 0:00:00
比特幣:Galaxy Digital聯席總裁:安全性考慮和稅收阻礙機構投資加密貨幣

編者按:本文來自?Cointelegraph中文,Odaily星球日報經授權轉載。最近幾個月,MicroStrategy和特斯拉等公司已經積累了大量比特幣頭寸.

1900/1/1 0:00:00
區塊鏈:內蒙古擬清退加密貨幣挖礦 碳中和承諾對礦業影響幾何?

吳說作者|ColinWu本期編輯|ColinWu內蒙古打擊挖礦“又又又來了”,但因為“碳中和”的大背景與承諾,這次可能真的不一樣.

1900/1/1 0:00:00
AEX:開放DOGE-BTC、XRP-BTC和AE-BTC流動池挖礦獎勵的公告

親愛的安銀小伙伴, ASwap流動池將于2021年03月02日17:00開放DOGE-BTC、XRP-BTC和AE-BTC挖礦獎勵流動池.

1900/1/1 0:00:00
USD:時時解幣:2.28比特幣多頭發力,以太坊多軍崛起?

成長的路上不太平,看護成才,恣生成柴。學會了止損,就是懂得了敬畏,這是交易者最基本的素質。成長是價格觀的摧毀,而禮貌是基本的素養,不要妄圖別人對你的熱忱,一定學會對他人的相迎,太多的人總想著為什.

1900/1/1 0:00:00
AAB:[2021年3月1日] AAX 3月期貨合約交易大賽,分享高達200,000 USDT

尊敬的AAX用戶: AAX豪擲大禮200,000USDT!ToDaMoon你準備好了嗎?趕快報名參與AAX3月合約交易大賽!交易并分享USDT獎池,參與者人數越多,獎金金額越大.

1900/1/1 0:00:00
ads