通过web3js部署调用智能合约

  • 1、在线编译智能合约
  • 2、部署合约
  • 3、调用合约

参考视频:https://www.bilibili.com/video/BV14z4y1Z7Jd?p=1

1、在线编译智能合约

https://remix.ethereum.org/

pragma solidity ^0.4.0;contract MyCounter{uint256 counter;constructor() public {counter = 1;}function kipCounter(uint step) public{counter +=step;}function getCounter() public view returns (uint256){return counter;}
}

2、部署合约

  1. 创建一个新的文件夹mkdir MyDapp2
  2. 启动ganache-cli
  3. 下载web3npm install web3,注:ganache的启动和deploy.js要在同一个目录。
  4. 先进行测试node deploy.js
var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));web3.eth.getAccounts().then(console.log);
  1. 部署合约
    web3的版本:1.7.1
    复制 WEB3DEPLOY 的内容到deploy.js
    == ganache需要启动才能运行 ==

    修改
    from: web3.eth.accounts[0],成ganache对应的账户
var mycounterContract = new web3.eth.Contract([{"constant":true,"inputs":[],"name":"getCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"step","type":"uint256"}],"name":"kipCounter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]);var mycounter = mycounterContract.deploy({data: '0x608060405234801561001057600080fd5b50600160008190555060e7806100276000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680638ada066e14604e578063e24801d8146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a9565b005b60008054905090565b806000808282540192505081905550505600a165627a7a72305820948660862b007e09bde5dcec9d432c7caced4dff0a50ed85f6f1af784b50ed750029', arguments: []
}).send({from: '0x0bfb484EB4B451FC20F52cDa3FF366097858C69A', 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("Contract address:",contract.options.address);});

合约地址每次启动都会变化
最终结果:

3、调用合约

  1. 首先创建新工程express -e contractTest
  2. 进入工程目录cd contractTest进行npm install npm install web3
  3. 修改app.js文件
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');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');app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));app.use('/', indexRouter);
app.use('/users', usersRouter);// catch 404 and forward to error handler
app.use(function(req, res, next) {next(createError(404));
});// error handler
app.use(function(err, req, res, next) {// set locals, only providing error in developmentres.locals.message = err.message;res.locals.error = req.app.get('env') === 'development' ? err : {};// render the error pageres.status(err.status || 500);res.render('error');
});module.exports = app;
  1. 修改route目录下的index.js
var express = require('express');
var router = express.Router();var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));web3.eth.getAccounts().then(console.log);/* GET home page. */
router.get('/', function(req, res, next) {res.render('index', { title: 'Express' });
});module.exports = router;
  1. 在view的目录下新建index.html
<!DOCTYPE html>
<html><head><title><%= title %></title><link rel='stylesheet' href='/stylesheets/style.css' /></head><body><h1><%= title %></h1><p>Welcome to <%= title %></p></body>
</html>
  1. 测试能否成功连接web3npm start

    web3较为常用的方法called, send, estimateGas
    called:不对参数进行改变的方法
    send:修改值(修改区块链的状态)
    estimatedGas:通过在本地执行方法,返回消耗值,不进行新的交易


    第一个参数ABI,第二个参数是合约地址

  2. 修改route目录中的index.js文件

var express = require('express');
var router = express.Router();var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));//web3.eth.getAccounts().then(console.log);var myContract = new web3.eth.Contract([{"constant": true,"inputs": [],"name": "getCounter","outputs": [{"name": "","type": "uint256"}],"payable": false,"stateMutability": "view","type": "function"},{"constant": false,"inputs": [{"name": "step","type": "uint256"}],"name": "kipCounter","outputs": [],"payable": false,"stateMutability": "nonpayable","type": "function"},{"inputs": [],"payable": false,"stateMutability": "nonpayable","type": "constructor"}
],'0x871662eAB2B567963587710196561C60740c2233');//调用合约
//可以指定从哪个账户发出,则任意选一个账户
// myContract.methods.getCounter().call({from: '0xe23493eACdC904cfd5826f9775Ee22B881051630'}, function(error, result){//     console.log("counter:",result);
// });//也可以不指定
var init_counter = 0;
var current_counter = 0;
myContract.methods.getCounter().call().then(function(counter){console.log("init counter:",counter);init_counter = counter;
})/* GET home page. */
//修改counter的值,并传递该参数
router.get('/', function(req, res, next) {myContract.methods.kipCounter(5).send({from: '0xe23493eACdC904cfd5826f9775Ee22B881051630'}).then(function(){myContract.methods.getCounter().call().then(function(counter){console.log('current counter:',counter);current_counter = counter;res.render('index', { init: init_counter, current:current_counter});});});
});module.exports = router;
  1. 修改view里的index.html
<!DOCTYPE html>
<html><head><title>调用合约</title><link rel='stylesheet' href='/stylesheets/style.css' /></head><body><h1>调用合约</h1><p>init counter: <%= init %><br>current counter:<%=current %></p></body>
</html>
  1. 运行npm start

    至此,视频06结束。

