1

摘要


介绍了如何获取宠物商店的TRUFLLE框架代码,并完成部署的过程。


但是这个是已经成熟的代码框架,一般用户要开发自己的项目。那如何借用宠物商店成熟框架完成自有DAPP的搭建呢?我们以tiny熊老师的一个姓名/年龄智能合约用例来呈现方法。


2

需求描述


我们要实现一个用户姓名和年纪的输入和呈现页面,能更新智能合约上的用户名和年龄。重新输入用户名和年纪,点击按钮可更新智能合约的这2个变量信息。


3

操作步骤


3.1 创建目录,下载框架


首先创建好目录,下载宠物商店的代码框架。


duncanwang@ubuntu:~/work$ mkdir name-age

duncanwang@ubuntu:~/work$ cd name-age

duncanwang@ubuntu:~/work/name-age$ truffle unbox pet-shop

Downloading...

Unpacking...

Setting up...

Unbox successful. Sweet!


Commands:


  Compile:        truffle compile

  Migrate:        truffle migrate

  Test contracts: truffle test

  Run dev server: npm run

 devduncanwang@ubuntu:~/work/name-age$


3.2 创建智能合约代码


新建一个InfoContract.sol智能合约文件,并把它更新到./contracts目录下。


pragma solidity ^0.4.24;


contract InfoContract {

    string name;

    uint age;


    event Instructor(string name, uint age);


    function setInfo(string _name, uint _age) public {

        name = _name;

        age = _age;

        emit Instructor(name, age);

    } 


   function getInfo() public view returns(string, uint) {

        return (name, age);

    }

}


3.3 增加合约相关的部署和测试代码


1) 增加合约部署测试


文件2_info_contract.js到./migrations目录,代码如下,表示contract InfoContract合约部署。


var MyContract = artifacts.require("./InfoContract.sol");


module.exports = function(deployer) {

  // deployment steps

  deployer.deploy(MyContract);

};


2) 增加测试文件


pragma solidity ^0.4.24;


import "truffle/Assert.sol";

import "truffle/DeployedAddresses.sol";

import "../contracts/InfoContract.sol";


contract TestInfoContract {

   InfoContract info = InfoContract(DeployedAddresses.InfoContract());

   string name;

   uint age;


   function testInfo() {

     info.setInfo("ABC", 10);


     (name, age) = info.getInfo();


     Assert.equal(name, "ABC", "设置名字出错");

     Assert.equal(age, 10, "设置年龄出错");

   }

}


3)修改配置文件


因为默认ganache-cli的端口为8545,所以需要修改truffle.js的端口号由7545 变为8545。


module.exports = {

  // See

  // for more about customizing your Truffle configuration!

  networks: {

    development: {

      host: "127.0.0.1",

      port: 8545,

      network_id: "*" // Match any network id

    }

  }

};


否则测试时会有找不到客户端提示。


duncanwang@ubuntu:~/work/name-age$ truffle test

Could not connect to your Ethereum client. Please check that your Ethereum client:

    - is running

    - is accepting RPC connections (i.e., "--rpc" option is used in geth)

    - is accessible over the network

    - is properly configured in your Truffle configuration file (truffle.js)


3.4 验收测试智能合约


1)参考宠物商店的文章代码在一个窗口启动一个ganache-cli 钱包


duncanwang@ubuntu:~/work/name-age$ cd ..
duncanwang@ubuntu:~/work$ ganache-cli >>trace.log


2)编译智能合约


然后启动另外一个窗口命令行,输入一下命令。


duncanwang@ubuntu:~/work/name-age$ truffle compile

Compiling ./contracts/InfoContract.sol...

Compiling ./contracts/Migrations.sol...

Writing artifacts to ./build/contracts


3)智能合约验收命令。


测试成功的提示说明:


duncanwang@ubuntu:~/work/name-age$ truffle test

Using network 'development'.


Compiling ./contracts/InfoContract.sol...

Compiling ./test/TestInfoContract.sol...

Compiling truffle/Assert.sol...

Compiling truffle/DeployedAddresses.sol...


Compilation warnings encountered:


/home/duncanwang/work/name-age/test/TestInfoContract.sol:12:4: Warning: No visibility specified. Defaulting to "public".

    function testInfo() {

   ^ (Relevant source part starts here and spans across multiple lines).


  TestInfoContract

    ✓ testInfo (838ms)


  1 passing (5s)


3.5 完成前端页面


完成以下2个文件的修改更新和上传。


1) index.html

把宠物商店的index.html的代码删除,替换为本文需要的框架代码。





    <!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 

   <meta http-equiv="X-UA-Compatible" content="ie=edge">

    <title>First Truffle DApp Demo</title>

    <link rel="stylesheet" type="text/css" href="main.css">


</head>

<body>

    <div>

        <h1> First Truffle DApp Demo</h1>


        <h2 id="info"></h2>

        <img id="loader" src="https://loading.io/spinners/double-ring/lg.double-ring-spinner.gif">


        <label for="name" class="col-lg-2 control-label">姓名:</label>

        <input id="name" type="text">


        <label for="name" class="col-lg-2 control-label">年龄:</label>

        <input id="age" type="text">


        <button id="button">更新</button>


    </div>


    <script src="http://libs.baidu.com/jquery/2.1.1/jquery.min.js"></script>

    <script src="js/web3.min.js"></script>

    <script src="js/truffle-contract.js"></script>

    <script src="js/app.js"></script>


    


2) app.js


然后修改app.js的代码,完成智能合约的执行和调用作用。


App = {

  web3Provider: null,

  contracts: {}, 


 init: function() {

    return App.initWeb3(); 

 },


/*加载web3*/

  initWeb3: function() {

    if (typeof web3 !== 'undefined') {

         App.web3Provider = web3.currentProvider

         web3 = new Web3(App.web3Provider);

     } else {

         App.web3Provider = new Web3.providers.HttpProvider("http://localhost:9545") 

        web3 = new Web3(App.web3Provider);

     }


点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部