主页 > 最新imtoken官网下载地址 > 第八课:如何在45分钟内发行代币(TOKEN)并进行在线交易

第八课:如何在45分钟内发行代币(TOKEN)并进行在线交易

最新imtoken官网下载地址 2023-08-05 05:18:33

以太坊发币教程_以太坊发币成本_基于以太坊发币

一、文章摘要

【本文目的】

通过分步指导和截图证明,一步步带领技术小白完成数字货币(通证、通证、TOKEN)的发布演示和在线交易。

【环境前提】

参考《第六课:如何开发DAPP区块链应用(以宠物店为例)》,已经在本地WIDOWS环境完成MetaMask轻钱包客户端的安装配置; 作者建议最好按照课程从头开始的顺序学习。 不过,如果你想在中途插入实践学习,问题不大。 当你遇到障碍时,可以反向找到相应文章的指导内容并完成。

【技术收获】

从这个实践中,你可以学到:

ERC20 Token的定义与实践

使用Remix Solidity IDE编写智能合约并编译调试

使用MetaMask完成钱包账户查看

使用网络钱包完成代币交易演示

【实践课程一览】

第一课:如何在WINDOWS环境下搭建以太坊开发环境

第二课:如何在以太坊中实现最简单的智能合约“Hello World”的运行

第4课以太坊开发框架Truffle从入门到实战

第六课技术小白如何开发DAPP区块链应用(以宠物店为例)

第七课 如何在45分钟内发行代币(TOKEN)并进行在线交易

第八课 如何调试以太坊官网智能合约众筹案例

第九课 如何在Remix环境下单步调试Solidity代码

第 10 课 Solidity 语言编辑器 REMIX 指南

【说明】未列出的课程为非实践性知识普及课程。 所有区块链文章,请参考“区块链入门”专栏。

2. ERC20 Token定义及接口说明

定义

ERC20合约是2015年11月在EIP上提出的合约标准,由代币定义的标准。

Token代表数字资产,具有价值,但并非都符合特定的规范。

基于 ERC20 的货币更容易互换,并且能够在 Dapp 上发挥相同的作用。

新标准可以使令牌更加兼容,允许其他功能,包括投票令牌化。 操作更像是投票操作,Token的持有者可以完全控制资产,符合ERC20的token可以随时追踪任何人拥有的token数量。 基于eth合约的子币种,易于实现。

ERC20 Token接口说明

方法

注意:调用者必须处理返回 false 的返回值 (bool success)。 调用者千万不要假设返回false的情况不存在。

名称

返回此令牌的名称,例如“MyToken”。

可选——此方法可用于提高可用性,但接口和其他契约不能依赖这些值的存在。

function name() constant returns (string name)

象征

返回令牌的符号,例如 HIX。

可选——此方法可用于提高可用性,但接口和其他契约不能依赖这些值的存在。

function symbol() constant returns (string symbol)

小数点

返回token使用的小数位数,比如8,表示分配的token数量为100000000

可选——此方法可用于提高可用性,但接口和其他契约不能依赖这些值的存在。

function decimals() constant returns (uint8 decimals)

总供给

返回代币的总供应量。

function totalSupply() constant returns (uint256 totalSupply)

余额

返回地址为_owner的账户余额。

function balanceOf(address _owner) constant returns (uint256 balance)

转移

_value 的代币数量转入地址_to,必须触发Transfer 事件。 如果 _from 帐户余额没有足够的代币可花费,则应抛出此函数。

创建新代币的代币合约应在创建代币时触发 _from 地址设置为 0x0 的转账事件。

请注意,值为 0 的传输必须被视为正常传输并触发传输事件。

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

从转移

要从地址 _from 向地址 _to 发送数量为 _value 的代币,必须触发 Transfer 事件。

transferFrom 方法用于提取工作流,允许合约代表您转移代币。 例如,这可用于允许合约代表您转移代币和/或以子货币收取费用。 除非 _from 帐户通过某种机制有意授权消息的发件人,否则此函数应该抛出。

请注意,值为 0 的传输必须被视为正常传输并触发传输事件。

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

批准

允许 _spender 多次提款到您的帐户,最多 _value 金额。 如果再次调用此函数,它将用 _value 覆盖当前保证金。

注意:为了防止矢量攻击,客户端需要确认用户界面的创建方式是将它们设置为 0,然后为同一支出者设置为另一个值。虽然不应强制执行合同本身,但允许向后兼容以前部署的合同

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

津贴

返回 _spender 仍然允许从 _owner 提取的金额。

function allowance(address _owner, address _spender) constant returns (uint256 remaining)

事件

转移

必须在转移令牌时触发(包括 0 值)。

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

