Dapp开发(一)

位置
你的配置文件是truffle.js。位于项目的根目录下。这个文件是Javascript文件,支持执行代码来创建配置。它必须导出一个对象,来代表项目配置,如下面的例子。

WINDOWS下的命名空间冲突
当使用Windows的命令行时,默认的配置文件名与truffle冲突。这种情况下,我们推荐使用Windows的power Shell或Git BASH。你也可以将配置文件重命名为truffle-config.js来避免冲突。

例子
module.exports = {
build: {
“index.html”: “index.html”,
“app.js”: [
“javascripts/app.js”
],
“app.css”: [
“stylesheets/app.css”
],
“images/”: “images/”
},
rpc: {
host: “localhost”,
port: 8545
}
};
默认配置文件已经配置好了,build和rpc。这些默认和非默认选项,详见后面。

选项
BUILD
这个是前端的构建配置。默认调用默认构建器,在上述构建章节,有所说明。但你也可以自定的构建流程,查看高级构建流程章节来了解更多。

例子:

build: {
“index.html”: “index.html”,
“app.js”: [
“javascripts/app.js”
],
“app.css”: [
“stylesheets/app.css”
],
“images/”: “images/”
}
NETWORKS
指定在移植(Migration)时使用哪个网络。当在某个特定的网络上编译或运行移植时,合约会缓存起来方便后续使用。当你的合约抽象层检查到你连到某个网络上时,它会使用这个这个网络上原有的缓存合约来简化部署流程。网络通过以太坊的RPC调用中的net_version来进行标识。

下述的networks对象,通过一个网络名做为配置的键,值对应定义了其网络参数。networks的对应选项不是必须的,但如果一旦指定,每个网络必须定义一个对应的network_id。如果你想指定一个默认网络,你可以通过将netword_id的值标记为default来实现,当没有匹配到其它的网络时,就会使用默认网络。需要注意的是整个配置中,应该有且仅有一个default的网络。一般来说,默认网络主要用于开发,配置,合约等数据没有长期保存的需要,网络ID也会因TestRPC的重启而频繁改变时。

网络名称用于用户接口调用时使用,在移植中的使用方式如下:

$ truffle migrate –network live
你还可以选择性的指定rpc的配置信息。下面是一个示例:

networks: {
“live”: {
network_id: 1, // Ethereum public network
// optional config values
// host - defaults to “localhost”
// port - defaults to 8545
// gas
// gasPrice
// from - default address to use for any transaction Truffle makes during migrations
},
“morden”: {
network_id: 2, // Official Ethereum test network
host: “178.25.19.88”, // Random IP for example purposes (do not use)
port: 80
},
“staging”: {
network_id: 1337 // custom private network
// use default rpc settings
},
“development”: {
network_id: “default”
}
}
RPC
关于如何连接到以太坊客户端的一些细节。host和port是需要,另外还需要一些其它的。

host:指向以太坊客户端的地址。本机开发时,一般为localhost
port:以太坊客户端接收请求的端口,默认是8545
gas:部署时的Gas限制,默认是4712388
gasPrice:部署时的Gas价格。默认是100000000000(100 Shannon)
from:移植时使用的源地址。如果没有指定,默认是你的以太坊客户端第一个可用帐户。
示例:

rpc: {
host: “localhost”,
port: 8545
}
MOCHA
MochaJS测试框架的配置选项,详细参考documentation。

示例:

mocha: {
useColors: true
}

网络与APP部署
背景
即使最小的项目也至少会与两个以上的区块链打交道,一个是开发机上的测试链,如EthereumJS TestRPC.另一个则是比如你最终要部署的网络,如以太坊网络,自己公司内的私链等等。Truffle提供了一个管理不同网络下的构建和部署资源的系统,来简化最终的部署流程。
配置
详见1. 配置文件章节了解更多。

指定一个网络
大多数Truffle提供的命令根据指定的网络不同而表现不同,会使用对应网络下的合约和配置信息。可以通过–network选项在参数上进行控制。

$ truffle migrate –network live
networks: {
development: {
host: “localhost”,
port: 8545,
network_id: “*” // match any network
},
live: {
host: “178.25.19.88”, // Random IP for example purposes (do not use)
port: 80,
network_id: 1, // Ethereum public network
// optional config values
// gas
// gasPrice
// from - default address to use for any transaction Truffle makes during migrations
}
}
在上面这个例子中,Truffle会在live网络中进行移植。如果配置如上述配置示例的Example的章节所指定的内容的话,是最终在以太坊网络上进行部署。

构建资源
正如4. 编译合约章节中所提到的那样,构建后的资源存储在./build/contracts目录下,以.sol.js这样的文件存在。当你编译合约文件,或者在某个网络上运行移植时,Truffle将会更新这些.sol.js的文件,文来包含相关网络的信息。当这些资源在后续中被使用了,比如在前端应用中。它会自动检测当前使用的网络,根据网络自动使用对应的合约资源。

应用部署
因为网络是在运行时自动检测的,这意味着你只需要部署你的应用或前端一次。当你的程序运行时,会动态检测当前使用的网络,以调用合适的资源,这让你的程序非常的灵活。

举例来说,如果你将程序发布到http://mydapp.io/,使用钱包浏览器时,你的程序能很好的运行。如果你的钱包浏览器运行在正式网络上,你的dapp会使用正式网络上部署的合约,如果是在测试网络上,则对应的使用测试网络的资源。
3. 构建流程
自定义构建流程
纵贯Truffle的发展历史看来,默认构造器并不适合每一个人。它有一些明显的缺点,且相比其它构建系统显得不太成熟。由此,Truffle提供了三种方式,来让你扩展默认的构建系统,但让你能体验到绝大部分的Truffle的特性。

