2018年03月13日 09:20:54 思无邪-machengyu 阅读数 2683
 
版权声明:本文为博主原创文章,转载请务必注明出处,否则追究法律责任 https://blog.csdn.net/pony_maggie/article/details/79535896

环境

ubuntu 16.04, 64位


运行testrpc

安装过程参考以前的文章。

开启一个终端,输入testrpc运行测试节点。testrpc是一个完整的在内存中的区块链仅仅存在于你开发的设备上。相对于 Geth私有链环境,TestRPC 它在执行交易时是实时返回,而不等待默认的出块时间,这样你可以快速验证你新写的代码,当出现错误时,也能即时反馈给你。

启动 testrpc 经后,会默认创建10个帐号,Available Accounts是帐号列表,Private Keys是相对应的帐号密钥。

在当前home目录下新建testproject目录,进入目录执行

  1. truffle init
 

等待一会发现会多出几个目录和文件:

  • contracts/: 智能合约存放的目录,默认情况下已经帮你创建 Migrations.sol合约。

  • migrations/: 存放部署脚本

  • test/: 存放测试脚本
  • truffle.js: truffle的配置文件

首先修改truffle.js文件,改成如下:

  1. module.exports = {
  2. networks: {
  3. development: {
  4. host: "localhost",
  5. port: 8545,
  6. network_id: "*" // 匹配任何network id
  7. }
  8. }
  9. };
 

这里是设置我们稍后要部署智能合约的位置, 否则会报网络错误。

编写合约

进入contracts目录,这里是存放合约代码的地方。我们可以使用sublime等工具编写测试合约代码,然后保存MyTest.sol文件。

  1. pragma solidity ^0.4.4;
  2. contract MyTest {
  3. function multiply(uint a) public pure returns(uint d) {
  4. return a * 7;
  5. }
  6. function say() public pure returns (string) {
  7. return "Hello Contract";
  8. }
  9. }
 

合约内容很简单,就是输入一个整数,返回它乘以7的结果。然后有一个函数say()输出一串字符。函数声明为pure,在这种情况下,它们承诺不会从该状态中读取或修改该状态

编译部署

修改migrations下的1_initial_migration.js文件,改成如下:

  1. var Migrations = artifacts.require("./Migrations.sol");
  2. var MyTest = artifacts.require("./MyTest.sol");
  3. module.exports = function(deployer) {
  4. deployer.deploy(Migrations);
  5. deployer.deploy(MyTest);
  6. };
 

原来的部署不动,只是新增一个我们自己写的合约(MyTest)。

