LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 币圈百科 > 区块链研究实验室|在内存中影射Solidity存储变量

区块链研究实验室|在内存中影射Solidity存储变量

2020-06-24 陀螺财经 来源:火星财经

本文讨论了使用以太坊区块链的智能合约语言中的memory对Solidity的storage变量进行影射处理技术。

在Datona Labs的Solidity智能数据访问合同(S-DAC)模板的开发和测试过程中,我们需要对一些持久数据进行排序,例如:

import"DiSort.sol";contractSDAC100is...{uint[]fileKeys;functionsortFileKeys()internal{DiSort.quickSort(fileKeys);}//...

Solidity具有2个数据位置,即storage和memory。storage在多个智能合约调用之间是持久的,而memory是暂时的,只存在于每个调用中。第三个数据位置称为calldata,实际上与memory相同。

上面代码片段中的数组必须在多个协定调用之间是持久的,因此它必须驻留在storage中。

但是访问storage比memory消耗更多的气体,因此访问数据的算法都将非常昂贵。

任何一种传统的排序算法,如插入排序或快速排序,都需要大量的数据访问来进行元素比较和交换。非比较排序(如Counting_sort)可节省元素比较和交换的时间,但仅适用于已知的小范围数字。

必须重写排序算法,以便找到正确的数据位置,例如:

functionquickSort(uint[]storagedata)internal{//...

影射数据

减少耗气量是将持久性存储阵列复制到memory(影射原始数据),执行排序,然后再次将阵列复制回。

functionsortFileKeys()internal{uint[]memoryshadow=fileKeys;DiSort.quickSort(shadow);fileKeys=shadow;}

此函数消耗气体以便在数据位置之间复制阵列,但与排序成本相比,这是否微不足道?

让我们测量一些示例数据来找出答案。

我们将在storage和影射memory数据位置中测量不同的排序算法。元素值将使用伪随机数生成器生成,该生成器生成一个确定的值序列。

结果

运行所有合约并将数据整理到电子表格中以产生以下结果。

请注意,计数排序比存储中的快速排序和插入排序要快得多(图1)。

请注意,从storage复制到memory(S => M)并再次返回(M => S)的成本占了天然气的消耗量(图2)。

显示了组合曲线以进行比较(图3)。

计数排序在storage方面几乎与影射memory一样快(图3)。那是因为它跳过了所有昂贵的元素比较和交换。不幸的是,计数排序仅适用于元素值在较小已知范围内的情况。

另外,尽管由于在不同数据位置(图2中的S=>M和M=>S)之间复制阵列而导致额外的气体消耗,但使用影射memory的比较排序(此处的快速排序和插入排序)的气体消耗是使用storage的6倍(图3)。

顺便说一句,如果在调用排序例程之前数据可能处于排序状态,则只有在数据已更改的情况下,才将数组从内存复制回存储区将是有益的。

functionsortFileKeys()internal{uint[]memoryshadow=fileKeys;if(DiSort.quickSort(shadow))//ifdatahaschangedfileKeys=shadow;}

在这种情况下,排序例程将需要修改以指示数据是否已更改。

结论

在Solidity的存储数据位置使用排序非常昂贵,因此始终值得将数据影射在内存数据位置并在那里进行排序。

使用影射技术也可以使执行许多数据访问的其他算法受益。

至于排序算法,请使用“快速排序”或“插入排序”。后者是一种更简单的算法,因此产生的字节码更少。

------------------------------------------

原文作者:Julian Goddard

原文链接:https://medium.com/coinmonks/shadowing-solidity-storage-variables-in-memory-b56f471edd81

译者:链三丰

本文来源:陀螺财经
原文标题:区块链研究实验室|在内存中影射Solidity存储变量

—-

编译者/作者:陀螺财经

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

知识 存储
LOADING...
LOADING...