在vue中使用web3.js开发以太坊dapp_如何使用web3和vue.js创建你的第一个以太坊dapp-程序员宅基地

技术标签: 区块链  vue  web3  

前端如何使用以太坊智能合约方法

这里讲的是前端与MetaMask之间的交互

文中涉及到的官方文档
web3.js 1.0中文手册
MetaMask官方文档

web3.js文件
链接:https://pan.baidu.com/s/1_mPT-ZcQ9GU_U1CVhBKpLA
提取码:cbey

#### 一、唤起MetaMask钱包进行登录
创建web3.js文件
```javascript
//web3.js
// 智能合约地址
const contractAddress = '.....'
// 智能合约ABI
const contractABI=[]
var contract=null;
/**
 * 初始化
 * @param {Object} callback 返回账户地址
 */
function Init(callback){
	//判断用户是否安装MetaMask钱包插件
	if (typeof window.ethereum === "undefined") {
		//没安装MetaMask钱包进行弹框提示
		alert("Looks like you need a Dapp browser to get started.");
		alert("Consider installing MetaMask!");
	} else {
		//如果用户安装了MetaMask,你可以要求他们授权应用登录并获取其账号
		ethereum.enable()
		.catch(function (reason) {
			//如果用户拒绝了登录请求
			if (reason === "User rejected provider access") {
				// 用户拒绝登录后执行语句;
			} else {
				// 本不该执行到这里,但是真到这里了,说明发生了意外
				alert("There was an issue signing you in.");
			}
			}).then(function (accounts) {
				//如果用户同意了登录请求,你就可以拿到用户的账号
				var currentProvider = web3.currentProvider;
				var Web3 = web3js.getWeb3();
				web3 = new Web3();
				web3.setProvider(currentProvider);
				contract = new web3.eth.Contract(contractABI, contractAddress);
				// console.log('地址列表', accounts)
				//这里返回用户钱包地址
				callback(accounts[0]);
			});
	}
}
//导出相应的方法
export default {
	Init,
}

然后在需要用到的页面引入

import NCWeb3 from "@/web3";
NCWeb3.Init(addr=>{
    
	//得到相应的钱包地址
	console.log(addr)
})
二、调用智能合约里面的方法(分为两种,需要油费和不需要的)

不需要油费的比较简单,通过contract.methods.智能合约方法(所需的参数).call()直接调用

// 投资授权
function Approve(addr,value, callback) {
    
	contract.methods
		//智能合约方法(所需的参数)
		.approve(addr,value)
		.call()
		.then((res) => {
    
			console.log('投资授权成功', res)
			callback(res);
		})
		.catch((err) => {
    
			alert('投资授权失败,稍后再试:', err)
		});
}
//导出相应的方法
export default {
    
	Init,
	Approve,
}

需要油费比较麻烦一点,先调用web3.eth.estimateGas()方法估算交易的gas用量。再用web3.eth.getGasPrice()方法获取当前gas价格,最后使用ethereum.sendAsync方法发送以太币、调用智能合约:

// 投资
function join(account, addr,val, callback) {
    
	//要支付的ETH,十六进制
	let value = "0x0";
	//智能合约的参数也需要进行转换
	//web3.utils.padLeft左侧补0补齐到指定长度的字符串
	//参数数字转换
	val = web3.utils.toHex(val).substring(2);
	val = web3.utils.padLeft(val, 64);
	//参数地址转换
	addr=web3.utils.padLeft(addr, 64).substring(2)
	//智能合约方法,获取方式看下面
	let fun="0x095ea7b3"
	let data = fun + addr + val;
	sendTransfer(account, data, value, callback, errorCallBack);
}
/**
 * 发送交易
 * @param {Object} account 用户地址
 * @param {Object} data 数据
 * @param {Object} value 转账金额
 * @param {Object} callback 返回hash
 * @param {Object} errorCallBack 返回的错误
 */
function sendTransfer(account, data, value, callback, errorCallBack) {
    
	// estimateGas获取交易的 gas 用量
	const params = {
    
		from: account,
		to: contractAddress,
		data: data,
		value: value,
 	 };
	web3.eth.estimateGas(params, function (error1, gaslimit) {
    
		if (error1) {
    
			errorCallBack(error1);
		} else {
    
			// gasprice获取当前gas价格
			web3.eth.getGasPrice(function (error2, gasPrice) {
    
				if (error2) {
    
					errorCallBack(error2);
				} else {
    
					gaslimit -= -10000;
					let params = [
						{
    
							gasPrice: gasPrice,
							gasLimit: gaslimit,
							from: account,
							to: contractAddress,
							data: data,
							value: value,
						},
					];
					//ethereum.sendAsync方法发送以太币、调用智能合约:
					ethereum.sendAsync(
						{
    
							method: "eth_sendTransaction",
							params: params,
							from: account,
						},
						function (error, hash) {
    
							if (error) {
    
								// alert(error.message);
								errorCallBack(error.message);
							} else {
    
								callback(hash);
							}
						}
		           );
		           //监听MetaMask的事件
		           ethereum.on('accountsChanged', function (accounts) {
    
		             console.log(accounts[0])
		           })
				}
			});
		}
	});
}
//导出相应的方法
export default {
    
	Init,
	Approve,
	join,
}

获取智能合约方法十六进制方式
在这里插入图片描述
然后在需要用到的页面引入使用,但需要注意的一点是要等初始化完之后才能调用合约方法

import NCWeb3 from "@/web3";
NCWeb3.Init(addr=>{
    
	//得到相应的钱包地址
	console.log(addr)
	NCWeb3.Approve(addr,value, res=>{
    
		console.log('Approve方法返回的数据',res)
	})
	NCWeb3.join(account, addr,val, res=>{
    
		//由于join方法存在交易,所以这里会返回交易哈希值
		console.log('join方法返回的数据',res)
	})
})

需要邮费的方法存在交易,需要链上打包确认,可以通过web3.eth.getTransactionReceipt(‘交易哈希值’)方法进行监听该方法的执行情况。如果交易处于pending状态,则返回null,反之返回一个对象,status属性为true则成功,反之失败。

最后如果看完对你有用,请点击收藏关注,谢谢支持,有问题可以评论留言

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qingshui_zhuo/article/details/112978150

智能推荐

字符,字节和编码-程序员宅基地

文章浏览阅读39次。级别:中级摘要:本文介绍了字符与编码的发展过程,相关概念的正确理解。举例说明了一些实际应用中,编码的实现方法。然后,本文讲述了通常对字符与编码的几种误解,由于这些误解而导致乱码产生的原因,以及消除乱码的办法。本文的内容涵盖了“中文问题”,“乱码问题”。掌握编码问题的关键是正确地理解相关概念,编码所涉及的技术其实是很简单的。因此,阅读本文时需要慢读多想,多思考。引言“字符与编码”...

Linux 修改 ELF 解决 glibc 兼容性问题_glibc_private-程序员宅基地

文章浏览阅读1.1k次。Linux glibc 问题相信有不少 Linux 用户都碰到过运行第三方(非系统自带软件源)发布的程序时的 glibc 兼容性问题,这一般是由于当前 Linux 系统上的 GNU C 库(glibc)版本比较老导致的,例如我在 CentOS 6 64 位系统上运行某第三方闭源软件时会报:[root@centos6-dev ~]# ldd tester./tester: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by._glibc_private

wxWidgets:常用表达式_wxwidget 正则表达式 非数字字符-程序员宅基地

文章浏览阅读282次。wxWidgets:常用表达式wxWidgets:常用表达式不同风味的正则表达式转义Escapes元语法匹配限制和兼容性基本正则表达式正则表达式字符名称wxWidgets:常用表达式一个正则表达式描述字符的字符串。这是一种匹配某些字符串但不匹配其他字符串的模式。不同风味的正则表达式POSIX 定义的正则表达式 (RE) 有两种形式:扩展正则表达式(ERE) 和基本正则表达式(BRE)。ERE 大致是传统egrep 的那些,而 BRE 大致是传统ed 的那些。这个实现增加了第三种风格:高级正则表达式_wxwidget 正则表达式 非数字字符

Java中普通for循环和增强for循环的对比_for循环10万数据需要时间-程序员宅基地

文章浏览阅读3.4k次,点赞5次,收藏11次。Java中普通for循环和增强for循环的对比_for循环10万数据需要时间

学习PCB设计前的知识扫盲_pcb端子设计基础知识-程序员宅基地

文章浏览阅读2.7k次,点赞13次,收藏97次。0.工厂制作PCB线路板流程1.PCB的结构铜层阻焊丝印本质(PCB画电路板到底在画什么)基础工艺指标2.PCB图中的元素元素布局布线叠层设计3.PCB的设计依据原理图原理图元件库4.PCB的设计流程——总结_pcb端子设计基础知识

Python读取Excel内容;将读取的数据转换为list类型便于切片处理;列表的操作方法;pandas处理DataFrame类型数据;pandas操作;Python几种取整的方法_pandas excel list-程序员宅基地

文章浏览阅读4.5k次,点赞5次,收藏19次。Python读取Excel内容;将读取的数据转换为list类型便于切片处理;列表的操作方法;pandas处理DataFrame类型数据_pandas excel list

随便推点

java小易——Spring_spring的beanfactory是hashmap吗-程序员宅基地

文章浏览阅读109次。SpringIoC DI AOPspring底层用的是ConcurrentHashMap解耦合:工厂模式:需要一个模板控制反转 IoC将原来有动作发起者(Main)控制创建对象的行为改成由中间的工厂来创建对象的行为的过程叫做IoC一个类与工厂之间如果Ioc以后,这个时候,动作发起者(Main)已经不能明确的知道自己获得到的对象,是不是自己想要的对象了,因为这个对象的创建的权利与交给我这个对象的权利全部转移到了工厂上了所用包:DOM4j解析XML文件lazy-init = _spring的beanfactory是hashmap吗

温故而知新:部分常见的图像数学运算处理算法的用途_图像处理算啊-程序员宅基地

文章浏览阅读1.3k次,点赞29次,收藏24次。本文将图像处理中常用的数学运算算法及其对图像的作用做了个汇总介绍,有助于图像处理时针对对应场景快速选择合适的数学算法。_图像处理算啊

EM Agent Fatal agent error: State Manager failed at Startup_check agent status retcode=1-程序员宅基地

文章浏览阅读1.1k次。EM 不定期异常宕机,问题重复出现,之前几次因为忙于其它事,无力兼顾,等回头处理时,发现EM已恢复正常。这次问题又重现,准备彻底解决,过程如下:1. 重新启动EM失败,报错:/u01/oracle/agent/core/12.1.0.5.0/bin/emctl status agentOracle Enterprise Manager Cloud Control 12c Relea_check agent status retcode=1

JVM常用调优参数 ——JVM篇_jvm调优-程序员宅基地

文章浏览阅读1.9w次,点赞50次,收藏366次。JVM常用性能调优参数详解​ 在学习完整个JVM内容后,其实目标不仅是学习了解整个JVM的基础知识,而是为了进行JVM性能调优做准备,所以以下的内容就是来说说JVM性能调优的知识。一、性能调优​ 性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等等。​ 架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。性能调优基本上按照以下步骤进行:明确优化目标发现性能瓶颈性能调优通过监控及数据统计工具获得数据确认是否达到目标二、何时进_jvm调优

三级嵌入式准备(二)_八个gpio引脚最多构成几个按键-程序员宅基地

文章浏览阅读435次,点赞3次,收藏7次。转载来源为https://blog.csdn.net/ReCclay/article/details/79439686 1、嵌入式系统的CPU主要使用的有DSP、ARM以及FPGA。2、DSP适用于数字信号处理的微处理器支持单指令多数据(DIMD)并行处理的指令显著提高音频、视频等数字信号的数据处理效率3、片上系统SOC已成为嵌入式处理器芯片的主流发展趋势它是..._八个gpio引脚最多构成几个按键

OpenStack的容器服务体验-程序员宅基地

文章浏览阅读70次。magnum 是用于 OpenStack 的容器服务。它有以下特点:抽象的容器、节点、服务等集成了用于容器技术的Kubernetes和Docker集成了多租户安全的 Keystone继承了k8s多租户网络安全的 Neutron环境准备在VMware Workstations建台虚拟机,Ubuntu 14.04 LTS,..._openstack 安装好没有容器服务