月亮链 月亮链
Ctrl+D收藏月亮链
首页 > Ethereum > 正文

NER:Solidity 类特性_sakuraparty

作者:

时间:1900/1/1 0:00:00

译文出自:登链翻译计划

译者:翻译小组

校对:Tiny熊

本文讨论Solidity的类特性,Solidity是以太坊区块链的默认智能合约语言。

背景

在Datona实验室的SoliditySmart-Data-Access-Contract模板的开发和测试过程中,我们探索了使用类的技术,就像在传统的面向对象的编程语言中一样。例如,我们希望能写出类似这样的代码:

import"ContractOwner

...}

在这个例子中,ContractOwner和Partners是我们想要使用的类。

一个类将相关的代码和数据封装在一个实体中。

关于这个的实现将在下面的例子中进一步探讨。

为什么在Solidity中使用类?

因为我们很习惯在OOP开发中使用类,并且想要继续以这种方式来开发,因为它很好用。

对于为什么要用OOP编程,其可能的原因有很多。参考wiki中的面向对象编程。

在Solidity中使用类有什么好处?

我们发现,OOP是非常熟悉、自然的,通常可以减少错误率,便于独立测试,并能重用。

在Solidity中使用类的缺点是什么?

主要的缺点是可能会使我们不去完全使用Solidity的编程范式。

还有人担心,大量导入文件会成为维护的噩梦。

最后,Solidity合约通常非常简单,而导入文件可能会增加不必要的复杂性、成本和文件管理。

尽管如此,我们认为值得探索各种可能性,即使只是为了拒绝它们。

Delio将于6月28日恢复ADA、SOL等代币存取款服务:6月26日消息,韩国加密金融公司Delio发布公告称,将于北京时间6月28日11:00恢复Cardano(ADA)、Solana(SOL)、Tezos(XTZ)、Polkadot(DOT)、Kusama(KSM)、NEARProtocol(NEAR)存取款服务。[2023/6/26 22:00:15]

Solidity类特性

Solidity已经有很多与现代OOP语言非常不同的特性,如:合约、可支付账号;执行的Gas消耗;永久存储;全局执行等等。

然而,合约不是类,因为Solidity有函数调度程序和其他开销,调用其他合约的函数是非常昂贵的。我在另一篇文章中有提到过“Solidity函数的Gas消耗”。

Solidity提供了哪些功能来实现将代码和数据封装在类里呢?

下面我们将开始探讨:

1)导入文件2)合约继承3)将库附加到结构体

在所有这些功能中,数据和函数都可以使用类似类的点符号。例如:myClass

...}

1

...}

包含内部函数的库将与合约的字节码一起被打包。这些将在(3)中讨论。

2)合约继承

在Solidity中,有两种方式可以有效地提供类特性,一种是_继承基础合约_。

被继承的基础合约是一个普通合约,包含数据和可以作用于这些数据的函数,但通常是不完整的,或者说只是完整合约的一个片段。恰当的文件命名习惯是很有用,可以清楚知道哪些合约是作为可继承的基础合约。

我们还可以把继承当做对象组合来使用,这在下面的例子中会讲到。

Solana官推更名为“Solano”,或为回应Jack Dorsey拼写错误刻意调整:金色财经报道,Solana官方社交媒体账户已更名为“Solano”,有传言显示,Solana此举可能是由于前 Twitter 首席执行官 Jack Dorsey 将其名称拼写错误有关,更名对其进行回应。Jack Dorsey 此前发文回应加密社区用户关于“Web5如何实现去中心化”问题时表示,Web3依然存在单点故障问题“比如Solano”。[2022/6/12 4:19:59]

3)将库附加到结构体

这是另一种有效提供类特性的方式,这种方式是创建一个结构体并附加一个库,库中的函数接受该结构体。这就是_将一个库附加到一个类型_。

在希望使用该类的合约中,声明了结构体的变量,并可提供结构体作为参数来调用库函数。

Solidity提供了一个编译器指令,以支持使用点符号调用库函数,这就是usingfor(usinglibraryforstruct)。这个功能也可以用于扩展标准类型,例如,usingNumbersLibforuint。

看看下面的例子。

一些使用Solidity类特性的例子

我们用一个简单的合约来演示类特性技术。

这个版本的合约,使用一个叫做ContractOwner的基础合约和一个叫做Partners的组件类。

import"ContractOwner

