solidity8基础

权限修饰符

public:内部、外部可见
internal:内部可见(当前文件内),不能用 this 调用。
external:仅在外部可见(仅可修饰函数),即使在合约内,也只能通过this.
private:仅在当前合约可见

全局变量

  //常用全局变量
  //链id
  uint id = block.chainid;
  //区块号
  uint num = block.number;
  //时间戳
  uint time = block.timestamp;
  //剩余 gas
  uint gas = gasleft();
  //调用者地址
  address sender = msg.sender;
  //发送的主币数量
  uint value = msg.value;
  //完整的 calldata 数据
  bytes memory data = msg.data;
  //calldata的前 4 个字节
  bytes4 sig = msg.sig ;
  //指定块的区块hash - 仅最近 256 个区块有效
  bytes32 a = blockhash(12);
  //当前合约地址
  address add = address(this);

在这里插入图片描述
在这里插入图片描述

view 和 pure

//view: 函数不会修改合约变量,只读,不消耗燃料
//pure: 纯函数,不读写合约变量,只操作函数变量,不消耗燃料,可用于算法计算
  function getNum() public view returns(uint8){
    return num + 1;
  }

  function gettNum(uint8 _num) public pure returns(uint8){
    return _num + 1;
  }

存储memory、storage和calldata

  引用类型包括结构,数组和映射,使用引用类型,必须明确指明数据存储位置
  string类型实际上是bytes,也属于数组
memory:即数据在内存中,因此数据仅在其生命周期内(函数调用期间)有效。不能用于外部调用。
storage:状态变量保存的位置,只要合约存在就一直存储.
calldata:用来保存函数参数的特殊数据位置,是一个只读位置。

常用数据类型

整型

int:有符号整型,支持int8、int16...int256,8位为步长递增,int默认为int256,默认值为0
uint:无符号整型,支持uint8、uint16...uint256,8位为步长递增,uint默认为uint256,默认值为0

支持 加减乘除、大于小于等于,移位运算和大部分语言相同,不记录

uint a = 10**5;//幂运算 10的五次方 100000

布尔型

bool a;//默认值为false

浮点型

fixed:有符号定长浮点型,支持fixedMxN,fixed默认fixed128x19
ufixed:无符号定长浮点型,支持ufixedMxN,ufixed默认ufixed128x19
M 表示该类型占用的位数,N 表示可用的小数位数,M必须能整除8,即8256位。N可以是从080之间的任意数

枚举类型

enum Names {
  TOM,
  Jack,
  ROSE
}
Names name;

function getName() public view returns(Names){
  return name;
}

function setName() public {
  name = Names.ROSE;
}

地址类型

address owner;

映射

 mapping(address => bool) data;
  
  function get() public view returns(bool a){
    a = data[msg.sender];
  }

  function set(bool _b) public {
    data[msg.sender] = _b;
  }

数组

  //动态数组
  uint[] a = [1,2,3];

  function push(uint _num) public  {
    a.push(_num);
  }

  function get() public view returns(uint[] memory) {
    return a;
  }
  //删除末尾元素
  function pop() public {
    a.pop();
  }
  //删除指定位置元素,只是变为0,不会改变数组长度
  function del(uint _ind) public {
    require(_ind <= a.length -1, "index out of bound");
    delete a[_ind];
  }
  //获取数组长度
  function getLength() public view returns(uint l){
      l = a.length;
  }
  
  //内存数组必须是定长数组,不能修改长度,也不能用push和pop方法
  function test() public pure returns(uint[] memory){
    uint[] memory list = new uint[](3);
    list[0] = 1;
    list[1] = 3;
    list[2] = 6;
    //uint[3] memory list1 = [uint(1),3,6];
    return list;
  }

结构体

  struct Cat{
    string name;
    uint8 age;
  }

  Cat public tom;

  function set() public {
    tom = Cat({
      name: "aaa",
      age: 18
    });
  }
  function get() public view returns(Cat memory){
    return tom;
  }

常量&不可变量

  //constant:常量,值在编译时确定
  uint public constant a = 10;
  //immutable:不可变量,值在部署时确定
  uint public immutable a = 10;

  //gas费比较
  uint public a = 10;			//114253 gas
  uint public constant a = 10;	//91875 gas
  uint public immutable a = 10;	//98492 gas
  
  uint public immutable a;		//101013 gas
  constructor(uint _a){
    a = _a;
  }

异常处理

require

  function tes(uint _a) public pure {
    require(_a > 10, "_a <= 10");
  }

revert

  function tes1(uint _a) public pure {
    if(_a <= 10){
      revert("_a <= 10");
    }
  }

assert

  function tes2(uint _a) public pure {
    assert(_a > 10);
  }

error

  error myError(string msg);
  function tes3(uint _a) public pure {
    if(_a <= 10){
      revert myError("_a <= 10");
    }
  }

构造函数

  address owner;
  string name;
  //部署时执行,且只会被执行一次
  constructor(string memory _name){
    owner = msg.sender;
    name = _name;
  }

函数修改器 modifier

  bool paused;

  // 函数修改器
  modifier whenNotPaused(){
    require(!paused,"paused");
    _; //运行到此处会返回调用方函数继续执行
  }
  function tes() public whenNotPaused(){
    
  }

继承 is

//virtual 父合约标记
//override 重写父合约
contract A {
  function tes() public pure virtual returns (string memory) {
    return "A";
  }

  function tes1() public pure virtual returns (string memory) {
    return "A";
  }
}
contract B is A{
  function tes() public pure override returns (string memory) {
    return "B";
  }

  function tes1() public pure virtual override returns (string memory) {
    return "B";
  }
  constructor(string memory _name){

  }
}
contract C is B{
   function tes1() public pure override returns (string memory) {
    return "C";
  }
  //向父合约构造函数传递参数
  constructor(string memory _name, string memory memo) B(_name) {

  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bug的搬运工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值