智能合約模糊測驗編譯部署腳本
1.依賴安裝
1.1 升級npm
使用命令
sudo npm -g install npm@next
1.2 升級node.js
- 下載用于管理node.js版本的"n"模塊, 使用命令:
sudo npm install -g n
- 安裝node.js穩定版, 使用命令:
n stable
- 注: 更新完成后需要重新啟動終端
2.使用Truffle
2.1 安裝Truffle
使用命令:
sudo npm install -g truffle
2.2 創建工程
- 創建工程目錄并進入, 使用命令:
mkdir trufflePro # trufflePro工程目錄名
cd trufflePro
- 初始化工程, 在工程目錄使用命令:
truffle
truffle init
- 遇到問題: RequestError: Error: connect ECONNREFUSED 127.0.0.1:443
解決: 更改hosts檔案- 打開hosts檔案:
sudo vi /etc/hosts - 添加以下內容:
參考: 在ubuntu執行truffle init出現錯誤0.0.0.0:443 github.com 199.232.68.133 raw.githubusercontent.com - 打開hosts檔案:
初始化成功后終端如圖:

專案目錄中結構如圖:

contract/- Truffle默認的合約檔案存放地址migrations/- 存放發布腳本檔案test/- 用來測驗應用和合約的測驗檔案truffle-config.js- Truffle的組態檔
2.3 編譯合約
(1) 設定solc版本
版本資訊位于檔案./truffle-config.js中, 如圖:

默認全部注釋, 表示默認配置, 關閉version注釋, 即可設定具體編譯器版本.
(2) 編譯合約
合約應位于./contracts目錄, 編譯合約使用命令:
truffle compile
編譯成功后即可在./build/contracts/目錄下找到合約編譯后對應json檔案, 檔案中具有合約的abi、位元組碼等資訊.
2.4 部署合約
(1) 配置部署檔案
部署合約檔案位于目錄./migrations, 創建組態檔, 以數字開頭, 如2_xxx.js, 檔案內容為:
var Test = artifacts.require("contract.sol");
//"contract.sol"替換成具體的合約檔案名
module.exports = function(deployer) {
deployer.deploy(Test);
};
(2) 修改Truffle配置
修改./truffle-config.js檔案networks部分, 如圖:

其中, development為以太網(私有鏈)網路名, 可自定義; host和port的值一般按此默認值, network_id可固定值也可以使用通配符*, gas值為交易時默認gas值.
(3) 以太坊配置
- 打開一個終端, 啟動本地私有鏈, 使用命令:
geth --rpc --rpcport "8545" --rpccorsdomain "*" --datadir node0 --port "30303" --networkid 506 console --unlock 0 --password "./pwd.txt"
其中: rpcport、·networkid值要與上述truffle-config.js檔案中一致; datadir的值根據自身私有鏈設定; console表明控制臺互動模式; unlock值對應解鎖的賬戶序號, 需要設為默認賬戶即0; password值問賬戶密碼所在檔案的路徑.
2. 私有鏈啟動挖礦, 使用命令: miner.start()
(4) 部署合約
在Truffle專案根目錄啟動另一終端, 使用命令部署合約:
truffle migrate --network development
#引數network后跟網路名, 須與truffle-config.js中一致, 可省
若成功部署則會顯示部署后的相關資訊, 如圖:

遇到問題及處理:
- Something went wrong while attempting to connect to the network

解決: 確保以太坊私有鏈網路率先啟動且啟動時需要有引數--rpc - Error: Could not find artifacts for Migrations from any sources

解決: 確保./migrations目錄下組態檔中部署的合約檔案名"xxx.sol"正確. - Returned error: authentication needed: password or unlock.

解決: 未在私有鏈設定解鎖賬戶, 應使用上述啟動私有鏈命令啟動時解鎖賬戶, 或者在私有鏈終端使用personal.unlockAccount(account, passwd)命令進行賬戶解鎖. (經測驗, 最好解鎖默認0號賬戶) - could not deploy due to insufficient funds

解決: 確保解鎖賬戶有余額, 可以先使用該賬戶挖礦獲得足夠以太幣后再部署.(私有鏈命令操作詳見#03.3.3(2)) - ran out of gas (using a value you set in your network config or deployment parameters.)

解決: 部署合約的gas用盡, 在./truffle-config.js檔案中gas的值要足夠大. - exceeded the block limit (with a gas value you set).

解決: 部署合約發送的gas值超出了區塊限制, 區塊的gas限制值可在私有鏈的gensis.json檔案(名字類似, 為生成私有鏈的組態檔)中查到, 如圖:

要修改./truffle-config.js檔案中gas的值不超過該gaslimit的值; 同時也可以設定genesis.json中的gasLimit的值更大一些(目前已知可行的修改方法是在初始化私有鏈的創世塊前對該檔案的gasLimit值進行修改, 私有鏈部署相關操作詳見#03.3.2). - Transaction was not mined within 750 seconds, please make sure your transaction was properly sent. Be aware that it might still be mined!.
解決: 未及時完成合約部署, 確保私有鏈已經開始挖礦, 原因不詳, 再次使用命令部署時成功. - The contract code couldn’t be stored, please check your gas limit.

解決:./truffle-config.js檔案中gas的值要足夠大. - Number can only safely store up to 53 bits

解決: 原因不詳, 猜測可能為上述私有鏈gensis.json檔案中gasLimit值大小超過53bits, 上圖的0x800000000暫無此問題.
3. 使用腳本
- 根據上述 #1, #2.1, #2.2 安裝Truffle并構建一個專案目錄
- 洗掉創建的Truffle專案目錄下除
truffle-config.js以外的檔案夾和檔案 - 按照 #2.4(2) 設定Truffle連接的私有鏈
- 打開用于部署合約的私有鏈, 解鎖賬戶后進行挖礦
- 根據運行環境修改腳本
contrCompDeploy.py中的路徑等引數 - 運行腳本
contrCompDeploy.py
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/356166.html
標籤:區塊鏈
下一篇:NEAR協議簡介
