什么叫代币?
代币可以在以太坊中表示任何东西:
在线平台的信誉积分,金融资产类似于公司股份的资产,像美元一样的法定货币,一盎司黄金以及更多。
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即可。