赞同

必须在成功调用 approve(address _spender, uint256 _value) 后触发。

event Approval(address indexed _owner, address indexed _spender, uint256 _value)

【官网界面说明点击查看】,()

接口文件ERC20Interface.sol如下:

contract ERC20Interface {
 string public constant name = "Token Name";
 string public constant symbol = "SYM";
 uint8 public constant decimals = 18; // 18 is the most common number of decimal places
 // 0.0000000000000000001 个代币
 function totalSupply() public constant returns (uint);
 function balanceOf(address tokenOwner) public constant returns (uint balance);
 function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
 function approve(address spender, uint tokens) public returns (bool success);
 function transfer(address to, uint tokens) public returns (bool success);
 function transferFrom(address from, address to, uint tokens) public returns (bool success);
 event Transfer(address indexed from, address indexed to, uint tokens);
 event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}

3.TOKEN合约代码

合约文件TokenERC20.sol如下:

pragma solidity ^0.4.16;
interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }
contract TokenERC20 {
 string public name;
 string public symbol;
 uint8 public decimals = 18; // decimals 可以有的小数点个数,最小的代币单位。18 是建议的默认值
 uint256 public totalSupply;
 // 用mapping保存每个地址对应的余额
 mapping (address => uint256) public balanceOf;
 // 存储对账号的控制
 mapping (address => mapping (address => uint256)) public allowance;
 // 事件,用来通知客户端交易发生
 event Transfer(address indexed from, address indexed to, uint256 value);
 // 事件,用来通知客户端代币被消费
 event Burn(address indexed from, uint256 value);
 /**
 * 初始化构造
 */
 function TokenERC20(uint256 initialSupply, string tokenName, string tokenSymbol) public {
 totalSupply = initialSupply * 10 ** uint256(decimals); // 供应的份额,份额跟最小的代币单位有关,份额 = 币数 * 10 ** decimals。
 balanceOf[msg.sender] = totalSupply; // 创建者拥有所有的代币
 name = tokenName; // 代币名称
 symbol = tokenSymbol; // 代币符号
 }
 /**
 * 代币交易转移的内部实现
 */
 function _transfer(address _from, address _to, uint _value) internal {
 // 确保目标地址不为0x0,因为0x0地址代表销毁
 require(_to != 0x0);
 // 检查发送者余额
 require(balanceOf[_from] >= _value);
 // 确保转移为正数个
 require(balanceOf[_to] + _value > balanceOf[_to]);
 // 以下用来检查交易,
 uint previousBalances = balanceOf[_from] + balanceOf[_to];
 // Subtract from the sender
 balanceOf[_from] -= _value;
 // Add the same to the recipient
 balanceOf[_to] += _value;
 Transfer(_from, _to, _value);
 // 用assert来检查代码逻辑。
 assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
 }
 /**
 * 代币交易转移
 * 从创建交易者账号发送`_value`个代币到 `_to`账号
 *
 * @param _to 接收者地址
 * @param _value 转移数额
 */
 function transfer(address _to, uint256 _value) public {
 _transfer(msg.sender, _to, _value);
 }
 /**
 * 账号之间代币交易转移
 * @param _from 发送者地址
 * @param _to 接收者地址
 * @param _value 转移数额
 */
 function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
 require(_value <= allowance[_from][msg.sender]); // Check allowance
 allowance[_from][msg.sender] -= _value;
 _transfer(_from, _to, _value);
 return true;
 }
 /**
 * 设置某个地址(合约)可以交易者名义花费的代币数。
 *
 * 允许发送者`_spender` 花费不多于 `_value` 个代币
 *
 * @param _spender The address authorized to spend
 * @param _value the max amount they can spend
 */
 function approve(address _spender, uint256 _value) public
 returns (bool success) {
 allowance[msg.sender][_spender] = _value;
 return true;
 }
 /**
 * 设置允许一个地址(合约)以交易者名义可最多花费的代币数。
 *
 * @param _spender 被授权的地址(合约)
 * @param _value 最大可花费代币数
 * @param _extraData 发送给合约的附加数据
 */
 function approveAndCall(address _spender, uint256 _value, bytes _extraData)
 public
 returns (bool success) {
 tokenRecipient spender = tokenRecipient(_spender);
 if (approve(_spender, _value)) {
 spender.receiveApproval(msg.sender, _value, this, _extraData);
 return true;
 }
 }
 /**
 * 销毁创建者账户中指定个代币
 */
 function burn(uint256 _value) public returns (bool success) {
 require(balanceOf[msg.sender] >= _value); // Check if the sender has enough
 balanceOf[msg.sender] -= _value; // Subtract from the sender
 totalSupply -= _value; // Updates totalSupply
 Burn(msg.sender, _value);
 return true;
 }
 /**
 * 销毁用户账户中指定个代币
 *
 * Remove `_value` tokens from the system irreversibly on behalf of `_from`.
 *
 * @param _from the address of the sender
 * @param _value the amount of money to burn
 */
 function burnFrom(address _from, uint256 _value) public returns (bool success) {
 require(balanceOf[_from] >= _value); // Check if the targeted balance is enough
 require(_value <= allowance[_from][msg.sender]); // Check allowance
 balanceOf[_from] -= _value; // Subtract from the targeted balance
 allowance[_from][msg.sender] -= _value; // Subtract from the sender's allowance
 totalSupply -= _value; // Update totalSupply
 Burn(_from, _value);
 return true;
 }
}

