分享百科

映射

视频 AI 总结: 该视频主要讲解了 Solidity 中的引用类型,包括数组、字符串、结构体和映射,以及它们在内存、存储和调用数据中的使用方式和注意事项。重点强调了引用类型与值类型的区别,引用类型通过指针指向数据,避免了大数据拷贝的开销。视频还讨论了 gas 消耗问题,以及如何在智能合约中高效地使用数组和映射,避免潜在的攻击风险。 关键信息: * 引用类型包括数组、字符串、结构体和映射,占用空间大,拷贝开销大,使用指针指向数据。 * 引用类型需要指定存储位置,包括 memory(函数内部,执行完消失)、storage(链上存储,持久存在)和 calldata(只读)。 * 数组分为定长数组和变长数组,变长数组可以使用 push 和 pop 操作。 * 在链上使用循环遍历数组时,需要注意 gas 消耗,避免线性增加,防止攻击。 * 删除数组元素时,可以使用将最后一个元素移动到要删除的位置,然后删除最后一个元素的方法,以减少 gas 消耗。 * 字符串是一种特殊的数组类型,不能用下标获取字符。 * 结构体是自定义的复合类型,可以包含任意类型成员,可以通过顺序或具名方式创建实例。 * 映射是一种键值对存储结构,类似于数据库中的表,key 不能是数组类型,没有长度概念,无法获取 key 或 value 的集合。 * 结构体和映射经常一起使用,结构体可以理解为表的其他字段,key 相当于表的索引。 * 在定义引用类型的变量时,需要额外加一个标识,标识这个变量存储在哪里。
28
0
0
3天前
在以太坊的合约编程中,映射的存储槽通过计算Ketchak 256哈希值来确定。以一个简单的例子说明,假设我们有一个从地址到Uint 256的映射,其中每个值占用32字节的一个槽。映射的存储槽由映射键的Ketchak 256值和映射声明的槽(例如槽0)共同决定。通过一个汇编函数,我们可以获取存储在映射中的值。该函数接受一个地址作为参数,计算出对应值的存储槽,并使用Sload指令加载该槽的值。通过调用该函数,我们可以验证不同地址对应的值,例如地址1返回11,地址2返回22,地址3返回33。此过程展示了如何在以太坊合约中有效地存储和检索映射数据。
902
0
0
2025-01-27 08:58
登链社区