在跨平台应用开发中,Uni-App 结合 Web3.js 能够高效构建支持以太坊(ETH)和币安智能链(BSC)的去中心化应用(DApp)。本文重点介绍如何实现代币转账功能,包括环境配置、合约交互及核心代码实现。
环境准备与 Web3 配置
首先确保已安装 Node.js 和 npm 环境。通过以下命令安装 Web3.js 库:
npm install web3Web3.js 是与区块链网络交互的核心工具库,支持主流以太坊虚拟机(EVM)兼容链(如 ETH 和 BSC)。
钱包连接与地址获取
DApp 需先连接用户钱包(如 MetaMask)以获取账户地址。以下示例演示自动检测钱包并获取地址:
if (window.ethereum) {
window.ethereum.enable().then((res) => {
this.walletAddress = res[0]; // 获取用户钱包地址
});
} else {
alert("请安装 MetaMask 钱包");
}此代码段需在页面加载时执行,确保用户已授权 DApp 访问账户。
代币转账实现步骤
1. 初始化 Web3 与合约实例
使用 Web3 提供商和合约 ABI 初始化合约对象:
const web3 = new Web3(window.web3.currentProvider);
const contractAddr = "0x510B7E4966758615F5AA4fc497Ebb85684519173"; // 代币合约地址
const contract = new web3.eth.Contract(contractAbi, contractAddr);合约 ABI(应用程序二进制接口)定义了合约方法与数据结构,通用于大部分 ERC-20 标准代币。
2. 查询代币余额与精度
转账前需获取用户代币余额和代币精度:
contract.methods.balanceOf(fromAddress).call().then((balance) => {
console.log("当前代币余额", balance);
});
const decimals = await contract.methods.decimals().call();精度值用于计算代币数量,确保转账金额正确转换。
3. 执行代币转账
调用合约的 transfer 方法发送代币:
const amountInWei = web3.utils.toWei(count.toString(), 'ether');
contract.methods.transfer(toAddress, amountInWei).send({
from: fromAddress,
gas: 81000,
gasPrice: await web3.eth.getGasPrice()
}).then((result) => {
console.log("转账成功,交易哈希:", result.transactionHash);
}).catch((err) => {
console.error("转账失败", err);
});此处需注意:
toWei方法将代币数量转换为最小单位(如 Wei)- 设置合理的 Gas 限制和 Gas 价格以保障交易确认
原生币转账(ETH/BNB)
原生币转账无需合约交互,直接发送交易即可:
const amountInWei = web3.utils.toWei(amount.toString(), 'ether');
web3.eth.sendTransaction({
from: this.walletAddress,
to: toAddress,
value: amountInWei,
gas: 21000,
gasPrice: 5000000000
}).then((result) => {
console.log("转账哈希:", result);
});原生币转账的 Gas 限制通常为 21000,而 Gas 价格需根据网络实时状况调整。
常见问题
如何选择 ETH 或 BSC 网络?
用户可通过 MetaMask 切换网络。DApp 应自动适配当前网络提供商,无需修改代码逻辑。BSC 网络通常具有更低手续费和更快确认速度。
交易失败可能的原因有哪些?
- 账户余额不足(涵盖代币数量和 Gas 费用)
- Gas 限制设置过低导致交易超时
- 合约地址或 ABI 错误
- 用户拒绝了交易签名请求
如何查询交易状态?
通过交易哈希可查询区块链浏览器(如 Etherscan 或 BscScan)获取交易确认状态和详情。👉 查看实时交易工具
是否支持其他钱包?
除 MetaMask 外,可兼容任何支持 Web3 注入的钱包(如 Trust Wallet)。核心是检测 window.ethereum 或 window.web3 对象。
如何估算合理 Gas 价格?
可通过网络提供的 Gas 价格API或使用 web3.eth.getGasPrice() 获取实时建议价格。BSC 网络 Gas 价格通常低于 ETH 网络。
代币转账与原生币转账有何区别?
代币转账通过调用智能合约的 transfer 方法实现,而原生币转账直接发送价值到地址。前者需要合约交互且消耗更多 Gas。
总结
Uni-App 结合 Web3.js 为多链 DApp 开发提供了高效解决方案。重点在于正确处理钱包连接、合约初始化和交易发送。开发者应关注网络状态、Gas 优化和用户体验,确保转账功能稳定可靠。对于更复杂的应用场景,👉 探索更多高级策略 可进一步提升应用性能与功能丰富度。