您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關基于以太坊的區塊鏈Hello World是怎樣的,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
windows 10 64bit
準備接手一個IPFS+Ethereum的項目,先學習一下Ethereum,并嘗試完成一個Hello World。
參考我另一片blog, 安裝nvm
安裝node 9.11.1 并切換環境
nvm install 9.11.1 nvm use 9.11.1
創建一個新的工作目錄,并在命令行索引到該路徑
安裝ganche-cli、web3、solc
npm install ganache-cli npm install web3@0.20.1 npm install solc@0.4.21 //此處原博客沒有版本,會安裝高于0.4的版本,會導致后續編譯smart contract編譯失敗
在安裝了ganache-cli與web3時,由于教程版本問題會出現報錯,但是不影響。
啟動ganache-cli
node_modules\.bin\ganache-cli
6. 使用Solidity創建Smart Contract,命名為:Voting.sol
pragma solidity ^0.4.18; contract Voting { mapping (bytes32 => uint8) public votesReceived; bytes32[] public candidateList; function Voting(bytes32[] candidateNames) public { candidateList = candidateNames; } function totalVotesFor(bytes32 candidate) view public returns (uint8) { require(validCandidate(candidate)); return votesReceived[candidate]; } function voteForCandidate(bytes32 candidate) public { require(validCandidate(candidate)); votesReceived[candidate] += 1; } function validCandidate(bytes32 candidate) view public returns (bool) { for(uint i = 0; i < candidateList.length; i++) { if (candidateList[i] == candidate) { return true; } } return false; }}
啟動node交互控制臺,依次輸入以下命令
> Web3 = require('web3') > web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")) > web3.eth.accounts
輸入以上最后一條命令后會獲取Ganache創建的10個帳號,如下
> code = fs.readFileSync('Voting.sol').toString() > solc = require('solc') > compiledCode = solc.compile(code)
全部完成會得到如下截圖的輸出,表示smart contract編譯成功 8.部署smart contract
> abi = JSON.parse(compiledCode.contracts[':Voting'].interface) > VotingContract = web3.eth.contract(abi) > byteCode = compiledCode.contracts[':Voting'].bytecode > deployedContract = VotingContract.new(['James', 'Norah', 'Jones'],{data: byteCode, from: web3.eth.accounts[0], gas: 4700000}) > deployedContract.address
此時會獲取address,記下來后續會用到
> contractInstance = VotingContract.at(deployedContract.address)
下載web3.js文件,下載后放在工作根目錄下。
由cdn不知什么原因不可用,所以直接下載源文件,鏈接如下 web3.js 0.20.6
在根目錄下創建index.html文件,并粘貼以下代碼,需要在截圖標出處,更換成第8步自己部署的smart contract的address
<!DOCTYPE html> <html> <head> <title>DApp</title> <link href='https://fonts.googleapis.com/css?family=Open Sans:400,700' rel='stylesheet' type='text/css'> <link href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css' rel='stylesheet' type='text/css'> </head> <body class="container"> <h2>Voting Application</h2> <div class="table-responsive"> <table class="table table-bordered"> <thead> <tr> <th>Candidate</th> <th>Votes</th> </tr> </thead> <tbody> <tr> <td>James</td> <td id="candidate-1"></td> </tr> <tr> <td>Norah</td> <td id="candidate-2"></td> </tr> <tr> <td>Jones</td> <td id="candidate-3"></td> </tr> </tbody> </table> </div> <input type="text" id="candidate" /> <a href="#" onclick="voteForCandidate()" class="btn btn-primary">Vote</a> </body> <script src="web3.js"></script> <script src="https://code.jquery.com/jquery-3.1.1.slim.min.js"></script> <script language="javascript" type="text/javascript"> web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); abi = JSON.parse('[{"constant":false,"inputs":[{"name":"candidate","type":"bytes32"}],"name":"totalVotesFor","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"candidate","type":"bytes32"}],"name":"validCandidate","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"votesReceived","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"x","type":"bytes32"}],"name":"bytes32ToString","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"candidateList","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"candidate","type":"bytes32"}],"name":"voteForCandidate","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"contractOwner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"inputs":[{"name":"candidateNames","type":"bytes32[]"}],"payable":false,"type":"constructor"}]') VotingContract = web3.eth.contract(abi); contractInstance = VotingContract.at('0x47f49b300eb86d972f91f103913376fb0a8e52e7'); candidates = {"James": "candidate-1", "Norah": "candidate-2", "Jones": "candidate-3"} function voteForCandidate(candidate) { candidateName = $("#candidate").val(); try { contractInstance.voteForCandidate(candidateName, {from: web3.eth.accounts[0]}, function() { let div_id = candidates[candidateName]; $("#"+div_id).html(contractInstance.totalVotesFor.call(candidateName).toString()); }); } catch (err) { } } $(document).ready(function() { candidateNames = Object.keys(candidates); for (var i = 0; i < candidateNames.length; i++) { let name = candidateNames[i]; let val = contractInstance.totalVotesFor.call(name).toString() $("#"+candidates[name]).html(val); } }); </script> </html>
在瀏覽器打開index.html,輸入Candidate中的人名后,點擊Vote即可投票,投票后效果如下 每次點擊投票,也都會生成一個新的區塊,效果如下。
以上步驟就完成了一個基于Ethereum的投票Dapp的完整搭建流程,整合個補全后步驟應該不會有坑的可以順利搭建完成。
就像“hello world”的字面意思一樣,0-1的過程是最艱難的,但是開了頭,剩下的1-n也就會順暢不少。
以上就是基于以太坊的區塊鏈Hello World是怎樣的,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。