智能合约学习 CryptoZombies 僵尸工厂 第二课进阶内容

174 阅读2分钟

4153226-d2ad18eb14bc81ca.webp

新的数据类型 映射和地址

映射

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

  1. 要是函数以结构体作为参数,那么函数修饰符必须有 private/internal
  2. memory 的改动不影响 storage ( storage 为值转递)
  3. storage 的改动不影响 memory
  4. memory 传值给 memory 会影响 memory
  5. memory 不能传值给 storage 指针

方法可见性

方法 public,private,internal,external

public :可以继承,内外都可以调用

private: 不能继承,只有合约内部调用

internal:可以继承,只能内部调用,不能外部调用

external: 可以继承,外部调用,或者通过this.调用,不能内部调用

和其他合约的交互

步骤:

  1. 定义协议接口
  2. 实现接口(类似于类创建对象,需要传入被调用合约地址)
  3. 使用合约的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 中不太常见的用法,不过按照网站的例子做一遍就能几个差不多