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

這里假設(shè)你已經(jīng)熟悉以太坊的基本原理,并且了解如何運用Solidity、Web3.js和Truffle進行以太坊項目開發(fā)。如果你對這一切還不熟悉,可能你需要先熟悉這些內(nèi)容再繼續(xù)讀下去。今天我將介紹如何將一個Truffle project部署到我們自己搭建的以太坊私有網(wǎng)絡(luò)上。

Environment

  • Truffle: v3.3.2 (core: 3.3.1)
  • Geth version: 1.6.6-stable
  • OS: ubuntu 16.04 x86-64

Details

step1

打開一個終端切換到你的工作目錄,并執(zhí)行以下命令獲取一個Truffle 項目:

$ truffle init

執(zhí)行ls命令可以看到新生成了一些文件和文件夾。這些是Truffle框架的一個簡單的demo。要了解這些內(nèi)容的具體含義可以瀏覽truffle tutorials 網(wǎng)頁。

Figure 1

接下來我們來編譯這個工程, 選項--reset 告訴truffle編譯contracts目錄下所有的 .sol 智能合約源文件。

$ truffle compile --reset

你將在終端看到如下輸出:


Figure 2

step2

走到這里我們已經(jīng)可以執(zhí)行 truffle migrate 將我們的智能合約部署到testrpc(一個很受歡迎的以太坊本地測試鏈),但在這里我們不打算使用testrpc來部署我們的智能合約,而是要將其部署在我們自己搭建的以太網(wǎng)私有鏈上。
首先我們需要創(chuàng)建genesis.json 用來初始化配置我們的私有鏈網(wǎng)絡(luò)。執(zhí)行 touch genesis.json 然后拷貝 這里 的內(nèi)容到genesis.json。你的genesis.json 文件應(yīng)該看上去像下面這樣:

Figure 3

然后,我們需要定制gnensis.json 來配置我們自己的網(wǎng)絡(luò),再進行了一些更改后你的genesis.json應(yīng)該如下所示:


Figure 4
  • difficulty: 減小difficulty的值否則以我們筆記本的算力將很難挖出新區(qū)塊。 在將值設(shè)為20后,在我的電腦上每秒可以挖出2-3個塊。
  • gasLimit: 如果你部署的智能合約比較龐大你最好增加大 gasLimit 的值。
  • alloc: 可選的, 表示的是pre-funds 賬戶。我在這里刪掉了它們因為待會我會手動創(chuàng)建賬戶。

更多關(guān)于genesis.json 和 以太坊私有鏈的細節(jié)可以參考 這里

step3

現(xiàn)在是時候來創(chuàng)建我們自己的網(wǎng)絡(luò)了。執(zhí)行下面的命令來對完成對網(wǎng)絡(luò)的初始化配置。選項 --datadir 配置網(wǎng)絡(luò)數(shù)據(jù)的存放位置,我們就設(shè)為當(dāng)前目錄;--networkid 配置網(wǎng)絡(luò)的ID,將會在RPC服務(wù)里使用到它(1 是以太坊共有鏈的network ID)。

$ geth --datadir ./ --networkid 11 init genesis.json

執(zhí)行上面的命令后你在終端應(yīng)該看到下面的輸出:


Figure 5

step4

執(zhí)行下面的命令啟動我們的網(wǎng)絡(luò)。這里我們添加了一些選項,它們的作用是告訴geth客戶端打開相應(yīng)的API。

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

step5

另外打開一個終端并切換到剛才的工作目錄,你可以看到現(xiàn)在已經(jīng)有了更多的文件:


Figure 6

執(zhí)行下面的命令進入geth console。注意geth.ipc文件必須存在。

$ geth attach geth.ipc

step6

由于我在genesis.json文件中刪除了pre-funds賬戶,所以現(xiàn)在在我們的網(wǎng)絡(luò)里還沒有賬戶。在啟動礦工進行挖礦之前我們必須創(chuàng)建至少一個賬戶,并將其設(shè)為ether base賬戶,這樣礦工挖礦所得的以太幣將自動存入我們設(shè)置的賬戶。

  • 創(chuàng)建一個賬戶:
$ personal.newAccount(“your account passwd”)

執(zhí)行 eth.accounts你可以看到如下輸出:

Figure 7

  • 設(shè)置礦工etherbase
$ miner.setEtherbase(eth.accounts[0])

accounts[0]是我們剛剛創(chuàng)建的賬戶。你也可以執(zhí)行eth.coinbase 它同樣返回accounts[0]。終端會返回你一個 "true"表示執(zhí)行成功。

step7

當(dāng)一個賬戶被創(chuàng)建時以太坊默認是將其鎖住的。所以我們首先要解鎖這個賬戶。執(zhí)行下面的命令,傳入需要解鎖的賬戶地址,賬戶的密碼以及需要保持解鎖狀態(tài)的時間(單位是秒)。如果這里不指定密碼,執(zhí)行過程中會提示你輸入。

$ personal.unlockAccount(eth.accounts[0], "you account passwd", 15000)

如果執(zhí)行成功,終端會返回給你一個"true"。

step8

一切OK的話我們可以開始挖礦了。

$ miner.start()

在你打開的的第一個終端上可以看到如下輸出:

Figure 8

你可以執(zhí)行 eth.blockNumber 來查看從開始挖礦到現(xiàn)在有多少區(qū)塊已經(jīng)成功生成。
Figure 9

step9

現(xiàn)在你已經(jīng)完成了幾乎所有的工作,最后一步讓我們來將我們的Truffle project部署到我們搭建的私有網(wǎng)絡(luò)上。

  • Truffle RPC網(wǎng)絡(luò)連接配置
    新建第三個終端然后切換到你的工作目錄。編輯truffle.js文件然后將下面的內(nèi)容添加到對應(yīng)位置。
privatenetwork: {
  host: 'localhost',
  port: 8545,
  network_id: 11
}

端口號 8545 是Etrereum RPC服務(wù)的默認端口號; network_id 必須設(shè)置為我們在 step3里創(chuàng)建配置網(wǎng)絡(luò)時緊接著--networkid的值。現(xiàn)在你的truffle.js文件應(yīng)該像下面這樣:

Figure 10

  • 部署Truffle project到Ethereum網(wǎng)絡(luò)
    執(zhí)行命令將當(dāng)前目錄下的Truffle project部署到指定網(wǎng)絡(luò):
truffle migrate --network privatenetwork

這時你應(yīng)該在終端看到如下內(nèi)容:


Figure 11

所有工作已經(jīng)完成,至此我們已經(jīng)成功的將一個Truffle project部署到了我們自己搭建的以太坊私有網(wǎng)絡(luò)上。

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.


版權(quán)所有,轉(zhuǎn)載請注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容