分享百科

以太坊

本视频讲解了动态数组在EBM内存中的存储方式,并通过两个示例进行说明。第一个示例中,初始化一个包含五个元素的动态UN256数组(11, 22, 33, 44, 55),使用汇编语言获取该数组的指针、长度及三个元素。通过指针R,我们可以访问数组的起始内存地址,并利用mload指令读取数组长度和元素。第二个示例中,初始化动态数组并使用汇编存储元素。首先获取指针R,然后更新数组长度为3,并存储三个元素(11, 22, 33)。最后,更新自由内存指针以确保ABI编码正确。通过调用test read和test write函数,验证了数组的长度和元素值的正确性,指针指向内存地址0x80。
425
0
0
2025-01-27 08:59
本文介绍了在EBM内存中固定大小数组的存储方式。即使数据类型不需要32字节,每个元素仍然占用32字节。例如,定义一个大小为3的UN32类型固定大小数组时,每个元素在内存中分别存储在0x80、0xA0和0xC0位置。通过汇编语言,可以将数据写入这些元素。示例中,使用mstore指令将数字11、22和33分别存储在数组的三个索引中。最后,通过常规的Solidity语法验证存储的数据,确保读取到的值与写入的值一致。该示例展示了在EBM内存中如何处理固定大小数组的存储和访问。
439
0
0
2025-01-27 08:59
在Solidity中,状态变量会被打包存储,而内存中的数据则以32字节为单位存储。例如,若有一个UN256变量后跟两个UN32变量,后两个UN32会被打包到一个槽中,但在内存中,每个变量都占用32字节。通过一个名为testRead的函数示例,展示了如何在内存中初始化一个结构体point,并将其值存储在内存地址0x80开始的位置。接着,使用汇编代码读取point的x、y、z值,并展示如何通过内存地址进行存储和读取。另一个函数testWrite则演示了如何将数据写入结构体,并更新自由内存指针。执行这些函数后,能够验证存储的值和更新后的自由内存指针位置。
438
0
0
2025-01-27 08:59
在以太坊虚拟机(EVM)中,使用内存的气体成本呈现出二次增长的特性。根据evm.codes网站的公式,内存的气体成本可以通过简化后的方程进行计算。假设每个uint256占用32字节内存,内存大小以字为单位进行计算。通过图形计算器绘制该方程,可以观察到气体成本随着内存分配的增加而增加。通过在Solidity中编写代码,测试不同大小的uint256数组的气体成本,发现小规模内存使用时,气体成本呈线性增长,而在大规模内存使用时,气体成本则呈现出明显的二次增长。这意味着在代码中使用大量内存将受到限制。总之,EVM中内存的气体成本随着使用量的增加而显著上升。
426
0
0
2025-01-27 08:59
在Solidity中,使用汇编语言操作EBM内存时,主要使用mStore和mLoad指令。mStore用于将32字节的数据存储到指定内存位置,而mLoad则用于从指定内存位置读取32字节的数据。首先,需要获取自由内存指针,通常从0x40开始。通过mStore可以将数据写入自由内存,例如将0xababab存储到0x80位置。接着,使用mLoad从该位置读取数据并返回。示例中展示了如何在内存中写入和读取数据,并通过调试观察内存变化。此外,mStore的存储位置不必是32的倍数,存储时会用0填充至32字节。通过多个示例,展示了不同内存位置的写入和覆盖情况,强调了内存操作的细节和影响。
442
0
0
2025-01-27 08:59
EBM内存可以视为一个字节数组,每个元素存储一个字节,理论上可容纳2的256次方个元素,但实际可用内存有限,因为分配内存的成本是平方级别的。读取和写入内存的操作通常以32字节为单位进行。Solidity为内存分配了三个特殊区域:前64字节为临时空间,接下来的32字节存储自由内存指针,指向可以存储新数据的区域。存储数据需使用mStore函数,该函数接受两个输入:p(写入起始位置)和b(要存储的数据)。例如,mStore0将值0xFF写入内存位置0,左侧填充31个00。内存写入位置不必是32的倍数,mStore2将值0xCC写入位置2,同样填充为32字节。接下来的视频将展示如何使用汇编在Solidity中存储数据。
479
0
0
2025-01-27 08:58
本文讨论了在EBM StorageStot中动态数组结构体的数据存储方式。以一个名为point的结构体为例,其包含三个字段:uint256类型的x和两个uint128类型的y和z。动态数组R存储多个point结构体。数据存储时,动态数组的每个元素占用两个槽位,计算元素槽位的方法是:取动态数组声明槽位的Ketschak 256值,加上元素索引乘以结构体大小。具体来说,uint256占用一个槽位,两个uint128各占用16字节,因此y和z将存储在第二个槽位。通过汇编语言读取数据时,动态数组的长度存储在声明槽位,x、y和z的值则分别存储在相应的槽位中。通过特定的计算公式,可以访问和提取这些值。最终,示例代码展示了如何获取动态数组中各个元素的值。
418
0
0
2025-01-27 08:58
本视频介绍了如何定位复杂数据结构的存储槽,特别是动态数组的映射。假设每个动态数组元素占32字节,以一个从地址到uint256的映射为例,讲解了如何计算存储槽。首先,映射中值的存储槽通过对映射声明的槽和键进行Keccak-256哈希计算得出。对于动态数组,元素的存储槽则是映射槽加上元素索引的哈希值。视频中还展示了如何通过汇编代码将数据存入映射,并获取动态数组的值和长度。通过实例,演示了如何获取特定地址的动态数组元素及其长度,确保了对存储槽计算规则的理解。
435
0
0
2025-01-27 08:58
本文讨论了如何计算嵌套映射中值的存储槽。对于简单映射,值的存储槽通过对键和声明映射的槽进行Ketchak 256哈希计算得出。而在嵌套映射中,存储槽的计算则需要进行两次Ketchak 256哈希。首先,使用外层键和声明映射的槽进行哈希,然后将内层键与内层哈希结果进行哈希。通过示例,文章展示了如何在以太坊智能合约中实现这一过程,包括如何使用汇编语言计算存储槽并提取存储的值。最终,通过调用函数验证了嵌套映射的值存储是否正确,成功获取了多个值。
434
0
0
2025-01-27 08:58
在以太坊的合约编程中,映射的存储槽通过计算Ketchak 256哈希值来确定。以一个简单的例子说明,假设我们有一个从地址到Uint 256的映射,其中每个值占用32字节的一个槽。映射的存储槽由映射键的Ketchak 256值和映射声明的槽(例如槽0)共同决定。通过一个汇编函数,我们可以获取存储在映射中的值。该函数接受一个地址作为参数,计算出对应值的存储槽,并使用Sload指令加载该槽的值。通过调用该函数,我们可以验证不同地址对应的值,例如地址1返回11,地址2返回22,地址3返回33。此过程展示了如何在以太坊合约中有效地存储和检索映射数据。
415
0
0
2025-01-27 08:58
本文讨论了动态数组在存储槽中的存储方式,特别是如何计算数组元素的存储位置。以动态数组类型为例,元素的存储位置由数组声明的槽位加上元素大小和元素索引的乘积决定。以uint256类型的动态数组为例,0号元素存储在声明槽位的256位置,1号元素则在该位置加上元素大小和索引的乘积。接着,文章通过uint128类型的动态数组示例,详细说明了元素的存储过程及其在EVM存储槽中的位置。最后,介绍了如何使用汇编语言编写函数来获取这些元素,包括获取数组长度和元素值的过程。通过示例调用函数,展示了如何提取动态数组中的元素及其32字节表示,帮助理解数据在存储中的布局。
434
0
0
2025-01-27 08:58
本文介绍了固定大小数组在存储槽中的元素存储方式。以一个大小为3的uint256数组为例,数组元素的存储位置由数组声明的槽加上元素的索引决定。第一个元素存储在槽0,第二个元素在槽1,第三个元素在槽2。对于另一个大小为3的uint256数组,起始槽为3,元素分别存储在槽3、槽4和槽5。若数组元素小于32字节,则可以打包存储,例如uint128数组的元素可以在同一槽中存储两个。通过汇编语言实现获取数组元素的函数,分别针对不同数组的起始槽和索引进行计算。最后,通过调用这些函数验证了元素的正确性,展示了如何通过索引访问数组元素及其存储机制。
427
0
0
2025-01-27 08:57
在Solidity智能合约中,常量和不可变变量不占用存储槽。例如,定义了两个状态变量s0和s1,分别赋值为1和2。在这两个状态变量之间,定义了一个常量x和一个不可变变量owner。常量在合约代码中被硬编码,不占用存储槽;而不可变变量在合约构造函数中初始化后,也以占位符形式硬编码,部署时替换为实际值。通过创建一个函数读取存储槽,可以验证s0和s1分别存储值1和2,而常量x和不可变变量owner则不占用任何存储槽。最终结果表明,常量和不可变变量的值直接嵌入合约字节码中。
437
0
0
2025-01-27 08:57
本视频讲解了如何为存储单个结构体的状态变量分配存储槽。状态变量的存储遵循声明顺序,且小于32字节的数据会尽可能打包到一个槽中。例如,名为single的结构体包含一个uint128类型的字段x(占16字节),接下来的两个uint64类型字段y和z也会存储在同一个槽中。另一个名为multi-slots的结构体则从槽1开始存储,字段a、b和c分别占用槽1、2和3。视频还展示了如何使用汇编语言读取存储在不同槽中的数据,包括如何通过位运算提取各字段的值。通过调用相应的函数,可以验证存储的值是否正确。整体上,视频深入探讨了以太坊虚拟机(EVM)中状态变量的存储机制及其实现方式。
431
0
0
2025-01-27 08:57
在EBM存储中,数据小于32字节时可以打包到一个槽中。视频中介绍了如何读取和写入打包在单个槽中的状态变量,使用了位掩码技巧。首先,声明了一些状态变量以适应单个槽,例如uint128、uint64、uint32等。接着,展示了如何通过位掩码清除和更新这些状态变量的值。通过创建适当的位掩码,可以在不影响其他变量的情况下更新特定的状态变量。最后,介绍了如何使用状态变量的.slot和.offset属性来替代硬编码的槽和偏移量,从而简化代码。通过这些方法,可以有效地管理和操作存储在单个槽中的多个状态变量。
425
0
0
2025-01-27 08:57
登链社区