
在 Solana 上将文件上传到 Shadow Drive
概述
Solana 成本较高且存储容量有限,因此存储大量数据的成本令人难以承受。为突破这些限制,由 GenesysGo 创建的 Shadow Drive 等链下存储解决方案逐渐得到广泛采用。
Shadow Drive 为在 Solana 上存储大量数据提供了一种经济高效且性能出色的选择。不过,它需要使用主网代币,你可以通过 SOL → SHDW 兑换来获取。
在本教程中,我们将演示如何使用 TypeScript 将文件上传到 Shadow Drive。
此测试只能在主网上运行,因为 SHDW 目前没有可用的开发网选项。
前置条件
开始之前,请确保已安装 Backpack 钱包扩展程序并满足以下前置条件:
sh -c "$(curl -sSfL https://release.solana.com/v1.14.18/install)"npm install -g ts-node设置环境
创建项目
- 在终端中新建一个名为 Shadow 的文件夹。
- 在 Shadow 文件夹内新建一个名为 upload.ts 的文件。
- 安装所需的软件包:
npm install @shadow-drive/sdk @project-serum/anchor4. 使用以下命令生成钱包:
solana-keygen grind --starts-with N:15. 在“Shadow”文件夹内创建一个名为“helius.txt”的文件,并添加一些内容。在本例中,我们只添加以下内容:
完成这些步骤后,你的文件目录结构应如下所示:
- 打开名为
[walletAddress].json的文件并复制私钥。我们需要为此钱包充值,以便完成示例。 - 从 Chrome 应用商店为你的浏览器安装 Backpack 钱包扩展程序。
- 打开 Backpack 钱包扩展程序并前往“设置”。
4. 在设置菜单中选择“钱包”。
5. 点击右上角的“+”按钮,添加新钱包。
6. 选择 Solana 作为钱包类型。选择“通过私钥导入”。
7. 将钱包文件的内容粘贴到导入字段中,然后点击“导入”。
导入后,从钱包中复制公钥。你可以从另一个 Solana 钱包向这个测试钱包转入不到 0.03 SOL。
获取 SHDW 代币
SHDW Drive 需要一种名为 SHDW(SHDWyBxihqiCj6YekG2GUr7wqKLeLAMK1gHZck9pL6y)的代币来创建存储账户。你可以在 Solana 上使用 Jupiter 通过兑换流程获取 SHDW 代币。
- 访问 Jupiter 进行 SOL 到 SHDW 的代币兑换。
- 输入要兑换为 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'
}如果钱包中没有至少 0.01 SOL 和 1 枚 SHDW 代币,你可能会在此步骤遇到错误。
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);上述代码执行四项主要操作:
- 将本地文件 helius.txt 读取为缓冲区。
- 查找我们创建的存储账户,并将其定义为账户公钥。
- 使用文件名和数据创建一个
ShadowFile对象。 - 使用
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 开发的最新动态,并在我们发布新内容时收到更新


