美文网首页
Ethereum-部署Truffle project到以太坊私有

Ethereum-部署Truffle project到以太坊私有

作者: tolak | 来源:发表于2017-07-26 19:49 被阅读918次

    这里假设你已经熟悉以太坊的基本原理,并且了解如何运用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 网页。

    Figure 1

    接下来我们来编译这个工程, 选项--reset 告诉truffle编译contracts目录下所有的 .sol 智能合约源文件。

    $ truffle compile --reset
    

    你将在终端看到如下输出:


    Figure 2

    step2

    走到这里我们已经可以执行 truffle migrate 将我们的智能合约部署到testrpc(一个很受欢迎的以太坊本地测试链),但在这里我们不打算使用testrpc来部署我们的智能合约,而是要将其部署在我们自己搭建的以太网私有链上。
    首先我们需要创建genesis.json 用来初始化配置我们的私有链网络。执行 touch genesis.json 然后拷贝 这里 的内容到genesis.json。你的genesis.json 文件应该看上去像下面这样:

    Figure 3

    然后,我们需要定制gnensis.json 来配置我们自己的网络,再进行了一些更改后你的genesis.json应该如下所示:


    Figure 4
    • 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
    

    执行上面的命令后你在终端应该看到下面的输出:


    Figure 5

    step4

    执行下面的命令启动我们的网络。这里我们添加了一些选项,它们的作用是告诉geth客户端打开相应的API。

    $ geth --datadir ./ --networkid 11 --rpc --rpcapi eth,web3,net,personal,ssh,db,debug
    

    step5

    另外打开一个终端并切换到刚才的工作目录,你可以看到现在已经有了更多的文件:


    Figure 6

    执行下面的命令进入geth console。注意geth.ipc文件必须存在。

    $ geth attach geth.ipc
    

    step6

    由于我在genesis.json文件中删除了pre-funds账户,所以现在在我们的网络里还没有账户。在启动矿工进行挖矿之前我们必须创建至少一个账户,并将其设为ether base账户,这样矿工挖矿所得的以太币将自动存入我们设置的账户。

    • 创建一个账户:
    $ personal.newAccount(“your account passwd”)
    

    执行 eth.accounts你可以看到如下输出:

    Figure 7
    • 设置矿工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()
    

    在你打开的的第一个终端上可以看到如下输出:

    Figure 8
    你可以执行 eth.blockNumber 来查看从开始挖矿到现在有多少区块已经成功生成。
    Figure 9

    step9

    现在你已经完成了几乎所有的工作,最后一步让我们来将我们的Truffle project部署到我们搭建的私有网络上。

    • Truffle RPC网络连接配置
      新建第三个终端然后切换到你的工作目录。编辑truffle.js文件然后将下面的内容添加到对应位置。
    privatenetwork: {
      host: 'localhost',
      port: 8545,
      network_id: 11
    }
    

    端口号 8545 是Etrereum RPC服务的默认端口号; network_id 必须设置为我们在 step3里创建配置网络时紧接着--networkid的值。现在你的truffle.js文件应该像下面这样:

    Figure 10
    • 部署Truffle project到Ethereum网络
      执行命令将当前目录下的Truffle project部署到指定网络:
    truffle migrate --network privatenetwork
    

    这时你应该在终端看到如下内容:


    Figure 11

    所有工作已经完成,至此我们已经成功的将一个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.


    版权所有,转载请注明出处。

    相关文章

      网友评论

          本文标题:Ethereum-部署Truffle project到以太坊私有

          本文链接:https://www.haomeiwen.com/subject/wllokxtx.html