在vue中使用波场tronWeb调用智能合约开发DAPP

4,766 阅读3分钟

这篇主要讲前端与波场智能合约交互

开发前的准备工作

开发中需要用的的资料及开发文档可查看下方的链接

开发中主要用到的文档:官方文档api函数

用于查询交易状态:波场浏览器

编译合约网址:TRON-IDE

安装波宝钱包

前往官网,下载波宝:www.tronlink.org 波宝是在谷歌商店下载的,所以需要电脑翻墙或者安装谷歌助手插件 在这里插入图片描述 下载完成后,进入波宝钱包。点击创建钱包,设置钱包名称及钱包密码 注意:波宝为去中心化钱包,密码请务必牢记。密码忘记,官方将无法帮助用户找回。 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 钱包弄好之后就可以进行开发了

一,获取钱包地址

可通过window.tronWeb.defaultAddress.base58获取到钱包地址,不过要注意的一点是初始化的时候defaultAddress对象为空,所以需要过一会获取加个定时器获取地址

this.Inval = setInterval(() => {
     this.defaultAddress = window.tronWeb.defaultAddress.base58?window.tronWeb.defaultAddress.base58 : ''
     //当获取到地址的时候就关掉定时器
     if(this.defaultAddress){
     	window.clearInterval(this.Inval);
     }
  }, 1000);

二,部署智能合约吗,初始化

创建web3.js文件

const contractAddress = '.....'//智能合约地址
const contractABI = []//智能合约abi
var contract = null;
function init(callback) {
	contract = window.tronWeb.contract(contractABI, contractAddress);
	return callback(contract)
}
//导出相对应的方法
export default {
	init,
};

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

import NCWeb3 from "@/web3";
NCWeb3.init(res => {
	conlose.log(res)
});

三,调用智能合约方法

智能合约方法有两种,一种用来获取数据;另一种需要调起钱包签名窗口,存在交易

先来看简单的,获取数据 contract.methods.合约方法(参数).call()

// 获取基本信息
function getPlayerBaseInfo(playId, callback) {
	contract.methods.get_player_base_info(playId)
		.call()
		.then((res) => {
			//返回数据
			callback(res);
		})
		.catch((err) => {
			// alert('用户是否出局状态信息,稍后再试:', err)
		});
}
//导出相对应的方法
export default {
	init,
	getPlayerBaseInfo,
};

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

import NCWeb3 from "@/web3";
NCWeb3.init(res => {
	NCWeb3.getPlayerBaseInfo(playId,res=>{
		console.log('获取基本信息',res);
	})
});

另外一种就相对麻烦一点

// 玩家激活参与支付750 USDT
async function join(Ref_address, callback, errorCallBack) {
	const tronWeb = window.tronWeb;
	//查询智能合约是否存在
	let instance = await tronWeb.contract().at(contractAddress);
	//instance["合约方法"](‘参数’)
	let res = await instance["join"](Ref_address);
	//使用send来执行智能合约方法,消耗资源并且还广播到网络。
	//feeLimit	调用合约方法消耗最大数量的SUN。上限是 1000 TRX。(1TRX = 1,000,000SUN)	Integer
    //callValue	本次调用往合约转账的SUN。	Integer
    //shouldPollResponse 如果设置为 TRUE,则会等到在 Solidity 节点上确认事务之后再返回结果。 Boolean
    //tokenId	本次调用往合约中转账TRC10的tokenId。如果没有,不需要设置	String
    //tokenValue	本次调用往合约中转账TRC10的数量,如果不设置tokenId,这项不设置。	Integer
	res.send({
		feeLimit: 100000000,
		callValue: 0,
		shouldPollResponse: true
	}).then( 
		res => { callback(res) },
		err => { errorCallBack(err) }
	);
}
//导出相对应的方法
export default {
	init,
	join,
};

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

import NCWeb3 from "@/web3";
NCWeb3.init(res => {
	NCWeb3.join(Ref_address,res=>{
		if(res.status){
			console.log('交易成功',res);},
		}else{
			console.log('交易失败',res);},
		}
	},err=>{console.log('交易失败',err);})
});

如果将shouldPollResponse的值设为false,可以通过tronWeb.trx.getTransaction(‘交易id’)方法来判断交易是否存在,若存在再调用tronWeb.trx.getConfirmedTransaction(‘交易id’)方法获取交易状态。若返回res.ret[0].contractRet === "SUCCESS"。则成功,反之失败。

window.tronWeb.trx.getConfirmedTransaction('交易id').then(res => {
	if (res.ret[0].contractRet === "SUCCESS") {
		let Inva2 = setInterval(() => {
		    window.tronWeb.trx.getConfirmedTransaction('交易id').then(res => {
		        window.clearInterval(Inval2);
		            if (res.ret[0].contractRet === "SUCCESS") {
		              this.$toast('交易成功');
		            } else {
		                this.$toast('交易失败');
		            }
		       }).catch(err => {});
		}, 1000);
	}
})

最后附上波场合约部署

1.导入合约文件 在这里插入图片描述 配置文件信息 在这里插入图片描述 编译合约文件,生成对应的方法进行测试 在这里插入图片描述 生成相对应的方法,点击展开后就可以测试合约方法 在这里插入图片描述

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