以太坊Dapp通过web3js部署调用智能合约相关推荐

  1. 尚硅谷以太坊区块链学习之NFT智能合约(6)

    尚硅谷以太坊区块链学习之NFT智能合约(6) 前言 一.NFT智能合约 1.智能合约代码 2.智能合约推送 3.具体调用 二.具体使用 三.NFT商家智能合约 前言 提示:服务外包区块链学习 5被ba ...

  2. 基于以太坊的次高价盲拍solidity智能合约(二)

    基于以太坊的次高价盲拍solidity智能合约(二) 4.揭标 5.第三方仲裁人终结拍卖 4.揭标 揭标的过程应该是本智能合约中最复杂且具有灵魂的关键步骤. 当每个发起过竞标的用户,利用该标的隐式价格 ...

  3. 八、 以太坊的杰出之作:智能合约

    智能合约主要有两大方面的作用,一个是用于更便捷地处理交易,一个适用于更灵活的开发的APP,也就是区块链应用. 以太坊虚拟机:虚拟机是计算机领域里面的一个术语,可以理解为一个虚拟环境,在这个虚拟环境中可 ...

  4. MIMIC 以太坊医疗项目开发(6)Web3智能合约API

    web3.js是一个库集合,你可以使用HTTP或IPC连接本地或远程以太它节点进行交互. 它具备如下性质: •通过JSON-RPC与Ethereum客户端进行交互 •支持所有的JSON-RPC方法类型 ...

  5. 基于以太坊的测试链发布一个智能合约

    1,创建账户 使用METAMASK钱包来进行操作,具体的创建过程请自行查阅.创建好的账户如下图所示,账户余额显示为0 详情下面显示对应账户的地址,这个是最关键的信息 首先选择左上角头像旁边的按键,切换 ...

  6. 以太坊去中心化淘宝智能合约案例

    这篇文章我们来介绍一个简易的区块链电商系统的核心功能,10多年来,我们习惯了淘宝的电商模式,淘宝为电商在中国普及做出了突出贡献,值得肯定,也完成了历史使命. 淘宝模式的核心是什么? 免费是一方面,我认 ...

  7. 学习以太坊:瑞波也要智能合约

    瑞波自2013年诞生以来,虽以强大的性能著称,但一直不支持智能合约.以太坊凭着智能合约,却一路高歌猛进.现在,这一情况将得到改变.瑞波支持的研发团队XRPL Labs在准备推出方案"Hook ...

  8. MIMIC 以太坊医疗项目开发(7) 医疗智能合约 sample

    本文引自<基于区块链的医疗信息系统及智能合约设计>辽宁科技大学学报 第43卷 第2期 2020年4月 Journal of University of Science and Techno ...

  9. 以太坊教程:入门学习开发以太坊dapp

    一.区块链 1. 分布式去中心化 比特币设计的初衷就是要避免依赖中心化的机构,没有发行机构,也不可能操纵发行数量.既然没有中心化的信用机构,在电子货币运行的过程中,也势必需要一种机制来认可运行在区块链 ...

最新文章

  1. hdu 2028 Lowest Common Multiple Plus
  2. Queue.LinkedList
  3. Android之Butterknife原理解析
  4. 文件服务器的配置与管理(2) 实现软RAID
  5. 接受java的返回值_java怎样接受 到return的值的?
  6. Android工程模块化平台的设计
  7. Spring Boot-@EnableWebMvc注解
  8. MATLAB矩阵添加新元素
  9. 《可解释的机器学习》校对活动正式启动 | ApacheCN
  10. 【commons-beanutils专题】003- PropertyUtils 专题
  11. stata 导出 相关系数表_【BBtime】戏说会计论文---stata简单实操
  12. 备份手机相册----syncthing (一劳永逸式解决方案)
  13. 华为路由器AAA配置与管理
  14. html自动生成拼音五笔,如何根据单元格汉字自动生成拼音码和五笔码
  15. oracle 运维入门,Oracle日常基本运维命令及基本体系结构
  16. 【操作系统习题】假定某多道程序设计系统供用户使用的主存空间为100 KB ,磁带机2台,打印机1台
  17. 一位游戏大厂测试的一些知识分享
  18. 07:计算多项式的值
  19. 代码实现微信8.0特效
  20. wps怎么免费导出简历_个人简历免费模板手机编辑,手机wps怎么免费导出简历

热门文章

  1. Unity UGUI基础 之 Scroll View/Scroll Rect 的简单使用,并取消拖拽(滑动内容)效果,拖拽只在Scrollbar 上起作用
  2. 我们更需要指数型的AB产品(长盛同庆、基金瑞福)
  3. promise.all的用法讲解。
  4. 笔记-JMH(Java Microbenchmark Harness)
  5. nginx配置wss
  6. wfGo 围棋 AI对弈模式
  7. 【交通行业数据治理会议推荐】大湾区交通行业数据要素增值研讨会
  8. 怎样看待程序员驻场?
  9. Caffeine实战教程篇
  10. 黑客利用SSH弱密码攻击控制Linux服务器,潜在目标约十万IP天