ホーム 記事一覧 ブック DH週間トピックス 検索 このサイトについて
English
Pinata V3 API グループ機能の実装ガイド

Pinata V3 API グループ機能の実装ガイド

Pinata の Files API v3 でグループ機能を使用する際のはまりポイントと解決策をまとめます。 背景 Pinata でアップロードしたファイルをグループで管理し、特定のグループに属するファイルのみを取得したいケースがあります。例えば、NFT登録フォームで使用する入力画像を「input」グループに格納し、そのグループからのみ画像を選択できるようにする場合などです。 はまりポイント 1. レガシーAPI と V3 API のファイル管理は分離されている 問題 : レガシーAPI(pinFileToIPFS)でアップロードしたファイルは、V3 API(/v3/files)では取得できません。逆も同様です。 レガシーAPI (pinList) → レガシーでアップロードしたファイルのみ表示 V3 API (/v3/files) → V3でアップロードしたファイルのみ表示 解決策 : どちらかのAPIに統一する。V3 APIに移行する場合は、新規アップロードからV3を使用し、既存ファイルは手動でグループに追加するか、マイグレーションを検討。 2. V3 API のエンドポイントには {network} パラメータが必要 問題 : V3 API のエンドポイントは {network} パラメータ(public または private)が必須。 ❌ GET /v3/files?group={group_id} ✅ GET /v3/files/public?group={group_id} 解決策 : 通常のIPFSファイルには public を使用。 3. グループフィルタのパラメータ名が異なる 問題 : アップロード時とリスト取得時でパラメータ名が異なる。 操作 パラメータ名 アップロード group_id リスト取得 group 4. JWT の種類による認証の違い 問題 : Scoped Key で生成した JWT は V3 API で動作しない場合がある。 ...

ブロックチェーンとPinata IPFSを使用したデジタル文化財管理システムの試作

ブロックチェーンとPinata IPFSを使用したデジタル文化財管理システムの試作

お知らせ: 2025-06-14 開発の経過は以下にまとめています。 https://zenn.dev/nakamura196/books/41693d2d017082 概要 ブロックチェーンの学習にあたり、デジタル文化財の管理システムのプロトタイプを作成しました。ブロックチェーンの学習が目的のため、不足している機能などが多いですが、今後追加・改修を加えていく予定です。 https://digital-heritage-five.vercel.app/ 使用技術 EthereumのSepoliaネットワークを使用しています。ブロックチェーンの学習およびプロトタイプの開発が目的であるため、テストネットワークを使用します。 分散ファイルストレージIPFSのホスティングサービスとして、Pinataを使用しています。 https://pinata.cloud/ 準備 後述する本サイトの使用にあたり、MetaMaskのウォレットの作成や、ETHのSepoliaテストネットの作成などが必要です。また登録にあたっては、ガス代の支払いに必要なSepoliaETHが一定数必要です。 これらの方法については、別の記事で紹介したいと思いますが、インターネット上の記事を参考にしてください。 使い方 以下のURLにアクセスします。 https://digital-heritage-five.vercel.app/ MetaMaskがインストール済みの場合、以下のように表示されます。 「ウォレットを接続」ボタンを押すと、以下の画面が表示されます。 接続後、以下のような画面が表示されます。 サンプルとして、いらすとやさんの画像を利用させていただきます。 https://www.irasutoya.com/2020/12/blog-post_279.html 名前や説明、画像URLを入力して、登録ボタンを押します。 以下の画面が表示されます。確認ボタンを押します。 以下のようにデータが登録されます。 Transactionの確認 Etherscanを使って、取引の内容を確認することができます。 https://sepolia.etherscan.io/tx/0x1234567890abcdef…(例) Input Dataに入力されている文字列は、「スマートコントラクトの関数呼び出しのエンコードされたデータ」とのことです。以下の関数でデコードしてみます。 const ethers = require('ethers'); // デコードするインプットデータ const inputData = '0xb2f262e4...(実際の登録データの例)'; // インプットデータをデコード function decodeInput(input) { try { // 関数シグネチャを取得 const functionSignature = input.slice(0, 10); console.log('Function Signature:', functionSignature); // パラメータデータを取得(最初の4バイトを除く) const paramsData = '0x' + input.slice(10); // デコーダーを作成 const decoder = new ethers.AbiCoder(); // パラメータの型を定義 const types = ['string', 'string', 'string']; // データをデコード const decoded = decoder.decode(types, paramsData); // 結果を表示 console.log('\nDecoded Parameters:'); console.log('Name:', decoded[0]); console.log('Description:', decoded[1]); console.log('Image URL:', decoded[2]); } catch (error) { console.error('デコードエラー:', error); } } // デコードを実行 decodeInput(inputData); 結果、以下のように確認することができました。 ...