Solidity Learning Road
- 简单代币合约
contract Coin{
//关键字"public"使变量能从合约外部访问。
address public minter;
mapping (address => uint) public balances;
//事件event让轻客户端能高效的对变化做出反应
event Sent(address from, address to, uint amount);
//这个构造函数的代码仅仅只能在合约创建的时候被运行
function Coin(){
minter = msg.sender;
}
function mint(address receiver, uint amount){
if(msg.sender != minter) return;
balances[receiver] += amount;
}
function send(address receiver, uint amount){
if(balances[msg.sender] < amount) return;
balances[msg.sender] -= amount;
Sent(msg.sender, receiver, amount);
}
}
mapping (address => uint) public balances;
表示声明一个map类型状态变量balances,其中k是address,v是balances。即可以存入键值对.可以根据address,查找到与之对应的balances.
我们可以提供一个接口如下提供查询访问:
function balances(address _account) returns (uint balance){
return balances[_account];
}
关键字
- contract: 合约相当于面向对象的类
- library/using: 库。他和合约很像,但又有些不同,就我们的目的而言,库允许我们使用 using 关键字,它可以自动把库的所有方法添加给一个数据类型。具体的使用方法后面会有介绍
- function: 声明一个函数
- event: 声明一个事件(当完成一个操作后调用event,用于生成日志)
- require: 用于验证 使用方式: require( a == 1); 不满足则抛出错误停止执行。经常与msg.sender一起使用对函数调用者进行验证
- modifier: 用于声明定义一个自定义修饰符。用法后面会进行详细介绍
常用的一些内置的变量
- msg.sender 调用者.
- now 获取当前时间戳。将返回当前的unix时间戳(自1970年1月1日以来经过的秒数).
下面是一些使用时间单位的实用案例:
uint lastUpdated;
// 将‘上次更新时间’ 设置为 ‘现在’
function updateTimestamp() public {
lastUpdated = now;
}
// 如果到上次`updateTimestamp` 超过5分钟,返回 'true'
// 不到5分钟返回 'false'
function fiveMinutesHavePassed() public view returns (bool) {
return (now >= (lastUpdated + 5 minutes));
}
- msg.sender 调用者。经常用于验证来确定调用者是否有足够的权限(获取变量或者调用函数)
数据类型
- address:地址类型变量
- bool/整形:int,unit/
- string: 字符串类型
- 数据类型转换方法