-
bitcoin $77709.100515 USD
1.62% -
ethereum $2492.425806 USD
1.87% -
tether $0.999129 USD
0.01% -
bnb $757.919161 USD
4.46% -
xrp $1.326644 USD
1.83% -
usd-coin $0.999883 USD
0.00% -
solana $105.801069 USD
5.74% -
tron $0.336062 USD
0.26% -
zcash $1493.817548 USD
9.92% -
hyperliquid $87.820963 USD
10.59% -
dogecoin $0.084335 USD
3.93% -
monero $532.699812 USD
7.43% -
chainlink $11.814085 USD
5.52% -
unus-sed-leo $8.892918 USD
-0.42% -
cardano $0.214025 USD
7.76%
智能合同存储如何工作?
Smart contract storage in Ethereum is a persistent key-value store where variables like state data are kept, with gas costs for reading and writing, and optimized through slot packing and efficient data structuring.
2025/07/29 07:35
了解智能合同存储机制
智能合约存储是区块链技术的一个基本方面,尤其是在以太坊等平台中。存储是指合同在函数调用之间维护的持久数据。与内存或堆栈(在每次交易之后都是暂时的和重置)不同,存储是持久的,并且无限期保留在区块链上。合同中声明的每个变量(例如状态变量)都存储在存储中,访问或修改该数据会损害气体成本。
在以太坊中,存储被实现为一个键值存储,每个键是一个32字节插槽,每个值也为32个字节。该结构被称为存储Trie ,它是整个以太坊状态Trie的一部分。变量对存储插槽的映射由编译器(例如,固定)确定,理解此映射对于优化气体使用至关重要。
变量如何存储在智能合约中
当开发人员在固体中声明变量时,编译器会确定它们如何包装到存储插槽中。例如,如果多个变量符合一个32字节的插槽,则将它们包装在一起以节省空间并降低气体成本。但是,此行为取决于所使用的变量的类型。如果较小的数据类型(例如uint8 , bool或address连续声明,则可以将其存储在一起。
相反,诸如uint256或string类的较大类型占据了自己的存储插槽。动态阵列和映射更为复杂,因为它们的数据未直接存储在声明的插槽中。取而代之的是,插槽用作基本参考,并且使用哈希功能将实际数据存储在派生位置。例如,动态阵列的长度存储在基本插槽中,而元素则存储在keccak256(baseSlot) + index上。
汽油成本和存储访问效率
访问和修改存储是以太坊中最昂贵的操作。从存储(SLOAD)阅读的读数为100天气,而写入(SSTORE)的质量要昂贵得多。写作成本取决于该值是从零变为非零(20,000气),非零为非零(5,000气体)还是非零的零变为零(退还气体)。该气体模型激发开发人员,以最大程度地减少存储访问并优化数据的结构方式。
一种有效的优化是将多个变量填充到一个存储插槽中。例如,将bool , uint8和uint16组合到一个插槽中可以减少SSTORE操作的数量。另一种优化涉及仅在必要时使用映射或数组,因为它们的存储逻辑更为复杂且昂贵。
复杂数据结构中的存储布局
复杂的数据结构(例如映射和结构)需要更深入地了解如何分配存储。映射没有长度,其键没有直接存储。取而代之的是,映射m中的键k的值存储在keccak256(k ++ m_slot)上,其中++表示串联。这种哈希机制可确保每个钥匙映射到唯一的存储位置。
从第一个声明的变量开始,结构依次存储在存储中。如果一个结构包含适合单个插槽的多个变量,则它们会被包装在一起。但是,根据编译器的规则,可以在变量之间添加填充物以进行对齐。了解结构布局对于在阅读或编写结构成员时优化存储和降低气体成本至关重要。
检索和修改存储数据
为了从智能合约的存储中检索数据,可以使用web3.js或ethers.js之类的外部工具来查询区块链。这些库提供了诸如getStorageAt(address, position)之类的方法,使开发人员可以在特定插槽中检查存储。但是,解释返回的数据需要了解合同使用的存储布局和编码方案。
修改存储是通过更新状态变量的函数调用来完成的。由于每次修改成本,开发人员通常会批量更新或使用临时内存变量来计算最终值,然后再将其提交存储。此外,使用事件(日志)可以帮助跟踪存储更改,而无需查询整个存储trie ,从而使链式监视效率更高。
智能合约存储中的安全考虑
不当处理存储会导致漏洞,例如存储碰撞,未经授权的访问或气体耗尽攻击。使用非初始化的指针或不正确的插槽计算的合同可能会覆盖意外数据。此外,如果映射或阵列公开暴露而没有适当的访问控制,则外部合同可能会操纵存储。
一个常见的攻击向量是代理合同中的存储碰撞,该合同和代理合同共享相同的存储布局。如果布局不匹配,则升级可能会损坏现有数据。为了减轻这种情况,开发人员应使用透明的代理或UUP(通用可升级的代理标准)等良好的升级模式。
常见问题
问:我可以直接访问另一个合同的存储空间吗?不,您不能直接从智能合同中读取另一个合同的存储空间。诸如web3.js或ethers.js之类的外部工具可用于查询链链的存储插槽,但链访问仅限于合同自己的存储空间。
问:坚固性存储与内存之间有什么区别?存储是持久的,并保留在交易之间的数据,而内存是暂时的,并且在每个功能调用后都清除。与存储器相比,关于气体的存储操作更昂贵。
问:在存储修改期间,天然气退款如何工作?当将存储插槽设置为零(即清除)时,将应用气体退款。这鼓励开发人员清理未使用的数据。但是,退款是有限的,仅部分抵消了最初的撰写本储备成本。
问:是否在区块链上加密存储变量?不,所有存储在智能合约中的数据都是公开的,并且可访问区块链的任何人都可以看到。如果需要隐私,则开发人员必须在链上实施加密机制或使用隐私保护技术,例如零知识证明。
免责声明:info@kdj.com
所提供的信息并非交易建议。根据本文提供的信息进行的任何投资,kdj.com不承担任何责任。加密货币具有高波动性,强烈建议您深入研究后,谨慎投资!
如您认为本网站上使用的内容侵犯了您的版权,请立即联系我们(info@kdj.com),我们将及时删除。
- 随着 Avalanche Chain 拥抱代币化基金和机构增长,AVAX 价格飙升
- 2026-09-18 16:50:01
- 日本央行加息:日元、比特币和套利交易的平仓
- 2026-09-18 12:50:01
- XRP Ledger 通过重大更新拥抱原生借贷和交易捆绑
- 2026-09-18 12:30:01
- CFTC 为被动加密货币交易软件提供经纪商注册减免,标志着更广泛的监管转变
- 2026-09-18 12:55:01
- 美国收紧控制:在海事支付调查中针对伊朗加密货币交易所 BitBank 实施新制裁
- 2026-09-18 12:45:01
- 美国财政部制裁伊朗交易所 BitBank 超过 10 亿美元的加密货币流动:纽约观点
- 2026-09-18 12:55:01
相关百科
如何查看SOL期货成交量和持仓量?
2026-09-14 00:40:03
访问 SOL 期货市场数据1. 前往SOL永续合约或季度合约上市的官方交易平台,例如Bybit、OKX或Bitget。 2. 找到SOL/USDT或SOL/USD期货交易对页面,切换到“合约概览”或“市场数据”选项卡。 3. 识别标记为“交易量(24 小时)”和“未平仓合约”的实时字段,这两个字段通...
如何查看XRP期货交易量和持仓量?
2026-09-15 05:00:12
访问实时 XRP 期货数据1. 访问列出 XRP 永续合约和季度期货合约的主要衍生品交易所,包括 Binance、Bybit、OKX 和 Bitget。 2. 导航至XRP/USDT或XRP/USD交易对页面,找到实时显示交易量和持仓量数据的市场深度面板。 3. 确认显示的持仓量是否反映了多头/空头...
如何查看DOGE期货成交量及持仓量?
2026-09-12 08:39:38
了解 DOGE 期货交易量1. 期货交易量是指在特定时间范围内交易的DOGE份期货合约的总数,通常以每天或每小时计算。 2. 高成交量通常表明市场参与度较高,并且可以表明潜在的趋势延续或逆转,具体取决于价格走势背景。 3. 交易者监控交易量峰值以及突破或崩溃,以评估合法性——交易量上升支持的持续价格...
如何查看ETH期货交易量和持仓量?
2026-09-16 19:00:18
访问实时 ETH 期货数据1. Binance、Bybit和OKX等主要中心化交易所提供实时仪表板,显示ETH永续和季度期货交易量和持仓量。这些指标每 5-10 秒更新一次,无需登录其公开市场页面即可访问。 2. Glassnode、CryptoQuant 和 Coinglass 等链上分析平台可以...
如何查看BTC期货交易量和持仓量?
2026-09-12 15:19:55
BTC期货指标的数据源1. CoinGlass API v4 提供 30 多个交易所的实时融资利率、清算热图和精细的未平仓合约细分。 2. 币安期货 API 提供对买卖深度、合约特定交易量历史记录和保证金比率快照的本机访问。 3. OKX 数据门户提供可下载的 CSV 档案,其中包含每日结算价格、按...
如何看懂DOGEUSDT永续合约图表?
2026-09-11 19:19:48
了解 DOGEUSDT 永续图表上的价格走势1. 蜡烛图的形成揭示了直接的市场情绪——绿色蜡烛表示买盘占主导地位,而红色蜡烛则反映该区间内的抛售压力。 2. 实体上方和下方的灯芯信号拒绝更高或更低的价格;在波动较大的模因币市场中,长上影线通常先于短期反转。 3. 接近关键水平的连续小实体蜡烛表明在突...
如何查看SOL期货成交量和持仓量?
2026-09-14 00:40:03
访问 SOL 期货市场数据1. 前往SOL永续合约或季度合约上市的官方交易平台,例如Bybit、OKX或Bitget。 2. 找到SOL/USDT或SOL/USD期货交易对页面,切换到“合约概览”或“市场数据”选项卡。 3. 识别标记为“交易量(24 小时)”和“未平仓合约”的实时字段,这两个字段通...
如何查看XRP期货交易量和持仓量?
2026-09-15 05:00:12
访问实时 XRP 期货数据1. 访问列出 XRP 永续合约和季度期货合约的主要衍生品交易所,包括 Binance、Bybit、OKX 和 Bitget。 2. 导航至XRP/USDT或XRP/USD交易对页面,找到实时显示交易量和持仓量数据的市场深度面板。 3. 确认显示的持仓量是否反映了多头/空头...
如何查看DOGE期货成交量及持仓量?
2026-09-12 08:39:38
了解 DOGE 期货交易量1. 期货交易量是指在特定时间范围内交易的DOGE份期货合约的总数,通常以每天或每小时计算。 2. 高成交量通常表明市场参与度较高,并且可以表明潜在的趋势延续或逆转,具体取决于价格走势背景。 3. 交易者监控交易量峰值以及突破或崩溃,以评估合法性——交易量上升支持的持续价格...
如何查看ETH期货交易量和持仓量?
2026-09-16 19:00:18
访问实时 ETH 期货数据1. Binance、Bybit和OKX等主要中心化交易所提供实时仪表板,显示ETH永续和季度期货交易量和持仓量。这些指标每 5-10 秒更新一次,无需登录其公开市场页面即可访问。 2. Glassnode、CryptoQuant 和 Coinglass 等链上分析平台可以...
如何查看BTC期货交易量和持仓量?
2026-09-12 15:19:55
BTC期货指标的数据源1. CoinGlass API v4 提供 30 多个交易所的实时融资利率、清算热图和精细的未平仓合约细分。 2. 币安期货 API 提供对买卖深度、合约特定交易量历史记录和保证金比率快照的本机访问。 3. OKX 数据门户提供可下载的 CSV 档案,其中包含每日结算价格、按...
如何看懂DOGEUSDT永续合约图表?
2026-09-11 19:19:48
了解 DOGEUSDT 永续图表上的价格走势1. 蜡烛图的形成揭示了直接的市场情绪——绿色蜡烛表示买盘占主导地位,而红色蜡烛则反映该区间内的抛售压力。 2. 实体上方和下方的灯芯信号拒绝更高或更低的价格;在波动较大的模因币市场中,长上影线通常先于短期反转。 3. 接近关键水平的连续小实体蜡烛表明在突...
查看所有文章














