本dapp是采用ganache-cli的私链开发,用express来创建项目,web3js来连接私链
//安装ganache-li
sudo npm install -g ganache-cli
//安装solidity(我刚开始用的是npm install solc报错,最后使用snap成功安装)
sudo snap install solc
//web3j安装
sudo npm install web3 -save
若web3js始终安装报错,请见博主另外一篇博客https://blog.csdn.net/holy19__/article/details/122609600启动ganache-cli(会自动分配十个用户)创建工程 安装express
//express安装
sudo npm install -g express-generator
!!!警示!!! 一定要在该工程目录下(若是题主则是dapp目录下)重新安装web3,否则项目将无法成功创建
创建工程express -e Dapp1
在创建成功后会出现如上提示,接下来跟着提示走即可
cd Dapp1
npm install
npm start
最后在浏览器输入: 127.0.0.1:3000
出现以下则表示该项目创建成功:
合约编写使用的是remix在线编程工具
remix在线工具地址:https://remix.ethereum.org/
合约代码(由于该篇博客只是为了阐明dapp开发的基本流程):
pragma solidity >=0.4.22 <0.8.0;
contract Counter{
uint256 conter;
constructor() public{
conter=1;
}
function kinCounter(uint step) public{
conter+=step;
}
function getCounter() public view returns(uint256){
return conter;
}
}
部署合约1、 创建一个合约部署目录,目录下创建一个js文件
2、目录下一定得安装web3(博主建议直接在前面创建项目的目录下即dapp目录下创建合约部署目录,这样就不需要再重新安装web3)
3、首先创建deploy目录(注意该目录是和Dapp1同级的)
4、再创建deploy.js文件
5、向deploy.js文件里添加代码:
(代码中从var counterContract = new web3.eth.Contract开始之后所有的代码就是合约的部署代码,是Remix自动生成的,在remix中自动编译后找到如图WEB3DEPLOY的地方,直接复制再粘贴至js代码中即可,注意将 arguments: [ ]
}).send({ from:’’ }内from后的序列改为ganache用户的地址)
6、使用
node deploy.js
运行deploy.js即可部署成功
remix中WEB3DEPLOY位置:
**//具体deploy.js代码**
var Web3=require('web3');
console.log("test");
var web3=new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
console.log(web3.version);
web3.eth.getAccounts().then(console.log);
var counterContract = new web3.eth.Contract([{"constant":true,"inputs":[],"name":"getCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"step","type":"uint256"}],"name":"kinCounter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]);
counterContract.options.data="0x608060405234801561001057600080fd5b50600160005560b1806100246000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80638ada066e146037578063fef527c314604f575b600080fd5b603d606b565b60408051918252519081900360200190f35b606960048036036020811015606357600080fd5b50356071565b005b60005490565b60008054909101905556fea265627a7a72315820bacf3927d6966aa5031c2e52312113c304cd7bd953f13d79ef0dc962335174e264736f6c634300050b0032"
var counter = counterContract.deploy({
data: '0x608060405234801561001057600080fd5b50600160005560b1806100246000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80638ada066e146037578063fef527c314604f575b600080fd5b603d606b565b60408051918252519081900360200190f35b606960048036036020811015606357600080fd5b50356071565b005b60005490565b60008054909101905556fea265627a7a72315820bacf3927d6966aa5031c2e52312113c304cd7bd953f13d79ef0dc962335174e264736f6c634300050b0032',
arguments: [
]
}).send({
from: '0x3878Ef8A312B8B108D634e6D5A56789afE11edbC',
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
}).then(function(contract){
console.log("address:",contract.options.address);
})
部署成功页面:
修改/routes/index.js文件,代码如下:
(js文件具体解释请查看下面代码的注释)
var express = require('express');
var router = express.Router();
var Web3=require('web3');
var web3=new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
//var myContract=new web3.eth.Contract([],'');
//该代码的第一项为remix内合约编译后的ABI,remix内ABI的位置同WEB3DEPLOY位置基本一致,具体看代码后的图,直接复制即可
//第二项参数为合约地址,在部署合约时deploy.js内打印在控制台里的,直接复制即可
var myContract=new web3.eth.Contract([
{
"constant": false,
"inputs": [
{
"internalType": "uint256",
"name": "step",
"type": "uint256"
}
],
"name": "kinCounter",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"constant": true,
"inputs": [],
"name": "getCounter",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],'0xE3Aa5983ac9E570Ed76Ef6B2E32534792AB53c6C');
//调用合约的getCounter()函数,from后面的地址为ganache启动的用户地址
myContract.methods.getCounter().call({from:'0xb309Aad4cC50e0fea2af70068aD7a45F297fE3EC'},
function(error,result){
console.log("conter:",result);
});
var init_counter=0;
var current_counter=0;
myContract.methods.getCounter().call().then(function(counter){
console.log('init:',counter);
init_counter=counter;
});
/* GET home page. */
router.get('/', function(req, res, next) {
//调用合约kinCounter()函数,from后面的地址为ganache启动的用户地址
myContract.methods.kinCounter(3).send({from:'0xb309Aad4cC50e0fea2af70068aD7a45F297fE3EC'})
.then(function(){
myContract.methods.getCounter().call().then(function(counter){
console.log('cure:',counter);
current_counter=counter;
res.render('index', { init: init_counter,curent: current_counter});
});
});
});
module.exports = router;
修改app.js文件用如下代码替换原app.js文件中
的这部分内容
var app = express();
var ejs = require('ejs');
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.engine('.html',ejs.__express);
app.set('view engine','html');
//app.set('view engine', 'ejs');
替换后:
html代码如下:
diaoyongheyue
'stylesheet' href='/stylesheets/style.css' />
init number: <%= init %>
curent number: <%= curent %>
该代码中的init,current与/routes/index.js中getCounter()方法内的res.render(‘index’, { init: init_counter,curent: current_counter});的这句代码里的init,current对应。
页面显示在浏览器输入 http://127.0.0.1:3000
出现如下页面
以上就是一次web3js和express实现简单dapp开发的基本流程啦!!!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)