以太坊智能合约项目-Token合约开发与部署

修订日期 姓名 邮箱
2018-09-05 brucefeng brucefeng@brucefeng.com

以太坊智能合约项目-Token合约开发与部署

一. 钱包环境安装

以太坊钱包顾名思义,就是管理以太坊地址,存储以太坊Token的工具,再简单点说,任何区块链网络都须要咱们有本身的帐户,管理帐户的软件可称之为钱包,不管是炒币的仍是研究以太坊开发的,钱包都是必不可少的。git

1.钱包分类

1.1 Mist

说到以太坊钱包,第一个要说的固然就是Ethereum官方钱包+浏览器 Mist。Mist是一个全节点钱包(全节点钱包通俗的来讲就是同步了所有的以太坊区块信息的钱包)。也就是说打开钱包后,电脑会自动同步所有的以太坊区块信息,若是设备和网络的条件过关的状况下,大概须要半天左右的时间。github

以太坊智能合约项目-Token合约开发与部署

最新版下载地址:https://github.com/ethereum/mist/releases/tag/v0.11.1浏览器

1.2 MyEtherWallet

以太坊智能合约项目-Token合约开发与部署

MyEtherWallet 是一个轻钱包,无需下载,在直接在网页上就能够完成全部的操做。安全

https://www.myetherwallet.com/网络

1.3 MetaMask

MetMask是一个以太坊钱包插件,目前支持Google跟FireFox浏览器,可以帮助用户方便地管理以太坊数字资产,支持全部的测试网络和私有链网络,是咱们开发人员的必备钱包工具,下文将会讲解如何安装。app

以太坊智能合约项目-Token合约开发与部署

1.4 Parity

原以太坊基金会部分红员开发的钱包,也是一个全节点钱包。ide

下载地址: https://github.com/paritytech/parity-ethereum/releases函数

2.帐户与网络

以太坊网络中的帐户和典型的区块链帐户没有太大区别,都由地址、公钥、私钥 3 部分构成,不论使用何种钱包建立的以太坊帐户,在不一样的以太网网络之间都是能够通用的,好比我在主网上建立了钱包帐户,而切换到 任意 测试网络,如Kovan时仍然可使用一样的帐户,这种跨网络通用的帐号机制其实是内置在以太坊客户端以内的。工具

以太坊智能合约项目-Token合约开发与部署

3.安装MetaMask钱包

3.1 钱包插件安装

建立以太坊帐户的方式有不少种,上文就提到了多种以太坊钱包,但咱们要开发跑在浏览器中的 DApp,钱包集成在浏览器中就很是方便了,因此咱们选择MetaMask做为咱们的开发环境的钱包工具。post

以太坊智能合约项目-Token合约开发与部署

官方地址:https://metamask.io/

点击GET CHROME EXTENSOIN跳转至安装界面

以太坊智能合约项目-Token合约开发与部署

点击右上角ADD TO CHROME

以太坊智能合约项目-Token合约开发与部署

点击添加扩展程序按钮,等待安装便可,安装成功后,在浏览器右上角能够有该图标显示!
以太坊智能合约项目-Token合约开发与部署

3.2 钱包帐户建立

以太坊智能合约项目-Token合约开发与部署

打开MetaMask图标,点击TRY IT NOW按钮开始建立帐户

以太坊智能合约项目-Token合约开发与部署

点击CONTINUE继续

以太坊智能合约项目-Token合约开发与部署

建立密码

以太坊智能合约项目-Token合约开发与部署

点击NEXT继续

以太坊智能合约项目-Token合约开发与部署

将协议文字拖到最后,点击ACCEPT继续

以太坊智能合约项目-Token合约开发与部署

以太坊智能合约项目-Token合约开发与部署

点击ACCEPT继续

以太坊智能合约项目-Token合约开发与部署

重要: 点击以太坊智能合约项目-Token合约开发与部署
获取助记词,将这12个英文字母抄写在纸上,妥善保存!

以太坊智能合约项目-Token合约开发与部署

以太坊智能合约项目-Token合约开发与部署

按照顺序选择助记词进行确认,确认完毕

以太坊智能合约项目-Token合约开发与部署

点击VIEW ACCOUNT查看帐户地址与二维码信息

以太坊智能合约项目-Token合约开发与部署

能够根据须要,对帐户名进行修改

以太坊智能合约项目-Token合约开发与部署

