Fully on chain data store & Data Availability Policy


Japanese follows English. 日本語は英語のあとに掲載されています。

On-chain data storage and data availability policy

Bansho art improves the availability of NFT data in multiple ways to ensure that artists’ work survives as long as possible and that NFT owners can maintain value.

The Bansho team deploys the ERC721 standard NFT contracts on the Ethereum mainnet. Unlike most NFTs, ERC721 metadata is stored on the contract itself, i.e., on-chain; NFT image data (SVG data) is referenced to IPFS due to gas fees, but backups of data stored on IPFS are also stored on the Polygon Network on chain. Therefore, even if data on IPFS is lost, it can be recovered by retrieving data from data storage on Polygon Network and uploading it to IPFS.

IPFS files are pinned on two IPFS nodes: a cloud service pinata and a self-hosted IPFS node.

PinataにおけるPin Policy

Data Storage Contracts

The on-chain data storage contract is at the address below. Data stored on-chain can be retrieved by calling the tokenData function of this contract (it is possible to execute this function from PolygonScan, but it will be represented in hexadecimal on PolygonScan).

Polygon Network (137) 0x023759f5944170f8f5Fbe483108170c7ef58b1aD

https://polygonscan.com/address/0x023759f5944170f8f5fbe483108170c7ef58b1ad

Practically, the following JavaScript code can be used to save the data stored on-chain as an svg file.

function hexStringToByte(str) {
  if (!str) {
    return new Uint8Array();
  }
  var a = [];
  for (var i = 0, len = str.length; i < len; i += 2) {
    a.push(parseInt(str.substr(i, 2), 16));
  }
  return new Uint8Array(a);
}
const banshoContracts = [
    "0x499D7f2d4105b367599Fd22595129b0BeF092C38",
    "0x92E1E2D55F5187027C1a34E7e35A9A307Fd9B86e",
  ];
const storage = await ethers.getContractAt(
    "BAStorage",
    "0x023759f5944170f8f5Fbe483108170c7ef58b1aD"
  );
let tokenData = await storage.tokenData(banshoContracts[0], tokenId);
let dt = hexStringToByte(tokenData.slice(2));
console.log(dt.length);
fs.writeFileSync("download/sample.svg", dt);

Other.

This storage contract issues an NFT to indicate that data has been stored on-chain. This NFT contains the contract address and token ID of the original NFT, making it visible which contract and which token ID’s data was recorded.

https://opensea.io/collection/bastorage

Example: https://opensea.io/assets/matic/0x023759f5944170f8f5fbe483108170c7ef58b1ad/4804773533918467612656719462048775546763355958328

オンチェーンデータストレージとデータ可用性ポリシー

Banshoコレクションでは、アーティストの作品をできる限り長く存続させるため、そしてNFTのオーナーが価値を維持できるよう、複数の方法でNFTのデータの可用性を向上させています。

Banshoコレクションでは、ERC721のコレクションをEthereum mainnet上に展開しています。多くのNFTと異なりERC721のメタデータはコントラクト自体つまりオンチェーンに保存しています。NFTの画像データ(SVGデータ)はガスフィーの関係でIPFSを参照していますが、IPFS上に保存しているデータのバックアップをPolygon Network上にもon chainで保管しています。したがって、万一、IPFS上のデータが消失したとしても、Polygon Network上のデータストレージからデータを取り出し、IPFSにアップロードすることで復旧が可能となっています。

IPFSファイルはクラウドサービスのpinataおよびセルフホストのIPFSノードの2つでpinしており、IPFS上のファイルもできる限り消失しないような運用をしています。

PinataにおけるPin Policy

データストレージコントラクト

オンチェーンでのデータストレージコントラクトは下記のアドレスです。本コントラクトのtokenData関数を呼び出すことでオンチェーンに保存されたデータを取り出すことができます(PolygonScanから本関数を実行することも可能ですが、PolygonScan上ではヘキサデシマル表記されます)。

Polygon Network (137) 0x023759f5944170f8f5Fbe483108170c7ef58b1aD

https://polygonscan.com/address/0x023759f5944170f8f5fbe483108170c7ef58b1ad

実際的には下記のようなJavaScriptのコードを用いるとオンチェーンに保存されたデータをsvgファイルとして保存することが可能です。

近日中にデータのダウンロード機能を本HPに実装し、また、ダウンロードスクリプトを公開予定です。

function hexStringToByte(str) {
  if (!str) {
    return new Uint8Array();
  }
  var a = [];
  for (var i = 0, len = str.length; i < len; i += 2) {
    a.push(parseInt(str.substr(i, 2), 16));
  }
  return new Uint8Array(a);
}
const banshoContracts = [
    "0x499D7f2d4105b367599Fd22595129b0BeF092C38",
    "0x92E1E2D55F5187027C1a34E7e35A9A307Fd9B86e",
  ];
const storage = await ethers.getContractAt(
    "BAStorage",
    "0x023759f5944170f8f5Fbe483108170c7ef58b1aD"
  );
let tokenData = await storage.tokenData(banshoContracts[0], tokenId);
let dt = hexStringToByte(tokenData.slice(2));
console.log(dt.length);
fs.writeFileSync("download/sample.svg", dt);

その他

本ストレージコントラクトでは、データをオンチェーンに保存した際にデータが保存されたことを示すNFTを発行しています。このNFTには元のNFTのコントラクトアドレスとトークンIDが記載されており、どのコントラクトのどのトークンIDのデータが記録されているかが可視化されています。

https://opensea.io/collection/bastorage

https://opensea.io/assets/matic/0x023759f5944170f8f5fbe483108170c7ef58b1ad/4804773533918467612656719462048775546763355958328

Fully on chain data store & Data Availability Policy