require和assert区别(知识补充)
if(msg.sender != admin) { throw; }等价于require(msg.sender==admin),require()是新版的用法
以下场景使用 require() :
验证用户输入,即: require(input<20);
验证外部合约响应,即: require(external.send(amount));
执行合约前,验证状态条件,即: require(balance[msg.sender]>=amount)
一般地,尽量使用 require 函数
一般地,require 应该在函数最开始的地方使用。
以下场景使用 assert():
检查 overflow/underflow,即:c = a+b; assert(c > b)
检查非变量(invariants),即:assert(this.balance >= totalSupply);
验证改变后的状态
预防不应该发生的条件
一般地,尽量少使用 assert 调用
一般地,assert 应该在函数结尾处使用
基本上,require() 应该被用于函数中检查条件,assert() 用于预防不应该发生的情况,但不应该使条件错误。
Token代码详解
pragma solidity ^0.4.25;
声明使用的solidity语言版本
interface tokenRecipient{
function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public;}
声明一个接口receiveApproval,可以和继承该接口的其他合约互相调用,interface是声明接口的关键字。
contract Token{
string public name;//代币名
string public symbol; //代币简称
uint8 public decimals = 2; // 定义token使用的小数点后几位,
//2即为后面两位数为小数点后的数
uint256 public totalSupply; //总发行量
address admin; //管理员地址
声明Token的各项基本属性
mapping(address => uint256) public balanceOf; // 用于返回某个地址的账户余额
声明一个映射类型的变量balanceOf,存储每个账户对应的余额(剩余Token数量)
mapping(address => mapping(address => uint256)) public allowance;
//返回_spender仍然被允许从_owner提取的金额
映射型变量allowance,表示存储账户允许第三方代理的余额数目(Token数),只要第三方进行的操作不超过这个余额数,想干什么就干什么。
event Transfer(address indexed from, address indexed to, uint256 value);
//货币转移,value:转移数量,from,to:转移地址
event Burn(address indexed from, uint256 value);//烧钱
触发该事件时,将参数信息传输给客户端,告知执行了该操作,即该事件发生。
modifier onlyAdmin(

本文详细比较了Solidity中require和assert的使用场景,require主要在函数开头验证条件,assert则用于预防错误,强调预防性。通过实例展示了如何在Token合同中运用这两种方法确保代码正确性和安全性。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



