Truffle框架和Ganache本地私鏈

NO IMAGE

Truffle框架和Ganache本地私鏈

安裝Truffle

Truffle是一個世界級的開發環境,測試框架,以太坊的資源管理通道,致力於讓以太坊上的開發變得簡單。

建立工程

  • 建立一個空工程

    truffle init
  • 建立包含metacoin的工程

    新版本truffle引入了box的概念,所有的示例程式碼都以box的形式提供。下載metacoin的示例程式碼:

    truffle unbox metacoin
  • 工程結構

    工程結構如圖:

    • contracts 目錄中包含 Solidity 合約程式碼,其中 Migrations.sol 是必須的,其他的是合約程式碼(這裡是示例的 MetaCoin 程式碼)。

    • migrations 目錄中包含合約部署指令碼, 1_initial_migration.js 用來部署 Migrations.sol ,其他的指令碼會按照順序依次執行。

    • test 目錄中是測試程式碼。

  • MetaCoin

    MetaCoin的程式碼主要實現了三個介面:發幣,檢視餘額,檢視Eth餘額。

    contract MetaCoin {
    mapping (address => uint) balances;
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    function MetaCoin() public {
    balances[tx.origin] = 10000;
    }
    function sendCoin(address receiver, uint amount) public returns(bool sufficient) {
    if (balances[msg.sender] < amount) return false;
    balances[msg.sender] -= amount;
    balances[receiver]  = amount;
    Transfer(msg.sender, receiver, amount);
    return true;
    }
    function getBalanceInEth(address addr) public view returns(uint){
    return ConvertLib.convert(getBalance(addr),2);
    }
    function getBalance(address addr) public view returns(uint) {
    return balances[addr];
    }
    }

安裝以太坊客戶端Ganache

智慧合約必須要部署到鏈上進行測試。可以選擇部署到一些公共的測試鏈比如 Rinkeby 或者 Ropsten 上,缺點是:部署和測試時間比較長需要申請一些假的代幣。所以對於開發者,最好的方式是部署到私鏈上。
Ganache是​​您以太坊開發的個人區塊鏈。他的前身是 testRPC ,很多舊的教程介紹的都是 testRPC

編譯和部署合約

  • Ganache 預設執行在本地 7545 埠,執行後預設建立10個賬號,每個賬號裡有100ETH的餘額。

  • 修改truffle.js

    要部署到鏈上,需要把IP、埠、網路ID告訴truffle。修改truffle.js:

    module.exports = {  
    networks: {  
    development: {  
    host: 'localhost',  
    port: '7545',  
    network_id: '*' // Match any network id  
    }  
    }  
    }; 
  • 編譯和部署

    truffle compile  
    truffle migrate

測試合約

  • 測試內容

    MetaCoin的示例程式碼裡已經把測試程式碼寫好了,主要測試 MetaCoin 的介面是否可用:

    contract TestMetacoin {
    function testInitialBalanceUsingDeployedContract() public {
    MetaCoin meta = MetaCoin(DeployedAddresses.MetaCoin());
    uint expected = 10000;
    Assert.equal(meta.getBalance(tx.origin), expected, "Owner should have 10000 MetaCoin initially");
    }
    function testInitialBalanceWithNewMetaCoin() public {
    MetaCoin meta = new MetaCoin();
    uint expected = 10000;
    Assert.equal(meta.getBalance(tx.origin), expected, "Owner should have 10000 MetaCoin initially");
    }
    }
  • 測試合約

    直接輸入測試合約的命令:

    truffle test

    結果顯示5個測試都通過:

  • Ganache

    檢視Ganache上的執行結果:

    • Accounts標籤:第一個賬戶裡ETH略有減少,因為交易消耗了gas

    • Blocks標籤:Ganache是自動挖礦,生成了6個新區塊,每個區塊裡有一個交易

    • Transactions標籤:有6筆新交易,可以點開看交易詳情

    • Logs標籤:顯示交易和挖礦日誌