博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Solidity高级理论(二):Gas
阅读量:6035 次
发布时间:2019-06-20

本文共 1340 字,大约阅读时间需要 4 分钟。

solidity高级理论(二):Gas

关键字:Gas、结构体、节省小技巧

Gas是什么

在Solidity中,用户想要执行DApp都需要支付一定量的Gas,Gas可以用以太币购买,所以,用户每次使用DApp都会发费以太币。

一个 DApp 收取多少 gas 取决于功能逻辑的复杂程度。每个操作背后,都在计算完成这个操作所需要的计算资源,(比如,存储数据就比做个加法运算贵得多), 一次操作所需要花费的 gas 等于这个操作背后的所有运算花销的总和。

由于运行你的程序需要花费用户的真金白银,在以太坊中代码的编程语言,比其他任何编程语言都更强调优化。同样的功能,使用笨拙的代码开发的程序,比起经过精巧优化的代码来,运行花费更高,这显然会给成千上万的用户带来大量不必要的开销。

gas是计算费用的方式。不过,这些费用仍然是以ether计算,这与gas不同。gas成本是工作量,如劳动时数,而gas价格就像您为完成工作付出的小时工资。 两者的组合决定了您的总交易费用。如果您的gas价格太低,没有人会处理您的交易。如果您的gas价格不错,但交易的gas成本超过预算,交易失败,但仍然被打包进区块,劳动者工作了,您不会获得退款。这样确保没有任何东西永远运行,而且人们会对他们运行的代码注意一点。 它使矿工和用户都能安全避免错误的代码!

节省Gas的小技巧

其实很多人觉得,使用uint变种会节省gas,如uin8,其实并不是,即使使用uint8,solidity还是会为它保留256位的存储空间。

例如,使用uint8而不是使用uint256,消耗的gas是一样的。

结构封装(Struct packing)

有一种办法可以节省gas,那就是把uint绑定到struct里面。

如果一个struct中有多个uint,则尽可能使用较小的uint,solidity会将这些uint打包在一起,从而占用较小的存储空间。例如:

struct da{        uint a;        uint b;        uint c;    }    strcut xiao{        uint32 a;        uint32 b;        uint c;    }    da normal = da(10, 20, 30);    xiao mini = xiao(10, 20, 30);    // 因为使用了结构打包,‘xiao’比‘da’占用的空间更少

这样就符合大家的逻辑了,使用uint32比uint256节省了很多的gas。

所以,当 uint 定义在一个 struct 中的时候,尽量使用最小的整数子类型以节约空间。 并且把同样类型的变量放一起(即在 struct 中将把变量按照类型依次放置),这样 Solidity 可以将存储空间最小化。例如,有两个 struct:

uint c; uint32 a; uint32 b; 和 uint32 a; uint c; uint32 b;

前者比后者需要的gas更少,因为前者把uint32放一起了。

知识星球二维码380.png

转载于:https://www.cnblogs.com/tokenpai/p/9175965.html

你可能感兴趣的文章
实验05博客园总结
查看>>
(转)shell中括号的特殊用法 linux if多条件判断
查看>>
zabbix监控多tomcat实例
查看>>
CSS定宽居中的实现方案
查看>>
Elasticsearch5.x 升级
查看>>
vue中嵌套页面(iframe)
查看>>
[古怪问题] Marshal.GetActiveObject 在管理员模式下无法正常运行
查看>>
1600802047 android 第三次作业(音乐播放器)
查看>>
初窥Linux 之 最常用20条命令
查看>>
Vue优化首页加载速度 CDN引入
查看>>
DML数据操作语言之常用函数
查看>>
angular搭建
查看>>
网络编程 --ftp01上传
查看>>
CentOS 6.5升级Python和安装IPython(亲测可用)
查看>>
cocos2d基本类介绍 director/scene/layer/sprite
查看>>
生成、打包、部署和管理应用程序及类型(3):将模块合并成程序集
查看>>
随机生成300道四则运算
查看>>
C#基础语法总结
查看>>
⽹站部署到阿里服务器及域名配置流程
查看>>
dubbo源码—dubbo简介
查看>>