区块链天枢计划课程笔记(一)
用int 和uint来声明,其中X是8-256之间的8的倍数,表示有多少个bit(二进制位),如int8,uint32
1 | type(x).max |
address与address payable储存160个bit长的信息,后者多了向他转账的功能
1 | address.balance返回当前地址金额 |
1 | address payable x = address(0x123); |
同样有短路操作&& ||
定长数组:
bytes1,bytes2,bytes32......
表示储存了1,2,32个bytes的数组。
bytes32 x
可以用下标访问。同样有位运算,常规数组和C++类似 如int a[10];
支持动长数组 a[]
.length返回长度
.push增加新元素并返回新长度,在solidity练习中练习过。
也用char来声明字符变量,string相当于char数组,不支持.length以及用下标访问,需要转换成bytes访问字节形式的内容
1 | string s; |
mapping
1 | mapping(_keyType => _valueType) public balance; |
相当于构造一个映射表。
Struct和C++几乎相同。
预定义变量:
1.BLOCK
1 | block.blockhash(uint blockNumber) returns (bytes32)指定的区块哈希,只能返回之前256个且不能返回当前区块,不推荐使用,换成 |
还有另外几个
msg:
1 | msg.data(bytes):完整的calldata |
EVENT
触发EVM中的log记录,使用如下语句声明和使用
1 | event 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 | function deposit() payable returns(address addr, uint amount, bool success) { |
没有声明可见性位public
VISIBILITY
public external internal private从大到小。
external表示只能在外部调用,想在内部调用要this.f
function this.f external
public则内外皆可。internal表示外部不能调用,可以被自己或者衍生类调用。即谁继承了合约,就可以调用这个合约的internal类。
private只能被自己合约调用。
变量的visibility不能是external.
构造函数
此构造函数为偏正短语,非主谓短语,前面二字为形容词
一个合约只能有一个构造函数,与合约同名,构造时会执行一次。
1 | Contract A { |
Receive Ether
一个合约至多有一个此函数。
当收到ether时执行(.send()和.transfer())
语句没有function关键词
1 | receive() external payable { |
本合约可以定义的事件为告诉大家收到了多少钱。用receive函数指出,emit触发
Fallback()
一个合约至多有一个fallback()函数此函数为缺型函数,当调用了一个合约不存在的函数时会执行fallback同样没有function关键词
REQUIRE():预定义函数(内置函数)
MODIFIER函数修饰器
1 | modifier onlyOwner { |
以上就是modifier其实就是把require放在类似函数的框架里。
继承
合约继承会继承所有非private的东西
override会把external变成public
virtual表示可以被override
补充:
allowances(a,b)表示b可以花a设定的资金(在这里类似一个向c转账的功能)
approval表示设定a允许b发送的资金。