
SolanaでShadow Driveにファイルをアップロードする方法
概要
Solanaはコストが高くストレージ容量も限られているため、大量のデータを保存すると非常に高額になります。こうした制約を克服するため、GenesysGoが開発したShadow Driveなどのオフチェーンストレージソリューションが注目を集めています。
Shadow Driveは、Solana上で大量のデータを保存するための高性能で費用対効果に優れた選択肢です。ただし、メインネットトークンが必要であり、SOL → SHDWのスワップによって取得します。
このチュートリアルでは、TypeScriptを使用してShadow Driveにファイルをアップロードする手順を説明します。
現在、SHDWには利用可能なdevnetオプションがないため、このテストはメインネットでのみ実行できます。
前提条件
開始する前に、Backpack Wallet拡張機能と以下の前提ツールがインストールされていることを確認してください。
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 Wallet拡張機能をインストールします。
- Backpack Wallet拡張機能を開き、「Settings」に移動します。
4. 設定メニューで「Wallets」を選択します。
5. 新しいウォレットを追加するには、右上の「+」ボタンをクリックします。
6. ウォレットタイプとしてSolanaを選択します。「Import by Private key」を選択します。
7. ウォレットファイルの内容をインポートフィールドに貼り付け、「Import」をクリックします。
インポートが完了したら、ウォレットから公開鍵をコピーします。別のSolanaウォレットから、このテスト用ウォレットに0.03 SOL未満の資金を入れることができます。
SHDWトークンの取得
SHDW Driveでストレージアカウントを作成するには、SHDW(SHDWyBxihqiCj6YekG2GUr7wqKLeLAMK1gHZck9pL6y)というトークンが必要です。Solana上のJupiterを使用したスワップによって、SHDWトークンを取得できます。
- SOLからSHDWトークンへのスワップを実行するには、Jupiterにアクセスします。
- SHDWとスワップするSOLの希望数量を入力し、「Swap」をクリックします。このテストに必要な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を、HeliusのDeveloper Portalから取得できる有効なAPIキーに置き換えてください。また、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);上記のコードは、主に4つの処理を実行します。
- ローカルファイル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開発の最新情報や新しい記事の公開通知を受け取れます


