這里假設(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)頁。
接下來我們來編譯這個工程, 選項--reset
告訴truffle編譯contracts
目錄下所有的 .sol
智能合約源文件。
$ truffle compile --reset
你將在終端看到如下輸出:
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)該看上去像下面這樣:
然后,我們需要定制gnensis.json 來配置我們自己的網(wǎng)絡(luò),再進行了一些更改后你的genesis.json應(yīng)該如下所示:
-
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)該看到下面的輸出:
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)有了更多的文件:
執(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
你可以看到如下輸出:
- 設(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()
在你打開的的第一個終端上可以看到如下輸出:
你可以執(zhí)行
eth.blockNumber
來查看從開始挖礦到現(xiàn)在有多少區(qū)塊已經(jīng)成功生成。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)該像下面這樣:
- 部署Truffle project到Ethereum網(wǎng)絡(luò)
執(zhí)行命令將當(dāng)前目錄下的Truffle project部署到指定網(wǎng)絡(luò):
truffle migrate --network privatenetwork
這時你應(yīng)該在終端看到如下內(nèi)容:
所有工作已經(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)載請注明出處。