用Solidity在Truffle上構建一個HelloWorld智能合約
原文地址:石匠的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智能合約