开始编译,

  1. pony@pony-virtual-machine:~/solidity/testproject/migrations$ sudo truffle compile --compile-all
  2. Compiling ./contracts/Migrations.sol...
  3. Compiling ./contracts/MyTest.sol...
  4. Compilation warnings encountered:
  5. /home/pony/solidity/testproject/contracts/MyTest.sol:3:5: Warning: No visibility specified. Defaulting to "public".
  6. function multiply(uint a) returns(uint d) {
  7. ^
  8. Spanning multiple lines.
  9. ,/home/pony/solidity/testproject/contracts/MyTest.sol:3:5: Warning: Function state mutability can be restricted to pure
  10. function multiply(uint a) returns(uint d) {
  11. ^
  12. Spanning multiple lines.
  13. Writing artifacts to ./build/contracts
 

Truffle仅默认编译自上次编译后被修改过的文件,来减少不必要的编译。如果你想编译全部文件,可以使用–compile-all选项。

然后会多出一个build目录,该目录下的文件都不要做任何的修改。

部署,

  1. pony@pony-virtual-machine:~/solidity/testproject$ sudo truffle migrate --reset
  2. Using network 'development'.
  3. Running migration: 1_initial_migration.js
  4. Deploying Migrations...
  5. ... 0x65b047027d1fac616d3e87dba99d8a971873a001753ea1e0c834599710c4a4d4
  6. Migrations: 0x01f6ddb59ead2e893504830c4bc0bba9845b8104
  7. Deploying MyTest...
  8. ... 0x92358d38b5cde5d89d0133e19082fae422f581aad05a1fcdd146bc1f4ae181c9
  9. MyTest: 0x2b4c4ba201ada20fe5983a4e52b983858f39bb8e
  10. Saving successful migration to network...
  11. ... 0xb3767703f49b42a3a3bc3d0fe193a431b01d8600a0f8bc6d24a926a23f16ba8a
  12. Saving artifacts...
 

这个命令会执行所有migrations目录下的js文件。如果之前执行过truffle migrate命令,再次执行,只会部署新的js文件,如果没有新的js文件,不会起任何作用。如果使用–reset参数,则会重新的执行所有脚本的部署。

执行

  1. truffle migrate
 

如果以前有编译过别的乱七八糟的合约,怕环境出问题,可以使用

  1. truffle migrate reset
 

我自己就是执行migrate一直不成功,带上reset就可以了。

如果要部署到指定的网络,可以使用–network参数,例如:

  1. truffle migrate --network live
 

多个网络的配置格式如下:

  1. networks: {
  2. development: {
  3. host: "localhost",
  4. port: 8545,
  5. network_id: "*" // match any network
  6. },
  7. live: {
  8. host: "178.25.19.88", // Random IP for example purposes (do not use)
  9. port: 80,
  10. network_id: 1, // Ethereum public network
  11. // optional config values:
  12. // gas Gas limit used for deploys. Default is 4712388
  13. // gasPrice Gas price used for deploys. Default is 100000000000 (100 Shannon).
  14. // from - default address to use for any transaction Truffle makes during migrations
  15. // provider - web3 provider instance Truffle should use to talk to the Ethereum network.
  16. // - if specified, host and port are ignored.
  17. }
  18. }
 

简单测试下, 进入truffle控制台,

  1. $ truffle console
  2. truffle(development)> var contract;
  3. undefined
  4. truffle(development)> MyTest.deployed().then(function(instance){contract= instance;});
  5. undefined
  6. truffle(development)>
  7. undefined
  8. truffle(development)>
  9. undefined
  10. truffle(development)> contract.multiply(3)
  11. { [String: '21'] s: 1, e: 1, c: [ 21 ] }
  12. truffle(development)>
  13. undefined
  14. truffle(development)> contract.say()
  15. 'Hello Contract'
 

输入.exit可以退出控制台。

自动化测试

上面只是简单测试了下,那么如何编写测试代码进行自动化测试呢?

项目目录下的test子目录用了存放测试代码文件,我们可以编写测试代码然后保存在改目录下,这样当执行

  1. truffle test

的时候,测试代码就会被执行。

编写测试代码,保存为TestMyTest.sol,代码如下:

  1. pragma solidity ^0.4.0;
  2. import "truffle/Assert.sol";
  3. import "truffle/DeployedAddresses.sol";
  4. import "../contracts/MyTest.sol";
  5. contract TestMyTest {
  6. uint someValue;
  7. uint value;
  8. function testmultiply(){
  9. someValue=3;
  10. MyTest aaa=MyTest(DeployedAddresses.MyTest());
  11. value = aaa.multiply(someValue);
  12. uint expected = 21;
  13. Assert.equal(value, expected, "should 3*7=21");
  14. }
  15. }
 

执行测试,

  1. pony@pony-virtual-machine:~/solidity/testproject$ sudo truffle test
  2. Using network 'development'.
  3. Compiling ./contracts/MyTest.sol...
  4. Compiling ./test/TestMyTest.sol...
  5. Compiling truffle/Assert.sol...
  6. Compiling truffle/DeployedAddresses.sol...
  7. TestMyTest
  8. testmultiply (83ms)
  9. 1 passing (548ms)
 

在testrpc以太坊测试环境部署智能合约的更多相关文章

  1. 区块链入门到实战(18)之以太坊(Ethereum) – 什么是智能合约

    作用:提供优于传统合约的安全方法,并减少与合约相关的其他交易成本. 以太坊网络基石:以太坊虚拟币和智能合约. 智能合约(Smart contract )是一种旨在以信息化方式传播.验证或执行合同的计算 ...

  2. [币严区块链]简单易懂的以太坊(ETH)智能合约开发入门教程

    以太坊(Ethereum)是一提供个智能合约(smart contract)功能的公共区块链(BlockChain)平台. 本文介绍了一个简单的以太坊智能合约的开发过程. 开发环境 在以太坊上开发应用 ...

  3. 以太坊开发教程(二) 利用truffle发布宠物商店 DAPP 到 以太坊测试环境Ropsten

    1.环境安装 1) node安装 设置镜像地址: curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -下载安装 ...

  4. 从零构建以太坊(Ethereum)智能合约到项目实战——第23章 从零构建和部署去中心化投票App,decentralization Voting Dapp

    P90 .1-从零构建和部署去中心化投票App-01 P91 .2-从零构建和部署去中心化投票App-02 P92 .3-从零构建和部署去中心化投票App-03 参考博文:http://liyuech ...

  5. 从零构建以太坊(Ethereum)智能合约到项目实战——第20章 搭建自己的私有链网络

    P75 .1-以太坊私网建立 .合约编译.部署完全教程(1) 使用此博文进行安装配置:https://blog.csdn.net/w88193363/article/details/79402074 ...

  6. 从零构建以太坊(Ethereum)智能合约到项目实战——第22章 玩转truffle framework 、Web3.js 框架

    P84 .1-玩转truffle framework.Web3.js 框架 内容介绍 truffle官方网站:https://truffleframework.com/ P85 .2-truffle ...

  7. 从零构建以太坊(Ethereum)智能合约到项目实战——学习笔记10

    P57 .1-Solidity Types - 玩转 Solidity 数组 (Arrays) 学习目标 1.掌握Arrays的可变不可变的创建 2.深度理解可变数组和不可变数组之间的区别 3.二维数 ...

  8. 从零构建以太坊(Ethereum)智能合约到项目实战——第21章 搭建联盟链

    P78 .1-内容介绍 什么情况下建立自己测试用的PoA chain? 公司内网或无对外网络,无法同步区块 降低测试时等待区块的时间 不想碰到testrpc各种雷 PoA chain特点有 有别于Po ...

  9. 从零构建以太坊(Ethereum)智能合约到项目实战——第24章 IPFS + 区块链

    P93 .1-IPFS环境配置P94 .2-IPFS+P .IPNS+P .个人博客搭建 - 如何在IPFS新增一个文件P95 .3-IPFS+P .IPNS+P .个人博客搭建 - 通过ipfs创建 ...

随机推荐

  1. Android开发中常见问题分析及解决

    最近公司有新的业务需求,需要开发一款APP,因为我开发过Android APP(我想告诉他们,那是4年前的事了,嘤嘤嘤),就把开发任务交给我了,当然也不是我一个人啦,让我组开发小组,说白了,就是让我来 ...

  2. kbmMW 5.10.01试用报告

    1.FileClient.SameFile 调用这个方法,当本地文件不存在时,会一直等待.跟踪代码,发现: function TkbmMWCustomFileClient.SameFileEx(Loc ...

  3. Image Processing and Analysis_15_Image Registration:a survey of image registration techniques——1992

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  4. 中国大学MOOC课程信息之数据分析可视化一

    版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/82263391 9月2日更:中国大学MOOC课程信息之数据分 ...

  5. ping加上时间信息

    一.linux系统ping加时间戳信息 1.ping 加时间信息,然后还要实时保存到一个文件中,那么就与awk结合 ping 115.239.211.112 -c 10 | awk '{ print ...

  6. PAT Advanced 1071 Speech Patterns (25 分)

    People often have a preference among synonyms of the same word. For example, some may prefer "t ...

  7. JS 日期格式化,留作参考

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Mac: ld: library not found for -lgcc_s.10.4

    Mac: ld: library not found for -lgcc_s.10.4   Checking for cc... ld: library not found for -lgcc_s.1 ...

  9. Codeforces Round #585 (Div. 2) C. Swap Letters

    链接: https://codeforces.com/contest/1215/problem/C 题意: Monocarp has got two strings s and t having eq ...

  10. 下拉框 显示name 隐藏code

    暂未做详细整理, 后期有机会完善 jsp 是否有效: <s:select id="queryIsValid" name="configBean.queryIsVal ...