分享百科

Solidity合约

视频的核心内容主要围绕Parallel EVM(并行以太坊虚拟机)的介绍及其对区块链性能提升的贡献。演讲者Hai来自RISE,强调了提升链上性能(如每秒处理的交易数和每秒消耗的气体量)是他们的主要任务。 **关键论据和信息包括:** 1. **Parallel EVM的功能**:Parallel EVM作为一种执行引擎,能够通过并行处理交易来最大化吞吐量,目标是实现每秒1 GigaGas和100,000笔交易。 2. **传统EVM的局限性**:传统的EVM执行器是顺序执行交易,这导致资源浪费。通过并行处理,理论上可以实现10倍的速度提升,但实际操作中面临核心状态冲突的问题。 3. **解决方案**:演讲者介绍了Block STM算法的应用,尽管其在EVM中并不完全适用。提出了一种懒惰更新的方法,允许在交易执行时不立即计算状态,而是在区块结束时进行评估,从而提高了并行处理的效率。 4. **性能提升的结果**:通过Parallel EVM,当前的平均速度提升为2倍,最大速度提升可达4倍。在处理独立的Uniswap交易时,最高可实现23倍的速度提升。 5. **未来的改进方向**:演讲者提到了一些未来的计划,包括支持可选的DAG(有向无环图)以优化同步速度,改进调度器以减少同步开销,以及进行低级别的性能调优。 6. **社区合作与开源**:Parallel EVM的实现是开源的,演讲者鼓励社区合作,欢迎新的想法和特性请求。 总的来说,视频强调了Parallel EVM在提升以太坊性能方面的重要性,并展示了通过技术创新实现更高吞吐量的潜力。
108
0
0
2025-02-08 15:15
视频的核心内容是关于以太坊虚拟机(EVM)的全面指南,旨在帮助区块链开发者和安全审计员从初级或中级水平提升到高级工程师或研究员。视频由Owen主讲,他在以太坊领域有两年的开发经验,并创立了Guardian Audits,专注于发现和审计智能合约中的安全漏洞。 视频中提出的关键论据和信息包括: 1. **EVM的结构与功能**:EVM是区块链的核心,理解其工作原理是成为高级开发者的关键。视频详细介绍了EVM的数据存储区域,包括栈、内存、调用数据和存储。 2. **数据存储区域**: - **栈**:用于存储32字节的字,采用先进后出(LIFO)结构。 - **内存**:类似于栈,但允许随机访问和写入,主要用于存储结构体和临时数据。 - **调用数据**:只读区域,存储函数调用的参数,读取成本较低。 - **存储**:最昂贵的存储区域,持久化数据,类似于区块链数据库。 3. **操作码(Opcodes)**:EVM通过操作码执行指令,视频中介绍了如何通过操作码与栈、内存和存储进行交互,包括常用的操作码如`push`、`pop`、`mstore`和`sstore`。 4. **优化建议**:视频提供了一些关于如何优化Gas费用的建议,例如优先从调用数据中读取而不是复制到内存中。 5. **实际示例**:通过示例合约,展示了如何查看字节码和操作码的执行过程,帮助观众理解EVM的实际运作。 总之,视频为希望深入理解EVM的开发者提供了系统的知识框架和实用的技巧,强调了EVM在区块链开发中的重要性。
139
0
0
2025-02-08 12:30
视频的核心内容主要围绕Solidity中的四舍五入问题,强调这些问题在智能合约审计中是常见的根本原因之一。视频的讲解者Owen分享了他在Guardian Audits的审计经验,指出理解和识别代码中的四舍五入问题对于提高审计质量至关重要。 关键论据和信息包括: 1. **四舍五入问题的根源**:在Solidity中,由于没有浮点数的概念,所有的除法运算都是截断式的,这导致了许多四舍五入问题。例如,9除以10的结果是0,而不是0.9。 2. **ERC20代币的精度**:通过定义代币的小数位数(如USDC有6位小数),可以在一定程度上解决四舍五入问题,但如果代币没有定义小数位数,就无法表示小数。 3. **实际案例分析**:视频中分析了两个具体的审计发现,展示了如何在不同的上下文中出现四舍五入问题,以及这些问题如何影响系统的安全性和功能。 - 第一个案例涉及到平均价格的计算,指出由于截断,可能导致用户以低于市场价格的平均价格购买代币。 - 第二个案例则展示了在尝试控制四舍五入时,逻辑错误导致的错误结果,强调了在处理负数时的复杂性。 4. **审计建议**:在进行安全审计时,审计人员应特别关注除法运算,确保正确处理截断,并考虑各种边界情况,以避免潜在的安全漏洞。 总之,视频强调了在智能合约审计中识别和处理四舍五入问题的重要性,并提供了实用的建议和案例分析,以帮助审计人员提高他们的审计技能。
144
0
0
2025-02-08 12:08
本视频讲解了如何在汇编中使用加载标签函数,包括调用、调用数据复制、返回数据大小和返回数据复制,以调用另一个合约。函数调用接受多个输入,包括合约地址、最大燃气和以太币数量,并指定输入和输出的内存区域。通过调用函数,可以将数据从调用数据复制到内存,并获取返回数据的大小。视频中创建了一个合约,并实现了一个外部函数,该函数调用计数器合约的增量函数,并返回增量后的计数。通过汇编代码,加载自由内存指针,复制调用数据,执行合约调用,并处理返回数据。最后,通过测试合约验证了功能,成功返回了增量后的计数值。视频展示了如何使用汇编进行外部合约调用的完整示例。
786
0
0
2025-01-27 09:01
在Solidity中,函数可以通过执行revert函数或在require语句中某些条件失败而回退。我们还可以使用汇编语言使函数回退。汇编中的revert函数接受两个输入:起始位置和长度,它会回退执行并返回存储在内存中从起始位置到起始位置加长度的数据。本文通过创建一个名为test revert的函数,演示了如何使用汇编实现revert,并展示了如何在内存中存储错误信息以便在回退时返回。通过将错误信息存储在特定内存位置,并计算出函数选择器、字符串偏移量和长度,最终调用revert函数,成功实现了在交易日志中显示错误信息的功能。此过程展示了如何在汇编中重现Solidity代码的回退机制。
1115
0
0
2025-01-27 09:00
本文介绍了如何在汇编中使用返回函数返回存储在内存中的数据。首先,定义了一个返回函数,该函数接受起始地址和长度作为输入,停止代码执行并返回指定内存范围的数据。通过示例,展示了如何将两个UN256数(11和22)存储在内存地址0x80及其后32字节的位置,并通过调用返回函数获取这些值。接着,强调了调用返回函数会中止当前函数的执行,导致无法返回后续定义的值(如123和456),而是返回之前存储的值(11和22)。最后,示例展示了如何使用返回函数ABI编码一个动态数组,存储三个元素(11、22和33),并返回该数组的内存部分。通过这些示例,读者可以理解汇编中返回函数的使用及其对代码执行流程的影响。
769
0
0
2025-01-27 09:00
智能合约返回的数据采用ABI编码。在调用其他合约时,返回的数据以及使用汇编调用外部合约时返回的数据都必须进行ABI编码。对于小于或等于32字节的值类型,左侧填充零;对于固定大小的字节类型(如bytes4、bytes16、bytes32),则右侧填充零。结构体和固定大小数组以32字节块返回,而动态数组则需要编码偏移量、长度和32字节元素。 例如,地址类型在ABI编码时左侧填充零,返回32字节,其中20字节为地址内容。结构体的编码则会将每个数据类型填充至32字节,返回时会包含多个32字节块。固定大小数组与结构体类似,返回时不编码长度,而是直接返回32字节块。动态数组则包含偏移量和长度,元素同样以32字节编码。 了解这些编码规则对于使用汇编进行外部调用和返回数据至关重要。
781
0
0
2025-01-27 09:00
函数返回数据的方式取决于其调用方式(内部或外部)及返回数据类型。若函数由外部合约或外部账户(EOA)调用,返回数据为ABI编码;若内部调用,返回方式则依赖于数据类型。若返回类型没有“memory”关键字,数据将存储在栈上;若有“memory”关键字,则返回的是指向存储实际数据的内存位置的指针。举例来说,内部函数返回一个值时,数据直接存储在栈顶;而返回动态数组时,栈顶存储的是指向内存中数组的指针,数组的实际内容存储在内存中。总结而言,内部函数返回值时,若无“memory”关键字,数据存于栈;若有,则返回指向内存的指针。
753
0
0
2025-01-27 09:00
本视频讲解了动态数组在EBM内存中的存储方式,并通过两个示例进行说明。第一个示例中,初始化一个包含五个元素的动态UN256数组(11, 22, 33, 44, 55),使用汇编语言获取该数组的指针、长度及三个元素。通过指针R,我们可以访问数组的起始内存地址,并利用mload指令读取数组长度和元素。第二个示例中,初始化动态数组并使用汇编存储元素。首先获取指针R,然后更新数组长度为3,并存储三个元素(11, 22, 33)。最后,更新自由内存指针以确保ABI编码正确。通过调用test read和test write函数,验证了数组的长度和元素值的正确性,指针指向内存地址0x80。
757
0
0
2025-01-27 08:59
本文介绍了在EBM内存中固定大小数组的存储方式。即使数据类型不需要32字节,每个元素仍然占用32字节。例如,定义一个大小为3的UN32类型固定大小数组时,每个元素在内存中分别存储在0x80、0xA0和0xC0位置。通过汇编语言,可以将数据写入这些元素。示例中,使用mstore指令将数字11、22和33分别存储在数组的三个索引中。最后,通过常规的Solidity语法验证存储的数据,确保读取到的值与写入的值一致。该示例展示了在EBM内存中如何处理固定大小数组的存储和访问。
775
0
0
2025-01-27 08:59
在Solidity中,状态变量会被打包存储,而内存中的数据则以32字节为单位存储。例如,若有一个UN256变量后跟两个UN32变量,后两个UN32会被打包到一个槽中,但在内存中,每个变量都占用32字节。通过一个名为testRead的函数示例,展示了如何在内存中初始化一个结构体point,并将其值存储在内存地址0x80开始的位置。接着,使用汇编代码读取point的x、y、z值,并展示如何通过内存地址进行存储和读取。另一个函数testWrite则演示了如何将数据写入结构体,并更新自由内存指针。执行这些函数后,能够验证存储的值和更新后的自由内存指针位置。
771
0
0
2025-01-27 08:59
在以太坊虚拟机(EVM)中,使用内存的气体成本呈现出二次增长的特性。根据evm.codes网站的公式,内存的气体成本可以通过简化后的方程进行计算。假设每个uint256占用32字节内存,内存大小以字为单位进行计算。通过图形计算器绘制该方程,可以观察到气体成本随着内存分配的增加而增加。通过在Solidity中编写代码,测试不同大小的uint256数组的气体成本,发现小规模内存使用时,气体成本呈线性增长,而在大规模内存使用时,气体成本则呈现出明显的二次增长。这意味着在代码中使用大量内存将受到限制。总之,EVM中内存的气体成本随着使用量的增加而显著上升。
762
0
0
2025-01-27 08:59
在Solidity中,使用汇编语言操作EBM内存时,主要使用mStore和mLoad指令。mStore用于将32字节的数据存储到指定内存位置,而mLoad则用于从指定内存位置读取32字节的数据。首先,需要获取自由内存指针,通常从0x40开始。通过mStore可以将数据写入自由内存,例如将0xababab存储到0x80位置。接着,使用mLoad从该位置读取数据并返回。示例中展示了如何在内存中写入和读取数据,并通过调试观察内存变化。此外,mStore的存储位置不必是32的倍数,存储时会用0填充至32字节。通过多个示例,展示了不同内存位置的写入和覆盖情况,强调了内存操作的细节和影响。
781
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中存储数据。
818
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的值则分别存储在相应的槽位中。通过特定的计算公式,可以访问和提取这些值。最终,示例代码展示了如何获取动态数组中各个元素的值。
758
0
0
2025-01-27 08:58
登链社区