鏈聞ChainNews:
Solidity是以太坊上最主流的函數修改器。本篇文章從技術角度展示了如何針對異常情況在代碼層面進行詳細分析,最后總結出異常情況最易出現的一些場景,并給出相對應的建議。
來源|矩陣數字經濟智庫作者|閆鶯等
函數修改器
Solidity提供了一個函數修改器的特性。函數修改器與Python中的裝飾器類似,可以在一定程度上改變函數的行為,比如可以自動在函數執行前檢查參數是否合法。函數修改器是可以被繼承的,同時可以被派生類覆蓋重寫。
下面代碼展示了如何聲明并使用函數修改器。
contractowned{functionowned(){owner=msg
EthHub創始人:擴展以太坊是一場馬拉松,而不是短跑:EthHub聯合創始人Anthony Sassano發推表示,擴展以太坊是一場馬拉松,而不是短跑。[2021/6/1 23:01:03]
addressowner;//這個合約定義了一個在派生合約中使用的函數修改器//";"指代被修改函數的函數體。//當這個函數執行前,先檢查msg
}contractContractisowned{//從owned合約繼承了onlyOwner函數修改器并且將其作用于close函數//確保了這個函數只有在調用者為合約創建者時才會生效functionclose()onlyOwner{selfdestruct(owner);}}
下面代碼進一步展示了函數修改器是如何接收參數的,函數修改器的參數可以是上下文中存在的任意變量組成的表達式。
Ark Invest報告:以太坊屢創新高有三大原因:投資管理公司Ark Invest近期發布了發布了一份研究報告,強調了以太坊價格屢創新高的三個原因。該公司指出,機構興趣的增加、強大的鏈上信號和即將到來的協議升級是其價格上漲的關鍵原因。(Bitcoin.com)[2021/5/10 21:45:01]
contractpriced{//函數修改器可以接收參數modifiercosts(uintprice){if(msg
}}contractRegisterispriced,owned{mapping(address=>bool)registeredAddresses;uintprice;functionRegister(uintinitialPrice){price=initialPrice;}//這里需要payable修飾詞,否則無法通過該方法轉賬以太幣//函數修飾器costs接收參數price//使用costs修飾器確保registe函數在msg
因網絡擁堵及交易費過高,Sky Mavis計劃構建以太坊側鏈Ronin:區塊鏈游戲Axie Infinity背后的初創公司Sky Mavis最近詳細闡述了開發其以太坊側鏈“Ronin”的計劃。Sky Mavis稱,團隊決定建立Ronin側鏈是因為網絡擁擠和高額交易費已經成為以太坊區塊鏈的一大問題。(SludgeFeed)[2020/7/2]
functionchangePrice(uint_price)onlyOwner{price=price;}}
下面的例子展示了如何使用函數修改器實現一個重入鎖機制。
contractMutex{boollocked;modifiernoReentrancy(){require(!locked);locked=true;;locked=false;}//這個函數使用了noReentrancy修改器,這保證了在f函數內部無法再次調用f函數//在執行return7時也執行了函數修改器中的locked=false語句functionf()noReentrancyreturns(uint){require(msg
動態 | 由安永開發的葡萄酒市場在以太坊區塊鏈上啟動:金色財經報道,11月14日,安永(EY)開發的TATTOO葡萄酒市場在以太坊公共區塊鏈網絡上啟動,相關技術利用了安永(EY)推出的EY OpsChain平臺,實現了可追溯性。消費者可以通過公司網站以常規方式訪問該服務。該計劃是新加坡初創公司Blockchain Wine的創意。Blockchain Wine的創始人表示,“在TATTOO葡萄酒市場上,每瓶酒都可以追溯到從起源到直接交付再到消費者的整個過程。”(Ledgerinsights)[2019/11/14]
}異常處理以太坊使用狀態回退機制處理異常。如果發生了異常,當前消息調用和子消息調用產生的所有狀態變化都將被撤銷并且返回調用者一個報錯信號。Solidity語言提供了兩個方便的函數assert和require來檢查條件,并且當條件不滿足的時候拋出一個異常。assert函數通常用于檢查變量和內部錯誤,require函數用于確保程序執行的必要條件是成立的。一個正常運行的程序不應該遇到assert和require失敗,否則程序代碼中一定存在需要修復的問題。revert函數和throw關鍵詞會標識發生了錯誤并且回退當前的消息調用產生的狀態改變。當前調用收到子消息調用產生的異常時會自動拋出,所以異常會一層層上浮直到最上層的根調用,代碼會立刻終止執行并回退狀態改變。但是,
動態 | 以太坊鏈上現大額轉賬到場外交易:據合約帝鏈上數據監測顯示,北京時間6月7日12:30,Ethereum鏈上出現一筆13499枚的轉賬,價值約332萬美金。據悉,Gemini交易所位于紐約,主營大宗場外交易。[2019/6/7]
}
一個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簽名:比特幣的最新升級
7月21日開始,FCoin的平臺幣FT價格大跌,一日跌幅超過14%。而FCoin的安全團隊監測發現,有一批僵尸賬戶突然激活,出現「均勻交易」,每5秒鐘進行一次拋單、吃單的操作,拼命打壓價格.
1900/1/1 0:00:00活動時間:2019年05月21日18:00:00到2019年05月28日18:00:00(UTC8)為慶祝NUSD上線KuCoin并開放交易.
1900/1/1 0:00:00據Cointelegraph和CCN報道,互聯網安全提供商和研究機構邁克菲實驗室11月12日發布一篇博客文章證實,其發現了一種新的惡意軟件.
1900/1/1 0:00:00倫敦大學學院的區塊鏈技術中心(TheCentreforBlockchainTechnologies,CBT)在其官網上宣布結束與IOTA基金會的合作關系,CBT認為必須維護其開放研究成果的自由.
1900/1/1 0:00:00Snapchat剛成為最新的社交媒體巨頭禁止投放最初的硬幣產品廣告。周一報道稱,母公司SnapInc.自2月以來一直在悄然實施該政策-僅限制加密幣銷售廣告,同時允許更廣泛地與加密貨幣相關的廣告.
1900/1/1 0:00:00AlphaWallet正在創造一個可以連接虛擬世界和真實世界的網關,意味著利用區塊鏈技術提供真實世界內的生活服務有了強有力的基礎技術平臺,基于區塊鏈而展開的種種想象成為了可能.
1900/1/1 0:00:00