😼 seeloop的小站
搜索
快照
归档
Github
eddie
文章
5
标签
3
Github
归档
搜索
标签
编程相关
Solidity loop(1) —— 基础
发布于: 2024-11-10
最后更新: 2024-11-10
次查看
Solidity
type
status
date
slug
summary
tags
category
icon
password
😀
前言: 这是我前段时间学习Solidity时的笔记,现在做一整理,记录了我在学习Solidty中的一些思考,以及一些容易遗漏的记录;后续随着理解的更加深入,仍会同步更新; 如果需要详细学习相关知识,请参考‣ ,本文仅推荐用于伴读。

数值类型,函数类型,函数输出,变量数据存储

uint256和uint实际上是一样的,都是0到2^256-1这个范围区间内; 一个字符2个字节;
四种函数可见性说明符,共有4种。
public:内部和外部均可见。
private:只能从本合约内部访问,继承的合约也不能使用。
external:只能从合约外部访问(但内部可以通过 this.f() 来调用,f是函数名)。
internal: 只能从合约内部访问,继承的合约可以用。(默认状态变量的可见性)
Pure和View、Default 针对的是修改链上state的权限 Pure 不能读、不能写 View 只能读、不能写 Default 能读、能写
数据位置: storage:合约里的状态变量默认都是storage,存储在链上。 memory:函数里的参数和临时变量一般用memory,存储在内存中,不上链。尤其是如果返回数据类型是变长的情况下,必须加memory修饰,例如:string, bytes, array和自定义结构。 calldata:和memory类似,存储在内存中,不上链。与memory的不同点在于calldata变量不能修改(immutable),一般用于函数的参数。例子:
memory修饰的数组的大小为定长类型
 

映射类型、变量初始值、常数、控制流、构造函数和修饰器、事件、继承

  • map 1、key仅支持内置值类型,value支持struct 2、存储位置为storage,这里的map只用来记录关系,而不是一个类型; 3、当映射声明为public 时候,自动创建getter函数 4、val[key] = val
  • constant和immutable 数值变量可以声明constant和immutable;string和bytes可以声明为constant,但不能为immutable。
  • EVM Log 用于存储Solidity Event,类似于信号量??; Topics: 描述事件,事件的签名(哈希)+最多3个indexed参数(256bit) data: 事件的值,可存储任意大小的数据;
  • 构造函数的继承
 

抽象合约和接口、异常、重载、库合约、Import

  • 接口规则
      1. 不能包含状态变量
      1. 不能包含构造函数
      1. 不能继承除接口外的其他合约
      1. 所有函数都必须是external且不能有函数体
      1. 继承接口的非抽象合约必须实现接口定义的所有功能
  • 异常
      1. error
      2.Require
      3.Assert
 

接收ETH、发送ETH、调用其他合约

  • 接收ETH:receive和fallback
  • 接收ETH
function
gas limit
是否支持对方合约fallback() or receive实现复杂逻辑
是否支持revert
返回值
paybale(_to).transfer(amount)
2300
否
支持
no returns
_to.send(amount)
2300
否
不支持
bool
_to.call{value: amount}("")
none
是
不支持
(bool,bytes)
  • gas limit 执行交易或合约时所能消耗的最大计算资源。如果你设定的 gas limit 是 100,000 gas,那么你的交易在任何情况下都不会消耗超过 100,000 gas。如果交易需要的 gas 超过了这个限制,交易就会失败。
  • 调用其他合约
     

    Call、Delegatecall

    • 通过call来进行调用某一个合约函数
      • delegatecall
        • 要求当前合约中的状态变量和被调用合约中的状态变量相同; 即为在调用过程中,delegatecall的执行结果可以修改当前合约的状态变量;
          要求变量类型和声明顺序必须相同,变量名可以不同;
          原因:变量名对于storage并不重要,storage是基于位置的;Solidity将状态变量以线性布局的方式存储在合约的storage slots中,如,第一个变量存在slot 0,第二个在slot1;
           

      在合约中创建新合约、Create2、删除合约、ABI编码解码

      • 使用CREATE创建合约 新地址 = hash(创建者地址,nonce)
      • 使用CREATE2创建合约 新地址 = hash(常数,创建者地址,salt,initcode)
        • ABI 应用二进制接口,是与以太坊智能合约交互的标准。数据基于他们的类型编码;并且由于编码后不包含类型信息,解码时需要注明它们的类型。
           

          Hash、TryCatch

          • 选择器
            • 即为bytes4(keccak256("fixedSizeParamSelector(uint256[3])")),可以理解作为函数的标识符,此处需要注意空格,uint换为uint256;
          • 异常捕捉
             

            EVM的执行模型

            💡
            1. 当一个交易被接收并准备执行时,以太坊会初始化一个新的执行环境并加载合约的字节码。
            1. 字节码被翻译成Opcode,被逐一执行。每个Opcodes代表一种操作,比如算术运算、逻辑运算、存储操作或者跳转到其他操作码。
            1. 每执行一个Opcodes,都要消耗一定数量的Gas。如果Gas耗尽或者执行出错,执行就会立即停止,所有的状态改变(除了已经消耗的Gas)都会被回滚。
            1. 执行完成后,交易的结果会被记录在区块链上,包括Gas的消耗、交易日志等信息。
            • 作者:eddie
            • 链接:https://www.binlog.com/article/13a4ec7d-70d7-80f8-9af3-f62c352cbaa6
            • 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
            相关文章
            Solidity loop(3) —— ethers.js
            Solidity loop(2) —— 实践
            Solidity loop(2) —— 实践SnapShot
            Loading...
            eddie
            eddie
            quantity,efficacy,quality
            文章
            5
            标签
            3
            最新发布
            Solidity loop(3) —— ethers.js
            Solidity loop(3) —— ethers.js
            2024-11-10
            Solidity loop(1) —— 基础
            Solidity loop(1) —— 基础
            2024-11-10
            Solidity loop(2) —— 实践
            Solidity loop(2) —— 实践
            2024-11-10
            SnapShot
            SnapShot
            2024-10-30
            hello-world
            hello-world
            2024-9-13
            2021-2025 eddie.

            seeloop的小站 | quantity,efficacy,quality

            Powered by NotionNext 4.7.0.