以太坊开发(一)Truffle入门到实战

什么是Truffle

Truffle是一个世界级的开发环境,测试框架,以太坊的资源管理通道,致力于让以太坊上的开发变得简单,Truffle提供:

  • 内置的智能合约编译,链接,部署和二进制文件的管理。
  • 针对快速迭代开发的自动化合约测试。
  • 可脚本化,可扩展的部署与迁移框架。
  • 用于部署到任意数量的公网或私网的网络环境管理。
  • 使用EthPM&NPM提供的包管理,使用ERC190标准。
  • 与合约直接通信的交互控制台。
  • 可配的构建流程,支持紧密集成。
  • 在Truffle环境里支持执行外部的脚本。

本篇文章将介绍怎样使用Truffle进行智能合约的编译、部署和测试。

第一步,安装Truffle

$ sudo npm install -g truffle

安装完成后执行下面的命令,确保Truffle被正确安装

zhujiantao@ubuntu:~$ truffle
Truffle v4.1.14 - a development framework for Ethereum

Usage: truffle <command> [options]

Commands:
  init      Initialize new and empty Ethereum project
  compile   Compile contract source files
  migrate   Run migrations to deploy contracts
  deploy    (alias for migrate)
  build     Execute build pipeline (if configuration present)
  test      Run JavaScript and Solidity tests
  debug     Interactively debug any transaction on the blockchain (experimental)
  opcode    Print the compiled opcodes for a given contract
  console   Run a console with contract abstractions and commands available
  develop   Open a console with a local development blockchain
  create    Helper to create new contracts, migrations and tests
  install   Install a package from the Ethereum Package Registry
  publish   Publish a package to the Ethereum Package Registry
  networks  Show addresses for deployed contracts on each network
  watch     Watch filesystem for changes and rebuild the project automatically
  serve     Serve the build directory on localhost and watch for changes
  exec      Execute a JS module within this Truffle environment
  unbox     Download a Truffle Box, a pre-built Truffle project
  version   Show version number and exit

See more at http://truffleframework.com/docs

第二步,创建并初始化项目

创建工程目录并执行初始化命令

zhujiantao@ubuntu:~$ mkdir dapp
zhujiantao@ubuntu:~$ cd dapp/
zhujiantao@ubuntu:~/dapp$ truffle init
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!

Commands:

  Compile:        truffle compile
  Migrate:        truffle migrate
  Test contracts: truffle test
zhujiantao@ubuntu:~/dapp$ tree
.
├── contracts
│   └── Migrations.sol
├── migrations
│   └── 1_initial_migration.js
├── test
├── truffle-config.js
└── truffle.js

3 directories, 4 files

执行初始化命令后可以看到目录下生成了一些目录及文件,其中:contracts目录下存放合约文件,migrations下存放迁移部署脚本,test目录下存放测试文件,truffle.js和truffle-config.js为Truffle配置文件

接下来介绍一下 Truffle Boxes,Truffle Boxes装有很多一些实用的项目模板,能让你忽略一些环境配置问题,从而使你能更专注于你的dapp特性开发。此外,Truffle Boxes还包含其他有用的组件, Solidity 合约和库, 前后端视图等等。更多可查看官网

那就下载个模板看看,MetaCoin是一个简单的代币应用,以此为例

zhujiantao@ubuntu:~/dapp$ truffle unbox metacoin
Downloading...
Error: Something already exists at the destination. `truffle init` and `truffle unbox` must be executed in an empty folder. Stopping to prevent overwriting data.
   at /usr/local/lib/node_modules/truffle/build/webpack:/packages/truffle-box/lib/utils/unbox.js:22:1
   at <anonymous>
   at process._tickCallback (internal/process/next_tick.js:188:7)
   at Function.Module.runMain (module.js:695:11)
   at startup (bootstrap_node.js:188:16)
   at bootstrap_node.js:609:3

可以看到truffle init和truffle unbox都需要在空文件夹中执行,以防止数据重写,没关系,重新建一个工程目录好了。

zhujiantao@ubuntu:~$ mkdir MetaCoin
zhujiantao@ubuntu:~$ cd MetaCoin/
zhujiantao@ubuntu:~/MetaCoin$ truffle unbox metacoin
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!

Commands:

 Compile contracts: truffle compile
 Migrate contracts: truffle migrate
 Test contracts:    truffle test
zhujiantao@ubuntu:~/MetaCoin$ tree
.
├── contracts
│   ├── ConvertLib.sol
│   ├── MetaCoin.sol
│   └── Migrations.sol
├── migrations
│   ├── 1_initial_migration.js
│   └── 2_deploy_contracts.js
├── test
│   ├── metacoin.js
│   └── TestMetacoin.sol
├── truffle-config.js
└── truffle.js

3 directories, 9 files

相比执行init,多了关于metacoin的合约和库文件,合约部署文件和测试文件,关于这些文件的详细内容将在下篇文章中一一拆解

第三步,启动以太坊客户端

我们需要安装Ethereum客户端来支持JSON RPC API的调用。

有许多的以太坊客户端可以选择。我们推荐在本地开发和主网部署时使用不同客户端。

本地开发可以使用Canache、Ethereumjs-testrpc、或者truffle自带的Truffle Develop。

主网部署时使用Geth。

这里以Ethereumjs-testrpc为例,事实上,合约在部署到主网之前,都应先使用TestRPC进行充分测试。

安装

$ sudo npm install -g ethereumjs-testrpc

运行

zhujiantao@ubuntu:~$ testrpc
EthereumJS TestRPC v6.0.3 (ganache-core: 2.0.2)

