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

  • 相关阅读:
    C++ template —— 类型区分(十一)
    C++ template —— 表达式模板(十)
    C++ template —— template metaprogram(九)
    C++ template —— 模板与继承(八)
    [转]2015有得有悟,2016笨鸟起飞
    C++ template —— trait与policy类(七)
    protobuf与json相互转换的方法
    如何通过卡面标识区分SD卡的速度等级
    MyEclipse设置字体和背景的方法
    JAVA中日期转换和日期计算的方法
  • 原文地址:https://www.cnblogs.com/bugmaking/p/9211225.html
Copyright © 2011-2022 走看看