众所周知,Solidity库不能有状态变量。 如果今天你在网上快速搜索一下Solidity库是否可以有状态变量,你会发现答案是否定的,它们不能。 以下是关于库的Solidity文档: 注意第一个限制
本文是由股票小能手创作,主要讲解的是如何在Solidity库中使用状态变量函数预计阅读时间3分钟,共计有1072个文字,话不多说下面一起来了解一下股票小能手的介绍吧,希望可以帮助到大家!
众所周知,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: MIT
pragma solidity ^0.7.0;
// This library has the state variables 'contractAddress' and 'name'
library Library {
// defining state variables
struct DiamondStorage {
address contractAddress;
string name;
// ... any number of other state variables
}
// return a struct storage pointer for accessing the state variables
function diamondStorage()
internal
pure
returns (DiamondStorage storage ds)
{
bytes32 position = keccak256("diamond.standard.diamond.storage");
assembly { ds.slot := position }
}
// set state variables
function setStateVariables(
address _contractAddress,
string memory _name
)
internal
{
DiamondStorage storage ds = diamondStorage();
ds.contractAddress = _contractAddress;
ds.name = _name;
}
// get contractAddress state variable
function contractAddress() internal view returns (address) {
return diamondStorage().contractAddress;
}
// get name state variable
function name() internal view returns (string memory) {
return diamondStorage().name;
}
}
// This contract uses the library to set and retrieve state variables
contract ContractA {
function setState() external {
Library.setStateVariables(address(this), "My Name");
}
function getState()
external
view
returns (address contractAddress, string memory name)
{
contractAddress = Library.contractAddress();
name = Library.name();
}
}
请注意,库函数setStateVariables、contractAddress和name()是内部函数。这些内部函数将被添加到ContractA的字节码中,从而增加它的大小。但是内部函数调用比外部调用使用更少的气体,所以这很好。
可以将库函数设置为外部函数,它们仍将起作用。在这种情况下,它们不会被添加到ContractA的字节码中。它们将使用委托代码操作码从外部调用??夂褪钦庋ぷ鞯?。
请注意,不同的库将需要使用不同的存储插槽,因此使用不同的keccak256ed字符串。这是为了防止两个或多个库在合同存储中写入相同的位置。
上一篇:以太坊大堵、手续费创历史新高,于是Layer 2项目火了
本文内容来自网络,如有侵犯请联系站长,本文主要讲解的事 如何在Solidity库中使用状态变量函数,如有转载请携带本站链接地址:http://www.tapmw.com/qukuailian/19910.html
-
如何在您的业务中实现区块链?
自从区块链技术的第一款产品比特币(Bitcoin)在2009年上市以来,它一直是交易员和投资者争论的话题。有人说这项技术一点都不可靠,另一方面,也有些人相信这项...
2019-06-11 03:32:42区块链技术90
-
ETH/USDT 深度最佳的以太坊 DEX - Tokenlon
7 月 23 日,福布斯杂志发表了一篇文章,标题是 Ethereum Starts Its DeFi Moon Shot,文章大意是说凭借 DeFi 应用的繁荣,以太坊价格出现了喜人的涨幅。 众所周知,以太...
2020-08-22 10:55:47区块链技术90
-
什么是莱特币 – 比特币是黄金它仍然是白银吗?
在这里,我们再次回顾另一种加密货币。在这篇文章中,我们将讨论市面上最古老的山寨币之一——莱特币。与几乎所有其他数字资产不同的是,莱特币不仅经受...
2019-06-11 03:32:42区块链技术90
-
美国第四修正案不?;け忍乇沂?/a>
第五巡回法院的法官小组最近裁定,第四修正案权利不适用于源自交易所的加密货币交易数据。美国法院判决被告Richard Gratkowski败诉,他试图利用第四修正案提出...
2019-06-11 03:32:42区块链技术90
-
币安季度合约是什么以及如何进行交易?
在过去一年,期货行业呈爆炸式增长,2020年第一季度总交易量超过2万亿美元。 虽然加密资产期货市场仍是新兴市场,但已对现货市场发起了挑战。 在币安交易平...
2019-06-11 03:32:42区块链技术89
-
合约导师安然:一个杀进币圈的十年外汇期货经验职业交易员
2020年7月10日,币安千江月对话币安合约总监Justin币安合约导师安然。安然在直播中和观众分享了他自己多年以来的交易经验,他认为交易手法和风格相适应需要磨...
2019-06-11 03:32:42区块链技术89
-
规范化管理的黄金对比特币的借鉴意义
比特币素有数字黄金之称。如果比特币将成为新一代黄金,那么 2020 年的黄金市场或许就是 2030 年比特币市场的写照。 虽然组成黄金的每个分子在物理属性上都是...
2020-08-22 10:58:21区块链技术89
-
EOS 经济模型详解
本文对 EOS 的经济模型进行了深入研究,重点聚焦 EOS 的供需情况、EOS 网络资源的产生和获得以及 EOS 的投票机制。 EOS的供需情况 EOS 的价格会受到基本面和供需情...
2019-06-11 03:32:42区块链技术95
-
加密货币正在构建自己的文化
很多人看不懂茅台酒价格的上涨,其实行业内人士都明白,其实茅台不单单是卖酒,更重要的是宣传一种酒文化。有人说过,世界上最容易赚钱的就是宗教和文化...
2019-06-11 03:32:42区块链技术94
-
zk rollup(链上数据)与Deversifi的Validium(链下数据)有什么区别?
DeversiFi最近推出了由StarkEx交易引擎提供支持的交易所的最新版本。这是一项令人难以置信的技术成就,它提高了用户可以从加密货币交易所获得的安全性标准。这...
2019-06-11 03:32:42区块链技术90
-
随机数奖励会对区块链游戏产生哪些经济价值?
重点摘 要 ·游戏中的随机数通常分为两类:输入型和输出型。 ·区块链游戏采用随机数机制发放经济奖励,有潜力推动游戏产业增长至万亿级规模。 ·区块链游戏...
2020-08-22 10:59:22区块链技术89
-
以太坊交易签名过程源码解析
向以太坊网络发起一笔交易时,需要使用私钥对交易进行签名。那么从原始的请求数据到最终的签名后的数据,这中间的数据流转是怎样的,经过了什么过程,今...
2019-06-11 03:32:42区块链技术90