用Solidity在Truffle上构建一个HelloWorld智能合约

智能合约 18-06-21 09:21 1242  

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测试验证成功,功能虽然简单,但是走通了以太坊智能合约的基本开发测试流程,以后可以基于此继续做扩展。