import Web3 from 'web3' import CryptoJS from 'crypto-js' export function useWalletAuth() { // 登录状态 const authState = reactive({ isAuthenticated: false, // 登录状态 account: null, // 账户 privateKey: null, // 私钥 encryptedKey: null, // 加密后的密钥 loading: false, // 加载状态 error: null, // 错误信息 chainId: null, // 链ID balance: '0', // 账户余额(ETH) rpcUrl: 'https://api.angeltokens.io' // 您的私有链RPC }) // Web3实例 const web3 = ref(null) // 初始化Web3 const initWeb3 = () => { try { web3.value = new Web3(authState.rpcUrl) return web3.value } catch (err) { authState.error = '初始化区块链连接失败' return null } } // 获取账户余额 const getBalance = async () => { if (!authState.account || !web3.value) return '0' try { const weiBalance = await web3.value.eth.getBalance(authState.account) const ethBalance = web3.value.utils.fromWei(weiBalance, 'ether') authState.balance = ethBalance return ethBalance } catch (err) { authState.error = '获取余额失败: ' + err.message return '0' } } // 通过私钥登录 const loginWithPrivateKey = async (privateKey, password = '') => { authState.loading = true authState.error = null try { const web3Instance = initWeb3() if (!web3Instance) throw new Error('区块链连接失败') // 验证私钥格式 if (!/^0x[0-9a-fA-F]{64}$/.test(privateKey)) { throw new Error('私钥格式不正确') } // 加密存储私钥(如果提供了密码) if (password) { authState.encryptedKey = CryptoJS.AES.encrypt( privateKey, password ).toString() } // 从私钥获取账户 const account = web3Instance.eth.accounts.privateKeyToAccount(privateKey) // 验证账户有效性 const code = await web3Instance.eth.getCode(account.address) if (code !== '0x') { throw new Error('该地址是合约地址,不支持登录') } // 更新状态 authState.account = account.address authState.privateKey = privateKey authState.isAuthenticated = true authState.chainId = await web3Instance.eth.getChainId() // 登录后自动获取余额 await getBalance() return { address: account.address, chainId: authState.chainId, balance: authState.balance } } catch (err) { authState.error = err.message || '登录失败' throw err } finally { authState.loading = false } } // 通过加密存储登录(需密码) const loginWithStorage = async (password) => { if (!authState.encryptedKey) { throw new Error('没有可用的加密钱包数据') } try { // 解密私钥 const bytes = CryptoJS.AES.decrypt(authState.encryptedKey, password) const privateKey = bytes.toString(CryptoJS.enc.Utf8) if (!privateKey) throw new Error('密码错误或数据损坏') return await loginWithPrivateKey(privateKey) } catch (err) { authState.error = err.message || '解密失败' throw err } } // 登出 const logout = () => { authState.isAuthenticated = false authState.account = null authState.privateKey = null authState.chainId = null authState.balance = '0' web3.value = null } // 检查本地是否有加密钱包数据 const hasStoredWallet = () => { return !!authState.encryptedKey } return { authState, web3, loginWithPrivateKey, loginWithStorage, logout, hasStoredWallet, getBalance } }