此时,钱包建立完毕,接下来,为了开发须要,咱们须要为几套测试环境申请测试ETH进行开发使用。

二.申请测试ETH

1.测试环境说明

从上图能够看到咱们钱包能够切换的环境,除了Main Ethereum Network以外的Network节点均为测试节点。

以太坊能够搭建私有的测试网络,不过因为以太坊是一个去中心化的平台,须要较多节点共同运做才能获得理想的测试效果,所以并不推荐自行搭建测试网络。

以太坊公开的测试网络共有4个,目前仍在运行的有3个。每一个网络都有本身的创世区块和名字,按开始运行时间的迟早,依次为:

  • Morden(已退役)

Morden是以太坊官方提供的测试网络,自2015年7月开始运行。到2016年11月时,因为难度×××已经严重影响出块速度,不得不退役,从新开启一条新的区块链。Morden的共识机制为PoW。

  • Ropsten

Ropsten也是以太坊官方提供的测试网络,是为了解决Morden难度×××问题而从新启动的一条区块链,目前仍在运行,共识机制为PoW。测试网络上的以太币并没有实际价值,所以Ropsten的挖矿难度很低,目前在755M左右,仅仅只有主网络的0.07%。这样低的难度一方面使一台普通笔记本电脑的CPU也能够挖出区块,得到测试网络上的以太币,方便开发人员测试软件,可是却不能阻止×××。

PoW共识机制要求有足够强大的算力保证没有人能够随意生成区块,这种共识机制只有在具备实际价值的主网络中才会有效。测试网络上的以太币没有价值,也就不会有强大的算力投入来维护测试网络的安全,这就致使了测试网络的挖矿难度很低,即便几块普通的显卡,也足以进行一次51%×××,或者用垃圾交易阻塞区块链,×××的成本及其低廉。

2017年2月,Ropsten便遭到了一次利用测试网络的低难度进行的×××,×××者发送了千万级的垃圾交易,并逐渐把区块Gas上限从正常的4,700,000提升到了90,000,000,000,在一段时间内,影响了测试网络的运行。×××者发动这些×××,并不能得到利益。

  • Kovan

为了解决测试网络中PoW共识机制的问题,以太坊钱包Parity的开发团队发起了一个新的测试网络Kovan。Kovan使用了权威证实(Proof-of-Authority)的共识机制,简称PoA。

PoW是用工做量来得到生成区块的权利,必须完成必定次数的计算后,发现一个知足条件的谜题答案,才可以生成有效的区块。

PoA是由若干个权威节点来生成区块,其余节点无权生成,这样也就再也不须要挖矿。因为测试网络上的以太币无价值,权威节点仅仅是用来防止区块被随意生成,形成测试网络拥堵,彻底是义务劳动,不存在做恶的动机,所以这种机制在测试网络上是可行的。

Kovan与主网络使用不一样的共识机制,影响的仅仅是谁有权来生成区块,以及验证区块是否有效的方式,权威节点能够根据开发人员的申请生成以太币,并不影响开发者测试智能合约和其余功能。

  • Rinkeby

Rinkeby也是以太坊官方提供的测试网络,使用PoA共识机制。与Kovan不一样,以太坊团队提供了Rinkeby的PoA共识机制说明文档,理论上任何以太坊钱包均可以根据这个说明文档,支持Rinkeby测试网络,目前Rinkeby已经开始运行。

2.测试ETH申请

2.1 Ropsten环境-测试币申请

以太坊智能合约项目-Token合约开发与部署

切换测试环境,点击DEPOSIT

以太坊智能合约项目-Token合约开发与部署

点击GET ETHER

以太坊智能合约项目-Token合约开发与部署

点击获取1个ETH测试币,能够点击屡次

以太坊智能合约项目-Token合约开发与部署

目前共计是11个,超出后报错“User is greedy”,比较直白:用户太贪了:-),若是测试币花不掉,也不要浪费,能够继续返回给测试币发送方。

以太坊智能合约项目-Token合约开发与部署

能够根据实际数量选择捐赠的数量

以太坊智能合约项目-Token合约开发与部署

成功获取到11个ETH测试币

2.2 Kovan环境-测试币申请
https://gitter.im/kovan-testnet/faucet

