TronLink钱包HTML5实现教程
TronLink钱包HTML5实现教程
本文将详细介绍如何使用HTML5、JSON、CSS和JavaScript创建一个简单的TronLink钱包界面。这个实现将展示如何连接TronLink钱包、查询余额和发送交易等基本功能。
什么是TronLink钱包?
TronLink是波场(TRON)区块链上最受欢迎的钱包扩展之一,类似于以太坊的MetaMask。它允许用户在浏览器中与TRONdApps交互,管理TRX和TRC代币。
项目结构
/tronlink-wallet
├──index.html主HTML文件
├──style.css样式表
├──app.js主JavaScript文件
└──config.json配置数据
1.HTML5结构(index.html)
<!DOCTYPEhtml>
<htmllang="zh-CN">
<head>
<metacharset="UTF-8">
<metaname="viewport"content="width=device-width,initial-scale=1.0">
<metaname="description"content="TronLink钱包HTML5实现-一个简单的TRON区块链钱包界面">
<metaname="keywords"content="TronLink,TRON,区块链,钱包,TRX,HTML5">
<title>TronLink钱包HTML5实现</title>
<linkrel="stylesheet"href="style.css">
<linkrel="stylesheet"href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css">
</head>
<body>
<header>
<h1>TronLink钱包模拟器</h1>
<p>一个使用HTML5实现的TRON钱包界面</p>
</header>
<main>
<sectionid="wallet-status"class="card">
<h2><iclass="fasfa-wallet"></i>钱包状态</h2>
<divid="connection-status"class="status-disconnected">
<spanid="status-text">未连接</span>
</div>
<buttonid="connect-btn"class="btn-primary">连接TronLink</button>
</section>
<sectionid="wallet-info"class="card"style="display:none;">
<h2><iclass="fasfa-info-circle"></i>钱包信息</h2>
<divclass="info-row">
<spanclass="info-label">地址:</span>
<spanid="wallet-address"class="info-value"></span>
<buttonid="copy-address"class="btn-icon"title="复制地址">
<iclass="farfa-copy"></i>
</button>
</div>
<divclass="info-row">
<spanclass="info-label">余额:</span>
<spanid="wallet-balance"class="info-value">0TRX</span>
</div>
<divclass="info-row">
<spanclass="info-label">网络:</span>
<spanid="wallet-network"class="info-value"></span>
</div>
</section>
<sectionid="send-transaction"class="card"style="display:none;">
<h2><iclass="fasfa-paper-plane"></i>发送TRX</h2>
<formid="send-form">
<divclass="form-group">
<labelfor="recipient">接收地址:</label>
<inputtype="text"id="recipient"placeholder="T..."required>
</div>
<divclass="form-group">
<labelfor="amount">金额(TRX):</label>
<inputtype="number"id="amount"min="0"step="0.000001"required>
</div>
<divclass="form-group">
<labelfor="memo">备注(可选):</label>
<inputtype="text"id="memo"maxlength="64">
</div>
<buttontype="submit"class="btn-primary">发送交易</button>
</form>
<divid="transaction-result"style="display:none;"></div>
</section>
<sectionid="transaction-history"class="card"style="display:none;">
<h2><iclass="fasfa-history"></i>交易记录</h2>
<divid="transactions-container">
<p>加载中...</p>
</div>
</section>
</main>
<footer>
<p>©2023TronLink钱包HTML5实现|仅供学习使用</p>
</footer>
<scriptsrc="app.js"></script>
</body>
</html>
2.CSS样式(style.css)
/基础样式/
:root{
--primary-color:2e86de;
--secondary-color:54a0ff;
--success-color:26de81;
--danger-color:fc5c65;
--warning-color:fed330;
--dark-color:2f3640;
--light-color:f5f6fa;
--gray-color:dcdde1;
}
{
margin:0;
padding:0;
box-sizing:border-box;
font-family:'SegoeUI',Tahoma,Geneva,Verdana,sans-serif;
}
body{
background-color:var(--light-color);
color:var(--dark-color);
line-height:1.6;
}
header{
background-color:var(--primary-color);
color:white;
padding:2rem;
text-align:center;
margin-bottom:2rem;
}
headerh1{
margin-bottom:0.5rem;
}
main{
max-width:800px;
margin:0auto;
padding:01rem;
}
footer{
text-align:center;
padding:2rem;
margin-top:2rem;
color:var(--dark-color);
border-top:1pxsolidvar(--gray-color);
}
/卡片样式/
.card{
background-color:white;
border-radius:8px;
box-shadow:04px6pxrgba(0,0,0,0.1);
padding:1.5rem;
margin-bottom:1.5rem;
}
.cardh2{
margin-bottom:1rem;
color:var(--primary-color);
display:flex;
align-items:center;
gap:0.5rem;
}
/按钮样式/
.btn{
padding:0.5rem1rem;
border:none;
border-radius:4px;
cursor:pointer;
font-weight:600;
transition:all0.3sease;
}
.btn-primary{
background-color:var(--primary-color);
color:white;
}
.btn-primary:hover{
background-color:var(--secondary-color);
}
.btn-icon{
background:none;
border:none;
cursor:pointer;
color:var(--primary-color);
font-size:1rem;
padding:0.25rem;
}
/状态显示/
.status-disconnected,.status-connected{
padding:0.5rem;
border-radius:4px;
margin-bottom:1rem;
font-weight:600;
}
.status-disconnected{
background-color:var(--danger-color);
color:white;
}
.status-connected{
background-color:var(--success-color);
color:white;
}
/信息行样式/
.info-row{
display:flex;
align-items:center;
margin-bottom:0.75rem;
gap:0.5rem;
}
.info-label{
font-weight:600;
min-width:80px;
}
.info-value{
flex-grow:1;
word-break:break-all;
}
/表单样式/
.form-group{
margin-bottom:1rem;
}
.form-grouplabel{
display:block;
margin-bottom:0.25rem;
font-weight:600;
}
.form-groupinput{
width:100%;
padding:0.5rem;
border:1pxsolidvar(--gray-color);
border-radius:4px;
}
/交易历史/
transactions-container{
max-height:300px;
overflow-y:auto;
}
.transaction-item{
padding:0.75rem;
border-bottom:1pxsolidvar(--gray-color);
}
.transaction-item:last-child{
border-bottom:none;
}
.transaction-success{
color:var(--success-color);
}
.transaction-failed{
color:var(--danger-color);
}
/响应式设计/
@media(max-width:600px){
header{
padding:1rem;
}
.info-row{
flex-direction:column;
align-items:flex-start;
}
}
3.JavaScript逻辑(app.js)
//配置数据通常来自外部JSON文件
constconfig={
networks:{
mainnet:{
name:"TRON主网",
fullNode:"https://api.trongrid.io",
solidityNode:"https://api.trongrid.io",
eventServer:"https://api.trongrid.io"
},
shasta:{
name:"Shasta测试网",
fullNode:"https://api.shasta.trongrid.io",
solidityNode:"https://api.shasta.trongrid.io",
eventServer:"https://api.shasta.trongrid.io"
},
nile:{
name:"Nile测试网",
fullNode:"https://nile.trongrid.io",
solidityNode:"https://nile.trongrid.io",
eventServer:"https://nile.trongrid.io"
}
},
defaultNetwork:"mainnet"
};
//DOM元素
constconnectBtn=document.getElementById('connect-btn');
conststatusText=document.getElementById('status-text');
constconnectionStatus=document.getElementById('connection-status');
constwalletInfoSection=document.getElementById('wallet-info');
constwalletAddress=document.getElementById('wallet-address');
constwalletBalance=document.getElementById('wallet-balance');
constwalletNetwork=document.getElementById('wallet-network');
constsendForm=document.getElementById('send-form');
consttransactionResult=document.getElementById('transaction-result');
consttransactionsContainer=document.getElementById('transactions-container');
consttransactionHistorySection=document.getElementById('transaction-history');
constsendTransactionSection=document.getElementById('send-transaction');
constcopyAddressBtn=document.getElementById('copy-address');
//模拟钱包状态
letwalletState={
connected:false,
address:null,
balance:0,
network:null,
transactions:[]
};
//初始化
document.addEventListener('DOMContentLoaded',()=>{
//检查是否安装了TronLink
checkTronLink();
//设置事件监听器
connectBtn.addEventListener('click',handleConnect);
sendForm.addEventListener('submit',handleSendTransaction);
copyAddressBtn.addEventListener('click',copyAddressToClipboard);
});
//检查TronLink是否可用
functioncheckTronLink(){
if(window.tronWeb){
updateStatus('TronLink已检测到',true);
connectBtn.textContent='连接钱包';
}else{
updateStatus('未检测到TronLink',false);
connectBtn.textContent='安装TronLink';
connectBtn.onclick=()=>{
window.open('https://www.tronlink.org/','_blank');
};
}
}
//更新连接状态UI
functionupdateStatus(message,isConnected){
statusText.textContent=message;
if(isConnected){
connectionStatus.classList.remove('status-disconnected');
connectionStatus.classList.add('status-connected');
}else{
connectionStatus.classList.remove('status-connected');
connectionStatus.classList.add('status-disconnected');
}
}
//处理连接钱包
asyncfunctionhandleConnect(e){
e.preventDefault();
if(!window.tronWeb){
alert('请先安装TronLink扩展');
return;
}
try{
//请求账户访问权限
constaccounts=awaitwindow.tronWeb.request({method:'tron_requestAccounts'});
if(accounts&&accounts.length>0){
walletState.connected=true;
walletState.address=accounts[0];
//设置网络
constnetwork=window.tronWeb.fullNode.host.includes('shasta')?'shasta':
window.tronWeb.fullNode.host.includes('nile')?'nile':'mainnet';
walletState.network=network;
//更新UI
updateStatus('已连接到TronLink',true);
connectBtn.style.display='none';
walletInfoSection.style.display='block';
sendTransactionSection.style.display='block';
transactionHistorySection.style.display='block';
walletAddress.textContent=walletState.address;
walletNetwork.textContent=config.networks[network].name;
//获取余额和交易记录
awaitupdateWalletInfo();
}
}catch(error){
console.error('连接TronLink失败:',error);
updateStatus('连接失败',false);
}
}
//更新钱包信息
asyncfunctionupdateWalletInfo(){
if(!walletState.connected)return;
try{
//获取余额
constbalance=awaitwindow.tronWeb.trx.getBalance(walletState.address);
consttrxBalance=window.tronWeb.fromSun(balance);
walletState.balance=trxBalance;
walletBalance.textContent=`${trxBalance}TRX`;
//获取交易记录
awaitfetchTransactionHistory();
}catch(error){
console.error('获取钱包信息失败:',error);
}
}
//获取交易记录
asyncfunctionfetchTransactionHistory(){
try{
consttransactions=awaitwindow.tronWeb.trx.getTransactionsRelated(
walletState.address,
'to',
'only_confirmed',
0,
10
);
walletState.transactions=transactions.data||[];
renderTransactions();
}catch(error){
console.error('获取交易记录失败:',error);
transactionsContainer.innerHTML='<p>无法加载交易记录</p>';
}
}
//渲染交易记录
functionrenderTransactions(){
if(walletState.transactions.length===0){
transactionsContainer.innerHTML='<p>没有交易记录</p>';
return;
}
lethtml='';
walletState.transactions.forEach(tx=>{
constdate=newDate(tx.raw_data.timestamp);
constamount=window.tronWeb.fromSun(tx.raw_data.contract[0].parameter.value.amount);
constisOutgoing=tx.raw_data.contract[0].parameter.value.owner_address===walletState.address;
html+=`
<divclass="transaction-item">
<p><strong>${date.toLocaleString()}</strong></p>
<p>${isOutgoing?'发送到':'接收到'}${isOutgoing?
tx.raw_data.contract[0].parameter.value.to_address:
tx.raw_data.contract[0].parameter.value.owner_address}</p>
<pclass="transaction-${isOutgoing?'failed':'success'}">${isOutgoing?'-':'+'}${amount}TRX</p>
</div>
`;
});
transactionsContainer.innerHTML=html;
}
//处理发送交易
asyncfunctionhandleSendTransaction(e){
e.preventDefault();
if(!walletState.connected){
alert('请先连接钱包');
return;
}
constrecipient=document.getElementById('recipient').value;
constamount=document.getElementById('amount').value;
constmemo=document.getElementById('memo').value;
if(!window.tronWeb.isAddress(recipient)){
alert('请输入有效的TRON地址');
return;
}
if(parseFloat(amount)<=0){
alert('请输入有效的金额');
return;
}
if(parseFloat(amount)>walletState.balance){
alert('余额不足');
return;
}
try{
constsunAmount=window.tronWeb.toSun(amount);
consttransaction=awaitwindow.tronWeb.transactionBuilder.sendTrx(
recipient,
sunAmount,
walletState.address,
memo||undefined
);
constsignedTx=awaitwindow.tronWeb.trx.sign(transaction);
constresult=awaitwindow.tronWeb.trx.sendRawTransaction(signedTx);
transactionResult.style.display='block';
transactionResult.innerHTML=`
<divclass="alertalert-success">
<p>交易发送成功!</p>
<p>交易ID:${result.txid}</p>
</div>
`;
//重置表单
sendForm.reset();
//更新余额和交易记录
setTimeout(updateWalletInfo,5000);//等待5秒让交易确认
}catch(error){
console.error('发送交易失败:',error);
transactionResult.style.display='block';
transactionResult.innerHTML=`
<divclass="alertalert-danger">
<p>交易发送失败:${error.message}</p>
</div>
`;
}
}
//复制地址到剪贴板
functioncopyAddressToClipboard(){
if(!walletState.address)return;
navigator.clipboard.writeText(walletState.address)
.then(()=>{
constoriginalText=copyAddressBtn.innerHTML;
copyAddressBtn.innerHTML='<iclass="fasfa-check"></i>';
setTimeout(()=>{
copyAddressBtn.innerHTML=originalText;
},2000);
})
.catch(err=>{
console.error('复制失败:',err);
});
}
4.配置数据(config.json)
{
"networks":{
"mainnet":{
"name":"TRON主网",
"fullNode":"https://api.trongrid.io",
"solidityNode":"https://api.trongrid.io",
"eventServer":"https://api.trongrid.io"
},
"shasta":{
"name":"Shasta测试网",
"fullNode":"https://api.shasta.trongrid.io",
"solidityNode":"https://api.shasta.trongrid.io",
"eventServer":"https://api.shasta.trongrid.io"
},
"nile
转载请注明出处: TronLink官网下载-TRON-TRX-波场-波比-波币-波宝|官网-钱包-苹果APP|安卓-APP-下载
本文的链接地址: https://tianjinfa.org/post/3240
扫描二维码,在手机上阅读
文章作者:
文章标题:TronLink钱包HTML5实现教程
文章链接:https://tianjinfa.org/post/3240
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明来自 !
文章标题:TronLink钱包HTML5实现教程
文章链接:https://tianjinfa.org/post/3240
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明来自 !
打赏
如果觉得文章对您有用,请随意打赏。
您的支持是我们继续创作的动力!
微信扫一扫
支付宝扫一扫
您可能对以下文章感兴趣
-
使用Go语言构建TronLink兼容钱包:完整指南与源码实现
5小时前
-
TRONLink钱包集成指南:使用JavaScript连接TRON区块链
5小时前
-
TronLink钱包集成开发指南:PHP+CSS+JS+HTML5实现
14小时前
-
原创TRONLink风格钱包实现(不使用MySQL)
5小时前
-
TronLink钱包HTML5实现教程
13小时前
-
TronLink钱包集成开发指南-原创PHP实现
14小时前
-
TronLink钱包HTML5实现教程-原创代码与SEO优化指南
14小时前
-
TronLink钱包集成开发指南
6小时前
-
使用JavaScript开发TRONLink钱包集成指南
14小时前
-
TronLink钱包集成开发指南:PHP+CSS+JS+HTML5实现
15小时前