SC programmer

@smartcontractprogrammer

https://www.smartcontract.engineer/

注册于 2025-01-20
汇编 If 和 Switch 语句 | Solidity 0.8

本文介绍了如何在Solidity的汇编中编写条件语句,包括if语句和switch语句。使用if语句时,条件表达式的结果为正数表示真,零表示假;汇编中没有else语句,因此需要另写if语句处理其他情况。通过示例,展示了如何使用if语句返回两个数中的最小值,以及如何使用switch语句返回两个数中的最大值。最终,代码成功编译并部署,验证了最小值和最大值的计算。

2395 0 0 2025-01-27
汇编变量 | Solidity 0.8

本视频系列将介绍如何理解MakerDAO稳定币合约中的Rpower函数,该函数使用二进制指数法计算复利,且代码采用汇编语言编写。系列的第一部分将教授汇编语言的基本知识,包括如何声明和赋值局部变量。通过示例,展示了如何在汇编中声明变量并将其赋值给Solidity变量,最终成功编译并部署合约,验证了变量赋值的正确性。

3520 0 0 2025-01-27
调用 | EVM 内存 10

本视频讲解了如何在汇编中使用加载标签函数,包括调用、调用数据复制、返回数据大小和返回数据复制,以调用另一个合约。函数调用接受多个输入,包括合约地址、最大燃气和以太币数量,并指定输入和输出的内存区域。通过调用函数,可以将数据从调用数据复制到内存,并获取返回数据的大小。视频中创建了一个合约,并实现了一个外部函数,该函数调用计数器合约的增量函数,并返回增量后的计数。通过汇编代码,加载自由内存指针,复制调用数据,执行合约调用,并处理返回数据。最后,通过测试合约验证了功能,成功返回了增量后的计数值。视频展示了如何使用汇编进行外部合约调用的完整示例。

2406 0 0 2025-01-27
回退(revert)  | EVM 内存 10

在Solidity中,函数可以通过执行revert函数或在require语句中某些条件失败而回退。我们还可以使用汇编语言使函数回退。汇编中的revert函数接受两个输入:起始位置和长度,它会回退执行并返回存储在内存中从起始位置到起始位置加长度的数据。本文通过创建一个名为test revert的函数,演示了如何使用汇编实现revert,并展示了如何在内存中存储错误信息以便在回退时返回。通过将错误信息存储在特定内存位置,并计算出函数选择器、字符串偏移量和长度,最终调用revert函数,成功实现了在交易日志中显示错误信息的功能。此过程展示了如何在汇编中重现Solidity代码的回退机制。

3077 0 0 2025-01-27
返回  | EVM 内存 9

本文介绍了如何在汇编中使用返回函数返回存储在内存中的数据。首先,定义了一个返回函数,该函数接受起始地址和长度作为输入,停止代码执行并返回指定内存范围的数据。通过示例,展示了如何将两个UN256数(11和22)存储在内存地址0x80及其后32字节的位置,并通过调用返回函数获取这些值。接着,强调了调用返回函数会中止当前函数的执行,导致无法返回后续定义的值(如123和456),而是返回之前存储的值(11和22)。最后,示例展示了如何使用返回函数ABI编码一个动态数组,存储三个元素(11、22和33),并返回该数组的内存部分。通过这些示例,读者可以理解汇编中返回函数的使用及其对代码执行流程的影响。

2360 0 0 2025-01-27
ABI编码 | EVM内存8

智能合约返回的数据采用ABI编码。在调用其他合约时,返回的数据以及使用汇编调用外部合约时返回的数据都必须进行ABI编码。对于小于或等于32字节的值类型,左侧填充零;对于固定大小的字节类型(如bytes4、bytes16、bytes32),则右侧填充零。结构体和固定大小数组以32字节块返回,而动态数组则需要编码偏移量、长度和32字节元素。 例如,地址类型在ABI编码时左侧填充零,返回32字节,其中20字节为地址内容。结构体的编码则会将每个数据类型填充至32字节,返回时会包含多个32字节块。固定大小数组与结构体类似,返回时不编码长度,而是直接返回32字节块。动态数组则包含偏移量和长度,元素同样以32字节编码。 了解这些编码规则对于使用汇编进行外部调用和返回数据至关重要。

2433 0 0 2025-01-27
如何从内部函数返回数据 | EVM内存 7

函数返回数据的方式取决于其调用方式(内部或外部)及返回数据类型。若函数由外部合约或外部账户(EOA)调用,返回数据为ABI编码;若内部调用,返回方式则依赖于数据类型。若返回类型没有“memory”关键字,数据将存储在栈上;若有“memory”关键字,则返回的是指向存储实际数据的内存位置的指针。举例来说,内部函数返回一个值时,数据直接存储在栈顶;而返回动态数组时,栈顶存储的是指向内存中数组的指针,数组的实际内容存储在内存中。总结而言,内部函数返回值时,若无“memory”关键字,数据存于栈;若有,则返回指向内存的指针。

2399 0 0 2025-01-27
动态数组 | EVM内存 6

本视频讲解了动态数组在EBM内存中的存储方式,并通过两个示例进行说明。第一个示例中,初始化一个包含五个元素的动态UN256数组(11, 22, 33, 44, 55),使用汇编语言获取该数组的指针、长度及三个元素。通过指针R,我们可以访问数组的起始内存地址,并利用mload指令读取数组长度和元素。第二个示例中,初始化动态数组并使用汇编存储元素。首先获取指针R,然后更新数组长度为3,并存储三个元素(11, 22, 33)。最后,更新自由内存指针以确保ABI编码正确。通过调用test read和test write函数,验证了数组的长度和元素值的正确性,指针指向内存地址0x80。

2354 0 0 2025-01-27
固定大小数组 | EVM内存 5

本文介绍了在EBM内存中固定大小数组的存储方式。即使数据类型不需要32字节,每个元素仍然占用32字节。例如,定义一个大小为3的UN32类型固定大小数组时,每个元素在内存中分别存储在0x80、0xA0和0xC0位置。通过汇编语言,可以将数据写入这些元素。示例中,使用mstore指令将数字11、22和33分别存储在数组的三个索引中。最后,通过常规的Solidity语法验证存储的数据,确保读取到的值与写入的值一致。该示例展示了在EBM内存中如何处理固定大小数组的存储和访问。

2405 0 0 2025-01-27
结构 | EVM 内存 4

在Solidity中,状态变量会被打包存储,而内存中的数据则以32字节为单位存储。例如,若有一个UN256变量后跟两个UN32变量,后两个UN32会被打包到一个槽中,但在内存中,每个变量都占用32字节。通过一个名为testRead的函数示例,展示了如何在内存中初始化一个结构体point,并将其值存储在内存地址0x80开始的位置。接着,使用汇编代码读取point的x、y、z值,并展示如何通过内存地址进行存储和读取。另一个函数testWrite则演示了如何将数据写入结构体,并更新自由内存指针。执行这些函数后,能够验证存储的值和更新后的自由内存指针位置。

2432 0 0 2025-01-27