以前接觸過以太坊工具鍊來做區塊鍊練手項目,後來荒廢了,如今再次撿起來,算是回憶和加深。
之前可能因為網絡的原因,在truffle各種初始化編譯合成智能合約都遇到了好多問題,如今再次嘗試,發現可以很快入門。
下面來看看如何通過truffle與ganache-cli來建構以太坊合約。
以太坊工具鍊就不多介紹了,這裡面水很深,内容很多,本文需要的主要的就是node環境,然後就是ganache服務,部署合約的時候需要這個服務。truffle是進行合約編譯部署的工具,可以初始化項目,編譯合約,合成合約,部署合約。
下面來看看如何做一個簡單的智能合約。
1、磨刀不誤砍柴工;
假定我們已經安裝了node環境以及npm等工具。需要全局安裝truffle,ganache-cli
npm install truffle ganache-cli -g
安裝好之後,我們可以看看版本資訊:
truffle自帶solidity版本是0.5.16,web3版本是1.2.9
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLxADN2QDMwATM3ITMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
ganache-cli是ethereum-testrpc的替代,是以不用再安裝testrpc了。
我們可以現在就啟動ganache服務,它會監聽localhost下的8545端口
2、牛刀小試
建立檔案夾、初始化以太坊合約項目,編寫智能合約。
contracts/HelloWorld.sol 合約檔案需要放在contracts目錄下
合成合約檔案放在migrations目錄下 ,合成檔案名稱也有講究,就是以數字開頭,帶下劃線:
3、齊活
其實這裡就是需要準備兩個檔案,一個是合約檔案sol結尾,一個是合成合約檔案,就是js檔案
HelloWorld.sol
pragma solidity ^0.5.0;
contract HelloWorld {
string public name;
constructor(string memory _name) public {
name = _name;
}
function getName() public view returns(string memory){
return name;
}
function setName(string memory _name) public {
name = _name;
}
}
2_deploy_contract.js
const HelloWorld = artifacts.require("./HelloWorld.sol");
module.exports = function (deployer) {
deployer.deploy(HelloWorld);
};
合約部署這裡,先挖一個坑,這裡會引出一個報錯,以及怎麼解決。
4、見證奇迹
修改truffle配置檔案,在項目目錄下有一個檔案tuffle-config.js,這是truffle的配置檔案,需要配置一個網絡資訊,就是前面開啟的ganache服務資訊,需要配置host,port,network_id:
将配置中development這塊的注釋打開,預設是注釋掉的。
編譯合約,合成合約,部署合約
- truffle compile 這句指令直接在指令行下運作就可以,它是用來編譯合約的
- truffle console 這句指令是開啟truffle開發者模式,會進入指令行互動模式,合成合約需要在這個互動模式下進行
- truffle migrate 這句指令是合成合約的,我們需要在開發者模式下運作
進入開發者模式:
這一步因為前面在編寫合約的時候,寫了一個構造函數constuctor(string memory _name),而我們在部署合約的代碼裡面沒有加入 參數,是以會報錯:"HelloWorld" -- Invalid number of parameters for "undefined". Got 0 expected 1!
解決辦法就是在部署合約代碼中加入參數:
合成合約,不報錯,可以進行合約部署測試:
HelloWorld.deployed().then(instance=>contract=instance)
合約調用:contract.getName()
這裡,在truffle development開發者模式下,函數可以進行自動補全,我們輸入contract.get可以通過tab鍵來進行提示。