函数的作用指的是对函数的描述和代码的自解释。

4. 合约编译、部署和发布

MetaMask 钱包网络

【前置条件】笔者假设学习者已经完成MetaMask的安装配置。 未完成的请参考《第六课:如何开发DAPP区块链应用(以宠物店为例)》中的“5.安装MetaMask并配置区块链网络”章节,完成MetaMask在本地WIDOWS环境安装配置轻钱包客户端。

打开MetaMask钱包,点击左上角“Ropsten测试网络”,连接成功。

以太坊发币成本_基于以太坊发币_以太坊发币教程

连接成功

查看现有账户Account 1,其中ETH余额显示为0。

基于以太坊发币_以太坊发币教程_以太坊发币成本

股票账户Account 1余额为0

点击“Copy Address to Clipboard”,将账户1的钱包地址记录为

0xD1F7922e8b78cBEB182250753ade8379d1E09949

点击MetaMask右上角圆形头像上的菜单“Create Account”创建一个新的钱包账户Account 8,

以太坊发币成本_以太坊发币教程_基于以太坊发币

添加账号成功

记录账号8的钱包地址为

0x3D7DfB80E71096F2c4Ee63C42C4D849F2CBBE363

单击帐户 8 上的“购买”按钮,可以从“Ropsten 测试网络”获得一些免费的测试 ETH。

基于以太坊发币_以太坊发币成本_以太坊发币教程

跳转到购买 ETH 页面

点击“ROPSTEN TEST FAUCET”按钮查看礼品页面

基于以太坊发币_以太坊发币成本_以太坊发币教程

单击绿色按钮并等待 10 秒以上。 如果成功,您每次可以获得1个测试ETH。

【故障排除】

基于以太坊发币_以太坊发币成本_以太坊发币教程

礼物失败

作者操作时出现错误。 从提示来看,是由于用户交易被拒绝。 等待10秒后再点击绿色按钮,就不会出现错误提示了。 原因不明,但可能是频繁操作造成的。

经过多次点击,偶有失误,小编一共从该测试网站获得了5个测试ETH,作为发币的gas fuel。

以太坊发币成本_以太坊发币教程_基于以太坊发币

获取测试ETH

Remix Solidity IDE调试环境介绍

1. 代码编写与编译

我们以第2课中的“Hello World”智能合约为例,参考下图完成编译并查找语法错误。

基于以太坊发币_以太坊发币成本_以太坊发币教程

编译环境使用方法

2. 合约创建

参考附图说明,在配置号为MetaMask账户和网络连接的情况下,保证账户中有虚拟ETH用于合约创建费用。 最后点击“创建”按钮,完成合约创建。 单击输出区域中的 Web 链接以查看合同的详细信息。

以太坊发币教程_以太坊发币成本_基于以太坊发币

支付合同费用

基于以太坊发币_以太坊发币教程_以太坊发币成本

图片.png

3. 合约执行

参考附件路径图,点击RUN按钮执行一次合约。 单击下面的“说”按钮以查看合约输出。 在调试输出窗口中可以看到“call to hello.say”的运行提示。

基于以太坊发币_以太坊发币成本_以太坊发币教程

合约执行

【总结】因此,不用Ubuntu+Ganache等,也可以直接在WINDOWS环境下使用Remix+MetaMask+Ropsten Test Network的组合,完成一个完整的以太坊测试环境。

更详细的REMIX帮助文档,参考Lesson 10 Solidity Language Editor REMIX Guide

编译ERC20智能合约

在CHROME浏览器中打开Remix Solidity IDE环境,打开之前编写的“TokenERC20.sol”智能合约,点击右侧“开始编译”按钮。 可以看到,除了一些警告提示外,智能合约编译成功。

基于以太坊发币_以太坊发币教程_以太坊发币成本

编译操作

运行 ERC20 智能合约

以太坊发币教程_基于以太坊发币_以太坊发币成本

