譯文出自:登鏈翻譯計劃
譯者:翻譯小組
校對:Tiny熊
本文討論Solidity的類特性,Solidity是以太坊區塊鏈的默認智能合約語言。
背景
在Datona實驗室的SoliditySmart-Data-Access-Contract模板的開發和測試過程中,我們探索了使用類的技術,就像在傳統的面向對象的編程語言中一樣。例如,我們希望能寫出類似這樣的代碼:
import"ContractOwner
...}
在這個例子中,ContractOwner和Partners是我們想要使用的類。
一個類將相關的代碼和數據封裝在一個實體中。
關于這個的實現將在下面的例子中進一步探討。
為什么在Solidity中使用類?
因為我們很習慣在OOP開發中使用類,并且想要繼續以這種方式來開發,因為它很好用。
對于為什么要用OOP編程,其可能的原因有很多。參考wiki中的面向對象編程。
在Solidity中使用類有什么好處?
我們發現,OOP是非常熟悉、自然的,通常可以減少錯誤率,便于獨立測試,并能重用。
在Solidity中使用類的缺點是什么?
主要的缺點是可能會使我們不去完全使用Solidity的編程范式。
還有人擔心,大量導入文件會成為維護的噩夢。
最后,Solidity合約通常非常簡單,而導入文件可能會增加不必要的復雜性、成本和文件管理。
盡管如此,我們認為值得探索各種可能性,即使只是為了拒絕它們。
NFT平臺SolSea宣布與可口可樂塞爾維亞分公司達成合作:金色財經報道,7月5日,基于Solana的NFT平臺SolSea表示,已與可口可樂塞爾維亞分公司Coca-Cola Srbija達成合作。SolSea表示,此次合作將涉及提供商品以及可口可樂塞爾維亞品牌的NFT。兩家公司正在與EXITFestival合作提供NFT和商品,EXIT Festival是一個夏季音樂節,每年7月的第一周在塞爾維亞諾維薩德舉行。2023年音樂節將于7月6日至9日舉行。參與者可以在塞爾維亞EXIT音樂節期間獲得與NFT搭配的專屬連帽衫。[2023/7/6 22:21:11]
Solidity類特性
Solidity已經有很多與現代OOP語言非常不同的特性,如:合約、可支付賬號;執行的Gas消耗;永久存儲;全局執行等等。
然而,合約不是類,因為Solidity有函數調度程序和其他開銷,調用其他合約的函數是非常昂貴的。我在另一篇文章中有提到過“Solidity函數的Gas消耗”。
Solidity提供了哪些功能來實現將代碼和數據封裝在類里呢?
下面我們將開始探討:
1)導入文件2)合約繼承3)將庫附加到結構體
在所有這些功能中,數據和函數都可以使用類似類的點符號。例如:myClass
...}
1
...}
包含內部函數的庫將與合約的字節碼一起被打包。這些將在(3)中討論。
2)合約繼承
在Solidity中,有兩種方式可以有效地提供類特性,一種是_繼承基礎合約_。
被繼承的基礎合約是一個普通合約,包含數據和可以作用于這些數據的函數,但通常是不完整的,或者說只是完整合約的一個片段。恰當的文件命名習慣是很有用,可以清楚知道哪些合約是作為可繼承的基礎合約。
區塊鏈公司Sollensys以330萬美元收購阿肯色州的一個數據中心:4月14日消息,美國安全與存儲公司Sollensys Corp已經收購了阿肯色州小石城的一個數據中心。Sollensys提供區塊鏈存檔服務器(Blockchain Archive Server),這是一種基于區塊鏈的存檔解決方案,目的是幫助保護公司免受勒索軟件的侵害。
該公司表示,新數據中心是其收購多處房地產項目的一部分,該項目總價值約為330萬美元。該設施面積為5044平方英尺,占地約1英畝。(DataCenterDynamics)[2022/4/14 14:24:43]
我們還可以把繼承當做對象組合來使用,這在下面的例子中會講到。
3)將庫附加到結構體
這是另一種有效提供類特性的方式,這種方式是創建一個結構體并附加一個庫,庫中的函數接受該結構體。這就是_將一個庫附加到一個類型_。
在希望使用該類的合約中,聲明了結構體的變量,并可提供結構體作為參數來調用庫函數。
Solidity提供了一個編譯器指令,以支持使用點符號調用庫函數,這就是usingfor(usinglibraryforstruct)。這個功能也可以用于擴展標準類型,例如,usingNumbersLibforuint。
看看下面的例子。
一些使用Solidity類特性的例子
我們用一個簡單的合約來演示類特性技術。
這個版本的合約,使用一個叫做ContractOwner的基礎合約和一個叫做Partners的組件類。
import"ContractOwner
functionaddPartner(addressaccount,stringmemoryinfo)publiconlyContractOwner{partners
Solana鏈上NFT交易總額突破18億美元 創歷史新高:金色財經報道,據最新數據顯示,Solana鏈上NFT交易總額已突破18億美元,創下歷史新高,本文撰寫時為1,819,448,959美元,鏈上交易數量達到3,903,303筆。 當前Solana區塊鏈上NFT交易額最大的NFT項目是Solana Monkey Business,交易額為178,392,733美元,Degenerate Ape Academy排名第二,交易額為135,050,175美元,這兩個NFT項目交易額已超過Solana鏈上交易總額的五分之一。[2022/4/8 14:13:31]
functiontransferToPartner(addressaccount,uintamount)publiconlyOwner{require((amount>0)&&(amount<=total-allocated));partners
functiongetPartnerBalance(addressaccount)publicviewreturns(uint){returnpartners
functiongetPartnerInfo(addressaccount)publicviewreturns(stringmemory){returnpartners
}
注意,我們從不同的文件中導入了這些類。
ContractOwner是一個繼承的基類,PartnersFuns是一個函數庫,它附加在Partners結構體上,后面列出了這些文件。
沒有Solidity類特性的例子
對比上面的EasyShareLib版本的合約,下面的EasyShare版本沒有繼承基礎合約,也沒有附加庫到結構體。
動態 | 以太坊智能合約編程語言新版本Solidity0.5.11已發布:據github數據顯示,針對以太坊智能合約的編程語言新版本Solidity0.5.11已發布。據悉該版本更新了諸多功能,并能幫助開發者修復錯誤編碼。[2019/8/16]
contractEasyShare{//ContractOwneraddressprivatecontractOwner=msg
//PartnersstructPartner{addressaccount;stringinfo;uintbalance;}Partnerpartners;uintpublictotal;uintpublicallocated;constructor(uint_total)public{require(_total>0,"Suppliedtotalmustbe>0");total=_total;}functionfindPartner(addressaccount)internalviewreturns(intindex){uintlength=partners
return-1;}functionaddPartner(addressaccount,stringmemoryinfo)publiconlyContractOwner{require(findPartner(account)<0,"Alreadyexists");partners
functiontransferToPartner(addressaccount,uintamount)publiconlyOwner{require((amount>0)&&(amount<=total-allocated));intindex=findPartner(account);require(index>=0,"Thispartnerisunknown");partners
分析 | 比特幣大跌主因是VanEck-SolidX比特幣ETF延遲審批:據 CCN分析,大多投資者和分析師將今日比特幣突然下跌歸因于美國證券交易委員會( SEC)推遲批準VanEck-&SolidX的比特幣 ETF。盡管,很多分析師都曾表示此次推遲是預料之中的,且并不足以引發加密貨幣市場的此次暴跌;然而,此前日本和韓國的交易市場的交易人員一直在大肆宣稱一旦比特幣ETF獲得批準,比特幣價格將在8月份達到此前的高點,由此帶來的虛假期望引發市場對VanEck-SolidX比特幣ETF的延遲審批后的激烈反應。[2018/8/8]
functiongetPartnerBalance(addressaccount)publicviewreturns(uint){intindex=findPartner(account);require(index>=0,"Thispartnerisunknown");returnpartners
functiongetPartnerInfo(addressaccount)publicviewreturns(stringmemory){intindex=findPartner(account);require(index>=0,"Thispartnerisunknown");returnpartners
}
這個例子中沒有使用導入文件,總體上還比較簡潔,但沒有采用可重復使用的合約和庫。
導入文件
將ContractOwner
...}
Partners
structPartners{Partnera;}libraryPartnersFuns{functionfind(Partnersstoragepartners,addressaccount)internalviewreturns(intindex){uintlength=partners
return-1;}functionadd(Partnersstoragepartners,addressaccount,stringmemoryinfo)internal{require(find(partners,account)<0,"Alreadyadded");partners
functionincBalance(Partnersstoragepartners,addressaccount,uintamount)internal{intindex=find(partners,account);require(index>=0,"Thispartneraccountisunknown");partners
functiongetBalance(Partnersstoragepartners,addressaccount)internalviewreturns(uint){intindex=find(partners,account);require(index>=0,"Thispartneraccountisunknown");returnpartners
functiongetInfo(Partnersstoragepartners,addressaccount)publicviewreturns(stringmemory){intindex=find(partners,account);require(index>=0,"Thispartneraccountisunknown");returnpartners
}
測試
要確保兩個版本的EasyShare合約行為正確,方式相同。
Gas消耗量
我們測量了創建合約的Gas成本,然后添加10個賬戶,并向10個賬戶中的每個賬戶轉移一些股份,然后獲取10個賬戶中每個賬戶的余額和信息字符串。我們使用了我在另一篇文章——Solidity函數的Gas消耗中所分享的Gas消耗測量方法。
兩個合約的消耗基本相同,除了Create和GetInfo在EasyShareLib中比EasyShare高一點。
Create成本比較高,因為調用庫函數有更多的字節碼。
GetInfo的成本較高,因為它是一個返回字符串的函數。通過額外的函數來訪問庫,字符串被復制兩次。
GetInfo也比GetBalance高。這清楚地表明了使用字符串的代價,它是引用類型的變量,而不是值類型數據。
結論
使用Solidity的特性來導入包含繼承基礎合約的文件,并將庫附加到結構體,這提供了我們在本文開頭所期望的大部的類的特性。
我們推薦將它們應用于快速開發的實驗性合約。
對于生產合約,你可能希望考慮將導入的文件擴展到合約中。
本文作者:JulesGoddard是Datona實驗室的聯合創始人,旨在提供智能合約來保護你的數字信息不被濫用。
本翻譯由CellNetwork贊助支持。
來源:https://medium.com/coinmonks/class-features-provided-by-solidity-84ee97840666
參考資料
登鏈翻譯計劃:https://github.com/lbc-team/Pioneer
翻譯小組:https://learnblockchain.cn/people/412
Tiny熊:https://learnblockchain.cn/people/15
面向對象編程:https://en.wikipedia.org/wiki/Object-oriented_programming
Solidity函數的Gas消耗:https://learnblockchain.cn/article/2716
CellNetwork:https://www.cellnetwork.io/?utm_souce=learnblockchain
__
免責聲明:作為區塊鏈信息平臺,本站所發布文章僅代表作者個人觀點,與鏈聞ChainNews立場無關。文章內的信息、意見等均僅供參考,并非作為或被視為實際投資建議。
本文來源于非小號媒體平臺:
登鏈社區
現已在非小號資訊平臺發布105篇作品,
非小號開放平臺歡迎幣圈作者入駐
入駐指南:
/apply_guide/
本文網址:
/news/10365656.html
免責聲明:
1.資訊內容不構成投資建議,投資者應獨立決策并自行承擔風險
2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表非小號的觀點或立場
上一篇:
每周編輯精選WeeklyEditors'Picks
Tags:NERARTPARPARToneroot幣騙局CryptoArt.AiPARA幣Charged Particles
DeFi周報是Odaily星球日報聯合全球Defi孵化工場DeFictory、區塊鏈營銷咨詢公司WXY、數據提供方OKLink、內容合作方BlockArk推出的一檔欄目.
1900/1/1 0:00:00據TheBlock9月21日報道,總部位于倫敦的開放銀行初創公司TrueLayer完成1.3億美元的新一輪融資,由TigerGlobalManagement領投,支付公司Stripe參投.
1900/1/1 0:00:00巴比特訊,9月24日,跨鏈DeFi平臺LibreDeFi完成80萬美元種子輪融資,本輪融資由MarshlandCapital、MagnusDigitalAssets、MoonrockCapita.
1900/1/1 0:00:00親愛的BitMart用戶:由于系統維護和升級,HederaHashgraph(HBAR)將延期上線。BitMart將暫時關閉HBAR的充值和提現功能。對您造成任何不便,我們深表歉意.
1900/1/1 0:00:00HPB社區成員West發起《提案|HPB社區治理委員激勵改進》,經過HPB社區治理委員會的充分討論與投票,最終該提案獲得通過.
1900/1/1 0:00:00第二十八期Layer2觀察者周報,Enjoyit!Optimism發文宣布一鍵部署EVM合約功能將10月上線近日,Optimism發表文章《OptimisticEthereum的未來》.
1900/1/1 0:00:00