使用 javascript 异步函数通过 json-rpc 请求获取 Phantom 钱包余额的问题?

Posted

技术标签:

【中文标题】使用 javascript 异步函数通过 json-rpc 请求获取 Phantom 钱包余额的问题?【英文标题】:Problem getting the balance of Phantom wallet with json-rpc request using javascript async function? 【发布时间】:2021-10-19 23:05:27 【问题描述】:

我与 Phantom 钱包建立了连接。

我希望 phantom_balance() 返回余额或包含余额的数据。

json-rpc 格式是否有错误?

我在catch() 上遇到以下JsonRpcEngine 故障。

Phantom - RPC Error: JsonRpcEngine: Response has no error or result for request:

  "jsonrpc": "2.0",
  "id": 1161935556,
  "method": "getBalance",
  "params": [
    "iQKBP3tSX6g3j6pS6g3LuzhoqTQKBP3tSX6g33tSX6g3j6pS6g"
  ]

这里是js

// get wallet provider, phantom
const get_provider = () => 
  if ("solana" in window) 
    const provider = window.solana;
    if (provider.isPhantom) 
      return provider;
    
  
  window.open("https://phantom.app/", "_blank");
;

// async get wallet balance
async function phantom_balance() 
  // alt window.solana
  const phantom = get_provider();
  console.log("Still Connected: " + phantom.isConnected);
  if (phantom.isConnected !== false) 
    const wallet_address = phantom.publicKey.toString();
    console.log("Getting Balance For: " + wallet_address);
 
    // json-rpc request (ERROR!)
      const balance = await phantom.request(
        method: "getBalance",
        params: [wallet_address]
        )
        .then(function(data) 
          console.log(data);
        ).catch(function(e) 
          console.log(e);
        );
    
  

我也尝试了以下方法并收到错误消息,提示 phantom.getBalance() 不是函数。

    const balance = await phantom.getBalance(wallet_address)
      .then(function(data) 
        console.log(data);
      ).catch(function(e) 
        console.log(e);
      );

我目前没有在文档头部包含任何<script>。根据 Phantom 文档,他们将window.solana 注入到文档中(这也暴露了 RPC 接口)。也许我仍然需要 web3 才能访问 window.solana.getBalance(wallet_address) 和/或 RPC 方法 window.solana.request(method: "getBalance") ??

【问题讨论】:

您是否尝试读取给定公钥的 SOL 令牌?如果是这样,您可以使用connection.getBalance() 阅读它。文档here 我已更新问题以包含您的建议。 【参考方案1】:

这是我的工作示例。

    确保您已安装 Phantom 钱包扩展。 phantom.app

    在文档头部包含 solana-web3。

<script src="https://unpkg.com/@solana/web3.js@latest/lib/index.iife.min.js"></script>
    确保您的 js 脚本已定义 type="module"
<script type="module" src="/path/to/your/main.js"></script>
    这在您的主 js 文件中运行。
// get wallet provider, phantom
const get_provider = () => 
  if ("solana" in window) 
    const provider = window.solana;
    if (provider.isPhantom) 
      return provider;
    
  
  window.open("https://phantom.app/", "_blank");
;

// get balance from connected Phantom wallet
async function phantom_balance() 
  // alt window.solana
  const phantom = get_provider();
  console.log("Wallet Connected: " + phantom.isConnected);
  if (phantom.isConnected !== false) 

    const wallet = phantom.publicKey;
    const wallet_b58 = phantom.publicKey.toString();

    // connect to the cluster
    console.log("Connecting Cluster");
    var connection = new solanaWeb3.Connection(
      solanaWeb3.clusterApiUrl('devnet'),
      'confirmed',
    );

    // remember, do not use base 58 encoded key with getBalance();
    console.log("Getting Balance: " + wallet_b58);
    let _balance = await connection.getBalance(wallet)
      .then(function(data) 
        console.log("Wallet Balance: " + data);
        return data;
      )
      .catch(function(error) 
        console.log(error);
        return error;
      );

  

    用法
var balance = phantom_balance();

返回 Lampport 整数

992953240

【讨论】:

以上是关于使用 javascript 异步函数通过 json-rpc 请求获取 Phantom 钱包余额的问题?的主要内容,如果未能解决你的问题,请参考以下文章

关于JSON

通过 Javascript 异步加载谷歌地图的问题

JSON详解

JavaScript之全局函数详解

springmvc通过ajax异步请求返回json格式数据

JSON