solidity系列教程<十五>以太坊私鏈Geth客戶端部署智能合約

安裝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

solc編譯合約.png

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)用合約方法了

合約地址.png

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ì)象有多少方法笼蛛。

合約函數(shù).png

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末洒放,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子滨砍,更是在濱河造成了極大的恐慌往湿,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惋戏,死亡現(xiàn)場(chǎng)離奇詭異领追,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)响逢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門绒窑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人龄句,你說(shuō)我怎么就攤上這事回论∩⒑保” “怎么了分歇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)欧漱。 經(jīng)常有香客問(wèn)我职抡,道長(zhǎng),這世上最難降的妖魔是什么误甚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任缚甩,我火速辦了婚禮谱净,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘擅威。我一直安慰自己壕探,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布郊丛。 她就那樣靜靜地躺著李请,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厉熟。 梳的紋絲不亂的頭發(fā)上导盅,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音揍瑟,去河邊找鬼白翻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绢片,可吹牛的內(nèi)容都是我干的滤馍。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼底循,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼纪蜒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起此叠,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纯续,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后灭袁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體猬错,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年茸歧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了倦炒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡软瞎,死狀恐怖逢唤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涤浇,我是刑警寧澤鳖藕,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站只锭,受9級(jí)特大地震影響著恩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一喉誊、第九天 我趴在偏房一處隱蔽的房頂上張望邀摆。 院中可真熱鬧,春花似錦伍茄、人聲如沸栋盹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贞盯。三九已至,卻和暖如春沪饺,著一層夾襖步出監(jiān)牢的瞬間躏敢,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工整葡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留件余,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓遭居,卻偏偏與公主長(zhǎng)得像啼器,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子俱萍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容