打开了解跳转至gitter聊天室中,能够经过github帐户或者twitter帐户进行登陆,加入faucet聊天室后,发送本身的帐户地址到聊天列表中,笔者申请的帐户地址为0x18850c9cE7B2274EbB0c78e6221844AC76715494

效果以下

以太坊智能合约项目-Token合约开发与部署

笔者的github帐户前几天申请过,因此第一次申请的时候提示我最近刚刚申请过,更换了登陆帐户后成功。

以太坊智能合约项目-Token合约开发与部署

成功获取到3个ETH测试币

2.3 Rinkeby环境-测试币申请

这个环境的测试币申请稍微复杂一点,要求接受充值的帐户持有人必须以太坊帐户地址发送到本身的社交网络中(如 Twitter、Facebook、Google Plus),一样,该工具限制了充值的频率;

  • 复制MetaMask帐户地址:0x18850c9cE7B2274EbB0c78e6221844AC76715494
  • 打开google plus并登陆:https://plus.google.com/
  • 点击首页-右下角按钮以太坊智能合约项目-Token合约开发与部署

以太坊智能合约项目-Token合约开发与部署

贴入帐户地址,点击发布

以太坊智能合约项目-Token合约开发与部署

点击按钮公开分享

以太坊智能合约项目-Token合约开发与部署

复制连接地址

https://plus.google.com/100168130519914964665/posts/eqQ6iBMAhbJ
  • 打开rinkeby的测试币获取地址
https://www.rinkeby.io/#faucet

以太坊智能合约项目-Token合约开发与部署

按需选择

以太坊智能合约项目-Token合约开发与部署

网站已经获取到请求,开始处理,等待片刻充值完毕

以太坊智能合约项目-Token合约开发与部署

获取到18.75个ETH测试币

三套测试环境的测试币咱们均已得到,如今咱们能够开始代码设计工做了。

三.代码设计解读

1. Token是什么?

Token是区块链实践中的一个重要概念,有多重要呢?有观点认为,Token多是比区块链更伟大的发明,是一个与“公司”比肩的伟大发明。区块链是一个技术概念,Token是一个经济概念;与“公司”同样,Token带来了全新的组织形式和协做形式。
Token早期的叫法为代币,但如今更适合的翻译应该是“通证”。“通证”的概念超过了“代币”。通证是一种可流通的、加密的数字权益证实,这个权益,能够是财产、×××、学历证书、钥匙、门票、积分、荣誉、使用权等等任何事物。代币更像是资产的数字化,而通证则在此基础上,同时包含了数字化的资产,将本来没法量化、没法记帐的东西,给量化、记帐。
Token目前有两种,一种是在区块链网络中内置的,用于用户之间的转帐交易,并奖励矿工,这种被理解为数字加密货币,比特币就属于这一种;另外一种是在DApp或智能合约上自行铸造的,用于内部交易,这种更接近“通证”这个含义。

看起来,Token跟股权有点相似,但其实这二者的差异仍是比较大的。Token比股权,最重要的就是多了流通凭证。股权只是权益凭证,缺少流动性,投资者若是对公司运做方式不承认,会经过董事会来施压,而Token模式下,投资者若是对公司运做方式不承认,能够直接卖了token退出。这一点,对于传统的投资模式,可能会有比较大的颠覆。VC行业也迅速作出了反应,市场上兴起了一波数字币基金,与传统VC在出资人、投资流程、项目管理和退出方面有明显的差别。

综上所述,Token做为一种权益证实,是数字的、加密的、可流通的。鉴于Token这么多的优势和想象力,区块链行业提出一个新概念,叫“通证经济”,要把Token通证充分用起来,用通证来盘活人力、资本、项目、信用等生产要素,用新的利益机制,造就新的生产关系。这事儿若是能成,会激发指数级的创新,给咱们的生产生活方式带来巨大的改变。

2.规范简介

Token的走红,归功于以太坊及其订立的ERC20标准。基于这个标准,每个人、每一家企业均可以在基于区块链的平台上发Token,这个Token是自定义的,能够表明任何权益和价值。

ERC-20最初做为一种尝试,旨在为以太坊(Ethereum)上的token合约提供一个特征与接口的共同标准,而且,它如今已经被证实是很是成功的了。ERC-20有不少好处,包括容许钱包显示数以百计不一样token的帐户余额;建立一个交易工具,只需提供token合约的地址就能够将更多token列入表中。建立ERC-20兼容token的好处不少,以致于在今天,不多有其余token合约用其余方式建立。

