用int 和uint来声明,其中X是8-256之间的8的倍数,表示有多少个bit(二进制位),如int8,uint32

1
2
type(x).max
type(x).min会给出当前类型x能取的上下界。

address与address payable储存160个bit长的信息,后者多了向他转账的功能

1
address.balance返回当前地址金额
1
2
3
4
5
address payable x = address(0x123);
address myAddress = address(this);
x.transfer(10)//or x.send(10)
都表示向x转账10
第二行表示当前合约的地址。

同样有短路操作&& ||

定长数组:

bytes1,bytes2,bytes32......表示储存了1,2,32个bytes的数组。

bytes32 x可以用下标访问。同样有位运算,常规数组和C++类似 如int a[10];

支持动长数组 a[] .length返回长度

.push增加新元素并返回新长度,在solidity练习中练习过。

也用char来声明字符变量,string相当于char数组,不支持.length以及用下标访问,需要转换成bytes访问字节形式的内容

1
2
3
4
string s;
bytes(s).length;
bytes(s)[7] = 'x';

mapping

1
2
mapping(_keyType => _valueType) public balance;
balance[msg.sender] = newBalance;

相当于构造一个映射表。

Struct和C++几乎相同。

预定义变量:

1.BLOCK

1
2
block.blockhash(uint blockNumber) returns (bytes32)指定的区块哈希,只能返回之前256个且不能返回当前区块,不推荐使用,换成
blockhash(uint blockNumber)

还有另外几个

image-20210807215224000

msg:

1
2
3
4
msg.data(bytes):完整的calldata
msg.gas(uint)现在不用了,用gasleft()代替
msg.sig(bytes4):calldata前4字节也就是函数标识符
msg.value(uint):随消息发送的wei数量

EVENT

触发EVM中的log记录,使用如下语句声明和使用

1
2
event x();//定义事件
emit x();//触发事件(一般在函数中调用)

循环和if结构都存在且语法类似,但是不能用if(1)因为不能转换成bool值。

UNITS(单位)

EtherUnits(货币单位) 1 ether = 10^18 wei

TimeUnits:一个数值后跟seconds,minutes,hours,days等默认1 == 1 seconds

如果把变量转换成单元 x * 1 ether

CONTRACT

CONTRACT包括状态变量,函数, 函数修饰器,事件

FUNCTION

1
function(uint(类似的)) internal/external pure/view/payable returns (types) {}

pure代表不会读取数据,view是读取数据但不改变状态。

可见性是一定要写的。

示例:

1
2
3
function deposit() payable returns(address addr, uint amount, bool success) {
return(msg.sender, msg.value, this.send(msg.value));
}//检验是否发送成功

没有声明可见性位public

VISIBILITY

public external internal private从大到小。

external表示只能在外部调用,想在内部调用要this.f

function this.f external

public则内外皆可。internal表示外部不能调用,可以被自己或者衍生类调用。即谁继承了合约,就可以调用这个合约的internal类。

private只能被自己合约调用。

变量的visibility不能是external.

构造函数

此构造函数为偏正短语,非主谓短语,前面二字为形容词

一个合约只能有一个构造函数,与合约同名,构造时会执行一次。

1
2
3
4
5
6
Contract A {
bytes32 name;
function A(bytes32 _name) public {
name = _name;
}
}

Receive Ether

一个合约至多有一个此函数。

当收到ether时执行(.send()和.transfer())

语句没有function关键词

1
2
receive() external payable {
}

image-20210807224057003

本合约可以定义的事件为告诉大家收到了多少钱。用receive函数指出,emit触发

Fallback()

一个合约至多有一个fallback()函数此函数为缺型函数,当调用了一个合约不存在的函数时会执行fallback同样没有function关键词

REQUIRE():预定义函数(内置函数)

MODIFIER函数修饰器

1
2
3
4
5
6
7
8
9
10
modifier onlyOwner {
require(msg.sender == owner);
_;//这里
}

modifier costs(uint _price) {
if (msg.value >= _price) {
_;
}
}

以上就是modifier其实就是把require放在类似函数的框架里。

继承

合约继承会继承所有非private的东西

override会把external变成public

image-20210807225728259

virtual表示可以被overrideimage-20210807225810458

补充:

allowances(a,b)表示b可以花a设定的资金(在这里类似一个向c转账的功能)

approval表示设定a允许b发送的资金。