以太坊truffle+ganache合約部署調試及web3.js事件監聽過程記錄

前期準備

0.系統:Windows10
1.本地hosts文件配置(爲了後面truffle download可以成功)
2.ganache安裝(爲了在truffle console中使用有ETHER的測試帳戶)
3.node環境配置


node

1-2教程請參考如下鏈接:以太坊truffle框架搭建基礎請點此處
3教程請自行百度,檢驗本地是否有node環境:在cmd中輸入node回車 若有則以下圖所示👇
在這裏插入圖片描述

webpack

truffle + ganache 合約部署

1.新建項目文件夾 並在cmd中cd進入 輸入 truffle unbox webpack 出現以下圖👇所示輸出表明成功
在這裏插入圖片描述
項目文件夾中自動生成下圖👇目錄,手動將編寫好的合約複製粘貼到contracts目錄 該目錄中有幾個自動產生的合約 能夠不對他們作任何處理
在這裏插入圖片描述
2.ganache開啓 : 打開另外一個cmd 輸入 ganache-cli 出現以下圖👇所示則表示ganache成功打開 能夠看到 listening on 後面的主機爲127.0.0.1,端口爲8545
在這裏插入圖片描述
3.修改項目文件夾中的 truffle-config.js 文件 使其的hostport與ganache中 listening on 後面的主機號與端口號一致 以下圖所示👇
在這裏插入圖片描述
4.修改項目文件夾下app/src/index.js文件中 http:// 後面的主機號與端口號 使其與ganache中 listening on 後面的主機號與端口號一致 以下圖所示👇
在這裏插入圖片描述
5.進入項目文件夾下的 migrations 目錄 這裏面有幾個剛剛contracts文件夾中自動生成的合約的migration.js
仿造它,爲咱們的合約編寫這些migrations.js
注意每一個migration文件前面有序號 這個序號表示migration文件的執行順序 咱們編寫的migration文件前面也依次添加上序號 以下圖 👇 所示











web

在這裏插入圖片描述

在這裏插入圖片描述

migration.js代碼解析以下👇json

//case1:獨立合約 不import其餘合約文件 也不繼承其餘合約
//tell truffle which contract we want to interact with
const contractName = artifacts.require(「contractName」);

//exports a function that accepts an object called deployer as a parameter. 
//This object acts as an interface between you (the developer) and Truffle's deployment engine
module.exports = function(deployer) {

	//部署該合約
	deployer.deploy(contractName);
}
//case2:import其餘合約文件 或繼承其餘合約
//先寫被import、被繼承的合約
const importcontract1 = artifacts.require(「importcontract1」);
const importcontract2 = artifacts.require(「importcontract2」);
......

//最後寫該合約
const contractName = artifacts.require(「contractName」);

//exports a function that accepts an object called deployer as a parameter. 
//This object acts as an interface between you (the developer) and Truffle's deployment engine
module.exports = function(deployer) {

	//先部署引入合約
	deployer.deploy(importcontract1);
	//再將引入合約與該合約連接
	deployer.link(importcontract1, contractName);
	
	//對全部引入、繼承合約重複部署、連接操做
	deployer.deploy(importcontract2);
	deployer.link(importcontract2, contractName);
	......
	
	//最後部署該合約
	deployer.deploy(contractName);
}

6.回到剛剛輸入 truffle unbox webpack 的cmd,輸入 ruffle compile 編譯合約 以下圖所示 👇 表示編譯成功
在這裏插入圖片描述
app

此時項目文件夾中也生成了一個build目錄 裏面有一個contracts文件夾,每一個合約在裏面都有一個json文件,包含合約的contractName,abi,metadata,bytecode…等信息
在這裏插入圖片描述
框架

7.接着在剛剛 輸入 ruffle compile 的cmd中輸入 truffle migrate 以下圖所示則說明migrate成功👇socket

注意 輸入一次後若是回去對合約或者migrate.js進行修改 下次應該輸入 truffle migrate --resetide

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
至此合約部署完成 如想要在web3.js中監聽合約中的event:
1.從這裏的輸出中複製合約地址
2.從 build/contracts 目錄中對於的json文件裏複製合約的abi 填入web3.js文件中的特定地方
詳情請請接着往下看👇





函數

web3.js監聽合約event

1.如下是一個簡單的web3.js代碼 填入合約地址、abi、和要監聽的事件名測試

var Web3 = require("web3")

var web3;

if (typeof web3 !== 'undefined') {
    web3 = new Web3(web3.currentProvider);
} else {
    web3 = new Web3(new Web3.providers.WebsocketProvider("ws://127.0.0.1:8545"));
}
        
var contractAbi = [];//copy and past contract's abi into []

var contractaAddress = "0x";//copy and past contract's address after 0x
        
MyContract = new web3.eth.Contract(contractAbi, contractaAddress);
                //console.log(MyContract.events.orderlog);
        
var myEvent = MyContract.events.EventName({
        filter:{},
        fromBlock: 0
}, function(error, event){})
        .on('data', function(event){
        console.log(event); // same results as the optional callback above
})
        .on('changed', function(event){
                    // remove event from local database
        })        
    .on('error', console.error);

2.而後新開一個cmd 進入存放該web3.js的目錄 輸入 node web3.js' name 便可開始合約時間監聽 以下圖所示👇
在這裏插入圖片描述
3.監聽到event時將在控制檯打印以下輸出 👇
在這裏插入圖片描述


truffle 合約調試

1.在剛剛compile、migrate的cmd中輸入 truffle console 進入控制檯 以下圖所示👇
在這裏插入圖片描述

2.這裏使用一個erc20合約進行調試演示說明 部分調試代碼以下所示 👇

//首先實例化部署合約合約
let instance1 = await SToken.deployed()

//獲取測試用帳戶
let accounts = await web3.eth.getAccounts()

//owner默認是accounts[0] 也是默認調用函數的帳戶
//先用owner帳戶給帳戶1轉一些token
instance.ownerMint(accounts[1],100000)

//查合約總供應和帳戶1的餘額
instance.totalSupply()
instance.balanceOf(accounts[1])

//帳戶1調用轉帳函數將本身的token轉給帳戶2
instance.transfer(accounts[2],500,{from:accounts[1]})

如需調用erc20的approve、allowance等其餘函數,或者其餘合約的函數,按照以上代碼照葫蘆畫瓢便可

下面是部分紅功調試的截圖👇
在這裏插入圖片描述
【直接輸入合約名能獲得合約相關的信息喲 ~ 獲取合約相關信息如地址 輸入合約名.address便可】
在這裏插入圖片描述
在這裏插入圖片描述

相關文章
相關標籤/搜索