鏈聞ChainNews:
Solidity是以太坊上最主流的函數修改器。本篇文章從技術角度展示了如何針對異常情況在代碼層面進行詳細分析,最后總結出異常情況最易出現的一些場景,并給出相對應的建議。
來源|矩陣數字經濟智庫作者|閆鶯等
函數修改器
Solidity提供了一個函數修改器的特性。函數修改器與Python中的裝飾器類似,可以在一定程度上改變函數的行為,比如可以自動在函數執行前檢查參數是否合法。函數修改器是可以被繼承的,同時可以被派生類覆蓋重寫。
下面代碼展示了如何聲明并使用函數修改器。
contractowned{functionowned(){owner=msg
以太坊L2網絡總鎖倉量為52.3億美元:金色財經報道,L2BEAT數據顯示,截至5月11日,以太坊Layer2上總鎖倉量為52.3億美元。其中鎖倉量最高的為擴容方案Arbitrum,約29.2億美元,占比55.78%。其次是dYdX,鎖倉量9.96億美元,占比19.04%。Optimism占據第三,鎖倉量5.24億美元,占比10.03%。[2022/5/11 3:08:16]
addressowner;//這個合約定義了一個在派生合約中使用的函數修改器//";"指代被修改函數的函數體。//當這個函數執行前,先檢查msg
}contractContractisowned{//從owned合約繼承了onlyOwner函數修改器并且將其作用于close函數//確保了這個函數只有在調用者為合約創建者時才會生效functionclose()onlyOwner{selfdestruct(owner);}}
以太坊開發者:ETH 2.0下一步是升級和節點分布多樣化:2月11日消息,以太坊基金會研究員及開發者Danny Ryan在播客節目中表示,12月初活ETH 2.0主網成功激不是驚喜而是解脫。很有信心且看到主網發展順利非常棒。與我們發布的一些測試網相比,信標鏈變得越來越好,主網的推出比任何一個都要成功。與此同時,Danny Ryan表示,在接下來的幾個月里,他希望在Eth 2.0上看到一些修正、調整和改進。經過今年年中的升級,驗證節點用于連接到網絡的軟件客戶端的分布將會更加多樣化。看起來網絡上50%的節點都是Prysm,這并不是我們想要的結果,而當前以太坊2.0已經有四個非常棒的客戶端。注:Danny Ryan提到的升級是指此前1月27日公布的ETH2.0預計將于年中進行一次小規模網絡升級。(CoinDesk)[2021/2/11 19:32:56]
下面代碼進一步展示了函數修改器是如何接收參數的,函數修改器的參數可以是上下文中存在的任意變量組成的表達式。
以太坊擴容團隊計劃為以太坊式智能合約提供全面支持:以太坊擴容團隊FuelLabs計劃在2021年下半年為以太坊式智能合約提供全面支持。另外,Fuel還發布v1.5預覽頁面,將實現無托管原子交換、擴展消費者硬件和支持所有ERC20代幣,且無新穎的密碼學和協議代幣。另外,每秒交易量將可達到4300TPS,每筆交易的gas費用約為384Gwei。[2020/11/10 12:10:40]
contractpriced{//函數修改器可以接收參數modifiercosts(uintprice){if(msg
}}contractRegisterispriced,owned{mapping(address=>bool)registeredAddresses;uintprice;functionRegister(uintinitialPrice){price=initialPrice;}//這里需要payable修飾詞,否則無法通過該方法轉賬以太幣//函數修飾器costs接收參數price//使用costs修飾器確保registe函數在msg
以太坊日交易量再創新高,鏈上活躍度大幅回升:Tokenview數據顯示,以太坊近24小時內鏈上交易額為675.3萬ETH,約為25.96億美元,同比24小時前上升54.28%,近24小時內鏈上交易量為138.2萬筆,同比24小時前上升24.73%,昨日ETH活躍地址數為58.9萬個,較前日上升23.25%,較近7日日均活躍地址數上升20.2%;新增地址數為10.91萬個,較前日下降5.47%,較近7日日均新增地址數下降3.72%。截止下午14時,以太坊全網算力約為249.86 TH/S,建議Gas費用為330 Gwei,未確認交易數約為11.9萬筆。[2020/9/18]
functionchangePrice(uint_price)onlyOwner{price=price;}}
SEC正討論是否將以太坊歸為證券:據紐約時報報道,第二大加密貨幣以太坊也在SEC加密貨幣豁免情況的討論范圍內。根據該報道,風險投資工作組的提案認為,以太坊“已經變得非常分散,不應該被視為一種證券”,盡管它在美國法律下具有許多證券的標志。[2018/4/23]
下面的例子展示了如何使用函數修改器實現一個重入鎖機制。
contractMutex{boollocked;modifiernoReentrancy(){require(!locked);locked=true;;locked=false;}//這個函數使用了noReentrancy修改器,這保證了在f函數內部無法再次調用f函數//在執行return7時也執行了函數修改器中的locked=false語句functionf()noReentrancyreturns(uint){require(msg
}異常處理以太坊使用狀態回退機制處理異常。如果發生了異常,當前消息調用和子消息調用產生的所有狀態變化都將被撤銷并且返回調用者一個報錯信號。Solidity語言提供了兩個方便的函數assert和require來檢查條件,并且當條件不滿足的時候拋出一個異常。assert函數通常用于檢查變量和內部錯誤,require函數用于確保程序執行的必要條件是成立的。一個正常運行的程序不應該遇到assert和require失敗,否則程序代碼中一定存在需要修復的問題。revert函數和throw關鍵詞會標識發生了錯誤并且回退當前的消息調用產生的狀態改變。當前調用收到子消息調用產生的異常時會自動拋出,所以異常會一層層上浮直到最上層的根調用,代碼會立刻終止執行并回退狀態改變。但是,
}
一個assert類型的異常會在下述場景拋出:
訪問數組越界,下標為負數或者超出長度。訪問固定長度的bytesN越界,下標為負數或者超出長度。對0做除法或者對0取模,比如5/0,5%0。移位操作使用了一個負數做操作數。轉換一個特別大的數或者負數到枚舉類型變量。使用移位操作時給一個負數值。使用枚舉時將過大值或賦值轉為枚舉類型變量。調用assert函數并且參數值為false。一個require類型的異常會在下述場景拋出:
調用throw。調用require并且參數值為false。發起一個消息調用,但是這個調用沒有正常完成,比如Gas耗盡、被調用函數不存在或者函數本身拋出一個異常。使用new創建一個合約,但是和3中提到的原因一樣構造函數沒有正常完成。調用外部函數時指向一個不包含代碼的地址。合約通過一個沒有payable修辭詞的函數接收以太幣,包括構造函數和fallback函數。合約通過一個公開的訪問函數接收以太幣。.transfer()失敗。在require類型的異常發生時會執行回退操作,對于一個assert類型的異常執行一個無效操作。在這兩種情況下,以太坊虛擬機都會撤銷所有的狀態改變。這樣做是因為發生了意料之外的情況,交易無法安全執行下去,為了保證交易的原子性,最安全的操作就是撤銷該交易對狀態造成的影響。
在編寫合約代碼時,我們需要合理使用assert和require來保證代碼能夠按我們預期的設計進行。
更多精彩內容,關注鏈聞ChainNews公眾號,或者來微博**@鏈聞ChainNews**與我們互動!轉載請注明版權和原文鏈接!
來源鏈接:mp.weixin.qq.com
本文來源于非小號媒體平臺:
鏈聞研究院
現已在非小號資訊平臺發布1篇作品,
非小號開放平臺歡迎幣圈作者入駐
入駐指南:
/apply_guide/
本文網址:
/news/3626956.html
以太坊ETH
免責聲明:
1.資訊內容不構成投資建議,投資者應獨立決策并自行承擔風險
2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表非小號的觀點或立場
上一篇:
文摘|Schnorr簽名:比特幣的最新升級
據報道,巴西政府已向國家的頂級加密貨幣交易所發出調查,試圖了解其業務并研究其在洗錢方面的潛在用途.
1900/1/1 0:00:00作為新一代顛覆性應用,區塊鏈技術已成為當下最火熱的話題,全球競相發展區塊鏈技術,可謂當之無愧的2018技術圈關鍵詞之首.
1900/1/1 0:00:00秋生夏長,璀璨星洲,時隔一年之際,達瓴智庫將再次啟動區塊鏈年度創新力50強評選活動。回顧初心,達瓴聯合聯合中歐創業營龔焱教授推動該榜單的目的在于:1.致敬“MITSmart50”,階段性展示從業.
1900/1/1 0:00:00WICC上線幣客BITKER交易所公告敬愛的BITKER用戶:BITKER于2018/9/1412:00正式開啟WICC/USDT.
1900/1/1 0:00:00無論是加密貨幣的幣圈,還是在加密學的學界,尼克?薩博都是活著的傳奇。雖然這名字不算家喻戶曉,幣圈小白可能都沒聽過他。然而,對真正的密碼學發燒友來說,尼克·薩博是神一樣的存在.
1900/1/1 0:00:00今日下午,CEO交易所于官網正式發布公告,將于5月22日15:00開始第一期“雙C計劃”試運營.
1900/1/1 0:00:00