Available Accounts
==================
(0) 0x14b1cf637d214963cd31c923711930aa7b97fd5b
(1) 0x8703ffa009e31e0eebf3aa2dacb32486e06077c0
(2) 0x2237e37056828dfb27e94a3274132a59ae5b4413
(3) 0x1744da91d3eca87fbcf2711740b12e62739965ec
(4) 0x3c35f08665a047f90ddce14d0f82b703a240a56f
(5) 0x2d4fa09b9f71d7b66a9c36d15eeda7311f49b837
(6) 0xc75df94d9a941cbab2a1297bd5770f0c036e4f89
(7) 0x7aaa5ff5f64970268183e06f56110a30571f753f
(8) 0x7c3b0b8193fff996b01bc77154fb91f3b361a646
(9) 0x2a5c667ba684bf0b7db61d7dec17751a6f6e03f8

Private Keys
==================
(0) 237fda9ce07f11cff672e58f633b514575613e96cb2653ea9d08ca69e882f042
(1) 50ea263a896e3b4ec3337ede58131e71dfdd71e7afa879b0957f3a3443b14b85
(2) dd251d5192bb0a73c1a9896f394099d646f6c8e2e96b88e7288f4e83d70a7392
(3) 3409d7a67896bbf2e6a8c9e414bb75284cf87fc66b9bb0e222cb8648a494709e
(4) e1229c76e7c1e5aad682c8b27da5d1a67171c7b3ad560fdb52cb1ae3855cc31d
(5) b627f6f491e8ed270733cd2483287cfa092d0b56b15de0f838ffc06257416c5b
(6) b25209ef82d3a44205d72b418b86476ac710afa1dcc582525954bc31db6c6832
(7) 20b540aa45c394306d38c1d37458d9c46d404311f822fc149fcd523c2e34d84d
(8) 838e1a99cca13ced482d9af2dbba6911a4ee3b676baa395a1462fd29fec070a5
(9) f586c3fe792d63b7459e399454d1798c21eb191db861aff67d9ec771cc22f83a

HD Wallet
==================
Mnemonic:      virus bamboo couch ankle afraid glide family attend empty bulb stadium cricket
Base HD Path:  m/44'/60'/0'/0/{account_index}

Listening on localhost:8545

第四步,编译部署合约

编辑配置文件truffle.js,保证配置文件中指定网络和你运行的网络一致。

这里要注意的是:Ganache默认运行在7545端口,Ethereumjs-testrpc 默认运行在8545端口,Truffle Develop 默认运行在9545端口

module.exports = {
    networks: {
        development: {
            host: 'localhost',
            port: '8545',
            network_id: '*' // Match any network id
        }
    }
};

使用truffle compile命令编译,生成build文件夹

zhujiantao@ubuntu:~/MetaCoin$ truffle compile
Compiling ./contracts/ConvertLib.sol...
Compiling ./contracts/MetaCoin.sol...
Compiling ./contracts/Migrations.sol...
Writing artifacts to ./build/contracts

zhujiantao@ubuntu:~/MetaCoin$ tree
.
├── build
│   └── contracts
│       ├── ConvertLib.json
│       ├── MetaCoin.json
│       └── Migrations.json
├── contracts
│   ├── ConvertLib.sol
│   ├── MetaCoin.sol
│   └── Migrations.sol
├── migrations
│   ├── 1_initial_migration.js
│   └── 2_deploy_contracts.js
├── test
│   ├── metacoin.js
│   └── TestMetacoin.sol
├── truffle-config.js
└── truffle.js

5 directories, 12 files

部署合约

zhujiantao@ubuntu:~/MetaCoin$ truffle migrate
Using network 'development'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0xf8e61ddf4663ae812678e0a62324911866b3b38c48d933c50c554a17f56da4f0
  Migrations: 0xb8d96e14501462f922b05d08bd1e461f59e71b77
Saving successful migration to network...
  ... 0xe6806b8ded1054326b5b795828c5306f186e584794732cba9f1fb50bd8e1dad8
Saving artifacts...
Running migration: 2_deploy_contracts.js
  Deploying ConvertLib...
  ... 0xddac202a2dc8dbe32b96867080e64ce6931dd05e3e2a9b1b29ef7b7970615a3b
  ConvertLib: 0xef4d768c8cb7dec157d40e06af71598176b15c5b
  Linking ConvertLib to MetaCoin
  Deploying MetaCoin...
  ... 0x4c2d8dcc99ffb631208a5568140e194515b03f38b9019d9c833770cfb3c262b6
  MetaCoin: 0xbc2104e9f774ea0a1d5f708401ff71ba451670b3
Saving successful migration to network...
  ... 0xabacbc322a9af2d359a49cdbc0e5a4ab55914956f95b4bc177b1789621bea3c9
Saving artifacts...

第五步,测试合约

zhujiantao@ubuntu:~/MetaCoin$ truffle test
Using network 'development'.

Compiling ./contracts/ConvertLib.sol...
Compiling ./contracts/MetaCoin.sol...
Compiling ./test/TestMetacoin.sol...
Compiling truffle/Assert.sol...
Compiling truffle/DeployedAddresses.sol...


  TestMetacoin
    ✓ testInitialBalanceUsingDeployedContract (88ms)
    ✓ testInitialBalanceWithNewMetaCoin (94ms)

  Contract: MetaCoin
    ✓ should put 10000 MetaCoin in the first account
    ✓ should call a function that depends on a linked library (50ms)
    ✓ should send coin correctly (128ms)


  5 passing (1s)

可以看到测试结果和用时等相关信息。

那么今天就先到这里啦,接下来,分析metacoin和webpack代码,学习怎样编写合约、迁移脚本和测试脚本,七夕快乐,嗒嗒嗒。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容