执行外部命令
如果你希望在每次触发构建时,执行一个外部命令。可以在项目的配置中包含一个选项。

module.exports = {
// This will run the webpack command on each build.
//
// The following environment variables will be set when running the command:
// WORKING_DIRECTORY: root location of the project
// BUILD_DESTINATION_DIRECTORY: expected destination of built assets (important for truffle serve)
// BUILD_CONTRACTS_DIRECTORY: root location of your build contract files (.sol.js)
// WEB3_PROVIDER_LOCATION: rpc configuration as a string, as a URL needed for web3’s http provider.
//
build: “webpack”
}
需要注意的是,你需要提供对应的环境变量,来将这些外部的脚本命令集成进Truffle,详见配置中的备注。

提供一个自定义的函数
你可以提供了一个自定义的构建函数。框架给提供给你工程相关的参数,方便你与Truffle进行深度集成。

module.exports = {
build: function(options, callback) {
// Do something when a build is required. options contains these values:
//
// working_directory: root location of the project
// contracts: metadata about your contract files, code, etc.
// contracts_directory: root directory of .sol files
// rpc: rpc configuration defined in the configuration
// destination_directory: directory where truffle expects the built assets (important for truffle serve)
}
}
创建一个自定义的模块
你也可以通过创建一个模块或对象来实现构建接口(一个包含build函数的对象,就像上一节中那样)。这适用于需要集成Truffle,但又有自已的发布流程情况。

下面是一个使用默认构建模块的一个例子。

var DefaultBuilder = require(“truffle-default-builder”);
module.exports = {
build: new DefaultBuilder(…) // specify the default builder configuration here.
}
初始化前端
因为你使用了你自己的构建流程,Truffle不再知道如何初始化你的前端。下面是一个需要做的事清单:

引入Web3库
初始化一个web3的实例,设置一个provider指向到你的以太坊客户端。检查web3对象是否已经存在是十分重要的,因为如果有人通过钱包浏览器,比如Metamask或Mist,对象很有可能已存在,这时你应该使用这个对象,而不是初始化一个全新的。查看例子了解更多。
require或import编译好的sol.js文件从./build/contracts目录。对每个文件需要调用MyContract.setProvider()来设置provider。这需要与web3实例使用provider是一致的。可以使用web3.currentProvider来获得当前的provider。
var MyContract = require(“./build/contracts/MyContract.sol.js”);
MyContract.setProvider(web3.currentProvider);
使用WEBPACK
4. Truffle命令指南
使用方式
truffle [command] [options]
命令
build
构建一个开发中的app版本,创建.build目录。

truffle build
可选参数

–dist: 创建一个可发布的app版本。仅在使用默认构造器时可用。
查看6. 构建应用章节来了解更多。

console
运行一个控制台,里面包含已初始化,且随时可用的合约对象。

truffle console
一旦控制台启去吧,你可以使用通过命令行来使用你的合约,就像代码中那样。另外所有Truffle的列在这里的命令都可以在控制台使用。

可选参数:

–network 名称:指定要使用的网络
–verbose-rpc:输出Truffle与RPC通信的详细信息。
其它的9. 控制台章节来了解更多。

compile
智能编译你的合约,仅会编译自上次编译后修改过的合约,除非另外指定强制刷新。

truffle compile
可选参数:

–compile-all: 强制编译所有合约。
–network 名称:指定使用的网络,保存编译的结果到指定的网络上。
create:contract
工具方法使用脚手架来创建一个新合约。名称需要符合驼峰命名:

$ truffle create:contract MyContract
create:test
工具方法,使用脚手架来创建一个新的测试方法。名称需要符合驼峰命名。

$ truffle create:test MyTest
migrate
运行工程的移植。详情见移植相关的章节。

truffle migrate
可选的参数:

–reset: 从头运行所有的移植。
–network 名称:指定要使用的网络,并将编译后的资料保存到那个网络。
–to number:将版本从当前版本移植到序号指定的版本。
–compile-all: 强制编译所有的合约
–verbose-rpc:打印Truffle与RPC交互的详细日志。
exec
在Truffle的环境下执行一个Javascript文件。环境内包含,web3,基于网络设置的默认provider,作为全局对象的你的合约对象。这个Javascript文件需要export一个函数,这样Truffle才可以执行。查看10. 外部脚本来了解更多。

$ truffle exec /path/to/my/script.js
可选参数:

–network 名称:名称:指定要使用的网络,并将编译后的资料保存到那个网络。
init
在当前目录下初始化一个全新的APP,一个全新的工程。会自带默认合约和前端配置。

$ truffle init
list
列出所有可用的命令,与–help等同。

truffle list
serve
在http://localhost:8080提供编译的app对应的服务,且在需要的时候自动构建,自动部署。与truffle watch类似,区别在于这里增加web服务器功能。

truffle serve
可选参数:

-p port: 指定http服务的端口。默认是8080。
–network 名称:名称:指定要使用的网络,并将编译后的资料保存到那个网络。
test
运行所有在./test目录下的测试用例。或可选的运行单个测试文件。

$ truffle test [/path/to/test/file]
可选参数:

–network 名称:指定要使用的网络,并将编译后的资料保存到那个网络。
–compile-all: 强制编译所有的合约
–verbose-rpc:打印Truffle与RPC交互的详细日志。
version
输出版本号然后退出。

truffle version
watch
Watch合约,APP,和配置文件变化,在需要时自动构建APP。

truffle watch

你可能感兴趣的:(区块链)