-
bitcoin $103163.554157 USD
-3.05% -
ethereum $3440.538470 USD
-4.50% -
tether $0.999930 USD
0.00% -
xrp $2.408381 USD
-5.38% -
bnb $962.292695 USD
-3.83% -
solana $155.202339 USD
-7.60% -
usd-coin $1.000166 USD
0.01% -
tron $0.298210 USD
0.35% -
dogecoin $0.172672 USD
-5.44% -
cardano $0.558494 USD
-6.71% -
hyperliquid $38.819383 USD
-5.91% -
chainlink $15.335896 USD
-7.06% -
bitcoin-cash $507.908940 USD
-3.06% -
stellar $0.282633 USD
-6.38% -
unus-sed-leo $9.242665 USD
0.58%
Solidity 中的映射是什么?它如何存储键值对?
Mappings in Solidity enable efficient, gas-optimized key-value storage using keccak256 hashing, ideal for balances, access control, and lookup-heavy smart contract use cases.
2025/11/10 12:20
了解 Solidity 中的映射
1. Solidity中的映射是一种引用类型,用于以键值对的形式存储数据,类似于其他编程语言中的哈希表或字典。它允许开发人员将唯一键与特定值关联起来,从而实现高效的查找和更新。
2. 声明映射的语法是mapping(keyType => valueType) ,其中 keyType 几乎可以是任何基本类型,例如 uint、地址或字节,但不能是数组或其他映射等引用类型。 valueType 可以是任何类型,包括结构体、数组,甚至其他映射。
3. 映射在合约内声明,通常用于维护状态变量。由于它们存储在存储中,因此它们的值在函数调用和事务中持续存在。
4. 映射的一个定义特征是它们不能迭代。没有内置机制来检索键或值列表。这种限制源于以太坊存储模型的工作方式——映射是为通过键而不是枚举来快速访问而设计的。
5. 创建映射时,所有可能的键均使用 valueType 的默认值进行初始化(例如,整数为 0,布尔值为 false)。这意味着访问不存在的键会返回默认值而不是抛出错误。
映射背后的存储机制
1. 映射不以传统的表格格式存储数据。相反,Solidity 使用 keccak256 哈希函数来动态计算存储槽。每个键都使用 keccak256 以及映射变量的存储槽位置进行哈希处理。
2. 对于位于存储槽n 的状态变量映射,与给定键关联的值存储在keccak256(key . slot)中,其中 '.'表示串联。这可确保每个键映射到存储中唯一的、确定性的位置。
3. 由于哈希函数是单向的,因此在计算上无法对已设置的密钥进行逆向工程。这导致无法迭代映射。
4. 嵌套映射遵循相同的原则。在像映射(地址=>映射(uint=>bool))这样的映射中,内部映射的槽是通过对外部键和外部映射的槽进行散列确定的,然后使用该结果作为内部键查找的基础。
5. 这种基于散列的存储布局使读取和写入操作的映射非常高效,这两种操作都在恒定时间内执行,而与条目数量无关。
智能合约的实际用例
1. 映射的一种常见用途是跟踪 ERC-20 代币中的用户余额。像mapping(address => uint256) private _balances这样的映射允许快速检索和更新任何钱包地址的代币持有量。
2. 访问控制系统通常使用映射来识别角色或权限。例如,mapping(address => bool) public isAdmin可以有效地验证地址是否具有管理权限。
3. 在去中心化交易所或 NFT 市场中,映射将订单 ID 或代币 ID 链接到结构化数据,例如价格、所有者或列表状态。这使得无需扫描大型数据集即可即时查找交易详细信息。
4. 映射还用于通过在函数执行期间标记地址来防止重入攻击。输入的简单映射(地址 => bool)私有可以充当锁定机制。
5. 由于其gas效率高的访问模式,当需要通过标识符频繁查找时,尤其是在高吞吐量协议中,映射比数组更受青睐。
常见问题解答
映射可以完全删除吗?是的,在映射上使用删除关键字会通过将每个写入的槽重置为其默认值来清除所有条目。但是,由于映射实际上是使用所有键的默认值进行初始化的,因此此操作仅影响显式分配的键。
是否可以从函数返回映射?不,映射不能直接从函数返回,因为它们不是 Solidity 中的有效返回类型。只能返回通过键访问的特定值。
字符串或动态数组可以用作映射键吗?字符串和动态字节数组不能用作映射键。仅允许固定大小的数据类型,例如 bytes32、uint 和地址。如果需要,字符串必须转换为固定大小的格式,例如 bytes32。
映射如何影响天然气成本?从具有未初始化键的映射中读取消耗的气体较少,因为它返回默认值而不修改存储。由于以太坊的状态增长成本规则,写入或更新值会产生更高的gas,特别是如果将零值更改为非零值。
免责声明:info@kdj.com
所提供的信息并非交易建议。根据本文提供的信息进行的任何投资,kdj.com不承担任何责任。加密货币具有高波动性,强烈建议您深入研究后,谨慎投资!
如您认为本网站上使用的内容侵犯了您的版权,请立即联系我们(info@kdj.com),我们将及时删除。
- XNO、BTC、Decred:随着 Nano 的飙升和 Decred 的下滑,驾驭加密货币浪潮
- 2025-11-12 14:40:01
- BONK 价格波动:内幕交易传闻和 Meme 币过山车
- 2025-11-12 15:05:01
- 以太坊、山寨币和长期收益:引领加密货币格局
- 2025-11-12 09:00:00
- 策略股、比特币撤退和市场痛苦:纽约市的视角
- 2025-11-12 08:55:01
- 塔夫脱、退伍军人和致敬:总统荣誉
- 2025-11-12 09:00:00
- 加密货币、突破币和 Meme 币:发生了什么?
- 2025-11-12 09:40:01
相关百科
什么是智能合约中的拒绝服务 (DoS) 攻击?其常见形式有哪些?
2025-11-10 05:20:08
了解智能合约中的拒绝服务1. 智能合约中的拒绝服务(DoS)攻击是指恶意行为者阻止合法用户访问或使用合约功能的情况。这通常是通过利用允许攻击者阻止关键操作的设计缺陷来实现的。与针对 Web 服务器的传统 DoS 攻击不同,基于区块链的 DoS 攻击利用了智能合约的不可变和透明特性。 2. 这些攻击的...
交易签名中使用的加密随机数是什么?
2025-11-11 05:59:39
了解区块链交易中的加密随机数1. 加密随机数是在区块链网络中的交易签名上下文中仅使用一次的随机数或伪随机数。其主要功能是确保每笔交易都是唯一的并且不会被恶意行为者重播。如果没有随机数,相同的交易可能会被多次提交,从而导致意外的转账或余额差异。 2. 在以太坊等系统中,随机数直接与发送者的帐户绑定,并...
Solidity 智能合约中的继承是如何工作的?
2025-11-11 22:40:12
Solidity 的继承:构建模块化智能合约1. Solidity 中的继承允许一个合约采用另一个合约的属性和功能,从而实现代码重用和结构化设计。派生合约可以从基础合约继承,获得对其状态变量、函数和修饰符的访问权限,前提是它们没有标记为私有。该机制支持逻辑的分层组织,减少多个合约之间的冗余。 2. ...
什么是最小代理合约 (EIP-1167) 以及它如何在部署时节省 Gas?
2025-11-12 11:39:42
什么是最小代理合同 (EIP-1167)? 1. 最小代理合约,根据以太坊改进提案 (EIP) 1167 进行标准化,是一种轻量级合约,旨在将调用委托给现有的实施合约。它充当代理,将所有函数调用和交易转发到主合约,而无需在其内部存储逻辑。 2. 核心机制依赖于低级SUCCESS、RETURNDATA...
Solidity 中的库是什么?它与基础合约有何不同?
2025-11-12 09:19:55
了解 Solidity 中的库1. Solidity 中的库是一种特殊类型的合约,旨在保存可重用的函数,这些函数可以在多个合约之间共享而无需继承。这些函数是无状态的,这意味着它们不会自行修改或存储数据,除非显式与另一个合约的存储交互。库对于实现数学计算、数组操作或编码实用程序等常见操作特别有用。 2...
如何安全地将以太币发送到另一个合约?
2025-11-09 18:40:05
将以太币发送到智能合约:关键考虑因素1. 验证接收合约是否具有应付后备功能或能够接受以太币的指定应付功能。如果没有这一点,任何转账都将恢复,并可能永久锁定资金。 2. 与外部合约交互时请谨慎使用address(contract).call{value: amount}('') ,因为...
什么是智能合约中的拒绝服务 (DoS) 攻击?其常见形式有哪些?
2025-11-10 05:20:08
了解智能合约中的拒绝服务1. 智能合约中的拒绝服务(DoS)攻击是指恶意行为者阻止合法用户访问或使用合约功能的情况。这通常是通过利用允许攻击者阻止关键操作的设计缺陷来实现的。与针对 Web 服务器的传统 DoS 攻击不同,基于区块链的 DoS 攻击利用了智能合约的不可变和透明特性。 2. 这些攻击的...
交易签名中使用的加密随机数是什么?
2025-11-11 05:59:39
了解区块链交易中的加密随机数1. 加密随机数是在区块链网络中的交易签名上下文中仅使用一次的随机数或伪随机数。其主要功能是确保每笔交易都是唯一的并且不会被恶意行为者重播。如果没有随机数,相同的交易可能会被多次提交,从而导致意外的转账或余额差异。 2. 在以太坊等系统中,随机数直接与发送者的帐户绑定,并...
Solidity 智能合约中的继承是如何工作的?
2025-11-11 22:40:12
Solidity 的继承:构建模块化智能合约1. Solidity 中的继承允许一个合约采用另一个合约的属性和功能,从而实现代码重用和结构化设计。派生合约可以从基础合约继承,获得对其状态变量、函数和修饰符的访问权限,前提是它们没有标记为私有。该机制支持逻辑的分层组织,减少多个合约之间的冗余。 2. ...
什么是最小代理合约 (EIP-1167) 以及它如何在部署时节省 Gas?
2025-11-12 11:39:42
什么是最小代理合同 (EIP-1167)? 1. 最小代理合约,根据以太坊改进提案 (EIP) 1167 进行标准化,是一种轻量级合约,旨在将调用委托给现有的实施合约。它充当代理,将所有函数调用和交易转发到主合约,而无需在其内部存储逻辑。 2. 核心机制依赖于低级SUCCESS、RETURNDATA...
Solidity 中的库是什么?它与基础合约有何不同?
2025-11-12 09:19:55
了解 Solidity 中的库1. Solidity 中的库是一种特殊类型的合约,旨在保存可重用的函数,这些函数可以在多个合约之间共享而无需继承。这些函数是无状态的,这意味着它们不会自行修改或存储数据,除非显式与另一个合约的存储交互。库对于实现数学计算、数组操作或编码实用程序等常见操作特别有用。 2...
如何安全地将以太币发送到另一个合约?
2025-11-09 18:40:05
将以太币发送到智能合约:关键考虑因素1. 验证接收合约是否具有应付后备功能或能够接受以太币的指定应付功能。如果没有这一点,任何转账都将恢复,并可能永久锁定资金。 2. 与外部合约交互时请谨慎使用address(contract).call{value: amount}('') ,因为...
查看所有文章














