以太坊Dapp通过web3js部署调用智能合约

这篇具有很好参考价值的文章主要介绍了以太坊Dapp通过web3js部署调用智能合约。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1、在线编译智能合约

https://remix.ethereum.org/
以太坊Dapp通过web3js部署调用智能合约

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需要启动才能运行 ==
    以太坊Dapp通过web3js部署调用智能合约
    修改
    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);
 });

合约地址每次启动都会变化
最终结果:
以太坊Dapp通过web3js部署调用智能合约

3、调用合约

  1. 首先创建新工程express -e contractTest
    以太坊Dapp通过web3js部署调用智能合约
  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 development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.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
    以太坊Dapp通过web3js部署调用智能合约
    web3较为常用的方法called, send, estimateGas
    called:不对参数进行改变的方法
    send:修改值(修改区块链的状态)
    estimatedGas:通过在本地执行方法,返回消耗值,不进行新的交易
    以太坊Dapp通过web3js部署调用智能合约
    以太坊Dapp通过web3js部署调用智能合约
    第一个参数ABI,第二个参数是合约地址

  2. 修改route目录中的index.js文件文章来源地址https://www.toymoban.com/news/detail-421951.html

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
    以太坊Dapp通过web3js部署调用智能合约以太坊Dapp通过web3js部署调用智能合约
    至此,视频06结束。

到了这里,关于以太坊Dapp通过web3js部署调用智能合约的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Web3】 Web3JS Pay Api

    Web3Network.eth.sendSignedTransaction(serializedTx) 参数: from - String|Number :发送帐户的地址。如果未指定,则使用web3.eth.defaultAccount属性。或web3.eth.accounts.wallet中本地的地址。 to - String :(可选)消息的目标地址,若未定义则为发送消息。 value - Number|String|BN|BigNumber :(可选)为wei中的交易

    2024年02月16日
    浏览(24)
  • 【跟乐乐学web3开发】一.使用IDE工具webstorm来编写web3js

    web3可以用java语言来编写,通过java的 web3j 依赖来编写,但是web3j对于abi的应用等支持库不太完整,所以还是多少有点局限性。 因此在当今的web3领域中,使用基于javaScript的 web3.js 库来编写web3应用是主流。 市面上大多的教材中,对于web3.js的编写是基于vscode这一款ide工具,这里

    2024年02月04日
    浏览(33)
  • 使用nodejs和web3js实现链接metamask钱包并实现合约交互

    在以太坊区块链上,metamask钱包是一个非常常用的钱包,用以管理以太币和其他以太坊资产。同时,它也是一个重要的以太坊智能合约交互工具。在本文中,我们将介绍如何使用nodejs和web3js实现链接metamask钱包并实现合约交互。 在开始之前,首先需要安装NodeJS和Web3JS。 NodeJS是

    2024年02月04日
    浏览(61)
  • 使用nodejs和web3js来实现链接MetaMask钱包并取消风险代币授权

    随着区块链技术的快速发展,数字货币资产在投资及交易市场中得到了广泛的应用。而在数字货币交易过程中,钱包是一个非常重要的环节。比如MetaMask就是一款非常流行的区块链钱包,它可以让用户在浏览器中安全地管理自己的数字资产。 然而,在数字货币交易过程中也存

    2024年01月23日
    浏览(37)
  • web3Js(干货)(多签的流程原理)看完这一篇就懂了(波场网络-请勿用于除学习外其他用途)

    连接波场网络: 其中APIKEY可以在官网获取; 可以使用tronWeb.isConnected()判断是否连接成功 创建离线波场地址: 该地址未激活,如果需要激活, 通常需要一定数量的 TRX(TRON 的本地代币)用于支付激活费用; 等待区块确定 就可以查看激活信息; 创建随机助记词与私钥: 如何让

    2024年02月04日
    浏览(59)
  • Web3.js在以太坊上部署和调用智能合约

    介绍如何使用Web3.js在以太坊上部署和调用智能合约;Web3.js是以太坊JavaScript API的实现,它可以与以太坊区块链进行交互 智能合约编写 使用Solidity编写一个简单的智能合约,然后使用Web3.js将其部署到以太坊区块链,通过JavaScript调用该智能合约 这个智能合约非常简单。它有两

    2024年02月16日
    浏览(38)
  • java使用web3j,部署智能合约在测试链上,并调用(万字详细教程)

    最近在学区块链相关,想做点自己感兴趣的。网上关于这块部分的坑也比较多,最近也是问了很多行业从事者才慢慢填坑,因此记录下来分享一下。 钱包 :metemask、 solidity编译器 :remix 、 java ide :idea。 智能合约编写的我选择在remix上方便,而且部署的时候不需要自定义gasP

    2024年01月16日
    浏览(39)
  • 【WEB3】如何使用Web3J库开发应用连接到以太坊区块链网络

    ​ Web3j 是一个与以太坊智能合约交互并与以太坊节点集成的 Java 库。它是高度模块化、类型安全和反应式的,专为以太坊上的 Java 和 Android 开发而构建。Web3j 消除了编写自定义集成代码以连接到以太坊区块链网络的开销。 通过 HTTP 和 IPC 实现完整的 Ethereum JSON-RPC客户端 API,

    2024年02月02日
    浏览(40)
  • Java Web3J :使用web3j调用自己的智能合约的方法(教程)

    代码世界有很多令人大呼小叫的技巧!有的代码像魔术师一样巧妙地隐藏了自己,有的像魔法师一样让你眼花缭乱,还有的像瑜伽大师一样灵活自如。它们让我们惊叹不已,让我们觉得自己仿佛置身于编码的魔幻世界。快来分享你见过哪些令你膛目结舌的代码技巧吧! web3j是

    2024年02月04日
    浏览(49)
  • 【web3j】java通过web3j监听并解析合约中的事件(event/emit)

    ① 查询链上数据用的rpc(本示例是binance的,测试网可以使用:https://data-seed-prebsc-2-s2.binance.org:8545) ② 自己还要有一个测试链上部署好的合约,合约中要有一个方法emit了事件。 ③ java依赖 一、 通过自己合约的abi和bin生成一个java文件,abi和bin可以在remix的compiler模块中获取,

    2024年02月09日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包