安裝solc
1、我們使用npm 先全局安裝 solc
npm install -g solc
2多矮、我們?cè)囋噑olc有沒(méi)有安裝上,solcjs --version
,若顯示沒(méi)有此命令,則需要找到你的node的安裝位置粪躬,將此路徑添加到linux的環(huán)境變量中
我的node的路徑是: /usr/local/node/node-v8.11.0-linux-x64
3、編輯文件sudo vim /etc/profile
文件末位加入:
export NODE_HOME=/usr/local/node/node-v8.11.0-linux-x64/bin
export PATH=$NODE_HOME:$PATH
保存文件退出
輸入命令: source /etc/profile 更新環(huán)境變量
然后我們?cè)偈褂胹olc --version命令就能看到版本了
以上就是解決linux下node.js全局模塊找不到的情況昔穴,我們?cè)僭囋噑olcjs 就有了命令镰官。
若我們?nèi)职惭b的solc,則命令要使用solcjs吗货,若不是全局安裝的則solc命令即可使用
編譯合約
1朋魔、將我們的合約代碼保存到一個(gè)名為vote.sol的文件中,在此路徑中打開(kāi)命令行窗口卿操,輸入solcjs --bin vote.sol
命令編譯vote.sol 文件警检,會(huì)生成一個(gè) vote_sol_Vote.bin 文件,此文件就是我們編譯后的合約二進(jìn)制文件害淤,然后繼續(xù)輸入solcjs --abi vote.sol
命令扇雕,生成此合約的ABI文件。此ABI文件名為vote_sol_Vote.abi
2窥摄、打開(kāi)私鏈節(jié)點(diǎn)镶奉,進(jìn)入控制臺(tái),輸入命令 var code = "0x二進(jìn)制文件內(nèi)容"
二進(jìn)制太長(zhǎng)崭放,如何一次性獲壬诳痢?我們可以將vote_sol_Vote.bin 文件后綴先改為.txt后綴币砂,然后打開(kāi)再?gòu)?fù)制建峭,然后黏貼進(jìn)那個(gè)命令中
3、我們可以看看這么長(zhǎng)的二進(jìn)制內(nèi)容寫入到鏈上决摧,我們至少需要耗費(fèi)多少Gas
web3.eth.estimateGas({data: code})
我得到的是1375684,意味著部署這個(gè)合約至少要 1375684 wei 的Gas亿蒸,只能多不能少。
4掌桩、我們用一個(gè)變量 abi 保存此 合約的abi边锁,和 保存二進(jìn)制內(nèi)容一樣過(guò)程輸入命令var abi=JSON.parse('abi文件的內(nèi)容')
因?yàn)閍bi是json格式的所以這里需要用單引號(hào)包裹并且需用JSON.parse轉(zhuǎn)成json格式,否則后面會(huì)報(bào)錯(cuò)波岛!
5茅坛、當(dāng)我們拿到一個(gè)合約的abi 和 二進(jìn)制的文件內(nèi)容后就可以部署這個(gè)合約了
6、部署合約的賬號(hào)需要消耗Gas则拷,所以必須要有余額贡蓖,我們先查看我們的第二個(gè)賬戶余額eth.getBalance(eth.accounts[1])
第一個(gè)或者第二個(gè)無(wú)所謂祟剔,只要有余額即可部署合約
7、解鎖賬號(hào)personal.unlockAccount(eth.accounts[1])
摩梧,然后輸入賬號(hào)密碼物延,返回為true則解鎖成功
8、使用abi生成一個(gè)合約對(duì)象var contract = web3.eth.contract(abi);
這個(gè)對(duì)象下面有一些方法仅父,我們使用new 方法生成一個(gè)新的合約對(duì)象
9叛薯、使用以下命令
contractInstance = contract.new({data: code, gas: 2000000, from: eth.accounts[1]}, function(e, contract){
if(!e){
if(!contract.address){
console.log("Contract transaction send: Transaction Hash:"+contract.transactionHash+" waiting to be mined...");
}else{
console.log("Contract mined! Address: "+contract.address);
console.log(contract);
}
}else{
console.log(e)
}
})
若此合約的構(gòu)造函數(shù)有參數(shù)
abi.new([constructorParam1] [, constructorParam2], {data: '0x12345...', from: myAccount, gas: 1000000},callback);
contractInstance = contract.new(["張三","李四","王五"],{data: code, gas: 2000000, from: eth.accounts[1]}, function(e, contract){
if(!e){
if(!contract.address){
console.log("Contract transaction send: Transaction Hash:"+contract.transactionHash+" waiting to be mined...");
}else{
console.log("Contract mined! Address: "+contract.address);
console.log(contract);
}
}else{
console.log(e)
}
})
=====================
=====================
=====================
=====================
INFO [09-18|14:36:40.537] Setting new local account address=0x0c16CB5B5dA60F6f13342AB9C8aA9052fBaE6648
INFO [09-18|14:36:40.538] Submitted contract creation fullhash=0x24ab7de040975261a258d39b638f12305272fc82fb98ad7f56b5e057f265854b contract=0x869FF12A872490ac97D9F8BAdE3133e308149220
Contract transaction send: Transaction Hash:0x24ab7de040975261a258d39b638f12305272fc82fb98ad7f56b5e057f265854b waiting to be mined...
undefined
10、 上述得到的合約是沒(méi)有地址的笙纤,只有挖礦成功才會(huì)有地址出現(xiàn)耗溜。所以現(xiàn)在我們的先挖礦, miner.start()
挖礦成功后會(huì)顯示出來(lái)合約地址省容,然后我們通過(guò)合約地址就能調(diào)用合約方法了
11抖拴、通過(guò)web3.eth.getCode("0x...合約地址")
命令會(huì)返回此合約的二進(jìn)制數(shù)據(jù),說(shuō)明合約部署成功
12腥椒、contractInstance就是這個(gè)合約實(shí)列阿宅,我們通過(guò)這個(gè)實(shí)列來(lái)調(diào)用合約里面的函數(shù)contractInstance.giveRightToVote.call("0x....")
調(diào)用我們寫的方法,我們也可以直接輸入contractInstance 看到我們這個(gè)合約對(duì)象有多少方法笼蛛。