ERC是 Ethereum Request for Comment 的缩写,Request for Comment 是征求你们意见的意思,你们都但愿 Ethereum 网络的将来技术走向不要集中在几个硏发人员的手里, 因此才开放给你们提出 Proposals (建议), 用来改进 Ethereum, 决定将来开发方向. 这就是每一个人每件跟 Ethereum 将来发展有关的事情, 都能用 EIP 建议格式 (EIP template) 提出来. 只要被你们选上, 就会正式列入 EIPs 清单。

并且, 你会看到 EIP 定义或讨论 issues 里, 经常会看到它相关的 ERC, 也就是, 讨论过程当中, 有一些要征求更多人意见时, 就会把它细节定义放在 ERC 里. 并且他们会用同一个号码, 好比 ERC-20就是对应到 EIP-20.

简单讲, 讨论项目, 一开始会用 EIP 提出建议, 结果与细节会定义在 ERC, 最后会 final (拍板定案), 放在 EIP 清单里 Finalized EIPs 区.

3.规范解读

关于EIP-20(ERC-20 Token Standard)的标准说明能够直接参考官方文档,英文能力强的直接看原文便可。

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

为了节约读者时间,本文直接在代码设计这部分对该标准进行解读,便于读者更好地理解如何使用标准去设计开发本身的Token合约。

4.代码设计

首先,咱们看简单看一下如今主流的一些Token的项目介绍,我我的比较关注也比较看好火币Pro,因此姑且用HT给你们进行直观化的了解。

此处仅为学习交流,不表明任何炒币观点,若是读者有火币的人脉资源,却是能够帮笔者引荐引荐。

HT(火币全球通用积分)是基于区块链发行和管理的积分系统,为火币官方发行的惟一积分。HT 将支持火币全球业务、全线产品,如:VIP 手续费折扣、认证商家保证金、火币积分专享活动、与热门币种交易、参与火币业务等。

以太坊智能合约项目-Token合约开发与部署

以上信息中,咱们姑且先关注一下总量: 500,000,000 HT,其余信息均为交易所信息,暂时不关注,如今,咱们开始经过ERC20标准实现咱们本身的Token合约。

4.1 建立合约接口 EIP20Interface

首先定义一个合约EIP20Interface,将ERC20标准中须要实现的全部方法与事件所有进行引用,做为Token合约的父合约,用于被其余合约集成使用。

pragma solidity ^0.4.24;