functionaddPartner(addressaccount,stringmemoryinfo)publiconlyContractOwner{partners

functiontransferToPartner(addressaccount,uintamount)publiconlyOwner{require((amount>0)&&(amount<=total-allocated));partners

Solana生态DEX Orca推出集中性流动性功能Whirlpools:3月24日消息,Solana生态去中心化交易所Orca推出集中性流动性功能Whirlpools,开始为期两周的测试阶段。 Whirlpools旨在通过资本效率为做市商带来更高的回报,同时为交易者提供低滑点交易。(BlockWorks)[2022/3/24 14:14:47]

functiongetPartnerBalance(addressaccount)publicviewreturns(uint){returnpartners

functiongetPartnerInfo(addressaccount)publicviewreturns(stringmemory){returnpartners

}

注意,我们从不同的文件中导入了这些类。

ContractOwner是一个继承的基类,PartnersFuns是一个函数库,它附加在Partners结构体上,后面列出了这些文件。

没有Solidity类特性的例子

对比上面的EasyShareLib版本的合约,下面的EasyShare版本没有继承基础合约,也没有附加库到结构体。

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

摩根大通:以太坊在NFT领域的主导地位正在被Solana“吞食”:1月19日消息,摩根大通在报告中表示,由于拥堵和高额Gas费,以太坊在NFT领域的主导地位正在下降。

Nikolaos Panigirtzoglou等分析师在上周发布的报告中写道,以太坊网络在NFT领域的市场份额已从2021年初的约95%降至约80%。

摩根大通表示,自去年8月份以来,Solana一直在从以太坊获取最多的NFT交易量份额,并指出这是NFT市场开始大规模扩张的时候。与此同时,以太坊的市值份额也正逐渐被Solana所“吞食”。

根据该报告,由于NFT是“加密生态系统中增长最快的领域”,以太坊在NFT市场中的份额可能比其DeFi份额更重要。本月早些时候,该行警告称,以太坊在DeFI领域的主导地位也面临风险,因为维持其主导地位所需的网络规模可能实现得太慢。

摩根大通警告称,如果以太坊在2022年继续失去NFT市场份额,其估值可能会面临更大的问题。(CoinDesk)[2022/1/19 8:59:43]

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

VaultAge Solutions投资者将向法院起诉已离职的CEO:南非加密货币投资公司VaultAge Solution的投资者已决定向法院起诉已离职的CEO Willie Breedt,并试图追回约2.77亿兰特(约合1700万美元)。此前消息,AllAfrica的一份报告指出,VaultAge Solutions首席执行官Willie Breedt被指控盗窃数百万美元的加密货币。去年12月,Breedt中断了与投资者的大部分私人联系,并以度假为由逃到莫桑比克,这让投资者们非常担心。(FinanceMagnates)[2020/6/10]

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&#039;Picks

标签:NERARTPARTPAROceans MinerGame ArtParty Dogsakuraparty

Ethereum热门资讯
DANK:新协议异军突起,黑马选手「DANK?Protocol」想借「固定利率」颠覆现有DeFi格局_Bogdanoff Forever

在经历了NFT繁荣、大饼回归等热点的稀释后,DeFi季的关注度在9月终于再度强势回归。数据上,DeFi总锁仓量一度突破1800亿美元,创下历史新高.

1900/1/1 0:00:00
GLO:開啟EC Bet Network (ECN)交易 / 2021.9.17_Shambala

親愛的BitGlobal用戶:BitGlobal將在GEM上線ECN數位資產服務,?詳情如下充提安排:9月22日11:00(UTC8)開放立即充值>>交易時間:9月22日17:00(.

1900/1/1 0:00:00
ENT:星球日报 | PayPal发布整合加密功能的“超级应用”;Vee.Finance被盗逾3500万美元(9月22日)_TAL

头条PayPal发布其“超级应用”,整合支付、数字钱包、加密功能星球日报讯PayPal近期一直在谈论其“超级应用”计划,最近告诉投资者其即将推出的数字钱包和支付应用已经开始发布.

1900/1/1 0:00:00
USDT:ZT创新板即将上线PRT_DUSD

亲爱的ZT用户:ZT创新板即将上线PRT,并开启PRT/USDT交易对。具体上线时间如下:交易:2021年9月22日17:00?;PRT项目简介:Parrot是一个用于在solana上借贷的流动.

1900/1/1 0:00:00
加密货币:法国基金经理Jad Comair:监管是一个积极因素,可以释放加密货币全部的潜力_NNI

据金融时报9月23日消息,此前对冲基金经理RayDalio认为,如果比特币变得过于成功,监管机构就会扼杀它.

1900/1/1 0:00:00
加密货币:美国国税局表示计划为加密初创公司TRM Labs Inc.的跨链追踪软件授予合同_Ghost Block

据Theblock9月20日消息,美国国税局近期发布的一份通知表明,美国税务机构希望加强其跟踪跨链交易的能力.

1900/1/1 0:00:00