以太坊智能合約項目-Token合約開發與部署

修訂日期 姓名 郵箱
2019-09-05 brucefeng [email protected]

以太坊智能合約項目-Token合約開發與部署

一. 錢包環境安裝

以太坊錢包顧名思義,就是管理以太坊地址,存儲以太坊Token的工具,再簡單點說,任何區塊鏈網絡都需要我們有自己的賬戶,管理賬戶的軟件可稱之爲錢包,無論是炒幣的還是研究以太坊開發的,錢包都是必不可少的。

1.錢包分類

1.1 Mist

說到以太坊錢包,第一個要說的當然就是Ethereum官方錢包+瀏覽器 Mist。Mist是一個全節點錢包(全節點錢包通俗的來說就是同步了全部的以太坊區塊信息的錢包)。也就是說打開錢包後,電腦會自動同步全部的以太坊區塊信息,如果設備和網絡的條件過關的情況下,大概需要半天左右的時間。

以太坊智能合約項目-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瀏覽器,能夠幫助用戶方便地管理以太坊數字資產,支持所有的測試網絡和私有鏈網絡,是我們開發人員的必備錢包工具,下文將會講解如何安裝。

以太坊智能合約項目-Token合約開發與部署

1.4 Parity

原以太坊基金會部分成員開發的錢包,也是一個全節點錢包。

下載地址: https://github.com/paritytech/parity-ethereum/releases

2.賬戶與網絡

以太坊網絡中的賬戶和典型的區塊鏈賬戶沒有太大區別,都由地址、公鑰、私鑰 3 部分構成,不論使用何種錢包創建的以太坊賬戶,在不同的以太網網絡之間都是可以通用的,比如我在主網上創建了錢包賬戶,而切換到 任意 測試網絡,如Kovan時仍然可以使用同樣的賬戶,這種跨網絡通用的賬號機制實際上是內置在以太坊客戶端之內的。

以太坊智能合約項目-Token合約開發與部署

3.安裝MetaMask錢包

3.1 錢包插件安裝

創建以太坊賬戶的方式有很多種,上文就提到了多種以太坊錢包,但我們要開發跑在瀏覽器中的 DApp,錢包集成在瀏覽器中就非常方便了,所以我們選擇MetaMask作爲我們的開發環境的錢包工具。

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

六.學習用途申明

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

最後,祝大家學習愉快!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章