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

这里讲的是前端与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则成功,反之失败。

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

在vue中使用web3.js开发以太坊dapp相关推荐

  1. 向别人网页注入js_区块链研究实验室 | Web3 .js基于以太坊的Javascript API

    web3.js是一个库集合,你可以使用HTTP或IPC连接本地或远程以太它节点进行交互. web3的JavaScript库能够与以太坊区块链交互. 它可以检索用户帐户,发送交易,与智能合约交互等. V ...

  2. 使用 Web3.js 连接以太坊节点并查询区块链数据

    Web3.js 是一个用于连接以太坊网络的 JavaScript 库.在本文中,我们将介绍如何使用 Web3.js 来连接以太坊节点,并且查询以太坊区块链上的数据. 1. 安装 Web3.js 首先, ...

  3. 使用ethers.js开发以太坊Web钱包 - 将私钥保存在客户端

    为什么需要 Keystore 文件 通过这篇文章理解开发HD 钱包涉及的 BIP32.BIP44.BIP39,私钥其实就代表了一个账号,最简单的保管账号的方式就是直接把私钥保存起来,如果私钥文件被人盗 ...

  4. web3.js链接以太坊并查询钱包u余额

    web3.js链接以太坊并查询钱包USDT余额 环境: 一.链接以太坊主网: 二.创建一个ABI 那么该如何获取ABI? 三.查询代码 四.输出结果 五.整体代码 环境: web3.js版本:6.14 ...

  5. 如何用web3.js在以太坊区块链上保存数据?

    2019独角兽企业重金招聘Python工程师标准>>> 虽然有北大博士讲,95%的区块链项目都没有前途,但我们知道区块链还是有它的优势,比如数据的不可篡改性对于版权保护有相当大的意义 ...

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

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

  7. 不同步节点在线使用Remix开发以太坊Dapp及solidity学习入门 ( 一 ):智能合约HelloWorld

    有问题可以点击–>加群互相学习 本人本来想自己写公链,结果发现任重道远: 遂,开始写Dapp,顺便写的时候搞个教程吧... 通过系列教程学习将会: 1.基本使用solidity 语言开发智能合约 ...

  8. 使用web3和infura开发以太坊ethereum区块链

    web3 Github: https://github.com/ethereum/web3.js/ web3.js是以太坊提供的一个Javascript库,它封装了以太坊的RPC通信API,提供了一系 ...

  9. solidity开发以太坊代币智能合约

    智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...

最新文章

  1. MinkowskiEngine Miscellaneous Classes杂类
  2. windows linux rac,跨平台表空间传输(windows到linux RAC)
  3. 行走在区块链上的智能合约
  4. 前端也要学系列:设计模式之装饰者模式
  5. 推荐算法矩阵分解实战——keras算法练习
  6. 遇到了消息堆积,但是问题不大
  7. 2场直播丨Oracle数据库SQL执行计划的取得和解析、一次特殊的 Oralce 硬解析性能问题的技术分享...
  8. 使用dime传输大附件的设置(WSE Soap toolkit)
  9. 个人财务管理系统mysql_开发个人财务管理系统(一)建数据库
  10. python之父去面试-Django面试题
  11. perf_event 事件类型与分类
  12. 腾讯云Ubuntu服务器挂载阿里云盘
  13. socket编程c++
  14. MemCache详解
  15. 计算机操作系统底层相关知识
  16. 孢子社群:今日推荐ARVR微信群:游乐VR智能
  17. 2022年SCI期刊最新影响因子正式发布
  18. ORACLE SQL Tuning Advisor
  19. 机器学习、数据分析类面经分享(美的_秋招_校招_20170924)
  20. 会放弃的人生才会更洒脱

热门文章

  1. 微前端在得物客服域的实践/那么多微前端框架,为啥我们选Qiankun + MF
  2. 加权平均资本成本【读书笔记】
  3. linux arm 无法执行二进制文件,qemu-arm无法运行arm编译的二进制文件
  4. 音乐与计算机的论文题目,音乐类毕业论文选题参考
  5. cache和register的区别
  6. notebook jupyter, can not assign ip adress
  7. c 语言中虚方法有什么作用是什么,虚函数的作用?
  8. 世界各国国家名和英文名-mysql数据库设计
  9. android请求https(一)生成BKS
  10. 有效的括号长按键入验证外星语词典字符的最短距离用栈实现队列