Solidity----view、storage的gas花费

本文探讨了在以太坊DApp中优化gas消耗的方法,包括合理使用view函数以减少玩家成本,以及避免不必要的存储写入来降低费用。view函数在外部调用时无需消耗gas,但若由非同一合约内的函数调用则会产生成本。存储操作尤其是写入操作极其昂贵,应尽可能避免。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、“view” 函数不花 “gas”

当玩家从外部调用一个view函数,是不需要支付一分 gas 的。

这是因为 view 函数不会真正改变区块链上的任何数据 - 它们只是读取。因此用 view 标记一个函数,意味着告诉 web3.js,运行这个函数只需要查询你的本地以太坊节点,而不需要在区块链上创建一个事务(事务需要运行在每个节点上,因此花费 gas)。

所以,在只读的函数上标记上表示“只读”的“external view 声明,就能为你的玩家减少在 DApp 中 gas 用量。

注意:如果一个 view 函数在另一个函数的内部被调用,而调用函数与 view 函数的不属于同一个合约,也会产生调用成本。这是因为如果主调函数在以太坊创建了一个事务,它仍然需要逐个节点去验证。所以标记为 view 的函数只有在外部调用时才是免费的。

2、storage是非常昂贵的

”写入“操作尤其贵。

这是因为,无论是写入还是更改一段数据, 这都将永久性地写入区块链。需要在全球数千个节点的硬盘上存入这些数据,随着区块链的增长,拷贝份数更多,存储量也就越大。这是需要成本的!

为了降低成本,不到万不得已,避免将数据写入存储。这也会导致效率低下的编程逻辑 - 比如每次调用一个函数,都需要在 memory(内存) 中重建一个数组,而不是简单地将上次计算的数组给存储下来以便快速查找。

 

参考:CryptoZombies

Solidity是一种用于编写智能合约的高级编程语言,主要用于以太坊区块链平台。以下是关于Solidity开发的一些关键点: ### 1. **基础知识** - **定义**:Solidity是由 Gavin Wood 等人设计的一种面向合约的语言,语法类似于JavaScript。它允许开发者创建自动化的、不可篡改的合约,并将其部署到区块链上运行。 - **特点**: - 支持复杂的用户自定义类型; - 强大的库支持(如 SafeMath 库防止溢出攻击); - 内置事件机制方便追踪状态变化。 ### 2. **环境搭建** 开发Solidity通常需要安装以下工具: - **Remix IDE**:基于浏览器的IDE,适合初学者快速入门和测试简单的智能合约。 - **Truffle Suite**:一套完整的开发框架,包括编译器、测试工具等,适用于大型项目管理。 - **Hardhat**:另一个流行的本地开发环境,提供丰富的插件生态系统,便于调试和优化性能。 ### 3. **核心概念** - **合约结构**:每个Solidity文件可以包含多个合约声明,其中每个合约都有自己的属性(变量)、函数和其他内部逻辑。 - **权限控制**:通过`msg.sender`获取当前发起交易者的地址,结合修饰符(`modifier`)实现对特定操作的身份验证或限制访问范围。 - **Gas费用优化**:由于每笔链上交互都要消耗一定的gas成本,在编码时需尽量减少不必要的计算量并合理规划数据存储位置(内存 vs 存储)。 ### 示例代码片段 ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract SimpleStorage { uint storedData; function set(uint x) public { storedData = x; } function get() public view returns (uint) { return storedData; } } ``` 此段程序展示了如何建立一个基本的数据存取功能,即外部账户能够调用`set()`方法更新字段值而无需直接修改底层数据库表;同时其他任何人也可以随时读回最新结果而不改变其状态。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值