新的数据类型 映射和地址
映射
mapping(address => uint) public accountBalance;
类似 java 的 map 可以通过 key 获取到 value
地址
本身就是 uint160 可以和 uint160 相互转换
全局变量 msg.sender
最常用的全局变量 msg.sender 指合约的当前调用者,经常和映射一起再储存用户数据资产
还有其他的全局变量
require
require验证前置条件
require(被验证的条件);//条件为 flase 报错结束运行
//条件为 true 则继续执行下面代码
继承
contract Doge {
function catchphrase() public returns (string) {
return "So Wow CryptoDoge";
}
}
contract BabyDoge is Doge {
function anotherCatchphrase() public returns (string) {
return "Such Moon BabyDoge"; }
}
继承的关键词就是 is
引入
类似 java 的引用其他文件
import "./someothercontract.sol";
contract newContract is SomeOtherContract {
}
Storage与Memory
总结出来就是 属性默认 storage ,方法参数,内部默认 memory
- 要是函数以结构体作为参数,那么函数修饰符必须有 private/internal
- memory 的改动不影响 storage ( storage 为值转递)
- storage 的改动不影响 memory
- memory 传值给 memory 会影响 memory
- memory 不能传值给 storage 指针
方法可见性
方法 public,private,internal,external
public :可以继承,内外都可以调用
private: 不能继承,只有合约内部调用
internal:可以继承,只能内部调用,不能外部调用
external: 可以继承,外部调用,或者通过this.调用,不能内部调用
和其他合约的交互
步骤:
- 定义协议接口
- 实现接口(类似于类创建对象,需要传入被调用合约地址)
- 使用合约的public(公共)或external(外部)方法
方法的多返回值
类似 python 的方法可以返回多个值需要再 returns 后面的括号中声明
function multipleReturns() internal returns(uint a, uint b, uint c) {
return (1, 2, 3);
}
function processMultipleReturns() external {
uint a;
uint b;
uint c;
// 这样来做批量赋值:
(a, b, c) = multipleReturns();
}
// 或者如果我们只想返回其中一个变量:
function getLastReturnValue() external {
uint c;
// 可以对其他字段留空:
(,,c) = multipleReturns();
}
第二节的新的新的内容很多,都是其他常见语言 java js 中不太常见的用法,不过按照网站的例子做一遍就能几个差不多