新消息:Helius 收购 Light Protocol
如何在 Solana 上将文件上传到 Shadow Drive
博客/开发

在 Solana 上将文件上传到 Shadow Drive

开发者关系负责人LinkedIn 上的 Hunter Davis
阅读需 4 分钟

概述

Solana 成本较高且存储容量有限,因此存储大量数据的成本令人难以承受。为突破这些限制,由 GenesysGo 创建的 Shadow Drive 等链下存储解决方案逐渐得到广泛采用。

Shadow Drive 为在 Solana 上存储大量数据提供了一种经济高效且性能出色的选择。不过,它需要使用主网代币,你可以通过 SOL → SHDW 兑换来获取。

在本教程中,我们将演示如何使用 TypeScript 将文件上传到 Shadow Drive。

前置条件

开始之前,请确保已安装 Backpack 钱包扩展程序并满足以下前置条件:

Node.js

代码
sh -c "$(curl -sSfL https://release.solana.com/v1.14.18/install)"

已安装 Solana CLI

代码
npm install -g ts-node

设置环境

创建项目

  1. 在终端中新建一个名为 Shadow 的文件夹。
  2. 在 Shadow 文件夹内新建一个名为 upload.ts 的文件。
  3. 安装所需的软件包:
代码
npm install @shadow-drive/sdk @project-serum/anchor

     4. 使用以下命令生成钱包:

代码
solana-keygen grind --starts-with N:1

     5. 在“Shadow”文件夹内创建一个名为“helius.txt”的文件,并添加一些内容。在本例中,我们只添加以下内容:

完成这些步骤后,你的文件目录结构应如下所示:

  1. 打开名为 [walletAddress].json 的文件并复制私钥。我们需要为此钱包充值,以便完成示例。
  2. 从 Chrome 应用商店为你的浏览器安装 Backpack 钱包扩展程序。
  3. 打开 Backpack 钱包扩展程序并前往“设置”。

      4. 在设置菜单中选择“钱包”。

      5. 点击右上角的“+”按钮,添加新钱包。

      6. 选择 Solana 作为钱包类型。选择“通过私钥导入”。

        7. 将钱包文件的内容粘贴到导入字段中,然后点击“导入”。

导入后,从钱包中复制公钥。你可以从另一个 Solana 钱包向这个测试钱包转入不到 0.03 SOL。

获取 SHDW 代币

SHDW Drive 需要一种名为 SHDW(SHDWyBxihqiCj6YekG2GUr7wqKLeLAMK1gHZck9pL6y)的代币来创建存储账户。你可以在 Solana 上使用 Jupiter 通过兑换流程获取 SHDW 代币。

  1. 访问 Jupiter 进行 SOL 到 SHDW 的代币兑换。
  2. 输入要兑换为 SHDW 的 SOL 数量,然后点击“兑换”。本次测试所需的 SHDW 不到 1 枚(相当于 0.01 SOL)。

      3. 确认交易。交易获批后,SHDW 代币将显示在你的钱包中。

构建步骤

1. 建立与 SHDW 的连接

在 upload.ts 文件中,我们将导入必要的模块并建立与 SHDW 网络的连接。我们会创建一个名为 main 的异步函数,用于容纳代码:

代码
const anchor = require("@project-serum/anchor");
const { Connection, clusterApiUrl, Keypair } = require("@solana/web3.js");
const { ShdwDrive, ShadowFile } = require("@shadow-drive/sdk");
const key = require('./{wallet_address}.json');
const fs = require('fs');
const rpc = "https://rpc.helius.xyz/?api-key="
async function main() {
    let secretKey = Uint8Array.from(key);
    let keypair = Keypair.fromSecretKey(secretKey);
    const connection = new Connection(
        rpc , "confirmed"
    );    
		const wallet = new anchor.Wallet(keypair);
    const drive = await new ShdwDrive(connection, wallet).init();
		console.log(drive)
}
main();

请务必将 rpc 变量中的 api-key 替换为有效的 API 密钥。你可以从 Helius 开发者门户获取该密钥。此外,请将 const key 替换为之前创建的钱包文件的正确名称。

如果现在使用 ts-node upload.ts 运行该文件,终端中将显示以下内容:

