1. 程式人生 > >用Solidity在Truffle上構建一個HelloWorld智能合約

用Solidity在Truffle上構建一個HelloWorld智能合約

基於 wms e431 添加 nds 測試程序 獲取 develop cover

原文地址:石匠的blog

Truffle的環境安裝在前文已經整理,這次用Solidity在Truffle寫一個HelloWorld以太坊智能合約,並在testrpc上進行測試。當前的軟件版本信息如下:

Truffle v4.1.11 (core: 4.1.11)
Solidity v0.4.24 (solc-js)

項目創建

打開Mac的terminal終端,創建一個新目錄,並truffle項目初始化。

> mkdir HelloWorld
> cd HelloWorld
> truffle init

初始化好之後的目錄結構如下:

HelloWorld
|____truffle.js
|____migrations
| |____1_initial_migration.js
|____test
|____contracts
| |____Migrations.sol
|____truffle-config.js

撰寫HelloWorld合約

HelloWorld智能合約測試代碼如下:

pragma solidity ^0.4.24;

contract HelloWorld{
    address creator;     
    string message;     

    constructor()   
    {
        creator = msg.sender;
    }

    function say() constant returns (string)          
    {
        return message;
    }
    
    function setMessage(string _newMsg) 
    {
        message = _newMsg;
    }
    
     /**********
     Standard kill() function to recover funds 
     **********/
    
    function kill()
    { 
        if (msg.sender == creator)
            selfdestruct(creator);  // kills this contract and sends remaining funds back to creator
    }

}

保存到contracts目錄下的HelloWorld.sol文件中。合約保存了一個message變量,用來存儲設置的信息。合約提供了message的設置和獲取接口setMessage和say,測試的時候可以調用者2個接口進行測試確認。

編譯

在HelloWorld目錄下:

> truffle compile

compile只會編譯更新過的合約文件,如果有多個文件,且想全部編譯,可以使用 truffle compile-all.

運行測試

1.啟動testrpc

通過testrpc可以很方便的進行測試,打開一個新的terminal終端執行命令:

> testrpc

默認會在localhost:8545進行合約部署的監聽。

2.修改合約配置

因為合約是要發給testrpc做運行,需要再HelloWorld/truffle.js中配置testrpc的地址信息,如下:

module.exports = {
      networks: {
             development: {
             host: "localhost",
             port: 8545,
             network_id: "*" // Match any network id
            }
    }
};

3.添加遷移信息(migrate)

需要配置告訴truffle遷移哪些合約到testrpc,添加一個文件HelloWorld/migrations/2_deploy_contracts.js

var HelloWorld = artifacts.require("./HelloWorld.sol");

module.exports = function(deployer) {
  deployer.deploy(HelloWorld);
};

運行遷移命令,部署合約到testrpc:

> truffle migrate

同樣的,這個命令只會遷移修改過的合約,如果有異常錯誤或者需要手動全部重新遷移,可以運行 truffle migrate --reset.

遷移成功後在testrpc窗口也會有響應的提示信息,包括函數調用和事務執行信息等。

4.命令行測試合約

通過console可以方便的測試合約的開發接口是否訪問正常,運行命令:

> truffle console

運行成功後進入到truffle的命令行程序中,可以通過以下命令來測試合約接口,設置信息:

> HelloWorld.deployed().then(i=>i.setMessage("Hello world!"));

HelloWorld.deployed()返回了部署成功的HelloWorld合約的Promise對象,然後通過then()調用setMessage接口。執行成功後可以得到類似如下的信息:

{ tx:
   ‘0xbb506d5a8ad80ae431fcffc326e4910dcd272bba1fe458c8c83b8eefd08b7de1‘,
  receipt:
   { transactionHash:
      ‘0xbb506d5a8ad80ae431fcffc326e4910dcd272bba1fe458c8c83b8eefd08b7de1‘,
     transactionIndex: 0,
     blockHash:
      ‘0x8dd58db70ad49d2741a9d36a6e5f77e5e6c0e19f09935df5cd21e52762472491‘,
     blockNumber: 16,
     gasUsed: 43459,
     cumulativeGasUsed: 43459,
     contractAddress: null,
     logs: [],
     status: 1 },
  logs: [] }

因為setMessage是一個設置接口,會修改區塊鏈的狀態,所以他是一個Transaction。然後調用say接口測試是否設置成功:

> HelloWorld.deployed().then(i=>i.say());
返回結果是:

"Hello world!"
表面前面的setMessage設置有效,且say接口訪問正常。

小結

以上是用solidity寫的很簡單的智能合約測試程序,並部署在truffle和testrpc測試驗證成功,功能雖然簡單,但是走通了以太坊智能合約的基本開發測試流程,以後可以基於此繼續做擴展。

用Solidity在Truffle上構建一個HelloWorld智能合約