NOVO: Helius adquire a Light Protocol
como fazer upload de arquivos para o Shadow Drive na Solana
Blog/Desenvolvimento

Como fazer upload de arquivos para o Shadow Drive na Solana

Líder de Relações com DesenvolvedoresHunter Davis no LinkedIn
4 min de leitura

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.

Pré-requisitos

Antes de começar, verifique se você tem a extensão Backpack Wallet e os seguintes pré-requisitos instalados:

Node.js

Código
sh -c "$(curl -sSfL https://release.solana.com/v1.14.18/install)"

Solana CLI instalada

Código
npm install -g ts-node

Configurando o ambiente

Criando o projeto

  1. No terminal, crie uma nova pasta chamada Shadow.
  2. Crie um novo arquivo chamado upload.ts dentro da pasta Shadow.
  3. Instale os pacotes necessários:
Código
npm install @shadow-drive/sdk @project-serum/anchor

     4. Gere uma carteira usando o seguinte comando:

Código
solana-keygen grind --starts-with N:1

     5. 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:

  1. Abra o arquivo chamado [walletAddress].json e copie a chave secreta. Precisaremos adicionar fundos a essa carteira para o exemplo.
  2. Instale a extensão Backpack Wallet no navegador pela Chrome Web Store.
  3. 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.

  1. Acesse a Jupiter para fazer o swap de SOL por tokens SHDW.
  2. 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:

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:

Código
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:

Código
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.

Código
{
  shdw_bucket: '5pzNpvGk3VK4XsqoCoJpqfXE7vioKkr7t4UEqbHkqnz1',
  transaction_signature: '4EFw2R7KNw45Rngg6MASqfhGDpeZvcaoQHApADhopD9WQxB6XMYBcshd7neyLFa6QtKZC5H9U5iTnggUuhdNDLfE'
}

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:

Código
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:

  1. Lê o arquivo local helius.txt como um buffer.
  2. Localiza a conta de armazenamento que criamos e a define como a chave pública da nossa conta.
  3. Cria um objeto ShadowFile com o nome e os dados do arquivo.
  4. Faz upload do arquivo para a conta de armazenamento especificada usando a função uploadFile.

Agora podemos executar o seguinte para iniciar o upload:

Código
ts-node upload.ts

Isso gera o seguinte no console:

Código
{
  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

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.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.

‍

Assine a Helius

Acompanhe as novidades mais recentes do desenvolvimento Solana e receba atualizações quando publicarmos

Imagem ampliada