譯文出自:登鏈翻譯計劃
譯者:翻譯小組
校對: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費用不是隨意的。它們旨在反映組成以太坊的節點上每個操作所消耗的基本資源。
SoFi:有“被迫停止某些類型資產交易”的可能性:金色財經報道,SoFi對美國安全交易委員會對數字資產的審查變得越來越謹慎。該公司甚至提到了“被迫停止某些類型資產交易”的可能性。SoFi概述了隨著美國證券交易委員會考慮對加密貨幣公司采取一系列更嚴格的措施而出現的一些關鍵風險,包括要求公司對其客戶擁有的數字資產進行內部托管。與許多銀行和準銀行競爭對手一樣,SoFi在周二向SEC提交的8-K季報中闡述了其監管擔憂。[2023/8/11 16:19:35]
來自EIP的動機部分。
操作的價格和資源消耗之間的不平衡有幾個缺點:
可能被用于攻擊,通過用低Gas操作填充區塊,導致區塊處理時間過長。
價格過低的操作碼會歪曲區塊Gas限制,有時區塊完成得很快,但其他Gas使用量相似的區塊完成得很慢。
如果操作定價更均衡,我們可以最大限度地提高塊Gas限制,并有一個更穩定的處理時間。
SLOAD歷來價格偏低,EIP1884糾正了這一問題。
智能合約不能依賴Gas成本
如果Gas成本是可以變化的,那么智能合約就不能依賴于任何特定的Gas成本。
任何使用transfer()或send()的智能合約,都是通過轉發固定數量的Gas來而產生2300Gas成本的硬性依賴。
因此建議停止在代碼中使用transfer()和send(),而改用call()。
contractVulnerable{functionwithdraw(uint256amount)external{//Thisforwards2300gas,whichmaynotbeenoughiftherecipient//isacontractandgascostschange
Spartan Capital聯合創始人:已停止對DAO投資,因利用DAO逃避法律問責的情況盛行:7月22日消息,Spartan Capital聯合創始人兼合伙人Kelvin Koh轉發了一條MakerDAO天使投資人Hasu的推文,并配文稱,“我已經停止對DAO的投資,因為越來越多的創始人利用DAO的結構來逃避法律問責。”MakerDAO天使投資人Hasu在推文中表示,“緩慢但堅定地說服自己,在發生重大變化之前,DAO是不可投資的。”[2022/7/22 2:30:24]
}contractFixed{functionwithdraw(uint256amount)external{//Thisforwardsallavailablegas
}
除了轉發固定的2300Gas之外,這兩個合約是等價的。
關于重入攻擊怎么辦?
重入攻擊,希望是你看到上述代碼后的第一反應。引入transfer()和send()的全部原因是為了解決TheDAO上臭名昭著的黑客事件的原因。當時的想法是,2300Gas足夠觸發一個日志條目,但不足以進行再重入的調用來修改存儲狀態。
不過請記住,Gas成本是會變化的,這意味著無論如何這都不是解決再重入攻擊的好辦法。19年初,君士坦丁堡分叉被推遲,就是因為gas成本的降低,導致以前重入攻擊安全的代碼不再安全。
如果我們不打算再使用transfer()和send(),我們就必須用更強大的方式來防止重入。幸運的是,這個問題有很好的解決辦法。
動態 | 推特網友發出請愿書希望Ripple停止向市場傾銷XRP:一位名為crypto Bitlord的加密愛好者最近在Twitter上創建了一份請愿書,希望Ripple停止向市場推出新的XRP。他的論點是,如果Ripple停止供應新的XRP,這將使XRP的價格上漲。請愿書指出,Ripple不斷向市場傾銷數十億XRP,導致了XRP的價格暴跌。這份請愿書得到了XRP社區的大量支持。這份請愿書創建于2019年8月5日,并通過擁有超過10.2萬粉絲的Crypto Bitlord賬戶發布到Twitter上。到目前為止,請愿書已經收到了超過1000個簽名。[2019/8/10]
檢查-生效-交互模式
消除重入性bug最簡單的方法是使用檢查-生效-交互(checks-effects-interactions)。這是一個典型的重入bug的例子:
contractVulnerable{..
}
如果msg.sender是一個智能合約,它在第6行有機會在第7行發生之前再次調用withdraw()。在那第二次調用中,balanceOf還是原來的金額,所以會再次轉賬。這可以根據需要重復多次,以耗盡智能合約。
檢查-生效-交互模式的想法是確保你所有的交互都發生在最后。上述代碼的典型修復方法如下:
1contractFixed{2...34functionwithdraw()external{5uint256amount=balanceOf;6balanceOf=0;7(boolsuccess,)=msg.sender.call.value(amount)("");8require(success,"Transferfailed.");9}10}
金色財經 | 白俄羅斯將使用核電力進行挖礦 幣安已停止BCHSV交易:1.普京地區政策顧問建議克里米亞采用數字貨幣。
2.白俄羅斯或將成為第一個使用核電力進行挖礦的國家。
3.中央財經大學鄧建鵬:區塊鏈應及時推進國際監管協作。
4.日本已制定加密貨幣監管提案等相關手冊 將提交給G20領導人。
5.三菱旗下子公司停止新系統開發 將以區塊鏈結算網絡為基礎重新思考戰略。
6.Bittrex:紐約金融服務部指出的朝鮮賬戶實際來自韓國。
7.CFTC主席:Bakkt保管比特幣的方式或成為其獲批阻礙。
8.幣安上的BCHSV交易已經停止 用戶可在7月22日18:00前提現。
9.阿富汗準備利用比特幣債券籌集58億美元。[2019/4/23]
請注意,在這段代碼中,余額在轉賬之前就被清零了,所以試圖對withdraw()進行重入調用對攻擊者來說沒有收益。
使用重入防護
另一種防止重入的方法是明確地檢查和拒絕這種調用。下面是一個簡單版的重入防護,大家可以看看思路:
1contractGuarded{2...34boollocked=false;56functionwithdraw()external{7require(!locked,"Reentrantcalldetected!");8locked=true;9...10locked=false;11}12}
在這段代碼中,如果嘗試重入調用,第7行的require將拒絕它,因為lock仍然被設置為true。
在OpenZeppelin的ReentrancyGuard合約中可以找到一個更復雜、更節省gas的版本。如果你繼承了ReentrancyGuard,你只需要用nonReentrant來修飾函數,防止重入。
動態 | Bithumb價格和交易量出現異常 Coinmarketcap已停止收錄部分交易數據:韓國主要交易所之一Bithumb的NEM、SNT等虛擬貨幣的交易價格和交易量近日出現異常。在Coinmarketcap上,NEM全球均價為0.1654美元,而Bithumb報價為0.3062美元,約為全球均價的1.85倍,24小時交易額約為1531萬美元,相當于目前排名第一交易所Zaif 464萬美元交易額的3.3倍。同樣,SNT現全球均價約為0.0698美元,Bithumb報價約為0.2658美元,高出全球均價的3.8倍,24小時交易額也遠高出目前排名第一的Upbit。Coinmarketcap網站顯示出,因Bithumb交易量出現異常,已停止收錄其部分交易數據,其中包括BTC,ETH,XRP等主流貨幣。[2018/7/11]
請注意,這個方法只應該用于保護重入,如果你明確地將其應用于所有正確的函數。由于需要在儲存中保持一個值,它也會增加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:GASTRARANHTTgas幣一分鐘暴漲5600倍Global Trading XenocurrencyEvident Proof Transaction Tokenhtt幣價格今日行情
原文標題:《KIRA&NFTsStaking》原文來源:KIRANetwork??2月26日,KIRANetwork發文探索NFT概念、支出池、代幣籃.
1900/1/1 0:00:00尊敬的LBank用戶: 應項目方要求,LBank已于今日暫停BAS持幣生息,今日產生的收益將于今日完成發放.
1900/1/1 0:00:00近期,以NBATopShot為代表的加密收藏品掀起了一波NFT熱潮。這款由DapperLabs公司與NBA合作推出的基于區塊鏈的NBA數字收藏卡片,在短短一個月內,銷售量實現了從3千萬美元到2.
1900/1/1 0:00:00由于ADA硬分叉升級,HomiEx現已暫停ADA的充值和提現。HomiEx將在ADA硬分叉升級完畢后恢復充提業務,具體時間將以公告另行通知.
1900/1/1 0:00:00尊敬的用戶: 幣虎創新區將于2021年3月1日18:00上線TIGER/USDT交易對,具體時間如下:1.開放充幣:2021年3月1日14:00;2.開放交易:2021年3月1日18:00;3.
1900/1/1 0:00:00尊敬的用戶: Hotbit即將在開啟DUCKDAO(DuckDaoDime)數字資產服務,并開放DUCKDAO理財產品。預計年化收益:10%;計息:T1.
1900/1/1 0:00:00