如何在Solidity库中使用状态变量函数

  • 时间:
  • 浏览:38
  • 来源:区块链技术网

众所周知,Solidity库不能有状态变量。

如果今天你在网上快速搜索一下Solidity库是否可以有状态变量,你会发现答案是否定的,它们不能。

以下是关于库的Solidity文档:

注意第一个限制:库不能具有状态变量。

但文档将显示,可以通过这种方式将存储指针传递到库函数并访问状态变量。

但是如果您想在库中定义、创建和使用新的状态变量,并且在不将它们作为参数传递的情况下使用它们呢?

如果您想随时随地修改所需的合约存储,而又不传递存储指针怎么办?

使用Solidity库可以做这些事情吗?

从Solidity文档看,答案似乎是否定的。如果您像我一样在网上搜索如何执行此操作,那么您可能会发现答案是否定的,除非您当然找到了此博客文章。

所以我会说:

Solidity库可以有状态变量!

我讨厌与Solidity文档发生冲突,而且几乎所有在这一点上了解Solidity的人都是如此。

请注意库限制底部的小行:

(这些可能会在以后解除。)

好吧,库不能具有状态变量的第一个限制已于2020年3月10日解除,没有人注意到把。

将状态变量添加到库中不仅仅是一个很好的技术技巧。具有状态变量的库非常有用。

如何向库中添加状态变量

通过使用Diamond(方块)存储,库可以拥有/创建/使用/修改状态变量。

从Solidity 0.6.4开始,可以在合约存储的任意位置创建指向结构的指针。

那就是Diamond(方块)存储。报价来自Diamond(方块)标准的合约存储部分。Diamond(方块)标准和实施Diamond(方块)的人们一直在引领Diamond(方块)存储的使用。

为了更好地理解如何使用Diamond(方块)存储向库添加状态变量,请参见下面的示例。

带有状态变量的库示例

这是带有状态变量的库的简单示例。它是为了易于阅读和理解而编写的。它编译时没有错误或警告。

//SPDX-License-Identifier:MITpragmasolidity^0.7.0;//Thislibraryhasthestatevariables'contractAddress'and'name'libraryLibrary{//definingstatevariablesstructDiamondStorage{addresscontractAddress;stringname;//...anynumberofotherstatevariables}//returnastructstoragepointerforaccessingthestatevariablesfunctiondiamondStorage()internalpurereturns(DiamondStoragestorageds){bytes32position=keccak256("diamond.standard.diamond.storage");assembly{ds.slot:=position}}//setstatevariablesfunctionsetStateVariables(address_contractAddress,stringmemory_name)internal{DiamondStoragestorageds=diamondStorage();ds.contractAddress=_contractAddress;ds.name=_name;}//getcontractAddressstatevariablefunctioncontractAddress()internalviewreturns(address){returndiamondStorage().contractAddress;}//getnamestatevariablefunctionname()internalviewreturns(stringmemory){returndiamondStorage().name;}}//ThiscontractusesthelibrarytosetandretrievestatevariablescontractContractA{functionsetState()external{Library.setStateVariables(address(this),"MyName");}functiongetState()externalviewreturns(addresscontractAddress,stringmemoryname){contractAddress=Library.contractAddress();name=Library.name();}}

请注意,库函数setStateVariables、contractAddress和name()是内部函数。这些内部函数将被添加到ContractA的字节码中,从而增加它的大小。但是内部函数调用比外部调用使用更少的气体,所以这很好。

可以将库函数设置为外部函数,它们仍将起作用。在这种情况下,它们不会被添加到ContractA的字节码中。它们将使用委托代码操作码从外部调用。库函数就是这样工作的。

请注意,不同的库将需要使用不同的存储插槽,因此使用不同的keccak256ed字符串。这是为了防止两个或多个库在合同存储中写入相同的位置。

---------------------------------------------

原文作者:

译者:链三丰

译文出处:http://bitoken.world

---------------------------------------------

猜你喜欢

这个臭名昭著的交易所满币网,终于跑路了!

这个平台,是满币网。 老粉丝都知道良心哥和满币是揭不过去的梁子,但在聊我们之间的这些恩怨之前,良心哥想简单复盘一下这个恶贯满盈的交易所罪恶的一生。

2022-01-15

2022十大智能合约开发工具

去年,我研究了一些顶级的智能合约开发者框架[2],今年,我们将扩展到更多。 我们将研究十类工具,然后看看每个类别中最适合智能合约/区块链/solidity/vyper/rust/web3开发者的工具(我们现在有太多 “区块链开发者”的术语)。

2022-01-15

马斯克:狗狗币前十地址都是我的,过两天就取消狗狗币支付

前两天,就有人爆料称:特斯拉代码已经添加狗狗币,可能在不久就会官宣特斯拉商品支持狗狗币购买。今天,马斯克竟然真的发消息称:特斯拉商品可以用狗狗币购买。

2022-01-15

搭建"虚拟货币"平台钓鱼网站,8人被刑拘

随着互联网的普及和不断发展,网络虚拟货币日渐盛行,一些不法之徒盯上虚拟货币牟利。江苏省徐州市铜山区公安局近期打掉一个盗窃虚拟货币犯罪团伙,抓获犯罪嫌疑人8人,涉案价值500余万元。

2022-01-15

“多地连线、云端开庭”许昌审理首例涉嫌跨境交易虚拟货币案

近日,河南省许昌市魏都区人民法院开庭审理了一起被告人李某五人交易虚拟货币涉嫌非法经营罪、帮助信息网络犯罪活动罪的案件。据悉,这是许昌市审理的首例涉嫌跨境交易虚拟货币案。

2022-01-15