以太坊智能合约开发(四):Solidity转账智能合约实验


1 合约编写

编写一个分布式转账智能合约,部署合约的人为合约管理员,只有管理员可以为其他用户发放代币,其他用户之间可以互相转账,转账的操作以事件的方式被记录在链上。

  • 版本声明和合约创建:
pragma solidity ^0.4.24;
contract coin {
}
  • 声明全局变量manager,作为本合约的管理员:
    address public manager;
  • 声明映射balances,通过balances[addr]来查看地址余额:
    mapping (address => uint) public balances;
  • 声明事件Sent,用来记录转账过程:
    event Sent (address _From,address _To,uint amount);
  • 构造函数,将调用者的地址赋予manager:
    constructor() public { manager = msg.sender; }
  • 自定义修饰符(modifier)isManager,判断分发代币的人是否是管理员:
 modifier isManager{
 	require(msg.sender == manager,"you are not the manager!");
    _;
 }
  • 自定义修饰符overflow,因为solidity本身对于数的加法溢出没有做处理,因此我们需要防备这种情况:
modifier overflow(address receiver,uint amount){
    require(balances[receiver] + amount > balances[receiver], "too many balances for receiver");
     _;
 }
  • reward函数,通过管理员为其他账户增加余额:
function reward(address receiver,uint amount) public isManager overflow(receiver,amount){
        balances[receiver] += amount;
    }
  • send函数,调用时用户会将自己余额中的部分代币发送给输入地址所对应的账户:
function send(address receiver,uint amount) public overflow(receiver,amount){
    balances[msg.sender] -= amount;
    balances[receiver] += amount;
    emit Sent(msg.sender, receiver, amount);
}

2 在线调试

执行上面的智能合约,合约执行成功。
在这里插入图片描述
以管理员身份尝试分发代币,并通过balances查询地址余额。
在这里插入图片描述
在这里插入图片描述
当以非管理员身份调用reward函数发放代币时,显示报错并调用失败。
在这里插入图片描述
普通用户之间相互转账并查询地址余额。
在这里插入图片描述

Logo

为所有Web3兴趣爱好者提供学习成长、分享交流、生态实践、资源工具等服务,作为Anome Land原住民可不断优先享受各种福利,共同打造全球最大的Web3 UGC游戏平台。

更多推荐