往期回顾
- Solidity快速上手教程(一)—— HelloWorld_1.sol(读取链上数据)
- Solidity快速上手教程(二)—— HelloWorld_2.sol(修改链上数据,并读取)
本节知识点
- 认识几种基本数据类型
- 了解结构体
前缀知识
基本数据类型是任何一门语言的基础知识,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(),查询指定下标的用户信息
- 创建一个结构体 User 并声明对应数组
// 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中添加)
- 网络名称:PlatON Dev Testnet
- PRC URL:https://devnetopenapi.platon.network/rpc
- 链ID:210309
- 货币符号:lat
- 区块链浏览器:https://devnetscan.platon.network/
- 合约源码(注释要写QAQ,不然后期复杂合约没有注释的话,看的很慢)
- ABI 和 合约地址
奖励
- 成功完成作业的用户共同瓜分价值 100 LAT 的浅浅社区节点奖学金