目录
目的及要求
了解以太坊的基本逻辑,理解以太坊的运行机理。能正确进行DAPP设计开发和部署。
基本原理
了解DAPP设计开发和部署。熟悉工具安装。
实验环境
使用VMWare中的Ubuntu虚拟机进行实验。
参考教程:https://www.bilibili.com/video/BV1sJ411D72u?p=515
实验内容
1. 工具安装,在虚拟机中安装Nodejs和npm
首先先安装curl指令:sudo apt install curl
安装nodejs:curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
然后执行安装指令sudo apt-get install -y nodejs
然后报了一个错:
E: 无法获得锁 /var/lib/dpkg/lock。锁正由进程 69782(unattended-upgr)持有
N: 请注意,直接移除锁文件不一定是合适的解决方案,且可能损坏您的系统。
E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
这种无法获得锁的错误只要删除显示的文件夹就可以了,比如这里就删除/var/lib/dpkg/lock
通过输入
sudo rm /var/lib/dpkg/lock
就可以解决缓存锁了,再重新输入安装指令:
sudo apt-get install -y nodejs
输入node -v
就可以查看node的版本
2. 模拟环境ganache安装。截图。
因为访问npm网站会比较慢,所以先切换源:
npm config set registry http://registry.npm.taobao.org
安装ganache-cli: sudo npm install -g ganache-cli
安装web3:sudo npm install -g web3@^0.20.7
(一定要这个版本用最新版的后面无法运行isConnected())
安装solc:sudo npm install -g solc@0.4.24
(一定要0.4的版本!不然后面compiledCode也会报错)
(搞得乱糟糟地于是又回头跟着视频一起走一遍,建议用上面的指定版本,感觉版本之前兼容有点问题)
在根目录下新建一个文件夹mkdir simple_vote
再进入这个文件夹cd simple_vote/
再输入npm init
一直按回车键
再 ls
就可以看到出现了一个新的文件夹
输入npm install web3@0.20.7 solc ganache-cli
安装web3(一定要是0.20版本的!)和solc和ganacje-cli(这一步可以不用做,就是为了验证一下这个文件夹下是可以用这三样的)
先cd进入simple_vote/node_modules/.bin
,输入ganache-cli
,如果是第一次安装就可以直接看到大串的结果,就不会有端口被占用的问题。但是我装了两次忘记把第一个删除了,所以需要重新设置端口ganache-cli -p 7878
设置为7878
再开一个终端输入cd ~/simple_vote
输入 vim Voting.sol
在vim中输入
pragma solidity >0.4.22;
contract Voting{
bytes32[] public candidateList;
mapping (bytes32 => uint8) public votesReceived;
constructor(bytes32[] candidateListName) public {
candidateList = candidateListName;
}
function validateCandidate(bytes32 candidateName) internal view returns (bool){
for(uint8 i = 0;i < candidateList.length; i++){
if(candidateName == candidateList[i])
return true;
}
return false;
}
function vote(bytes32 candidateName) public {
require(validateCandidate(candidateName));
votesReceived[candidateName] += 1;
}
function totalVotesFor(bytes32 candidateName) public view returns(uint8){
require(validateCandidate(candidateName));
return votesReceived[candidateName];
}
}
粘贴后按esc键输入 :wq
保存退出
再输入
npm list web3
npm list ganache-cli
npm list solc
输入 node
进入nodejs环境
依次输入
var Web3=require('web3')
var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7878'))
(没有改过端口的将7878改成8545)
再输入
web3.isConnected()
这个时候结果会变成true
如果是false的注意一下是不是写错了或者ganache-cli窗口关掉了。
ganache-cli窗口长这样:
继续在nodejs环境中输入
web3.eth.accounts
出来的结果应该和ganache-cli中的结果是一致的。
输入var solc = require('solc')
再输入
solc
再另开一个终端输入进入~/simple_vote. sudo chmod 666 Voting.sol
回到node命令行下输入var sourceCode = fs.readFile
并按tab键提示
输入var sourceCode = fs.readFileSync('Voting.sol').toString()
再输入sourceCode
就会出现一大串
输入
var compiledCode = solc.compile(sourceCode)
compiledCode
然后报错了……
大概是solidity的版本要控制在0.4.所以又去卸载重装了0.4.24版本。(上面安装指令是修改后正确的安装指令)
安装完后重新将node环境下的代码都再输一次。输到compiledCode过后会出来一大串
输入
var abi = compiledCode.contracts[':Voting'].interface;
abi
输入
var abi = JSON.parse(compiledCode.contracts[':Voting'].interface);
abi
输入
var byteCode = compiledCode.contracts[':Voting'].bytecode
bytecode
输入
var VotingContract = web3.eth.contract(abi)
var deployTxObj = {
data:byteCode,from:web3.eth.accounts[0],gas:3000000}
var contractInstance = VotingContract.new(['Alice','Bob','Cary'],deployTxObj);
contractInstance.address
3. 控制台投票交互。截图。
输入
contractInstance.vote("Alice",{
from:web3.eth.accounts[0]}) //投给Alice