You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用near-api-js无法在NEAR测试网账户间转账代币问题

NEAR测试网转账问题排查与解决

一、转账失败的常见原因及修复方案

1. 密钥权限匹配问题

虽然account.getAccessKeys()显示存在全权限密钥,但要确认当前调用sendMoney时使用的密钥是否为全权限密钥。BrowserLocalStorageKeyStore会存储多个密钥,若当前账户实例绑定的是功能权限密钥(比如仅允许调用特定合约),则无法执行转账操作。

  • 验证方法:在sendTokens中添加密钥校验逻辑,对比当前使用的公钥与全权限密钥:
    const currentPubKey = await account.connection.signer.getPublicKey(account_id, "testnet");
    const accessKeys = await account.getAccessKeys();
    const hasFullAccess = accessKeys.some(key => 
      key.public_key === currentPubKey.toString() && key.access_key.permission === "FullAccess"
    );
    if (!hasFullAccess) throw new Error("当前密钥无全权限,无法转账");
    

2. 金额格式与数值问题

你传入的"100000000"是yoctoNEAR单位,要确认数值是否符合预期:1 NEAR = 10^24 yoctoNEAR,若想转0.0000001 NEAR这个数值是对的,但如果是转1 NEAR则需要传入"1000000000000000000000000"。

  • 优化建议:使用near-api-js内置工具函数转换金额,避免手动计算出错:
    import { utils } from "near-api-js";
    // 转换0.0000001 NEAR为yoctoNEAR
    const amount = utils.format.parseNearAmount("0.0000001");
    

3. NextJS初始化时机问题

直接在组件顶层执行setNear(await NearConfig())可能导致near对象未完全初始化就调用sendTokens,引发异步逻辑错误。

  • 修复方案:在NextJS组件中用useEffect处理异步初始化:
    import { useEffect, useState } from 'react';
    import { connect, keyStores } from "near-api-js";
    
    export default function TransferComponent() {
      const [near, setNear] = useState(null);
    
      useEffect(() => {
        const initNear = async () => {
          const config = {
            networkId: "testnet",
            keyStore: new keyStores.BrowserLocalStorageKeyStore(),
            nodeUrl: "https://rpc.testnet.near.org",
            walletUrl: "https://wallet.testnet.near.org",
            helperUrl: "https://helper.testnet.near.org",
            explorerUrl: "https://explorer.testnet.near.org",
          };
          const nearInstance = await connect(config);
          setNear(nearInstance);
        };
        initNear();
      }, []);
    
      const sendTokens = async () => {
        if (!near) return;
        // 后续转账逻辑
      };
    
      return <button onClick={sendTokens} disabled={!near}>转账NEAR</button>;
    }
    

二、官方文档禁止直接调用sendMoney的原因

官方文档禁止前端直接调用这类全权限操作,核心是安全风险管控:

  • 前端代码运行在浏览器环境中,若直接使用全权限密钥执行转账,密钥可能被恶意脚本窃取,导致用户资产被盗。
  • NEAR官方推荐的安全流程是:前端发起交易请求,引导用户在NEAR Wallet界面确认操作,密钥始终存储在钱包中,不暴露给前端应用,从根源避免密钥泄露风险。

简单来说,直接在前端用密钥执行转账属于不安全的实践,因此文档会明确禁止这类操作,引导开发者遵循钱包授权的安全流程。

内容的提问来源于stack exchange,提问作者Sandeep Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:06:28