
Como fazer upload de arquivos para o Shadow Drive na Solana
Visão geral
O alto custo e a capacidade limitada de armazenamento da Solana tornam proibitivo o armazenamento de grandes volumes de dados. Soluções de armazenamento off-chain como o Shadow Drive, criado pela GenesysGo, ganharam popularidade para superar essas limitações.
O Shadow Drive oferece uma opção econômica e eficiente para armazenar grandes volumes de dados na Solana. No entanto, ele exige um token da mainnet, que você pode adquirir fazendo um swap de SOL → SHDW.
Neste tutorial, mostraremos como fazer upload de arquivos para o Shadow Drive usando TypeScript.
Este teste só pode ser executado na mainnet, pois atualmente o SHDW não oferece uma opção de devnet.
Pré-requisitos
Antes de começar, verifique se você tem a extensão Backpack Wallet e os seguintes pré-requisitos instalados:
sh -c "$(curl -sSfL https://release.solana.com/v1.14.18/install)"npm install -g ts-nodeConfigurando o ambiente
Criando o projeto
- No terminal, crie uma nova pasta chamada Shadow.
- Crie um novo arquivo chamado upload.ts dentro da pasta Shadow.
- Instale os pacotes necessários:
npm install @shadow-drive/sdk @project-serum/anchor4. Gere uma carteira usando o seguinte comando:
solana-keygen grind --starts-with N:15. Crie um arquivo chamado "helius.txt" dentro da pasta "Shadow" e adicione algum conteúdo a ele. Neste exemplo, inseriremos apenas o seguinte:
Depois de concluir essas etapas, a estrutura de diretórios dos arquivos deverá ser semelhante à seguinte:
- Abra o arquivo chamado
[walletAddress].jsone copie a chave secreta. Precisaremos adicionar fundos a essa carteira para o exemplo. - Instale a extensão Backpack Wallet no navegador pela Chrome Web Store.
- Abra a extensão Backpack Wallet e acesse "Configurações".
4. No menu de configurações, selecione "Carteiras".
5. Clique no botão "+" no canto superior direito para adicionar uma nova carteira.
6. Escolha Solana como o tipo de carteira. Selecione "Importar por chave privada".
7. Cole o conteúdo do arquivo da carteira no campo de importação e clique em "Importar".
Após a importação, copie a chave pública da carteira. Você pode adicionar menos de 0,03 SOL a essa carteira de teste usando outra carteira Solana.
Obtendo o token SHDW
O SHDW Drive exige um token chamado SHDW (SHDWyBxihqiCj6YekG2GUr7wqKLeLAMK1gHZck9pL6y) para criar contas de armazenamento. Você pode obter tokens SHDW por meio de um processo de swap usando a Jupiter na Solana.
- Acesse a Jupiter para fazer o swap de SOL por tokens SHDW.
- Insira a quantidade desejada de SOL para trocar por SHDW e clique em "Swap". Precisamos de menos de 1 SHDW para este teste (o equivalente a 0,01 SOL).
3. Confirme a transação. Depois que ela for aprovada, o token SHDW aparecerá na sua carteira.
Etapas de desenvolvimento
1. Configurando a conexão com o SHDW
No arquivo upload.ts, importaremos os módulos necessários e estabeleceremos uma conexão com a rede SHDW. Criaremos uma função assíncrona chamada main para agrupar nosso código:
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();Substitua api-key na variável rpc por uma chave de API válida, que você pode obter no Portal do Desenvolvedor da Helius. Também substitua const key pelo nome correto do arquivo da carteira que criamos antes de começar.
Se você executar o arquivo agora com ts-node upload.ts, verá o seguinte no terminal:
ShdwDrive {
connection: Connection {
_commitment: 'confirmed',
_confirmTransactionInitialTimeout: undefined,
_rpcEndpoint: 'https://rpc.helius.xyz/?api-key=',
...2. Criar uma conta de armazenamento
Para criar uma conta de armazenamento, adicione o seguinte código dentro da função main:
const newAccount = await drive.createStorageAccount("heliusDemo", "1MB", "v2");
console.log(newAccount);A execução do comando ts-node upload.ts aqui exibirá o ID e a assinatura da transação da conta de armazenamento recém-criada.
{
shdw_bucket: '5pzNpvGk3VK4XsqoCoJpqfXE7vioKkr7t4UEqbHkqnz1',
transaction_signature: '4EFw2R7KNw45Rngg6MASqfhGDpeZvcaoQHApADhopD9WQxB6XMYBcshd7neyLFa6QtKZC5H9U5iTnggUuhdNDLfE'
}Você poderá encontrar um erro nesta etapa se a carteira não tiver pelo menos 0,01 SOL e 1 token SHDW.
3. Fazer upload de um arquivo
Agora que temos uma conta de armazenamento, podemos fazer upload de um arquivo para ela. Adicione o seguinte código dentro da função 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);O código acima realiza quatro ações principais:
- Lê o arquivo local helius.txt como um buffer.
- Localiza a conta de armazenamento que criamos e a define como a chave pública da nossa conta.
- Cria um objeto
ShadowFilecom o nome e os dados do arquivo. - Faz upload do arquivo para a conta de armazenamento especificada usando a função
uploadFile.
Agora podemos executar o seguinte para iniciar o upload:
ts-node upload.tsIsso gera o seguinte no console:
{
finalized_locations: [
'https://shdw-drive.genesysgo.net/5pzNpvGk3VK4XsqoCoJpqfXE7vioKkr7t4UEqbHkqnz1/helius.txt'
],
message: '3UNhH2UMys8GxqSouVPtKLAd3rcP7m3oP8LwvwH8HSp3yChaYPSaAhjub5iV2i1LDvSU3JZ9ck322kt7QhRdbMhY',
upload_errors: []
}Pronto, o upload do arquivo foi concluído! Você pode acessar o link finalized_location gerado e verificar se o upload foi feito corretamente.
Observe que o URL do arquivo é https://shdw-drive.genesysgo.net/[storage_account_address]/[file_name]
Isso significa que todos os arquivos enviados para essa conta de armazenamento compartilharão o URL inicial, mas o nome do arquivo será diferente. Você também pode criar contas de armazenamento separadas para armazenar arquivos.
Ao verificar sua carteira, você também notará que essa operação custou apenas 0,00244 SHDW.
Código completo
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();Conclusão
É isso! Você fez upload de um arquivo para o Shadow Drive usando TypeScript. Esse conhecimento fundamental permite aproveitar os recursos descentralizados do SHDW e fornece uma base para casos de uso mais avançados. Por exemplo, você pode ampliar este tutorial integrando a funcionalidade de upload de arquivos a uma aplicação web ou criando um serviço de armazenamento descentralizado de arquivos. Consulte a documentação oficial para saber mais sobre o que você pode fazer com o Shadow Drive SDK.
Artigos relacionados
Assine a Helius
Acompanhe as novidades mais recentes do desenvolvimento Solana e receba atualizações quando publicarmos


