Solidity快速上手教程(三)

往期回顾

本节知识点

  • 认识几种基本数据类型
  • 了解结构体

前缀知识

基本数据类型是任何一门语言的基础知识,Solidity也不例外。

在本节教程中,我们就讲几种用到的基本数据类型,整数型、字符串常量、地址类型和布尔型;然后把这几种结合在一起组成结构体。

我的案例中,通常是使用 Solidity 0.4.26,这是因为 platon-truffle 仅支持:

  • 0.4.26
  • 0.5.17
  • 0.6.12
  • 0.8.6

但是我们又用的是 Remix 做的部署,任何版本都可以,但考虑到我没有去看新版本的特性,所以就使用 0.4.26 吧,方便你我他她=。=

案例

  • 实现目标
    • 创建一个结构体 User 并声明对应数组
      • 这个数组允许用户出现重复
      • 使用 push 函数将局部结构体压入数组中
    • 这个结构体包含四个属性
      • string name
      • int age
      • address userAccount
      • bool isStudent
    • 这个合约包含两个函数
      • setUserInfo(),添加新的用户信息到数组内
      • getUserInfo(),查询指定下标的用户信息
// UserInfo.sol
pragma solidity ^0.4.26;

contract UserInfo{
    struct User{
        string name;
        int age;
        address userAccount;
        bool isStudent;
    }
    
    User[] user; // 使用 User 结构体声明一个 user 全局数组变量
    User _user; //User 局部变量,方便待会 push

    // 设置UserInfo
    function setUserInfo(
        string _name, 
        int _age, 
        address _userAccount, 
        bool _isStudent) public {
            _user.name = _name;
            _user.age = _age;
            _user.userAccount = _userAccount;
            _user.isStudent = _isStudent;

            //将 _user 压入 user 数组中
            user.push(_user);
        }
    
    // 获取UserInfo
    function getUserInfo(uint _userId) view public returns(string, int, address, bool){
        require(_userId >= 1 && _userId <= user.length, "超出查询范围!");
        return (
            user[_userId-1].name, 
            user[_userId-1].age, 
            user[_userId-1].userAccount, 
            user[_userId-1].isStudent
        );
    }
}

部分代码解析

user.push(_user);

这里是数组类型的一个基本操作,push (入栈)和 pop(出栈)都是对最后一个元素的操作,关于数据结构【栈】的相关知识可以看—— 数据结构慢速入门教程(栈)

require(_userId >= 1 && _userId <= user.length, “超出查询范围!”);

这一行是做异常检查,用于确认条件有效性,前面的表达式表示判断,如果符合则继续执行后面的操作,如果不符合则抛出异常,返回 message 告知用户。

课外作业

尝试修改 UserInfo.sol 案例代码,完成以下需求:

  • 修改 setUserInfo() 使之能够对指定下标的用户信息做修改,而不是新增一个用户;
  • 新增 addUserInfo() 新增一个用户到数组中;
  • 新增 getAllUserInfo() 读取数组中所有用户信息。

作业回帖格式如下:

  • 节点部署网络统一为 PlatON 测试网络(若使用Remix,请在MetaMask中添加)
  • 合约源码(注释要写QAQ,不然后期复杂合约没有注释的话,看的很慢)
  • ABI 和 合约地址

奖励

  • 成功完成作业的用户共同瓜分价值 100 LAT 的浅浅社区节点奖学金