概述
Solana 的高成本和有限的存储容量使得存储大量数据的成本过高。GenesysGo 创建的 Shadow Drive 等链下存储解决方案已获得青睐,可以克服这些限制。
Shadow Drive 为在 Solana 上存储大量数据提供了一种经济高效且性能卓越的选项。但是,它需要主网代币,您可以通过进行 SOL → SHDW 交换来获取该代币。
在本教程中,我们将演示如何使用 TypeScript 将文件上传到 Shadow Drive。
笔记
该测试只能在主网上运行,因为 SHDW 目前没有可用的开发网选项。
先决条件
在开始之前,请确保您已安装Backpack Wallet Extension和以下先决条件:
Node.js
代码
sh -c "$(curl -sSfL https://release.solana.com/v1.14.18/install)"
Solana CLI 已安装
代码
npm install -g ts-node
设置环境
创建项目
从您的终端创建一个名为Shadow的新文件夹。
在Shadow文件夹中创建一个名为upload.ts的新文件。
安装所需的软件包:
代码
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 Wallet 扩展程序。
3.打开 Backpack Wallet 扩展并转到“设置”。
4. 在设置菜单中,选择“钱包”。
5.点击右上角“ + ”按钮,添加新钱包。
6. 选择 Solana 作为钱包类型。选择“通过私钥导入”。
7. 将钱包文件的内容粘贴到导入字段中,然后单击“导入”。
导入后,从钱包中复制公钥。你可以从另一个 Solana 钱包向这个测试钱包注入少于 0.03 SOL 的资金。
1.获取 SHDW 代币
SHDW Drive 需要一个名为 SHDW ( SHDWyBxihqiCj6YekG2GUr7wqKLeLAMK1gHZck9pL6y) 的代币来创建存储账户。您可以通过在 Solana 上使用 Jupiter 的交换流程获取 SHDW 代币。
2.访问Jupiter执行 SOL 到 SHDW 代币交换。
输入要兑换 SHDW 的 SOL 数量,然后单击“兑换”。我们只需要少于 1 SHDW 即可进行此测试(相当于 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();
确保将变量替换api-key为rpc可从 Helius开发者门户获取的有效 API 密钥。此外,请const key用我们在开始之前创建的钱包的正确文件名替换。
如果您现在使用 ts-node upload.ts 运行该文件,您将在终端中看到以下内容:
代码
ShdwDrive {
connection: Connection {
_commitment: 'confirmed',
_confirmTransactionInitialTimeout: undefined,
_rpcEndpoint: 'https://rpc.helius.xyz/?api-key=',
...
2.创建存储帐户
要创建存储帐户,请在主函数中添加以下代码:
代码
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.上传文件
一旦我们有了存储帐户,我们就可以向其中上传文件。在主函数中添加以下代码:
代码
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 的功能。