精华内容
下载资源
问答
  • 以太坊私有链上发行代币

    千次阅读 2020-02-11 11:45:16
    本文我们继续使用该网络,介绍如何在以太坊私有链上发行电子代币,本文使用的以太坊私有链钱包是Ethereum Wallet。 假设有一个山寨需要分两次一共发行1万5千贯山寨币,该山寨币可以在山寨内部各处流通,山寨币的持有者...

    上一篇文章我们介绍了如何在同一台机器上搭建包括两个节点的以太坊私有链网络。本文我们继续使用该网络,介绍如何在以太坊私有链上发行电子代币,本文使用的以太坊私有链钱包是Ethereum Wallet

    假设有一个山寨需要分两次一共发行1万5千贯山寨币,该山寨币可以在山寨内部各处流通,山寨币的持有者可以随时到山寨的好汉钱庄兑换等值铜钱。基于此背景,我们考虑如何使用以太坊私有链完成如下山寨需求 :

    1. 发行代币
      1. 初始发行数量1万贯;
      2. 随后增发数量5千贯;
    2. 发年终奖
      1. 李逵 : 4000 贯
    3. 还钱转账
      1. 李逵归还借武松的200贯买牛肉钱;
    4. 购物消费
      1. 李逵从孙二娘处花20贯打了一壶酒;
    5. 代币兑换
      1. 孙二娘到好汉钱庄将20贯换成等值铜钱;

    1. 发行代币

    1.1 准备山寨的代币发行账号

    山寨要想在以太坊私有链上发行自己的代币,必须首先要有属于山寨自己的钱包地址,比如说是 :

    名称 : ShanZhai 
    地址 : 0x0C5Ae7c2520b1208d579bCF8b2bF624EdD7a025c  
    
    • 山寨以太坊私有链账户截图 :
      在这里插入图片描述

    要想在以太坊私有链上开展各项业务,账户里必须有先有以太币,山寨的账户也不例外,以下李逵,武松,孙二娘的账户也不例外。

    1.2 定义山寨的代币智能合约

    现在山寨已经准备好了自己的区块链账号,接下来要想发行代币,必须先定义自己的山寨币智能合约:

    pragma solidity ^0.4.18;
    
    contract ShanZhaiCoin {
        // 发币人地址
        address public minter;
    	
        // 代币名称
        string public coinName="山寨币";
    	
        // 代币的单位
        string public coinUnit="贯";
    	
    	
        // 潜在地为每个被操作的地址创建一个变量 balances,
        // 类型为 unit, 用于表示该地址中该代币的余额,初始值为 0,
        // 通过该变量 balances, 合约通过该变量获取或者设置某个地址
        // 上该代币的余额,	
        mapping (address => uint) public balances;
    
    
        // 该智能合约的构造函数,仅在该智能合约创建时被调用,
        // 调用时将发币人地址设置成消息的发送者,也就是说,
        // 创建该智能合约实例的人会被设置为发币人
        constructor() public {
            minter = msg.sender;
        }
    
        // 发币人发行一定数量的代币
        // 可用于初始发行或者后期增发
        // 要求调用者地址和最初创建该智能合约的地址必须一致,
        // 也就是说,只有该智能合约实例的创建者才能发行/增发该代币
        function mint(uint amount) public {
            // 要求调用者地址 msg.sender 和 该智能合约实例创建人 minter
            // 必须相同, 也就是只有该智能合约实例的创建人才能发行/增发
            // 该代币		
            require(msg.sender == minter);
    		
            // 单次发行量不能大于 10的60次方
            require(amount < 1e60);
    		
            // 往发币人地址上增加指定数量的该代币
            balances[minter] += amount;
        }
    
    
        // 从调用者地址往指定地址 receiver 发送指定数量的代币,
        // 也就是一般意义上的转账功能
        // 从任何地址都可以发起,只要该地址拥有足够的该代币
        function send(address receiver, uint amount) public {
            require(amount <= balances[msg.sender], "Insufficient balance.");
            // 转账发起方账户扣减指定数量代币
            balances[msg.sender] -= amount;
            // 转账接收方账户增加指定数量代币
            balances[receiver] += amount;		
        }
    }
    

    在这个合约中,我们进行了如下信息:

    1. 属性 minter 表示发币人地址, 该属性必须在智能合约创建时设定;
    2. 属性 coinName 表示代币名称,并且不提供修改;
    3. 属性 coinUnit 表示代币单位,并且不提供修改;
    4. 潜在对应到每个地址的属性 balances , 表示该地址的账户余额,可以读取和修改;
    5. 方法 constructor , 智能合约的构造函数,仅在智能合约创建时被执行,接受一个参数表示发币人地址;
    6. 方法 mint, 表示发行指定数量的代币,仅仅允许发币人调用,并且每次发行数量不得大于10的60次方;
    7. 方法 send,表示调用者向其他地址账户转账;

    1.3 创建山寨币智能合约

    Ethereum Wallet中,点击界面右上角的CONTRACTS进入到合约界面,按照下图提示创建山寨币的智能合约 :

    在这里插入图片描述

    点击部署之后,钱包会提醒输入账户ShanZhai的密码,输入其密码,点击SEND TRANSACTION继续即可,如下图所示 :
    在这里插入图片描述

    确保私有链上有矿工正在挖矿,那么在WAllETS界面下方,你会看到该智能合约实例账户正在被创建,当进度达到12/12时,山寨币智能合约账户就创建好了。

    在这里插入图片描述

    好了,现在山寨币智能合约账户已经创建了,如下所示 :

    名称 : Shan Zhai Coin (根据相应智能合约的名称自动生成)
    地址 : 0x0182bB09435a77307D9B1540bDe6f42f9D3d16D3
    

    在这里插入图片描述

    在上图界面中点击该账户图表即可进入该账户钱包的主界面,如下图所示 :

    在这里插入图片描述

    从此图不难看出,我们在智能合约中定义和创建过程中指定的一些属性,已经在这里显示了出来 :

    Minter : ShanZhai (这是我们代币发行者的地址的名称)
    Coin name : 山寨币 (这是所发行的代币的名称,在智能合约中已经设定)
    Coin unit : 贯 (这是所发行的代币的单位,在智能合约中已经设定)

    接下来我们看看发币账号中该代币的余额 :
    在这里插入图片描述

    Balances 属性下面的Address输入栏中输入发币人ShanZhai的地址,下面出现数字0,这表明发币人账户中山寨币的余额为0。这是符合我们预期的一个结果,因为我们尚未发行代币。

    1.4 初期发行1万贯山寨币

    在合约账户的右下方,我们选择功能Mint,设置发行数量Amount10000,指定发行者账号为ShanZhai,点击EXECUTE发起发行1万山寨币,如下图所示 :

    在这里插入图片描述

    执行该代币发行事务同样需要消耗发行者账户的以太币,以及需要提供发行者的账户密码,有了这些信息,该发行代币动作和创建该执行合约没什么不同,都是作为一个事务交给底层区块链矿工挖矿完成。

    在这里插入图片描述

    1.5 再次增发5千贯山寨币

    增发代币和初期发行代币有什么不同吗 ?如果从实际业务需求的角度上没有这方面的约束和限制,就可以认为是没有。上面智能合约所定义的山寨币,就可以忽略其不同,所谓增发,就是再执行一次发行山寨币。所以重复上面1.4小节的动作,指定发行数量为5000,即可完成增发任务。增发之后,通过"Balances"方法查询发行人"ShanZhai"的山寨币余额,现在应该是15000贯。如下图所示 :
    在这里插入图片描述

    从上面我们定义山寨币智能合约的代码来看,我们约定了只能由智能合约的创建人来发行代币。那么,上面的智能合约是由"ShanZhai"创建的,其他账号可以用来发行山寨币吗 ?

    接下来,我们用李逵的账号试一试,假设李逵的账号是 :

    名称 : LiKui
    地址 : 0xbd5dd112d243f1D7899708667AE47A1b9AeBe902
    

    这次发行代币过程中我们选择了使用李逵的账号发行山寨币,这是一个不同于山寨币所属智能合约创建者山寨ShanZhai的一个账号,结果,虽然可以输入密码后将事务发送到区块链处理,但是处理完成之后,李逵的账号中并没有山寨币 :
    在这里插入图片描述

    这正是我们上面智能合约中代币发行逻辑所限制的,只能由智能合约创建者发行代币 :

            // 要求调用者地址 msg.sender 和 该智能合约实例创建人 minter
            // 必须相同, 也就是只有该智能合约实例的创建人才能发行/增发
            // 该代币		
            require(msg.sender == minter);
    

    2. 发年终奖

    山寨币已经发行了,现在山寨要给李逵发年终奖了。山寨之外的世界发奖金比较复杂,扣除各种税,进行各种登记,然后转账。山寨里就比较简单了,在"Shan Zhai Coin"山寨币主界面上,直接转账 :

    在这里插入图片描述

    确保矿工在挖矿,转账事务处理完成后,我们分别看看山寨的账户和李逵的账户 :

    • 山寨的账户余额
      在这里插入图片描述

    因为给李逵发奖金,4000贯已经被所发行的15000贯中扣除了,所以剩下了11000贯。

    • 李逵的账户余额
      在这里插入图片描述

    看来李逵的奖金到账了。

    3. 还钱转账

    有了钱,李逵要做的第一件事情是还钱,毕竟山寨里都是好汉,好汉的信誉都很重要。现在,李逵要还掉从武松那里借来买牛肉的200贯钱。现在李逵这里有武松的山寨币账号 :

    名称 : WuSong
    地址 : 0x7dB957E34f634B97E47A632D65C3c520F4E820df
    

    现在其余额是 :
    在这里插入图片描述

    借钱的时候,武松并没有让李逵打什么借条之类的凭据,所以还钱这件事情很简单,李逵只需要转账200贯钱给武松即可。在"Shan Zhai Coin"山寨币主界面上,我们执行这个转账操作:
    在这里插入图片描述

    提交以上转账事务,提供李逵账户的密码,确保矿工在挖矿,转账就能成功。我们来看看该转账完成时的情况。

    • 李逵的账户余额
      在这里插入图片描述

    • 武松的账户余额
      在这里插入图片描述

    可以看到,李逵给武松的还钱转账已经完成了。

    4. 购物消费

    还完了帐,李逵手里还有钱,现在他要去孙二娘那里打壶酒喝。孙二娘给李逵打了一壶酒,李逵要支付孙二娘20贯酒钱。孙二娘让李逵把山寨币转到自己的这个账号 :

    名称 : SunErNiang
    地址 : 0xEB851F746ea8693E5776dAe1cdeF80C2c32b8dbC
    
    • 李逵的账户余额
      在这里插入图片描述

    • 孙二娘的账户余额
      在这里插入图片描述

    可以看出,李逵买酒的钱已经转账山寨币给孙二娘了。

    5. 代币兑换

    过了一段时间,店里的酒卖的差不多了,孙二娘需要到山下进货。山寨币虽然在山寨流通,山下却用不了。孙二娘需要到山寨的好汉钱庄将山寨币兑换成山下能用的铜钱。

    要想兑换出铜钱,孙二娘需要先把自己的山寨币转账给好汉钱庄。钱庄让孙二娘把要兑换的山寨币转到这个地址 :

    名称 : ShanZhai 
    地址 : 0x0C5Ae7c2520b1208d579bCF8b2bF624EdD7a025c
    

    孙二娘一看,这不就是山寨最初发行山寨币的那个地址么。没错,好汉钱庄是山寨开的,兑换山寨币的话就需要先将山寨币通过好汉钱庄转回给山寨的山寨币账号。

    • 兑换前山寨账户里还有这么多山寨币
      在这里插入图片描述
    • 兑换前孙二娘账户里余额有1000贯
      在这里插入图片描述

    开始帮孙二娘转账,这段时间一共收了1000贯山寨币,她都需要兑换 :
    在这里插入图片描述

    同样地,需要提供孙二娘账户的密码和矿工挖矿该转账事务才能被处理。处理成功后,看一下转账结果:

    • 兑换后山寨账户里多出1000贯
      在这里插入图片描述

    • 兑换后孙二娘账户里余额有0贯
      在这里插入图片描述

    转账成功,没有问题,好汉钱庄给了孙二娘1000贯铜钱。孙二娘离开了钱庄。

    展开全文
  • 如何在币安智能链BSC上发行代币

    千次阅读 2021-10-18 14:30:53
    浏览器 ll​​​​​​​TESTNET Binance (BNB) Blockchain Explorerhttps://testnet.bscscan.... Remix - Ethereum IDEhttp://remix.ethereum.org/水龙头 Binance Smart Chain: Faucethttps://testnet.binan.
    展开全文
  • 以太坊智能合约让我们发行自己的代币成为一种不是那么难的事情,下面是我前几天在以太坊测试网络发行自己代币的一些流程. 首先,我们需要爬墙出去,安装一个叫做metamask的Chrome插件吧 点击以下网址: ...
  • 发行代币实用教程

    千次阅读 2018-03-01 21:40:36
    代币市场异常火热,你是否也想创建一个自己的代币,开启ICO,迎娶白富美,走上人生巅峰呢?那还犹豫什么,洗洗睡吧!其实开发一个ERC20标准(以太坊钱包能够识别的标准)的代币很容易,跟着教程走,十分钟搞定!编写...

    代币市场异常火热,你是否也想创建一个自己的代币,开启ICO,迎娶白富美,走上人生巅峰呢?那还犹豫什么,洗洗睡吧!

    其实开发一个ERC20标准(以太坊钱包能够识别的标准)的代币很容易,跟着教程走,十分钟搞定!

    编写代币合约代码

    代币合约代码:

    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;  // 18 是建议的默认值
        uint256 public totalSupply;
    
        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);
            balanceOf[msg.sender] = totalSupply;
            name = tokenName;
            symbol = tokenSymbol;
        }
    
    
        function _transfer(address _from, address _to, uint _value) internal {
            require(_to != 0x0);
            require(balanceOf[_from] >= _value);
            require(balanceOf[_to] + _value > balanceOf[_to]);
            uint previousBalances = balanceOf[_from] + balanceOf[_to];
            balanceOf[_from] -= _value;
            balanceOf[_to] += _value;
            Transfer(_from, _to, _value);
            assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
        }
    
        function transfer(address _to, uint256 _value) public {
            _transfer(msg.sender, _to, _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;
        }
    
        function approve(address _spender, uint256 _value) public
            returns (bool success) {
            allowance[msg.sender][_spender] = _value;
            return true;
        }
    
        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);
            balanceOf[msg.sender] -= _value;
            totalSupply -= _value;
            Burn(msg.sender, _value);
            return true;
        }
    
        function burnFrom(address _from, uint256 _value) public returns (bool success) {
            require(balanceOf[_from] >= _value);
            require(_value <= allowance[_from][msg.sender]);
            balanceOf[_from] -= _value;
            allowance[_from][msg.sender] -= _value;
            totalSupply -= _value;
            Burn(_from, _value);
            return true;
        }
    }


    部署

    在开发测试智能合约时,MetaMaskRemix Solidity IDE是两个非常好用的工具,今天就用他们来完成部署。

    1. 安装和配置MetaMask请参考开发、部署第一个去中心化应用,本文选择了以太坊的测试网络Ropsten,如果你没有余额请点击购买buy,进入的网站可以送一些测试以太币给你,配置好之后,界面应该如下: 

    2. 浏览器打开Remix Solidity IDE,复制以上源码粘贴上,在右侧选项参考如图的设置: 
       
      注意Environment和Account和MetaMask保持一致,然后选择合约TokenERC20,填入你想要的发行量,名称及代号,就可以创建合约了。 
      这时MetaMask会弹出一个交易确认框,点SUBMIT。待合约部署交易确认之后,复制合约地址。

    3. 打开Metamask界面,切换到TOKENS,点添加合约,出现如下对话框: 
       
      填入刚刚复制的地址,点ADD,这时你就可以看到你创建的代币了,如图: 

    哈哈,你已经完成了代币的创建和部署(正式网络和测试网络部署方法一样),可以在Etherscan查询到我们刚刚部署的代币。

    代币交易

    由于MetaMask插件没有提供代币交易功能,同时考虑到很多人并没有以太坊钱包或是被以太坊钱包网络同步问题折磨,今天我用网页钱包来讲解代币交易。 
    1. 进入网页钱包地址 https://www.myetherwallet.com/, 第一次进入有一些安全提示需要用户确认。 
    2. 进入之后,按照下图进行设置: 

    3. 连接上之后,如图 

    需要添加代币,填入代币合约地址。 
    4. 进行代币转账交易 

    在接下来的交易确认也,点击确认即可。 
    5. 交易完成后,可以看到MetaMask中代币余额减少了,如图: 

    现在,你已经拥有了自己的代币,妈妈再也不用担心没有代币啦!

    (转至:http://blog.csdn.net/xilibi2003/article/details/79131924)


    展开全文
  • 一、区块链学习-基于ETH发行代币

    千次阅读 2018-06-26 10:30:05
    ERC20 Token也许你经常看到ERC20和代币一同出现, ERC20是以太坊定义的一个代币标准。要求我们在实现代币的时候必须要遵守的协议,如指定代币名称、总量、实现代币交易函数等,只有支持了协议才能被以太坊钱包支持。...

    ERC20 Token
    也许你经常看到ERC20和代币一同出现, ERC20是以太坊定义的一个代币标准。
    要求我们在实现代币的时候必须要遵守的协议,如指定代币名称、总量、实现代币交易函数等,只有支持了协议才能被以太坊钱包支持。协议的github具体描述位于 https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
    一个标准的协议促使了代币可以在不同的应用中得到使用,如钱包和去中心化交易所。

    接口定义如下:

    pragma solidity ^0.4.19;
    
    contract Token {
        /// token总量,默认会为public变量生成一个getter函数接口,名称为totalSupply().
        uint256 public totalSupply;
    
        /// 获取账户_owner拥有token的数量
        function balanceOf(address _owner) constant returns (uint256 balance);
    
        //从消息发送者账户中往_to账户转数量为_value的token
        function transfer(address _to, uint256 _value) returns (bool success);
    
        //从账户_from中往账户_to转数量为_value的token,与approve方法配合使用
        function transferFrom(address _from, address _to, uint256 _value) returns  (bool success);
    
        //消息发送账户设置账户_spender能从发送账户中转出数量为_value的token
        function approve(address _spender, uint256 _value) returns (bool success);
    
        //获取账户_spender可以从账户_owner中转出token的数量
        function allowance(address _owner, address _spender) constant returns  (uint256 remaining);
    
        //发生转账时必须要触发的事件 
        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);
    }
    代币合约

    基于ERC20编写的合约代码如下:

    pragma solidity ^0.4.19;
    
    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;
        }
    }

    部署合约


    完成代币合约编写后,可以将合约发布到Etherscan的测试链上(公链需要购买ether,而且速度较慢,建议开发在测试上进行),合约部署方式如下:

    我采用Remix在线浏览器IDE才进行合约的编译和部署的,打开Remix页面样子如下:

    Remix: https://remix.ethereum.org


    点击新建按钮,将上面编辑的合约复制到IDE中:


    复制完成后,IDE的左边会自动校验你的合约的编写是否准确,有错误会提示,警告可以忽略。


    中间插入MetaMask讲解

    MetaMask使用

    由于我们是在以太坊测试链上发行合约,还是需要ether的,只不过可以免费获得,为了发行合约,我们需要测试链账户,下面我们将插入使用MetaMaskchrome插件来链接创建账户:


    安装好后,在浏览器右上角会出现图标,点击图标,一直点击到下图,填写你的密码,进入后就创建好了一个MetaMask钱包,MetaMask会为用户创建12个英文助记词,一定要保存好这些助记词,一定要保存好这些助记词,一定要保存好这些助记词,在其他钱包导入这个新创建的账户的时候有可能需要这些助记词。具体细节可以参考这篇文章


    创建好后,会给你默认一个账号:


    由于我们是要基于以太坊测试链发行代币,所以我们选择测试链:


    此时,我们发现我们的账户中没有ether,依次按照如下步骤获取



    这时候会打开网页,点击图标(建议点一两次就ok,每次会给你的账户放1个ether,部署合约1个就已经搓搓有余。)。


    一会你就会发现你们账户有金额;


    准备工作终于做完了,现在我们开始部署代币合约,这时候点击IDE右侧横栏中的run,按照1到3确认信息,并在4中编写你要发行的代币的信息,依次是100000000,"GaoTeB","GTB"(发行总量,发行币全称,发行币简称),4步确认不误后点击create按钮发布代币合约带测试链中


    点击后,会弹出对话框


    点击submit后,如果不报错,此时,会出现你的合约信息:


    点击合约会打开页面,你可以看到正在创建中:


    那么你就基本已经发行成功你的代币了!

    怎么在我们的账户下看呢?

    下面我们使用MetaMask工具查看,依次点击


    将刚才打开的页面中的信息填入MetaMask中


    这时候,我们就能看到啦:


    哎,终于大功告成,下面我们来转账一回试试:

    代币交易
    MetaMask插件没有提供代币交易功能,同时考虑到很多人并没有以太坊钱包或是被以太坊钱包网络同步问题折磨,今天我用网页钱包来讲解代币交易。

    初次进入会有一些列的确认信息,一顿点击,来到这个页面,选择与MetaMask同一个网络链(以太坊测试链):


    点击链接后,这个页面就会和你的MetaMask链接上,你会发现你的账户信息就会出现在页面上。

    此时,你的Token信息并没有出现在这里,需要你认为添加:


    点击添加,将你的Token信息填入这里:


    此时,你会发现:


    然后开始代币交易,我们尝试转账给别的账户,填写好信息后依次点击:


    展开全文
  • 创建系统账号 eosio.token 必须显使用eosio 创建系统账户 eosio.token ,否则无法使用...cleos create account eosio eosio.token EOS6QBdS5gSxe9HXw6BukZkUR2Ja6wAmNA5UjtddLZRYUA5AvAgfk 编译代币合约eosio.tok...
  • 6.添加发行代币到钱包中 复制并填写刚刚生成的合约地址 添加成功 验证合约 1.打开区块浏览器验证合约地址 2.添加合约信息 提示: 1.构造函数参数的ABI码,可以...
  • 通过以太坊发行代币(token)完整版

    千次阅读 2018-05-08 17:17:15
    2017年开始,区块链ICO项目层出不穷,市场热度一波更胜一波,很多ICO都是通过以太坊智能合约发行自己的代币(token),具体怎样才能发行代币呢?本文进行具体详细的介绍。 准备工作 以太坊官网ERC20标准合约代码:...
  • ibet-Issuer 是发行人在 ibet 网络上发行各种代币的 WEB 应用程序。 它支持开发的代币。 支持的合约版本 ibet-SmartContract:版本 21.4.0 启动服务器 安装包 $ cd ibet-Issuer $ pip install -r requirements.txt ...
  • 发行自己的代币代币发行概述状态机模型是一种图灵完备的计算模型,理论上你可以用它来实现任何应用, 代币也不例外。例如,我们可以借鉴以太坊的账户模型,设计出自己的账户 状态机:出于简化问题考...
  • bsc链发行代币遇到了问题

    千次阅读 2021-11-29 19:13:53
    我今天找了个合约代码,但是不知道在哪里编辑代币的名称,数量,有知道的大神帮助我下,谢谢
  • 5.tendermint发行代币

    2019-06-16 14:04:01
    代币发行概述 状态机模型是一种图灵完备的计算模型,理论上你可以用它来实现任何应用, 代币也不例外。例如,我们可以借鉴以太坊的账户模型,设计出自己的账户 状态机: 出于简化问题考虑,我们假设系统只发行一种...
  • 5分钟教你发行ERC20代币代币生态

    万次阅读 多人点赞 2018-08-08 21:25:29
    本文将讲述一下代币生态的运作、如何发行代币以及如何用一门常用的编程语言(Java)操作它。 虽然类似的文章一搜一大堆,但是根据笔者的实践,几乎很少有一篇文章可以真的把整个流程讲解的透彻,并且无障碍的实践...
  • 前几天EOS代币CET疯涨3倍,ADD,IQ,KARMA, EETH代币也开始发展,EOS代币慢慢多了起来,但是由于发币智能合约部署成本不低,总体而言代币还处于初创期,但大家也开始慢慢使用代币了。今天就以EOS以太坊侧链代币EETH...
  • 如何在以太坊上发行自己的代币

    千次阅读 2019-03-19 21:53:30
    简单代币开发 代币(Token): 代币单纯从其名字上理解的话,就是一种可以替代通用货币起到交换媒介作用的东西,可以是商场积分,可以是游戏币,也可以是筹码。但是在区块链中,就不完全是那么回事了,区块链中的...
  • 如何在以太坊发行代币,非一键发币,能够说明具体代码,及时部署合约步骤等。</p>
  • 发行自己的以太坊ERC20代币---超级详细

    千次阅读 热门讨论 2021-05-16 13:47:41
    一、环境准备 1、安装MetaMask插件+新建钱包 注意:电脑是需要ke学上网的,并且需要使用谷歌浏览 在谷歌浏览器中打开这个地址安装MetaMask钱包插件:... ...(发行代币是需要旷工费的,并且以eth
  • ethereum wallet 通过合约发行代币试验

    千次阅读 2018-03-24 11:00:43
     这一次,我们试验在Ethereum Wallet (Version 0.9.3) 里部署智能合约发行代币(Token) .以下为代码,先复制到合约界面,Contracts / Deploy New Contract , 右边会提示让 输入代币的名称、符号、以及总数量, 我...
  • 本文主要记录了基于以太坊智能合约发行以太坊代币过程。
  • 在以太坊发行代币,不是一键发币的那种。有具体步骤完成代码,部署合约等。</p>
  • 什么是以太坊代币(ERC20 token) ERC-20代币是一种任何人都可以创建的数字资产。从solidity代码上来看,其实就是基于ERC-20协议的一个变量。只不过在初始的时候,被发布到了以太坊网络,让所有的节点都知道了。...
  • 学习目的是老师布置了一个任务,让我抓dapp的流量包,具体描述如下: 区块链DApp从零开始学 (一) | DApp抓包,第一步需要模拟dapp发送数据,有了以下尝试 环境:win10,ganache-cli 参考:主教程 辅教程 ...
  • 以太坊代币发行

    千次阅读 2019-05-06 17:08:45
    一、什么是代币代币就类似于游乐场的游戏币,可以作为换取物品或服务的凭证。通常,代币需要使用货币来换取。与货币不同,代币的使用范围较小,一般只能够在特定范围内使用(比如游乐场、商店等等)。 在区块链...
  • 5.发行自己的ERC20代币

    2021-05-14 11:32:21
    发行自己的代币 步骤1 从https://etherscan.io/tokens 查找一个代币 步骤2 复制其合约代码 步骤3 在remix中编译合约代码 步骤4 部署合约(需要提前安装Metamask, 并获取一些测试币), 这里Rinkeby测试为...
  • 以太坊发行代币

    2018-02-13 11:16:00
    以太坊发行代币 https://hashnode.com/post/how-to-build-your-own-ethereum-based-erc20-token-and-launch-an-ico-in-next-20-minutes-cjbcpwzec01c93awtbij90uzn https://steemit.com/ethereu...
  • eos 智能合约 , 代币发行

    千次阅读 2018-09-02 15:49:12
    1.eos智能合约代币发行。使用官方智能合约下面的代码。 2.创建钱包, 创建用户test1, test2, 导入key, 否则会报错。 3.部署智能合约 ./cleos set contract test1 /eos/build/contracts/eosio.token/ -p test1 ...
  • 2017年开始,区块链ICO项目层出不穷,市场热度一波更胜一波,很多ICO都是通过以太坊智能合约发行自己的代币(token),具体怎样才能发行代币呢?本文进行具体详细的介绍。 准备工作 以太坊官网ERC20标准合约代码:...
  • 如何编写代币合约、及代币合约的自定义方法 智能合约测试、部署到开发网络、测试网络 发布后调用合约 相关代码会放到GitHub,链接在文章末尾 二、以太坊智能合约开发 三、以太坊智能合约编译 四、以太坊智能合约测试...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,128
精华内容 4,451
关键字:

发行代币