分享百科

智能合约

在以太坊的合约编程中,映射的存储槽通过计算Ketchak 256哈希值来确定。以一个简单的例子说明,假设我们有一个从地址到Uint 256的映射,其中每个值占用32字节的一个槽。映射的存储槽由映射键的Ketchak 256值和映射声明的槽(例如槽0)共同决定。通过一个汇编函数,我们可以获取存储在映射中的值。该函数接受一个地址作为参数,计算出对应值的存储槽,并使用Sload指令加载该槽的值。通过调用该函数,我们可以验证不同地址对应的值,例如地址1返回11,地址2返回22,地址3返回33。此过程展示了如何在以太坊合约中有效地存储和检索映射数据。
413
0
0
2025-01-27 08:58
本文讨论了动态数组在存储槽中的存储方式,特别是如何计算数组元素的存储位置。以动态数组类型为例,元素的存储位置由数组声明的槽位加上元素大小和元素索引的乘积决定。以uint256类型的动态数组为例,0号元素存储在声明槽位的256位置,1号元素则在该位置加上元素大小和索引的乘积。接着,文章通过uint128类型的动态数组示例,详细说明了元素的存储过程及其在EVM存储槽中的位置。最后,介绍了如何使用汇编语言编写函数来获取这些元素,包括获取数组长度和元素值的过程。通过示例调用函数,展示了如何提取动态数组中的元素及其32字节表示,帮助理解数据在存储中的布局。
431
0
0
2025-01-27 08:58
本文介绍了固定大小数组在存储槽中的元素存储方式。以一个大小为3的uint256数组为例,数组元素的存储位置由数组声明的槽加上元素的索引决定。第一个元素存储在槽0,第二个元素在槽1,第三个元素在槽2。对于另一个大小为3的uint256数组,起始槽为3,元素分别存储在槽3、槽4和槽5。若数组元素小于32字节,则可以打包存储,例如uint128数组的元素可以在同一槽中存储两个。通过汇编语言实现获取数组元素的函数,分别针对不同数组的起始槽和索引进行计算。最后,通过调用这些函数验证了元素的正确性,展示了如何通过索引访问数组元素及其存储机制。
423
0
0
2025-01-27 08:57
在Solidity智能合约中,常量和不可变变量不占用存储槽。例如,定义了两个状态变量s0和s1,分别赋值为1和2。在这两个状态变量之间,定义了一个常量x和一个不可变变量owner。常量在合约代码中被硬编码,不占用存储槽;而不可变变量在合约构造函数中初始化后,也以占位符形式硬编码,部署时替换为实际值。通过创建一个函数读取存储槽,可以验证s0和s1分别存储值1和2,而常量x和不可变变量owner则不占用任何存储槽。最终结果表明,常量和不可变变量的值直接嵌入合约字节码中。
434
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)中状态变量的存储机制及其实现方式。
428
0
0
2025-01-27 08:57
在EBM存储中,数据小于32字节时可以打包到一个槽中。视频中介绍了如何读取和写入打包在单个槽中的状态变量,使用了位掩码技巧。首先,声明了一些状态变量以适应单个槽,例如uint128、uint64、uint32等。接着,展示了如何通过位掩码清除和更新这些状态变量的值。通过创建适当的位掩码,可以在不影响其他变量的情况下更新特定的状态变量。最后,介绍了如何使用状态变量的.slot和.offset属性来替代硬编码的槽和偏移量,从而简化代码。通过这些方法,可以有效地管理和操作存储在单个槽中的多个状态变量。
421
0
0
2025-01-27 08:57
本视频系列将介绍EBM存储,重点学习状态变量在EBM存储中的存储位置及如何使用汇编语言读写这些变量。首先,我们将了解EO语言,它是Solidity中的内联汇编语言,主要用于读写状态变量。EO支持的唯一数据类型是bytes32。接着,我们将探讨如何在Solidity中使用EO进行变量赋值,并了解状态变量在EBM中的存储方式。状态变量以32字节为单位存储,每个合约最多有2的256次方个槽位,槽位按声明顺序分配。对于小于32字节的状态变量,它们会被打包存储。我们将通过sstore和sload函数进行示例,sstore用于将值存储到指定槽位,而sload用于从槽位读取值。通过这些示例,我们将掌握如何在EBM存储中读写状态变量。
886
0
0
2025-01-27 08:56
本次讲座深入探讨了去中心化金融(DeFi)的安全性,强调了安全在金融生态系统中的重要性。内容涵盖了DeFi的多个层面,包括硬件层、网络层、区块链层、智能合约层及应用层,分析了各层可能面临的攻击及其后果。特别提到的攻击方式包括重入攻击、回放攻击、三明治攻击和矿工可提取价值(MEV)等,强调了这些攻击对用户和整个DeFi生态系统的潜在威胁。此外,讲座还探讨了如何通过设计更安全的智能合约、使用去中心化的预言机和优化交易路由等方式来减轻MEV的影响,以提高DeFi的安全性和可持续性。
92
0
0
2025-01-27 08:16
本次讲座由Andrew Miller主讲,主要介绍智能合约的基本概念及其在区块链上的应用。智能合约被视为区块链上的程序对象,而非传统意义上的合同。讲座内容包括Solidity编程基础、CryptoKitties拍卖机制案例分析、智能合约与法律合同的比较,以及代币的概念,涵盖可替代代币(如ERC20)和不可替代代币(如ERC721)的特点。通过实例,Miller强调了智能合约的自动执行特性及其在去中心化金融(DeFi)中的重要性,鼓励学习者理解和应用这些技术。
128
0
0
2025-01-27 08:04
本文讨论了在不同情况下计算费率增长的方法,特别是在初始化的下限和上限区间内。首先,介绍了如何在当前刻度低于、介于或高于初始化的下限和上限时,分别计算费率增长。通过设定初始值并应用更新规则,得出在不同时间点的费率增长值。最终,所有情况下的费率增长均可通过相应时间点的费率差值来计算,确保了计算的一致性和准确性。接下来的视频将总结已计算的内容。
136
0
0
2025-01-22 17:41
在本视频中,我们计算了在特定条件下的费用增长,特别是当下限未初始化而上限已初始化时的情况。通过计算 Fk 减去 F0,我们得出在两个刻度之间的费用增长。我们分析了不同时间点的费用增长,并得出结论:费用增长的计算公式为 FG2 减去 FG1。接下来的视频将探讨下限和上限均已初始化的情况。
140
0
0
2025-01-22 17:41
本视频的第二部分讨论了在下限刻度已初始化而上限刻度未初始化的情况下,如何计算两个刻度之间的fee增长。我们使用了不同的方程来处理当前刻度在下限刻度以下、两者之间或上限刻度以上的情况。通过逐步计算,我们得出在不同时间点的fee增长,并最终简化为fg2与fg1之间的差值,验证了这一结果与图形的直观理解相符。接下来的视频将探讨上限刻度已初始化而下限刻度未初始化的情况。
156
0
0
2025-01-22 17:41
本视频讨论了在不同情况下如何计算一个位置内的费用增长,特别是当两个边界(i lower 和 i upper)都未初始化时。我们定义了费用增长的相关公式,并通过三种情况(当前刻小于、在两个边界之间、大于上边界)逐步推导出费用增长的计算方法。最终,我们得出结论,费用增长可以通过当前时间的费用增长与初始化时的费用增长之差来计算。接下来的视频将探讨当其中一个或两个边界已初始化时的费用增长计算方法。
129
0
0
2025-01-22 17:41
本视频介绍了Unisob V3中fee增长的初始化过程,重点在于如何计算和更新f out of i。首先,当当前tick i的值大于或等于tick i时,f out of i被初始化为当前fee增长f of g;否则初始化为零。随着当前tick的变化,f out of i会根据特定规则进行更新。此外,视频还讨论了如何计算fee_inside,定义了f of i lower和f of i upper,并通过不同的情况(当前tick小于、在i lower和i upper之间、大于i upper)简化了fee_inside的计算公式。接下来的视频将利用这些方程进行具体的fee inside计算。
142
0
0
2025-01-22 17:41
在本视频中,我们探讨了如何计算在两个刻度之间的费用增长(FB),并通过简单示例阐明了FB的定义及其计算方法。FB代表在特定刻度下的费用增长,计算时需考虑费用增长在不同时间点的高度变化。通过分析费用增长在跨越刻度时的高度变化,我们可以逐步更新FB的值,确保准确反映当前的费用增长情况。
132
0
0
2025-01-22 17:40
登链社区