手把手教你一步步開發第一個Dapp(使用solidity語言實作投票合約)——Ubuntu版本
前言
現在流行的技術區塊鏈算一個熱門,我也在學習的路上,寫下博客旨在為了記錄一些自己遇到的問題和解決方法,希望可以多多幫助學習路上的小白,
提到區塊鏈不得不提到位元幣,但是現在熱門的開發就是go語言開發和基于以太坊的開發,我目前在學的是以太坊的一些東西,之前沒有接觸很多,所以也是從無到有的程序,
經過這些天的學習我發現中國對于這塊技術的討論還是相對較少(在遇到問題的時候通過百度很難找出答案,不知道是因為大牛的封閉,還是我們確實缺乏這方面技術的研究),
什么是Dapp?
App我們都知道是客戶端應用,是application的簡稱,再說dapp就是D+app,d是英文單詞decentralization的首字母,單詞翻譯中文是去中心化,即dapp為去中心化應用,主要強調的是一個可以被我們直觀看見的一個頁面這樣子的應用,里面集成了我們的區塊鏈技術(去中心化技術),
接上一篇的文章,上一篇我們是在Windows上實作了Dapp,那么我沒也可以在Linux上實作我們的Dapp投票合約,按理來說后者更加的適合我們的需求和環境,
本文參考基礎:
如果想在Windows上搭建Dapp的可以參看上文:手把手教你一步步開發第一個Dapp(使用solidity語言實作投票合約)——Remix版本——這篇文章中的合約和前一篇一樣,后面的web部署代碼也一樣
在Ubuntu上挖礦:全網最詳細的Ubuntu挖礦教程(私有鏈搭建、挖礦、轉賬和交易)
看完這篇文章后你會學會:
- 熟悉Linux(Ubuntu)的作業系統
- 會基本的腳本語言
- 安裝環境(solc,web3,Ganache,node)
- 安裝geth挖礦環境以及挖礦操作
- Dapp的基礎開發
目錄
前言
1. 挖礦
2.部署
1)安裝node
2)安裝solc
方法一:安裝solc
方法二:安裝指定版本的solc
3)安裝web3
4)安裝Ganache
(1)通過源得到Ganache并下載
(2)修改權限
(3)啟動Ganache
3.搭建Dapp
(1)進入node.js
(2)獲取web3支持
(3)定義變數地址
(4)web3連接地址
(5)獲取地址賬戶
(6)定義變數獲取solc
(7)定義變數拿到合約
(8)定義變數編譯合約
(9)定義變數創建abi
(10)定義變數得到合約編譯后的bytecode
(11)定義變數連接abi
(12)定義變數(支付費用的賬戶和最高gas)
(13)部署合約
(14)獲取合約地址
(15)合約執行(驗證)
報錯總結
(1)呼叫函式
(2)創建合約(初始化合約)
(3)web3連接錯誤
(4)合約版本和你裝的solc版本不對應
后言
1. 挖礦
這一部分的內容我單獨的寫了一篇文章來細細講解,有需要的可以看:全網最詳細的Ubuntu挖礦教程(私有鏈搭建、挖礦、轉賬和交易)
2.部署
1)安裝node
sudo apt-get install nodejs
因為我已經安裝過了,所以你們可能和我的界面有不一樣的地方,

安裝完成查看node.js的版本:
yeyuheng@yeyuheng-virtual-machine:~/桌面/web$ node -v
![]()
能查到版本就是安裝成功了,
也可以下載源檔案進行鏈接安裝(參考):https://blog.csdn.net/liuweihui521/article/details/84141545
2)安裝solc
需要注意的是,這個solc需要安裝在你專案檔案夾下,比如我的Dapp專案的檔案夾是web,那么你就要定位到web檔案夾下然后進行下一步的安裝步驟,
還有一點就是你安裝的solc版本最好和我們的智能合約中的版本一致,這樣可以減少報錯的可能,
定位檔案夾:

