本文作者:jackson[1]
最近看到一个很有意思的项目 FORT,说他有意思,一个是其产品的逻辑新颖,折现计算机和无限流动性,这些看起来很技术化的概念有意思。另外一个是其合约的写法有很多有意思的地方。在其中就看到了一种通过对数据进行编码的 gas 优化方法,下面对这种方法做一个简单的分析。
我们知道,以太坊上 gas 消耗最大的跟存储相关的指令,因此针对存储进行优化是一个重要的方向。而在做项目的时候,一些数据,像价格,余额等,通常都用 uint256 来表示,这是一个以太坊存储槽的大小,也就是说,一个价格就需要单独占用一个存储槽。因为不同的代币,精度和价格相差极大,导致我们不能简单的用更小的数据类型来表示价格,而这个问题,在 FORT 的代码里面有一种很简单高效的解决方法,下面是从其 github 上的代码:
如上图所示,其通过_encodeFloat()方法将 uint256 编码成一个 uint56,通过_decodeFloat()两个方法,将编码的 uint56 解码成 uint。从而让原本需要占用 256 位的数据压缩到了 56 位,这个压缩比还是很高的。那么,这是什么原理呢?
这种方法采用 50 位存储 fraction,这决定了数据的精度,经过计算可知,这可以达到 15 位 10 进制有效数字的精度,这是一个极高的精度,用于表示价格这样的数据,在通常情况下是完全足够的。
这种表示方法能够表示超大的数据范围,同时提供极高的精度,具体精度可以通过调整 fraction 占用的位数来按需调整。这是一种通用方法,当目标数据符合此特征时,可以采用此方法表示,从而大大节省存储空间,优化 gas 消耗。
FORT 合约代码里面有很多类似的技巧,可以看出,开发者在节省 gas 上是煞费苦心,其中很多技巧是通用解决方案,我准备后续继续写一系列的文章来解读这些技巧,另外,为了更好的理解合约,我也会研究合约的结构并记录下来。
[1]
jackson: https://learnblockchain.cn/people/245