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

pert發表於2018-06-21

原文地址:石匠的 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智慧合約
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章