Web3的一些零碎知识点

5/2/2022 web3以太坊智能合约solidity

# SPDX-License-Identifier 是什么

在6.0以后需要指定开源协议,类似于github上面的,如果不想开源,请使用UNLICENSED.

# 8.0引入的safeMath有什么作用

function testUnderflow() public pure returns (uint) {
    uint x = 0;
    x--;
    return x;
}

function testUncheckUnderflow() public pure returns (uint) {
    uint x = 0;
    unchecked {
        x--;
    }
    return x;
}
1
2
3
4
5
6
7
8
9
10
11
12
13

第一个函数会直接报错,第二个函数会返回uint256的最大值

# 简述一下solidity的错误处理

一般我们用revert来抛出错误,但是revert有一个问题就是他的 但是在8.0之后引入了自定义错误的新特性error YourErrorName (address pram)

# 合约之外的函数

# create2 函数 部署合约

# 变量

  • 状态变量

在合约内部定义,永远在链上,修改需要花费gas

  • 局部变量

在函数内部定义

  • 全局变量
address msg.sender; // 调用函数的地址,有可能是一个人,也有可能是上个调用的合约
uint block.timestamp; // 区块的时间戳 只读的,当前的时间
uint block.number; // 区块编号

blockhash(uint blockNumber) returns (bytes32) // 指定区块的区块哈希——仅可用于最新的 256 个区块且不包括当前区块
block.chainid (uint) // 当前链 id
block.coinbase ( address ) // 挖出当前区块的矿工地址
block.difficulty ( uint ) // 当前区块难度
block.gaslimit ( uint ) // 当前区块 gas 限额
block.number ( uint ) // 当前区块号
block.timestamp ( uint) // 自 unix epoch 起始当前区块以秒计的时间戳
gasleft() returns (uint256) // 剩余的 gas
msg.data ( bytes ) // 完整的 calldata
msg.sender ( address ) // 消息发送者(当前调用)
msg.sig ( bytes4 ) // calldata 的前 4 字节(也就是函数标识符)
msg.value ( uint ) // 随消息发送的 wei 的数量
tx.gasprice (uint) // 交易的 gas 价格
tx.origin (address payable) // 交易发起者(完全的调用链)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# view 和 pure 的区别

区别在于是否读取链上的信息

# 常量消耗的gas值怎么理解

当我们定义常量的时候使用 constant 来定义常量,这样可以减少gas的消耗

ps:这里gas的消耗指的是通过访问函数调用变量的消耗

# 错误控制

require revert assert

Last Updated: 6/10/2022, 7:11:06 AM