代码
ShdwDrive {
  connection: Connection {
    _commitment: 'confirmed',
    _confirmTransactionInitialTimeout: undefined,
    _rpcEndpoint: 'https://rpc.helius.xyz/?api-key=',
...

2. 创建存储账户

要创建存储账户,请在 main 函数中添加以下代码:

代码
const newAccount = await drive.createStorageAccount("heliusDemo", "1MB", "v2");
console.log(newAccount);

在此运行 ts-node upload.ts 命令将输出新建存储账户的 ID 和交易签名。

代码
{
  shdw_bucket: '5pzNpvGk3VK4XsqoCoJpqfXE7vioKkr7t4UEqbHkqnz1',
  transaction_signature: '4EFw2R7KNw45Rngg6MASqfhGDpeZvcaoQHApADhopD9WQxB6XMYBcshd7neyLFa6QtKZC5H9U5iTnggUuhdNDLfE'
}

3. 上传文件

有了存储账户后,我们就可以向其中上传文件。请在 main 函数中添加以下代码:

代码
const accts = await drive.getStorageAccounts("v2");
const fileBuff = fs.readFileSync("./helius.txt");
let acctPubKey = new anchor.web3.PublicKey(accts[0].publicKey);
const fileToUpload: ShadowFile = {
    name: "helius.txt",
    file: fileBuff,
    };
const uploadFile = await drive.uploadFile(acctPubKey, fileToUpload);
console.log(uploadFile);

上述代码执行四项主要操作:

  1. 将本地文件 helius.txt 读取为缓冲区。
  2. 查找我们创建的存储账户,并将其定义为账户公钥。
  3. 使用文件名和数据创建一个 ShadowFile 对象。
  4. 使用 uploadFile 函数将文件上传到指定的存储账户。

现在可以运行以下命令开始上传:

代码
ts-node upload.ts

控制台中将显示以下内容:

代码
{
  finalized_locations: [
    'https://shdw-drive.genesysgo.net/5pzNpvGk3VK4XsqoCoJpqfXE7vioKkr7t4UEqbHkqnz1/helius.txt'
  ],
  message: '3UNhH2UMys8GxqSouVPtKLAd3rcP7m3oP8LwvwH8HSp3yChaYPSaAhjub5iV2i1LDvSU3JZ9ck322kt7QhRdbMhY',
  upload_errors: []
}

文件现已上传!你可以访问生成的 finalized_location 链接,确认文件已正确上传。

请注意,该文件的 URL 为 https://shdw-drive.genesysgo.net/[storage_account_address]/[file_name]

这意味着上传到此存储账户的所有文件都将共享相同的初始 URL,但文件名会有所不同。你也可以创建单独的存储账户来存储文件。

检查钱包后你还会发现:完成此操作只花费了 0.00244 SHDW。

完整代码

代码
const anchor = require("@project-serum/anchor");
const { Connection, clusterApiUrl, Keypair } = require("@solana/web3.js");
const { ShdwDrive, ShadowFile } = require("@shadow-drive/sdk");
const key =  require('./wallet.json');
const fs = require('fs');

async function main() {
    let secretKey = Uint8Array.from(key);
    let keypair = Keypair.fromSecretKey(secretKey);
    const connection = new Connection(
        "https://rpc.helius.xyz/?api-key=", "confirmed"
    );    const wallet = new anchor.Wallet(keypair);
    const drive = await new ShdwDrive(connection, wallet).init();
		const newAccount = await drive.createStorageAccount("heliusDemo", "1MB", "v2");
		console.log(newAccount);  
    const accts = await drive.getStorageAccounts("v2");
    const fileBuff = fs.readFileSync("./helius.txt");
    let acctPubKey = new anchor.web3.PublicKey(accts[0].publicKey);
    const fileToUpload: typeof ShadowFile = {
    name: "helius.txt",
    file: fileBuff,
    };
    const uploadFile = await drive.uploadFile(acctPubKey, fileToUpload);
    console.log(uploadFile);

}
main();

总结

就是这样!你已成功使用 TypeScript 将文件上传到 Shadow Drive。这些基础知识让你能够利用 SHDW 的去中心化功能,并为更高级的应用场景奠定基础。例如,你可以扩展本教程,将文件上传功能集成到 Web 应用中,或创建去中心化文件存储服务。请查看官方文档,进一步了解 Shadow Drive SDK 的功能。

‍

订阅 Helius

及时了解 Solana 开发的最新动态,并在我们发布新内容时收到更新

放大图片