contract EIP20Interface{
    /*
    //获取token名字,好比"BruceFeng Coin"
    function name() view returns (string name);
    //获取Token简称,好比"BFC"
    function symbol() view returns (string symbol);
    //获取小数位,好比以太坊的decimals为18
    function decimals() view returns (uint8 decimals);
     //4.获取token发布的总量,好比HT 5亿
     function totalSupply() view returns (uint256 totalSupply);
    /*
    //获取token发布的总量,好比HT 5亿
    function totalSupply() view returns (uint256 totalSupply);
    */
    //获取_owner地址的余额
    function balanceOf(address _owner) public view returns (uint256 balance);
    //主动转帐:当前地址主动发起转帐,从当前地址向_to地址转入_value个Token
    function transfer(address _to, uint256 _value)public returns (bool success);

    //被动转帐:容许_to地址从_from(通常为当前地址)向_to转_value个Token
    function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
    //容许_spender从本身(调用方)帐户转走_value个Token
    function approve(address _spender, uint256 _value) returns (bool success);
    //本身_owner查询__spender地址能够转走本身多少个Token
    function allowance(address _owner, address _spender) view returns (uint256 remaining);

    //转帐的时候必需要调用的事件,好比Tranfer,TransferFrom
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    //成功执行approve方法后调用的事件
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

请严格参照3.规范解读中的英文网页进行对比查看,咱们此处将网页中须要实现的方法所有贴入代码中,在下面会依次实现。

3.2 建立继承合约 BFCToken
contract BFCToken is EIP20Interface {
// 合约体
}

建立一个新合约名为BFCToken做为子类集成EIP20Interface合约中的全部方法。

3.3 设置Token合约参数
//1.获取token名字,好比"BruceFeng Coin"
    string public name;
     //2.获取Token简称,好比"BFC"
    string public symbol;
    //3.获取小数位,好比以太坊的decimals为18
    uint8 public decimals;
     //4.获取token发布的总量,好比HT 5亿
    uint256 public totalSupply;

在合约标准中,经过function name() view returns (string name);实现,因为这些变量是存储固定信息的变量,不参与任何运算,只为显示所需,因此,经过public类型进行声明便可自动提供变量值的获取方法,这是行业内的常规作法,你们能够先参考实现,因此,咱们将获取这四个参数的函数都先注释掉。

3.4 定义存储变量

这两个变量很是重要,请仔细思考

//存储地址余额
mapping(address=>uint256) balances ;   
//存储容许转出的金额
mapping(address=>mapping(address=>uint256)) allowances;
  • balances 存储帐户余额

    如balance["0xca35b7d915458ef540ade6068dfe2f44e8fa733c"]=10000

  • allowances 容许转出的金额
key   :0x18850c9cE7B2274EbB0c78e6221844AC76715494
value : 
        key   : 0xca35b7d915458ef540ade6068dfe2f44e8fa733c  
        value : 100
value : 
        key   : 0xxv3fe7d915458ef540ade6068dfe2f44e8fa34xb  
        value : 200

1.表示地址0x18850c9cE7B2274EbB0c78e6221844AC76715494容许地址0xca35b7d915458ef540ade6068dfe2f44e8fa733c从本身帐户中转出100个TOKEN
map[0x18850c9cE7B2274EbB0c78e6221844AC76715494][0xca35b7d915458ef540ade6068dfe2f44e8fa733c]=100

2.表示地址0x18850c9cE7B2274EbB0c78e6221844AC76715494容许地址0xxv3fe7d915458ef540ade6068dfe2f44e8fa34xb从本身帐户中转出200个TOKEN

map[0x18850c9cE7B2274EbB0c78e6221844AC76715494][0xxv3fe7d915458ef540ade6068dfe2f44e8fa34xb]=200

请仔细参考以上讲解说明,此处均为被动转帐模式。

3.5 定义构造函数
function BFCToken(string _name,string _symbol, uint8 _decimals,uint256 _totalSupply) public{
    name = _name;
    symbol = _symbol;
    decimals = _decimals;
    totalSupply = _totalSupply;
    balances[msg.sender] = _totalSupply;
    }

经过该函数定义部署Token合约时的传入参数

3.5 查询地址余额 balanceOf
function balanceOf(address _owner) public view returns (uint256 balance){
        return balances[_owner];
    }

查询指定地址拥有该Token的数量

3.5 主动转帐 transfer
function transfer(address _to, uint256 _value)public  returns (bool success){
        require(_value >0 && balances[_to] + _value > balances[_to] && balances[msg.sender] > _value);
        balances[_to] += _value;
        balances[msg.sender] -= _value;
        Transfer(msg.sender, _to,_value);

        return true;
    }

转帐:从本身帐户向地址_to地址转入_value个Token

3.6 被动转帐
  • 实现转帐批准:approve
function approve(address _spender, uint256 _value) returns (bool success){
         //定义依赖条件,转帐金额>0 而且 被转帐户余额>转帐金额
        require(_value >0 && balances[msg.sender] > _value);
        //将转帐金额存入allowances集合中,对应关系可参考···3.4定义存储变量···
        allowances[msg.sender][_spender] = _value;
        //触发Approval事件
        Approval(msg.sender,_spender,_value);
                return true;
    }

容许_spender从本身(合约调用方msg.sender)帐户转走_value个Token

  • 实现批准金额查看:allowance
function allowance(address _owner, address _spender) view returns (uint256 remaining){
        return allowances[_owner][_spender];
    }

查询当前地址_owner(msg.sender)能够被_spender地址多少个Token

  • 建立被动转帐函数:transferFrom
function transferFrom(address _from, address _to, uint256 _value) returns (bool success){
        //取出本次当前地址对中容许转帐的金额
        uint256 allowan = allowances[_from][_to];
        /*定义依赖条件:
        1. 容许转帐的金额 > 转出的金额
        2. 转出方地址的余额>=转出的金额
        3. 转入方地址务必是当前帐户地址
        4. 转入方转帐后地址务必大于原来余额
        */
        require(allowan > _value && balances[_from] >= _value && _to == msg.sender && balances[_to] + _value>balances[_to]);
        //将本次转帐金额从容许转帐金额中扣除
        allowances[_from][_to] -= _value;
        //将本次转帐金额从转出方余额中扣除
        balances[_from] -= _value;
        //将本次转帐金额加入到转入方余额中
        balances[_to] += _value;
        //触发Transfer事件
        Transfer(_from,_to,_value);
        return true;
    }

5.最终代码

pragma solidity ^0.4.24;

contract EIP20Interface{
    //获取_owner地址的余额
    function balanceOf(address _owner) public view returns (uint256 balance);
    //转帐:从本身帐户向_to地址转入_value个Token
    function transfer(address _to, uint256 _value)public returns (bool success);

    //转帐:从_from向_to转_value个Token
    function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
    //容许_spender从本身(调用方)帐户转走_value个Token
    function approve(address _spender, uint256 _value) returns (bool success);
    //本身_owner查询__spender地址能够转走本身多少个Token
    function allowance(address _owner, address _spender) view returns (uint256 remaining);

    //转帐的时候必需要调用的时间,好比Tranfer,TransferFrom
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    //成功执行approve方法后调用的事件
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

contract BFCToken is EIP20Interface {
    //1.获取token名字,好比"BruceFeng Coin"
    string public name;
     //2.获取Token简称,好比"BFC"
    string public symbol;
    //3.获取小数位,好比以太坊的decimals为18
    uint8 public decimals;
     //4.获取token发布的总量,好比HT 5亿
    uint256 public totalSupply;

    mapping(address=>uint256) balances ;

    mapping(address=>mapping(address=>uint256)) allowances;
    function BFCToken(string _name,string _symbol, uint8 _decimals,uint256 _totalSupply) public{       
    name = _name;
    symbol = _symbol;
    decimals = _decimals;
    totalSupply = _totalSupply;
    balances[msg.sender] = _totalSupply;
    }

    //获取_owner地址的余额
    function balanceOf(address _owner) public view returns (uint256 balance){
        return balances[_owner];
    }
    //转帐:从本身帐户向_to地址转入_value个Token
    function transfer(address _to, uint256 _value)public  returns (bool success){
        require(_value >0 && balances[_to] + _value > balances[_to] && balances[msg.sender] > _value);
        balances[_to] += _value;
        balances[msg.sender] -= _value;
        Transfer(msg.sender, _to,_value);

        return true;
    }

    //转帐:从_from向_to转_value个Token
    function transferFrom(address _from, address _to, uint256 _value) returns (bool success){
        uint256 allowan = allowances[_from][_to];
        require(allowan > _value && balances[_from] >= _value && _to == msg.sender && balances[_to] + _value>balances[_to]);
        allowances[_from][_to] -= _value;
        balances[_from] -= _value;
        balances[_to] += _value;
        Transfer(_from,_to,_value);
        return true;
    }
    //容许_spender从本身(调用方)帐户转走_value个Token
    function approve(address _spender, uint256 _value) returns (bool success){
        require(_value >0 && balances[msg.sender] > _value);
        allowances[msg.sender][_spender] = _value;
        Approval(msg.sender,_spender,_value);
                return true;
    }
    //本身_owner查询_spender地址能够转走本身多少个Token
    function allowance(address _owner, address _spender) view returns (uint256 remaining){
        return allowances[_owner][_spender];
    }

}

四. 代码调试测试

调试环境: JavaScript VM

1.代码调试

在将代码正式部署到以太坊测试网络前,咱们先在JavaScript VM环境进行部署并进行调试

以太坊智能合约项目-Token合约开发与部署

填写Token初始化参数,须要注意,发行总量=_TotalSupply/_decimals,此处发行了100000个BFC

以太坊智能合约项目-Token合约开发与部署

直接获取参数值

以太坊智能合约项目-Token合约开发与部署

部署成功

2.代码测试

为了读者可以理顺后面的地址之间的关系,此处先进行说明

  • 部署合约的帐户地址(下文简称为地址A): 0xca35b7d915458ef540ade6068dfe2f44e8fa733c

以太坊智能合约项目-Token合约开发与部署

  • 生成的Token合约地址(下文简称为地址B): 0xdc04977a2078c8ffdf086d618d1f961b6c546222

以太坊智能合约项目-Token合约开发与部署

  • 用于转入Token的帐户地址(下文简称为地址C):0x14723a09acff6d2a60dcdf7aa4aff308fddc160c

    (能够从JavaScript VM环境的帐户中选择一个便可)

以太坊智能合约项目-Token合约开发与部署

在代码测试过程当中,这几个地址千万不要混淆,地址B目前不须要使用,但部署到以太坊网络后须要使用,此处先做个铺垫。

2.1 查询帐户余额

以太坊智能合约项目-Token合约开发与部署

查询地址A的Token余额

以太坊智能合约项目-Token合约开发与部署

查询地址B的Token余额

2.2 主动转帐

注意点: 务必保证转帐帐户须要选择正确

以太坊智能合约项目-Token合约开发与部署

从地址A给地址B转帐1888个Token

以太坊智能合约项目-Token合约开发与部署

查询地址B的Token余额

以太坊智能合约项目-Token合约开发与部署

查询地址A的Token余额

以太坊智能合约项目-Token合约开发与部署

地址B给地址A转帐88个Token

以太坊智能合约项目-Token合约开发与部署

查询地址B的Token余额

以太坊智能合约项目-Token合约开发与部署

查询地址A的Token余额

2.3 被动转帐

其实被动转帐这个概念是笔者本身定义的,让别人从本身这边取走东西,能够简单理解为被动,如此定义只是为了讲解的方便。

  • 建立批准规则

以太坊智能合约项目-Token合约开发与部署

地址A容许地址B转走800个Token

  • 查看批准金额数量

以太坊智能合约项目-Token合约开发与部署

allowance中填写: "0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"

查看地址B能从地址A中转出多少Token

此时地址A与地址B的余额分别为

地址A: 0: uint256: balance 9999999999999999998200
地址B: 0: uint256: balance 1800
  • 执行转帐操做

以太坊智能合约项目-Token合约开发与部署

地址B从地址A中转出230个Token,注意执行合约的Account是地址B

以太坊智能合约项目-Token合约开发与部署

此时,地址B能从地址A中转出的Token余额为570,地址B的Token余额增长了230

此时,Token合约代码测试基本完毕,能够部署到以太坊网络中。

五.代码部署转帐

测试环境:本文选择使用Rinkeby环境进行合约部署

1.代码部署

以太坊智能合约项目-Token合约开发与部署

选择对应的测试环境跟帐户,填写对应的Token合约参数,总量为10万

以太坊智能合约项目-Token合约开发与部署

确认部署

以太坊智能合约项目-Token合约开发与部署

部署确认

以太坊智能合约项目-Token合约开发与部署

合约部署成功

以太坊智能合约项目-Token合约开发与部署

获取合约配置参数,复制合约地址:0x79334c31893ca7c59dd0bcf2a69189dd0db609c9

2.转帐测试

2.1 添加Token到钱包中

以太坊智能合约项目-Token合约开发与部署

点击ADD Token
以太坊智能合约项目-Token合约开发与部署

将合约地址粘贴进去,Token合约的简称跟位数都会直接显示

以太坊智能合约项目-Token合约开发与部署

添加便可

以太坊智能合约项目-Token合约开发与部署

添加成功

2.2 转帐至其余帐户地址

以上部署合约的帐户地址(地址1)为: 0x18850c9cE7B2274EbB0c78e6221844AC76715494

要转入Token的帐户地址(地址2)为:0x139f46dCb8DAE14dE0aE3F98B298A73393b7Cc43

地址2的帐户信息

以太坊智能合约项目-Token合约开发与部署

以太坊智能合约项目-Token合约开发与部署

点击SEND执行转帐操做

以太坊智能合约项目-Token合约开发与部署

填写转入地址为地址2

以太坊智能合约项目-Token合约开发与部署

信息确认

以太坊智能合约项目-Token合约开发与部署

交易提交成功

以太坊智能合约项目-Token合约开发与部署

交易确认成功

2.3 转帐成功确认

进入到地址2中进行Token添加

以太坊智能合约项目-Token合约开发与部署

以太坊智能合约项目-Token合约开发与部署

以太坊智能合约项目-Token合约开发与部署

转帐成功

以太坊智能合约项目-Token合约开发与部署

读者能够继续执行转帐测试工做,如从地址2转入地址1中。

六.学习用途申明

本文全部内容均为学习交流使用,各位技术人在进行技术研究以及业务落地的过程当中切记以遵照国家法律为前提,合法开展相关技术支撑的业务与市场活动。

最后,祝你们学习愉快!

相关文章
相关标签/搜索