译文出自:登链翻译计划
译者:翻译小组
校对:Tiny熊
本文讨论Solidity的类特性,Solidity是以太坊区块链的默认智能合约语言。
背景
在Datona实验室的SoliditySmart-Data-Access-Contract模板的开发和测试过程中,我们探索了使用类的技术,就像在传统的面向对象的编程语言中一样。例如,我们希望能写出类似这样的代码:
import"ContractOwner
...}
在这个例子中,ContractOwner和Partners是我们想要使用的类。
一个类将相关的代码和数据封装在一个实体中。
关于这个的实现将在下面的例子中进一步探讨。
为什么在Solidity中使用类?
因为我们很习惯在OOP开发中使用类,并且想要继续以这种方式来开发,因为它很好用。
对于为什么要用OOP编程,其可能的原因有很多。参考wiki中的面向对象编程。
在Solidity中使用类有什么好处?
我们发现,OOP是非常熟悉、自然的,通常可以减少错误率,便于独立测试,并能重用。
在Solidity中使用类的缺点是什么?
主要的缺点是可能会使我们不去完全使用Solidity的编程范式。
还有人担心,大量导入文件会成为维护的噩梦。
最后,Solidity合约通常非常简单,而导入文件可能会增加不必要的复杂性、成本和文件管理。
尽管如此,我们认为值得探索各种可能性,即使只是为了拒绝它们。
Solana:Slope用户或曾在Slope导入助记词的设备或存在被盗风险:据官方消息,Solana发布8月2日Slope钱包事件更新:从UTC时间2022年8月2日22:37开始并持续约4小时,一个或多个恶意攻击者盗取了9231个钱包中共计价值约410万美元的资产。链上交易显示,受影响钱包的私钥已被泄露,并被用于签署恶意交易。
在开发人员、分析公司和安全审计员的调查中,受影响的地址似乎曾在iOS和Android上的Slope钱包应用程序(由Slope Finance创建和发布)中创建、导入或使用。这些Slope用户的私钥资料被Slope无意中传输到应用程序监控服务,但黑客获取或截获这些信息的途径仍在调查中。
此次攻击没有涉及与Solana Labs、Solana基金会或任何与Solana协议本身相关的核心代码,这不是协议级别的漏洞。
这一漏洞似乎孤立于支持Solana和以太坊地址的一个钱包提供商,但其他软件钱包(如Phantom和Solflare)上受影响的用户可能是用户重复使用在Slope中生成或存储的助记词的结果。
目前官方认为这不是与Slope以外的任何特定钱包实现直接相关的问题。由于以太坊和Solana都使用BIP39助记符,因此对使用以太坊钱包用户的任何影响也可能是由于重复使用了助记词。
无论是否使用Slope的硬件钱包没有受到影响,任何从助记词生成的从未被导入(或被Slope钱包使用)的钱包都没有受到影响。然而,用户只要将他们的助记词导入Slope应用程序,就有受攻击的风险。
Solana官方强调,Slope钱包用户或者之前曾将助记词导入Slope的设备,即使没有资产被转移,钱包也可能会被盗用。因此建议:
- 在另一个钱包应用程序中生成一个新的助记词;
- 将所有资产(代币和NFT)转移到这个新钱包;
- 放弃旧地址,因为它可能会受到攻击。
用户不应该重复使用以前在Slope移动应用中使用过的助记词衍生的钱包。[2022/8/9 12:11:42]
Solidity类特性
数据:当前Solana生态总市值为166.1亿美元:金色财经消息,据CoinGecko最新数据显示,当前Solana生态总市值为166.1亿美元(截至发稿时为16,610,196,560美元),24小时交易额为4,027,792,998美元。[2022/6/16 4:30:14]
Solidity已经有很多与现代OOP语言非常不同的特性,如:合约、可支付账号;执行的Gas消耗;永久存储;全局执行等等。
然而,合约不是类,因为Solidity有函数调度程序和其他开销,调用其他合约的函数是非常昂贵的。我在另一篇文章中有提到过“Solidity函数的Gas消耗”。
Solidity提供了哪些功能来实现将代码和数据封装在类里呢?
下面我们将开始探讨:
1)导入文件2)合约继承3)将库附加到结构体
在所有这些功能中,数据和函数都可以使用类似类的点符号。例如:myClass
...}
1
...}
包含内部函数的库将与合约的字节码一起被打包。这些将在(3)中讨论。
2)合约继承
在Solidity中,有两种方式可以有效地提供类特性,一种是_继承基础合约_。
被继承的基础合约是一个普通合约,包含数据和可以作用于这些数据的函数,但通常是不完整的,或者说只是完整合约的一个片段。恰当的文件命名习惯是很有用,可以清楚知道哪些合约是作为可继承的基础合约。
我们还可以把继承当做对象组合来使用,这在下面的例子中会讲到。
3)将库附加到结构体
这是另一种有效提供类特性的方式,这种方式是创建一个结构体并附加一个库,库中的函数接受该结构体。这就是_将一个库附加到一个类型_。
数据:当前Solana生态总市值为259.8亿美元:金色财经消息,据CoinGecko最新数据显示,当前Solana生态总市值为259.8亿美元(截至发稿时为25,981,043,846美元),24小时交易额为4,965,812,183美元。目前按市值排名前三的项目分别是:Solana(17,097,808,143美元)、STEPN(876,951,779美元)和Serum(392,764,225美元)。[2022/5/14 3:16:20]
在希望使用该类的合约中,声明了结构体的变量,并可提供结构体作为参数来调用库函数。
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生态借贷协议Solend宣布上线Star Atlas Pool:3月2日消息,Solana 生态借贷协议 Solend 宣布上线 Star Atlas Pool,Star Star Atlas 池有 3 个储备 Token:ATLAS、POLIS 和 USDC,用户目前已经可以进行借入借出操作。据了解,Star Atlas 是建立在 Solana 链上的 GameFi。[2022/3/2 13:32:36]
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
Solana上AI/ML赛车游戏RaceFi完成290万美元私募轮和种子轮融资:12月4日消息,Solana上AI/ML赛车游戏RaceFi宣布完成290万美元的种子轮和私募轮融资,由ExnetworkCapital、GenblockCapital、SolarEcoFund、ShimaCapital、BasicsCapital和x21Digital领投。其他投资者包括SolRazr、Enjinstarter、MagnusCapital、TitansVentures、VBCVentures、MasterVentures、GoodGamesGuild、PolRare、R-930Capital、ZBSCapital、AsteroidCapital、AlphaMoonCapital、AVStarCapital、IDOResearchVentures、KiwiGROUP和KVVentures参投。[2021/12/4 12:51:26]
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
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
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。