今天我们继续在《Solidity学习代码示例 - 第一节》的基础上再继续构造器constructor,修改器modifier,require的使用,以及事件event的使用。具体的使用,可以详看代码注释。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SaveData3 {
event SETDATA(string); // 声明一个事件
address public owner; // 部署合约的当前用户,任何人都可看见
string private data; // 声明一个变量,这个变量是private,不让其他人查看
string[] datas; // 声明一个数组,这里不给它声明是否可见
mapping(address=>string[]) maps; // 映射 address代表用户的地址,string[]代表data的数据
struct Account {
address user;
}
constructor() { // 声明一个构造器,也就是在部署合约时就初始化数据。在这里,只要合约部署了,合约的owner就是msg.sender,也就是部署合约的当前用户
owner = msg.sender;
}
modifier onlyOwnerCanCall { // 修改器。只有部署合约的用户才能够执行
require(owner == msg.sender,"only owner can call!"); // require意思是要求的意思。这里要求owner必须是部署合约的用户。如果不满足这个条件,则报提示的错误。
_;
}
function setData(string memory _data) external onlyOwnerCanCall { // 这里将修改器的限制条件放在方法的后面即可
data = _data;
datas.push(_data); // 将每次存放的data的值装到数组里
maps[msg.sender] = datas; // 将存放的数据与用户的地址绑定在一起。这里的msg.sender在solidity的语法里代表的是当前的调用方法的这个用户
emit SETDATA(_data); // 监听事件
}
function getAllData() view external returns(string[] memory) { // 获取所有的datas,通过这个方法,我们可以查看到所有存放的datas的值
return datas;
}
function getUserData() view external returns(string[] memory) { // 查看当前调用这个方法的用户的所有数据
return maps[msg.sender];
}
}
至此,solidity的常用的一些简单的入门写法我们已经掌握了。在下一节,我们通过发行代币的合约示例来带着大家怎么去发行自己的代币,以及代币里合约的具体逻辑的学习。