DAPP开发(五)——创建货币

什么叫代币?

代币可以在以太坊中表示任何东西:

在线平台的信誉积分,金融资产类似于公司股份的资产,像美元一样的法定货币,一盎司黄金以及更多。

ERC-20就是一套基于以太坊的标准代币发型协议。有了ERC-20,开发者们得以搞笑,可靠,低成本的创造专属自己项目的代币。

ERC-20的功能实例包括:

  • 将代币从一个账户转到另一个账户
  • 获取账户的当前代币余额
  • 获取网络上可用代币的总供应量
  • 批准一个账户中一定的代币金额由第三方账户使用

代币的完成,还需要对应的交易所来交易货币。

github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md

方法

货币名称

function name() public view returns (string)

货币简称

function symbol() public view returns (string)

货币换算 一般取18

function decimals() public view returns (uint8)

货币发行数量

function totalSupply() public view returns (uint256)

某个账户下货币的余额

function balanceOf(address  _ owner) public view returns (uint256 balance)

用户之间进行转账 需要触发emit Transfer事件

function transfer(address  _to, uint256  _value) public returns (bool success)

event Transfer(address _from,address _to,uint256 _value);

交易所使用的转账方法 

function transferFrom(address  _from, address  _to,uint256  _value) public returns (bool success)

账户可以授权给交易所额度,可以理解为存在交易所 需要触发emit Approval事件

function approve(address  _spender,uint256  _value) public returns (bool success)

event Approval(address _from,address _spender,uint256 _value);

function allowance(address _owner,address  _spender) public view returns (uint256  remaining)

我们来创建一个新的货币

需要下载依赖 并引入

npm i openzeppelin-solidity
// SPDX-License-Identifier: GPL-3.0
//源码遵循协议,MIT...
pragma solidity >=0.4.16 <0.9.0; //限定solidity编译器版本
import "openzeppelin-solidity/contracts/math/SafeMath.sol"; //下载依赖引入安全数学计算
contract TestToken{ //名称与文件名一致
using SafeMath for uint256;
    string public name = "TestToken";
    string public symbol ="TT";
    uint256 public decimals = 18;
    uint256 public totalSupply;

    mapping (address=>uint256) public balanceOf;

    mapping(address=>mapping(address=>uint256)) public allowance;
    //第一个address是指货币,第二个是指每个交易所含有的数量

    constructor(){
        totalSupply = 1000000*( 10 ** decimals);
        balanceOf[msg.sender] = totalSupply;
    }

    event Transfer(address _from,address _to,uint256 _value);//转账后要执行事件函数记录在区块链上,必须执行
    //转账
    event Approval(address _from,address _spender,uint256 _value);
    function transfer(address _to, uint256 _value) public returns (bool){
        require(_to!=address(0));
        _transfer(msg.sender, _to, _value);
        return true;
    }
    function _transfer(address _from ,address _to, uint256 _value) internal {
        require(balanceOf[_from] >= _value );
        balanceOf[_from]=balanceOf[_from].sub(_value);
        balanceOf[_to]=balanceOf[_to].add(_value);
        emit Transfer(_from,_to,_value);
    }
    // 给交易所授权
    function approve(address _spender,uint256 _value) public returns (bool success){
        //_spender是交易所的账号地址,_value是授权的钱数
        require(_spender!=address(0),'');
        allowance[msg.sender][_spender] = _value;//授权给_spender交易所_value值
        emit Approval(msg.sender,_spender,_value);
        return true;
    }
    // 被授权的交易所调用
    function transferFrom(address _from, address _to,uint256  _value) public returns (bool success){
        //_from 放款账号 _to 收款账号 msg.sender交易所账户地址
        require(balanceOf[_from] >= _value);
        require(allowance[_from][msg.sender] >= _value);
        allowance[_from][msg.sender] = allowance[_from][msg.sender].sub(_value);
        _transfer(_from,_to,_value);
        return true;
    }
}

 写js脚本测试:

const Contracts = artifacts.require("TestToken.sol")
const fromWei =(bn)=>{
    return web3.utils.fromWei(bn,'ether')
}
const toWei =(number)=>{
    return web3.utils.toWei(number.toString(),'ether')
}
module.exports = async function (callback) {
    const testToken = await Contracts.deployed()
    let res = await testToken.balanceOf('0xa09c73676293dC499113f9446d1cbbb1C4549404'); //这里取创建货币的人
    console.log(fromWei(res));
    await testToken.transfer('0x4D26100f60525C5Ef35DA5B4dFc7B80d55050574',toWei(10000),{
        from:'0xa09c73676293dC499113f9446d1cbbb1C4549404'
    })
    let res2 = await testToken.balanceOf('0xa09c73676293dC499113f9446d1cbbb1C4549404'); //这里取创建货币的人
    console.log(fromWei(res2));
    callback()
}

可以在metamask添加自己的货币,在编译打包合约的json文件中networks就是对应的货币地址,添加到metamask即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Goat恶霸詹姆斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值