鏈聞ChainNews:
Solidity是以太坊上最主流的函數修改器。本篇文章從技術角度展示了如何針對異常情況在代碼層面進行詳細分析,最后總結出異常情況最易出現的一些場景,并給出相對應的建議。
來源|矩陣數字經濟智庫作者|閆鶯等
函數修改器
Solidity提供了一個函數修改器的特性。函數修改器與Python中的裝飾器類似,可以在一定程度上改變函數的行為,比如可以自動在函數執行前檢查參數是否合法。函數修改器是可以被繼承的,同時可以被派生類覆蓋重寫。
下面代碼展示了如何聲明并使用函數修改器。
contractowned{functionowned(){owner=msg
Blockworks:以太坊合并大約在9月15日或16日進行:8月12日消息,Blockworks 發文表示,以太坊合并大約在 9 月 15 日或 16 日進行。[2022/8/12 12:19:42]
addressowner;//這個合約定義了一個在派生合約中使用的函數修改器//";"指代被修改函數的函數體。//當這個函數執行前,先檢查msg
}contractContractisowned{//從owned合約繼承了onlyOwner函數修改器并且將其作用于close函數//確保了這個函數只有在調用者為合約創建者時才會生效functionclose()onlyOwner{selfdestruct(owner);}}
下面代碼進一步展示了函數修改器是如何接收參數的,函數修改器的參數可以是上下文中存在的任意變量組成的表達式。
以太坊信標鏈網絡總質押量突破1100萬枚ETH:金色財經報道,據Ethereum官方網站最新數據顯示,以太坊信標鏈(The Beacon Chain)網絡總質押量已突破1100萬枚ETH,截止目前為11,036,841枚ETH,驗證者總數量為328,806個。據coingecko數據,當前ETH價格為3,274.22美元,24小時跌幅為3.6%。[2022/4/1 14:31:25]
contractpriced{//函數修改器可以接收參數modifiercosts(uintprice){if(msg
}}contractRegisterispriced,owned{mapping(address=>bool)registeredAddresses;uintprice;functionRegister(uintinitialPrice){price=initialPrice;}//這里需要payable修飾詞,否則無法通過該方法轉賬以太幣//函數修飾器costs接收參數price//使用costs修飾器確保registe函數在msg
DeFi預言機Umbrella Network上線以太坊主網:據官方消息,DeFi預言機Umbrella Network上線以太坊主網,此后基于以太坊的 DApp 可以與 Umbrella Network 代碼進行即時通信,請求和獲取可靠、全面的數據。今年5月,Umbrella Network上線BSC主網。根據官方路線圖,將在未來幾個月內繼續完成多鏈支持,包括 Polygon、Solana、Cardano、Avalanche 等。(Medium)[2021/10/3 17:21:32]
functionchangePrice(uint_price)onlyOwner{price=price;}}
下面的例子展示了如何使用函數修改器實現一個重入鎖機制。
動態 | 以太坊雷電網絡僅有35個公開通道 Layer2冷啟動或面對困難:近日,在以太坊社區中有人提出知名Layer2項目雷電網絡用戶寥寥的問題。雷電網絡的瀏覽器顯示,目前其公開通道僅有35個。針對此問題的社區討論,以太坊創始人Vitalik認為一切需要規模效應的應用的普及都會遇上這種困難,以太坊基金會已經在和眾多Layer2項目溝通,以促進一種通用性Layer2標準的誕生。(區塊律動BlockBeats)[2019/12/30]
contractMutex{boollocked;modifiernoReentrancy(){require(!locked);locked=true;;locked=false;}//這個函數使用了noReentrancy修改器,這保證了在f函數內部無法再次調用f函數//在執行return7時也執行了函數修改器中的locked=false語句functionf()noReentrancyreturns(uint){require(msg
動態 | Wirex推出以太坊錢包:據Wirex官方消息,Wirex已推出Wirex以太坊錢包,用戶可以買賣和存儲ETH,用戶還可以將其轉換為GBP,EUR或USD。[2018/9/5]
}異常處理以太坊使用狀態回退機制處理異常。如果發生了異常,當前消息調用和子消息調用產生的所有狀態變化都將被撤銷并且返回調用者一個報錯信號。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簽名:比特幣的最新升級
Tags:以太坊ICEPRIRICE以太坊價格今日行情美元flokiceo幣群prime幣值得買嗎Frax Price Index
尊敬的幣客用戶: 感謝各位長期以來對BITKER交易所的支持。BITKER周年慶典將于2019年5月16日盛大開啟,屆時BITKER將取消幣幣交易手續費.
1900/1/1 0:00:00親愛的社區用戶: 現公布GU項目重組方案及公投方案如下: 重組背景 GU項目當前持有募集資金共計75654269.5934435FT,由于項目本身未有實質進展.
1900/1/1 0:00:005月16日美國商務部工業與安全局將華為列入“實體名單”,谷歌撤銷了華為的Android許可證,除了谷歌之外,受美國政府禁令影響,包括英特爾、高通、賽靈思和博通也都正在切斷與華為的交易.
1900/1/1 0:00:00近日,香港主板上市公司前進控股集團通過其官方微信對外發布消息稱,已完成子公司OKLinkFintechLimited的注冊,并將于近期正式推出USDK合規穩定幣的業務.
1900/1/1 0:00:00Tark錢包全球首創雙形態冷錢包安全防護模式,技術上實現重大突破,應用上充分體現區塊鏈精神。Tark錢包兩大超級特色,六大優勢具備匿名性和安全性兩大超級特色,多幣種、秒速、多帳戶系統、離線簽名、.
1900/1/1 0:00:00宇宙就是一座黑暗森林,每個文明都是帶槍的獵人,像幽靈般潛行于林間,輕輕撥開擋路的樹枝,竭力不讓腳步發出一點兒聲音,連呼吸都必須小心翼翼,他必須小心,因為林中到處都有與他一樣潛行的獵人.
1900/1/1 0:00:00