Mac下基于testrpc和truffle的以太坊智能合约开发环境搭建

原文地址:石匠的blognode

truffle是一个基于Javascript开发的一套智能合约开发框架,使用Solidity语言编写合约。truffle有一套自动的项目构建机制,集成了开发,测试和部署的各个流程细节,不用开发人员关注。truffle使用说明.python

testrpc是基于pyethereum,能够快速的搭建一个模拟以太坊的测试网络,而且预制了若干存有代币的帐号,能够直接使用。不像geth是一个真正的以太网网络,testrpc在内存中模拟了以太坊网络,运行速度很是快,很适合作智能合约的开发和测试,待测试完整后再上geth会比较高效。webpack

预期经过truffle和testrpc搭建一个只能合约的开发测试环境,部署官方的测试合约metacoin进行验证和后续的测试学习。git

truffle安装

truffle使用npm安装,因此在mac上先安装npm:github

brew install npm

而后依次安装truffle和testrpcweb

npm install -g truffle
npm install -g ethereumjs-testrpc

truffle安装好之后,准备安装默认的metacoin作测试。npm

truffle版本变动的坑

我当前用的最新版本是:vim

Truffle v4.1.11 (core: 4.1.11)
Solidity v0.4.24 (solc-js)

按照以前的老版本truffle使用流程进行搭建和部署(好比这里介绍的),大概步骤以下:api

1.创建一个独立的目录
2.运行truffle init建立默认的合约项目
3.运行truffle compile编译合约项目
4.运行testrpc
5.运行truffle deploy部署合约到testrpc
6.运行truffle serve启动服务,在localhost:8080启动web服务
7.浏览器打开localhost:8080,就出现了metacoin的主页

按照以上步骤,出现了各类问题,好比:浏览器

  1. truffle init生成的contracts目录中并无生成app目录,并且也没有metacoin的合约sol文件, metacoin已经独立成一个单独的box,须要单独安装 truffle unbox webpack(注意:不是truffle unbox metacoin)。
  2. truffle deploy运行报错:

    No network specified. Cannot determine current network.

    解决办法是须要再truffle.js中设置网络参数以下:

    module.exports = {
       networks: {
       development: {
       host: "localhost",
       port: 8545,
       network_id: "*" // Match any network id
      }
     }
    };
  3. truffle serve运行报错:

    TypeError: fsevents is not a constructor

    最后再github的官方issue里面找到了一种解决办法,就是强行修改js代码,不适用useFsEvents参数,以下:

    vim /usr/local/lib/node_modules/truffle/build/cli.bundled.js
    
    // Enable fsevents on OS X when polling isn't explicitly enabled.
    //if (undef('useFsEvents')) opts.useFsEvents = !opts.usePolling;
    
    // If we can't use fsevents, ensure the options reflect it's disabled.
    //if (!FsEventsHandler.canUse()) opts.useFsEvents = false;
    opts.useFsEvents = false;
  4. 采用truffle serve启动后,原本应该是要在localhost:8080看到metacoin的范例主页的,可是访问后,只能获得:

    Cannot get /
  5. 找各类奇葩问的解决方案的时候,在github官方issue看到了说是官方已经放弃truffle serve,不该该再采用这种方式启动服务了,前面跟着老版本的方法作就很容易入坑了。
  6. 操做过程当中还遇到很多奇葩问题,就不一一列举了。

正确配置方法

我当前mac使用的truffle版本是Truffle v4.1.11,解决问题过程当中,发现了线索,metacoin的项目可使用webpack来安装:

$truffle unbox webpack

以上命令运行成功后,能够看到返回结果:

$truffle unbox webpack
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!

Commands:

  Compile:              truffle compile
  Migrate:              truffle migrate
  Test contracts:       truffle test
  Run linter:           npm run lint
  Run dev server:       npm run dev
  Build for production: npm run build

从Commands里面能够看到,当前正确的命令是什么,总结以前的操做流程,正确的步骤以下:

1.创建一个独立的目录metacoin
2.运行truffle unbox webpack下载合约项目
3.运行truffle compile编译合约项目(为提升效率,默认只编译修改过的合约文件, 添加"--all"选项,能够强制编译全部文件)
4.运行testrpc(新建一个独立窗口执行)
5.修改truffe.js文件,设置testrpc的地址:localhost和8545
6.运行truffle migrate部署合约到testrpc(此时能够再运行testrpc的窗口看到有日志出现)
6.运行npm run dev启动服务,在localhost:8080启动web服务
7.浏览器打开localhost:8080,就出现了metacoin的主页

出现的metcoin主页是这样的:
avatar

到了这里,metacoin的环境就搭建起来了,剩下的能够继续对智能合约进行修改,测试和验证。

单独安装testrpc-py

testrpc是python开发,使用pip能够很方便的安装和自动处理依赖关系。testrpc项目地址在这里。也能够经过testrpc的官方向导,单独安装。

pip install eth-testrpc

安装的时候遇到如下问题,不管是sudo与否都过不去:

error: [Errno 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/LICENSE'

google后发现是系统版本问题(这里),个人mac是10.13.2 High Sierra版本,而mac从10.11.x(EI Capitan)就引入了SIP机制(System Integrity Protection),运行时会对系统的完整性作保护,不容许改变系统目录,因此须要关掉这个机制,关闭方法:

1.重启电脑,按住Command+R(直到出现苹果标志)进入Recovery Mode(恢复模式)
2.左上角菜单里找到实用工具->终端
3.输入csrutil disable回车
4.重启Mac
(若是想从新启动SIP机制重复上述步骤改用csrutil enable便可)

解决问题后,从新pip安装,成功后便可使用testrpc-py命令来使用。

相关文章
相关标签/搜索