运行页面

切换到“RUN”页面,Environment选择“Injected Web3”,Account会自动更新为MetaMask的Account 8账号。 在“创建”按钮前,根据发行的币数(本次为1亿)、代币名称、代币符号填写100000000、“ColorBay”、“CB”。

点击“Create”按钮,会弹出交易确认框,设置合理的Gas Price,但要保证Max Transaction Fee不会超过Account 8的ETH总量,点击“SUBMIT”按钮。

基于以太坊发币_以太坊发币成本_以太坊发币教程

智能合约部署

如果部署成功,Account8会生成一条交易记录,状态显示为“Contract Published”,表示部署成功。

以太坊发币成本_以太坊发币教程_基于以太坊发币

部署成功

【说明】有时点击账户会出现“用更高的gas price here Retry”的提示。 一般再等10秒,看交易是否成功。 如果仍然不起作用,请考虑提高 Gas Price。

基于以太坊发币_以太坊发币教程_以太坊发币成本

部署确认

MetaMask 加载令牌

点击账户8的交易记录,跳转到智能合约部署信息展示页面:

以太坊发币成本_基于以太坊发币_以太坊发币教程

部署成功

智能合约地址为0x5eeec41dc08d7caece17c4a349635934637036f1,点击查看交易详情。

以太坊发币成本_以太坊发币教程_基于以太坊发币

在MetaMask的Account 8账户的TOKENS页面点击“ADD TOKEN”按钮,设置Token Contract Address为0x5eeec41dc08d7caece17c4a349635934637036f1,Token Symbol为CB,然后就可以创建你的token了。

以太坊发币教程_基于以太坊发币_以太坊发币成本

token创建成功,CB币总量1亿枚。 此时点击100000000的代币仓位,跳转到代币查询页面,在etherscan网站上可以看到账户持有的代币数量。

以太坊发币成本_以太坊发币教程_基于以太坊发币

100000000

以太坊发币成本_基于以太坊发币_以太坊发币教程

代币信息

截至笔者发稿,以太坊价格为2559元/枚以太坊发币教程,你有1亿个CB币。 你即将达到人生的巅峰吗? 哈哈,这只是一个梦。 一个真正的区块链应用,必须要有生态,要为人类社会创造价值,而不是讲故事割韭菜!

5. 代币交易

由于MetaMask插件不提供代币交易功能,考虑到很多人没有以太坊钱包或者被以太坊钱包网络的同步问题折磨,今天我就用网页版钱包来讲解一下代币交易。

1. 输入网页钱包地址

首次进入时,有一些安全提示需要用户确认。

2.进入后,按照下图进行设置

以太坊发币教程_基于以太坊发币_以太坊发币成本

网络配置

3.添加自定义令牌

填写地址Token Contract为0x5eeec41dc08d7caece17c4a349635934637036f1等信息,点击保存按钮。

以太坊发币教程_基于以太坊发币_以太坊发币成本

添加自定义令牌

以太坊发币成本_基于以太坊发币_以太坊发币教程

配置TOKEN合约地址和代币符号

配置成功界面如下:

基于以太坊发币_以太坊发币教程_以太坊发币成本

【说明】如果不成功,会提示“Not a valid ERC-20 token CB”,可能是右上角的代币信息不正确或网络选择错误,选项“Network Ropston(infura. com)" 没有被选中的原因。 4.转账到账户1

在“发送地址”输入框中填写账户1的地址“0xD1F7922e8b78cBEB182250753ade8379d1E09949”,

基于以太坊发币_以太坊发币教程_以太坊发币成本

选择 CB,而不是 ETH

以太坊发币教程_以太坊发币成本_基于以太坊发币

转账确认

以太坊发币成本_基于以太坊发币_以太坊发币教程

交易确认

基于以太坊发币_以太坊发币成本_以太坊发币教程

交易技巧

查看账户余额,账户8减少了800万个CB币,而账户1增加了800万个CB币。

以太坊发币教程_基于以太坊发币_以太坊发币成本

帐户 8

以太坊发币成本_基于以太坊发币_以太坊发币教程

帐户 1

转账交易成功!

作为一个经典投资者以太坊发币教程,用了45分钟完成了TOKEN的上市交易,整理这篇文章用了4个小时。 学习就是这么简单,只要对新技术如饥似渴,前辈开发改造区块链并不难! 6.总结参考文件

本文是站在巨人肩膀上的操作实践,感谢以下文章作者的帮助:

知识对接服务:

辉哥和欧阳哥在知识星球开通了区块链入门专栏,用于存放简书区块链入门专栏文章的项目源码等内容,并建立了专门的微信群进行技术交流。 欢迎加入。