進行安裝:
方法一:安裝solc
>sudo add-apt-repository ppa:ethereum/ethereum
>sudo apt-get update
>sudo apt-get install solc
方法二:安裝指定版本的solc
(1)先安裝npm
>sudo apt install npm
如果有報錯的話可以嘗試:sudo apt-get install update 然后在執行上面的陳述句,
如果報錯如下:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
The following packages have unmet dependencies:
npm : Depends: node-gyp (>= 0.10.9) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
可以使用以下代碼解決:sudo apt-get install nodejs-dev node-gyp libssl1.0-dev,然后再次的執行安裝命令,
(2)安裝指定版本的solc
>sudo npm install solc@0.4.25
出現進度條表示開始安裝,只需要耐心的等待一下就好了,

安裝成功:

可以使用sudo npm list solc對其版本查詢:

3)安裝web3
安裝web3和solc的方法大差不差
sudo npm install web3@0.20.1
安裝完畢(出現的結果可能不同,因為我之前已經安裝了好幾個web3的版本,這都是小問題):

查詢web3版本查看是否安裝成功:
yeyuheng@yeyuheng-virtual-machine:~/桌面/web$ sudo npm list web3

可以看到查詢出來的版本就是我們剛剛安裝的版本,說明安裝成功,
4)安裝Ganache
wget https://github.com/trufflesuite/ganache/releases/download/v1.0.1/ganache-1.0.1-x86_64.AppImage //下載ganache
chmod +x ganache-1.0.1-x86_64.AppImage //修改權限
sudo ./ganache-1.0.1-x86_64.AppImage //啟動ganache
(1)通過源得到Ganache并下載
yeyuheng@yeyuheng-virtual-machine:~/桌面/web$ wget https://github.com/trufflesuite/ganache/releases/download/v1.0.1/ganache-1.0.1-x86_64.AppImage

(2)修改權限
yeyuheng@yeyuheng-virtual-machine:~/桌面/web$ chmod +x ganache-1.0.1-x86_64.AppImage
(3)啟動Ganache
yeyuheng@yeyuheng-virtual-machine:~/桌面/web$ sudo ./ganache-1.0.1-x86_64.AppImage

點擊yes出現Ganache圖形界面

啟動成功就是安裝成功了,對于Ganache界面有啥不懂的可以看:手把手教你一步步開發第一個Dapp(使用solidity語言實作投票合約)——Remix版本這里面的Ganache部分介紹,
到此我們需要在Ubuntu上開發Dapp的所有前期準備全部完成了,

下面才是進入我們這片文章的重點部分:

3.搭建Dapp
進入到我們的源檔案的位置,開始操作,(合約還是上一篇的合約)
![]()
(1)進入node.js
yeyuheng@yeyuheng-virtual-machine:~/桌面/web$ node
![]()
(2)獲取web3支持
> var Web3=require('web3')

(3)定義變數地址
> var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'))

(4)web3連接地址
>web3.isConnected()

(5)獲取地址賬戶
>web3.eth.accounts

注意:我連接的是自己虛擬機上的私有鏈,并沒有用Ganache,如想使用Ganache把第三步的http換掉即可,
(6)定義變數獲取solc
>var solc = require('solc')

(7)定義變數拿到合約
>var sourceCode = fs.readFileSync('Voting.sol').toString()

列印查看:

(8)定義變數編譯合約
>var compiledCode = solc.compile(sourceCode)

列印查看:

(9)定義變數創建abi
>var abi = JSON.parse(compiledCode.contracts[':Voting'].interface);

注意:引數里面的Voting是我們編譯合約后得到的一個類似標識的一個東西,可以在剛剛列印的編譯好的合約中找到:
(10)定義變數得到合約編譯后的bytecode
> var byteCode = compiledCode.contracts[':Voting'].bytecode

注意:最后合約部署的時候要求的bytecode是一個十六進制的數,但是我們從上圖看出來了這個編譯出來的bytecode不是十六進制的一個數,所以我們需要將其轉化,不然后面部署的時候可能會報錯,
加上0x即可:> byteCode="0x"+byteCode
(11)定義變數連接abi
> var VotingContract = web3.eth.contract(abi)

(12)定義變數(支付費用的賬戶和最高gas)
>var deployTx0bj = {data:byteCode, from:web3.eth.accounts[0], gas:3000000}

(13)部署合約
部署合約的時候需要開啟挖礦否則不會出現合約的address
>var contractInstance = VotingContract.new(['Allice','Bob','Cary'],deployTx0bj);

