Solana主网使用自定义的RPC进行转账

1、引言

如果用 browser 连接主网的 RPC server 会收到 error code 403 message 為 Access forbidden, contact your app developer or [email protected]. 错误,因为主网的 RPC server 会检查 HTTP Header 如果判断出來是 browser 就会报告 403 錯誤。

要解決这个问题就是换一个 RPC server ,可以注册免费的 RPC server 。

2、免费RPC Server

Solana RPC Server 是让开发者存取区块链数据的 Server , Solana 主网有提供一个(Solana Cluster RPC Endpoints (opens new window)),但是为了避免滥用,有设定一些网路存取的限制,存取太快会产生 HTTP 429 的错误。

所以要开发 Solana 应用程式最好还是有个自己的 RPC Server ,不过要建立自己的 RPC Server 代价相当高,根据 How to run a Solana RPC node (opens new window)这篇文章, CPU 要 32 core ,记忆体要 250 GB ,这样的硬体规格租下来可是相当花钱。

于是就有一些公司提供 RPC Server 服务,然后只要注册就可以使用到一些免费额度,这些免费额度对于开发 Solana 应用程式就相当够用了,以下几个是博主试过有免费额度又稳定的 Solana RPC server

Chainstack

一个月免费额度 300 万个 request

QuickNode

一个月免费额度 1000 万个 request

3、sol转账代码

复制代码
import { useWallet } from 'solana-wallets-vue'
import {Connection, clusterApiUrl, Keypair, SystemProgram, Transaction, PublicKey} from '@solana/web3.js';

const { publicKey, connected, sendTransaction } = useWallet();

const onClick = async () => {
        if (!publicKey) {
            console.log('error', `Send Transaction: Wallet not connected!`);
            return;
        }

        let signature = '';
        try {
            // send 1 lamport to random account
            // https://solanacookbook.com/references/basic-transactions.html#how-to-send-sol

            const account = Keypair.generate();
            const transaction = new Transaction().add(
                SystemProgram.transfer({
                    fromPubkey: publicKey.value,
                    toPubkey: new PublicKey("接收地址"),
                    lamports: 1_000_000,
                })
            );

            //const connection = new Connection(clusterApiUrl('devnet'));
            const connection = new Connection(
                "https://solana-mainnet.core.chainstack.com/xxx", //替换rpc链接
                {
                  wsEndpoint:'wss://solana-mainnet.core.chainstack.com/ws/xxx' //替换rpc链接
                }
            );
            signature = await sendTransaction(transaction, connection);
            await connection.confirmTransaction(signature, 'confirmed');
            console.log("successs")
        } catch (error) {
            console.log('error', `Transaction failed! ${error?.message}`, signature);
            return;
        }
    }

4、转账结果查询

相关推荐
JhonKI3 天前
【从零实现Json-Rpc框架】- 项目实现 - Dispatcher模块实现篇
qt·rpc·json
蜗牛沐雨3 天前
深入解析 JSON-RPC:从基础到高级应用
rpc·json
island13144 天前
【#2】介绍第三方库
c++·rpc·json
蜗牛沐雨4 天前
深入解析 JSON-RPC:从基础到高级应用(附调用示例)
rpc·json
杨凯凡5 天前
Dubbo 全面解析:从 RPC 核心到服务治理实践
网络协议·rpc·dubbo
JhonKI6 天前
【从零实现Json-Rpc框架】- 项目实现 - 项目消息类型字段信息定义篇
网络协议·rpc·json
23级二本计科6 天前
C++ Json-Rpc框架-3项目实现(1)(1.其它函数实现2.消息类型字段定义3.消息Message/通信Muduo抽象具象实现)
网络协议·rpc·json
景天科技苑7 天前
【go微服务】Golang微服务之基--rpc的实现原理以及应用实战
微服务·rpc·golang·go微服务开发·微服务开发
JhonKI8 天前
【从零实现Json-Rpc框架】- 入门准备篇
网络协议·rpc·json
ScilogyHunter8 天前
深入解析libsunrpc:构建分布式系统的核心RPC库
rpc·远程过程调用