以太坊智能合約項目-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中。

六.學習用途申明

本文全部內容均爲學習交流使用,各位技術人在進行技術研究以及業務落地的過程當中切記以遵照國家法律爲前提,合法開展相關技術支撐的業務與市場活動。

最後,祝你們學習愉快!

相關文章
相關標籤/搜索