出現報錯:可以看見是賬戶沒有解鎖的問題,對賬戶進行解鎖,不會可以查看: 全網最詳細的Ubuntu挖礦教程(私有鏈搭建、挖礦、轉賬和交易)
解鎖完成再次執行:

挖礦界面同步出現資料:

(14)獲取合約地址
> contractInstance.address //需要等待一會才會部署成功出現地址

注意:如果你是執行了部署合約再開啟挖礦的話可能會導致address出不來,建議先開啟挖礦在執行剛剛的一系列操作
(15)合約執行(驗證)
> contractInstance.voteForCandidate('Alice',{from: web3.eth.accounts[0]})
'0xd7bad76d185da8a187d82b1712eea3bcbf83f831574e905b945e638954cbb49e'
> contractInstance.totalVotesFor.call('Alice')
BigNumber { s: 1, e: 0, c: [ 1 ] }
> contractInstance.totalVotesFor.call('Alice').toString()
'1'
現在我們有了合約的地址和abi和部署的http地址,我們就可以開發我們的Dapp來實作投票系統了:
后面一部分和手把手教你一步步開發第一個Dapp(使用solidity語言實作投票合約)——Remix版本中的第三章是一樣的操作,我就不累贅了,大家可以去那邊查看具體的實作程序,
報錯總結
(1)呼叫函式
當你進行呼叫函式的時候一定用加上contractInstance.setInfo(name,age,{from: web3.eth.accounts[0]})
當你輸入>contractInstance.setInfo(name,age)就會報錯無效的地址(Error: invalid address)

(2)創建合約(初始化合約)
> var contractInstance = VotingContract.new([],deployTx0bj);
Error: invalid argument 0: json: cannot unmarshal hex string without 0x prefix into Go struct field SendTxArgs.data of type hexutil.Bytes
at Object.InvalidResponse (/home/yeyuheng/桌面/new/node_modules/web3/lib/web3/errors.js:38:16)
at RequestManager.send (/home/yeyuheng/桌面/new/node_modules/web3/lib/web3/requestmanager.js:61:22)
at Eth.send [as sendTransaction] (/home/yeyuheng/桌面/new/node_modules/web3/lib/web3/method.js:145:58)
at ContractFactory.new (/home/yeyuheng/桌面/new/node_modules/web3/lib/web3/contract.js:228:33)
大概率就是出現了那里沒有加上0x,經過查看是 deployTx0bj這個引數中有一個地方沒有加上0x
(3)web3連接錯誤
> web3.isConnected()
false
那么可能你的賬戶沒有解鎖,可以先解鎖試試
(4)合約版本和你裝的solc版本不對應
> sourceCode
'pragma solidity ^0.4.24;\r\n \r\ncontract MeetingInfoContract{\r\n string name;\r\nuint age;\r\nfunction setInfo(string _name,uint _age) public{\r\nname = _name;\r\nage = _age;\r\n}\r\nfunction getInfo() public view returns(string,uint){\r\nreturn(name,age);\r\n}\r\n}'
選擇一個合適的solc版本進行安裝
后言
本次開發是在Ubuntu上進行的投票系統,全程用到了ubuntu這個作業系統,其實后面部署到web端上操作和我之前的那篇投票的blog大差不差(所以我也偷了一下懶,大家可以看之前那篇文章的第三章),
自己總結一下我的兩篇姊妹篇的文章的差異:主要是得到abi和合約地址的方法的差異,這篇文章可以直接連接到我們自己創建的私有鏈上進行一系列的具體操作,而那個在windows上搭建的雖然可以通過matemask等錢包和remix編譯器等工具來進行自己私有鏈的連接,但是沒有這個來的直觀,在Ubuntu上開發唯一的去缺點就是要自己安裝很多的環境,有些人可能在這一步的時候就會放棄,但是反過來想想多學點東西未嘗不是一件好事呢!
兩篇文章各有千秋,建議剛剛開始學這方面知識的小白,可以兩條路都走一下看看,多學總是好的,
整理不易多點關注+點贊+收藏,感謝各位大哥,持續關注后續更加精彩,
打個廣告:代做Web畢設,專業團隊值得信任,可以私聊,
這一次的分享到此結束,

No pains No results
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/258073.html
標籤:區塊鏈
下一篇:Synchronized


