这里假设你已经熟悉以太坊的基本原理,并且了解如何运用Solidity、Web3.js和Truffle进行以太坊项目开发。如果你对这一切还不熟悉,可能你需要先熟悉这些内容再继续读下去。今天我将介绍如何将一个Truffle project部署到我们自己搭建的以太坊私有网络上。
Environment
- Truffle: v3.3.2 (core: 3.3.1)
- Geth version: 1.6.6-stable
- OS: ubuntu 16.04 x86-64
Details
step1
打开一个终端切换到你的工作目录,并执行以下命令获取一个Truffle 项目:
$ truffle init
执行ls
命令可以看到新生成了一些文件和文件夹。这些是Truffle框架的一个简单的demo。要了解这些内容的具体含义可以浏览truffle tutorials 网页。
接下来我们来编译这个工程, 选项--reset
告诉truffle编译contracts
目录下所有的 .sol
智能合约源文件。
$ truffle compile --reset
你将在终端看到如下输出:
step2
走到这里我们已经可以执行 truffle migrate
将我们的智能合约部署到testrpc
(一个很受欢迎的以太坊本地测试链),但在这里我们不打算使用testrpc来部署我们的智能合约,而是要将其部署在我们自己搭建的以太网私有链上。
首先我们需要创建genesis.json
用来初始化配置我们的私有链网络。执行 touch genesis.json
然后拷贝 这里 的内容到genesis.json。你的genesis.json 文件应该看上去像下面这样:
然后,我们需要定制gnensis.json 来配置我们自己的网络,再进行了一些更改后你的genesis.json应该如下所示:
-
difficulty
: 减小difficulty的值否则以我们笔记本的算力将很难挖出新区块。 在将值设为20后,在我的电脑上每秒可以挖出2-3个块。 -
gasLimit
: 如果你部署的智能合约比较庞大你最好增加大 gasLimit 的值。 -
alloc
: 可选的, 表示的是pre-funds 账户。我在这里删掉了它们因为待会我会手动创建账户。
更多关于genesis.json 和 以太坊私有链的细节可以参考 这里。
step3
现在是时候来创建我们自己的网络了。执行下面的命令来对完成对网络的初始化配置。选项 --datadir
配置网络数据的存放位置,我们就设为当前目录;--networkid
配置网络的ID,将会在RPC服务里使用到它(1 是以太坊共有链的network ID)。
$ geth --datadir ./ --networkid 11 init genesis.json
执行上面的命令后你在终端应该看到下面的输出:
step4
执行下面的命令启动我们的网络。这里我们添加了一些选项,它们的作用是告诉geth客户端打开相应的API。
$ geth --datadir ./ --networkid 11 --rpc --rpcapi eth,web3,net,personal,ssh,db,debug
step5
另外打开一个终端并切换到刚才的工作目录,你可以看到现在已经有了更多的文件:
执行下面的命令进入geth console。注意geth.ipc文件必须存在。
$ geth attach geth.ipc
step6
由于我在genesis.json文件中删除了pre-funds账户,所以现在在我们的网络里还没有账户。在启动矿工进行挖矿之前我们必须创建至少一个账户,并将其设为ether base账户,这样矿工挖矿所得的以太币将自动存入我们设置的账户。
- 创建一个账户:
$ personal.newAccount(“your account passwd”)
执行 eth.accounts
你可以看到如下输出:
- 设置矿工etherbase
$ miner.setEtherbase(eth.accounts[0])
accounts[0]是我们刚刚创建的账户。你也可以执行eth.coinbase
它同样返回accounts[0]。终端会返回你一个 "true"表示执行成功。
step7
当一个账户被创建时以太坊默认是将其锁住的。所以我们首先要解锁这个账户。执行下面的命令,传入需要解锁的账户地址,账户的密码以及需要保持解锁状态的时间(单位是秒)。如果这里不指定密码,执行过程中会提示你输入。
$ personal.unlockAccount(eth.accounts[0], "you account passwd", 15000)
如果执行成功,终端会返回给你一个"true"。
step8
一切OK的话我们可以开始挖矿了。
$ miner.start()
在你打开的的第一个终端上可以看到如下输出:
你可以执行
eth.blockNumber
来查看从开始挖矿到现在有多少区块已经成功生成。step9
现在你已经完成了几乎所有的工作,最后一步让我们来将我们的Truffle project部署到我们搭建的私有网络上。
- Truffle RPC网络连接配置
新建第三个终端然后切换到你的工作目录。编辑truffle.js文件然后将下面的内容添加到对应位置。
privatenetwork: {
host: 'localhost',
port: 8545,
network_id: 11
}
端口号 8545
是Etrereum RPC服务的默认端口号; network_id
必须设置为我们在 step3里创建配置网络时紧接着--networkid
的值。现在你的truffle.js
文件应该像下面这样:
- 部署Truffle project到Ethereum网络
执行命令将当前目录下的Truffle project部署到指定网络:
truffle migrate --network privatenetwork
这时你应该在终端看到如下内容:
所有工作已经完成,至此我们已经成功的将一个Truffle project部署到了我们自己搭建的以太坊私有网络上。
Trouble Shooting
i. Error: exceeds block gas limit
Increase the gas limit in file genesis.json.
Attention that block gas limit isn't down to your personal funds, it's a property of the network.
ii. Error: authentication needed: password or unlock
personal.unlockAccount(eth.coinbase)
Do not forget unlock your accounts before making them accept ether.
iii. Error: truffle Invalid JSON RPC response:
Tell the geth turn on RPC APIs.
$ geth --datadir ./ --networkid 11 --rpc --rpcapi eth,web3,net,personal,ssh,db,debug
iv. Error: insufficient funds for gas * price + value
Your balance isn't enough to deploy a contract, try start mining to earn more ether.
miner.start()
v. After running truffle migrate privatenetwork
, the output message blocking at "Deploying Migrations…."
Run minner.start()
if you have stopped mining. Deloy contract is a transaction request, so we need the minner commit the new block to our network.
版权所有,转载请注明出处。