在之前的文章:以太坊智能合约逆向分析与实战:(3)[实战篇] 访问私有动态数据类型 中,我们以破解链上某“猜数字”游戏为例,讲解了映射这种动态数据类型在 EVM 中的存储与访问,这次我们把目标对准另一种动态数据类型: 动态数组 ,看看 EVM 是如何实现动态数组的存取。首先我们先看一个简单的合约:图1通过之前的学习,你一定能够轻松地判断出 slot 0 里面的值(没错就是 0x666666 ),但是对于动态数组,它的长度是随时变化的,其内容并不会像这些值类型一样固定在某个 slot 里。那么它是如何存储的呢?让我们先调用 record()函数 ,给动态数组压入一些数值(0xff0000, 0xff0001, 0xff0002,0xff0003), 此时的动态数组长度应该是4,我们通过其 length() 函数也可获知。然后打开调试器看一下:图2与之前讲的映射相比,我们可以发现动态数组的存储方式和映射有一些相似之处,却也有所不同。在动态数组中,进行变量声明的位置(slot2)存放着数组的长度,而数组内各元素的值,是按照 slot n、slot n+1、slot n+2 … 的顺序进...