紹介

概要

Metaplex Inscription Programを使用すると、ブロックチェーンをデータストレージの方法として使用して、Solanaに直接データを書き込むことができます。Inscription programはまた、このデータストレージをオプションでNFTにリンクさせることも可能です。この概要では、このプログラムがどのように動作するかと、そのさまざまな機能を高レベルでどのように活用できるかを説明します。

はじめに

お好みの言語やライブラリを選択して、SolanaでデジタルアセットのOSセットを開始しましょう。

APIリファレンス

何か特定のものを探していますか?APIリファレンスをご覧いただき、答えを見つけてください。

はじめに

NFTのJSONデータと画像は、従来ArweaveやIPFSなどの分散ストレージプロバイダーに保存されてきました。Inscription programは、そのデータをチェーンに直接書き込むことを可能にし、NFTデータストレージのためのもう一つの選択肢としてSolanaを導入します。Metaplex Inscription programは、NFTの関連データがすべてSolana上に保存されるという新しい使用例を導入します。これにより、特性ベースの入札を持つSolanaプログラム、プログラムによって更新される動的画像、さらにはオンチェーンのRPGゲーム状態など、多くの新しい使用例が可能になります。

Inscriptionには2つの異なる種類があります:

  1. NFTミントに添付された Inscription - NFTデータがオフチェーンストレージの代わりに、または追加でチェーンに書き込まれる
  2. ストレージプロバイダーとしての Inscription - 任意のデータをチェーンに書き込む

NFTミントに添付されたInscription

Inscriptionは、メタデータJSONとメディアが保存されるArweaveのようなオフチェーンストレージに加えて使用することができ、またはInscription Gatewayを使用してそれらのオフチェーンストレージを完全に置き換えることもできます。

どちらの場合でも、inscriptionを作成するために同じプロセスが使用されます。ゲートウェイを使用する場合の唯一の違いは、オンチェーンメタデータで使用されるURIです。これについては、Gatewayセクションで詳しく説明します。

NFTメタデータをオンチェーンに保存する際、3つのinscriptionアカウントが使用されます:

  1. JSONメタデータを保存するinscriptionAccount
  2. inscriptionのメタデータを保存するinscriptionMetadata
  3. メディア/画像を保存するassociatedInscriptionAccount

以下のスクリプトは、これらのアカウントを両方作成し、新しくミントされたNFTをMetaplexゲートウェイに向けます。これにより、あなたのNFTは完全にオンチェーンになります。

Gatewayを使用した新しいNFTのデータの刻印

const umi = await createUmi()
umi.use(mplTokenMetadata())
umi.use(mplInscription())
// 刻印するNFTを作成してミントします。
const mint = generateSigner(umi)
const inscriptionAccount = await findMintInscriptionPda(umi, {
mint: mint.publicKey,
})
await createV1(umi, {
mint,
name: 'My NFT',
uri: `https://igw.metaplex.com/devnet/${inscriptionAccount[0]}`,
sellerFeeBasisPoints: percentAmount(5.5),
tokenStandard: TokenStandard.NonFungible,
}).sendAndConfirm(umi)
await mintV1(umi, {
mint: mint.publicKey,
tokenStandard: TokenStandard.NonFungible,
}).sendAndConfirm(umi)
const inscriptionMetadataAccount = await findInscriptionMetadataPda(umi, {
inscriptionAccount: inscriptionAccount[0],
})
let builder = new TransactionBuilder()
// Inscriptionを初期化し、JSONが保存されるアカウントを作成します。
builder = builder.add(
initializeFromMint(umi, {
mintAccount: mint.publicKey,
})
)
// そして、NFTのJSONデータをInscriptionアカウントに書き込みます。
builder = builder.add(
writeData(umi, {
inscriptionAccount: inscriptionAccount[0],
inscriptionMetadataAccount,
value: Buffer.from(
'{"description": "A bread! But onchain!", "external_url": "https://breadheads.io"}'
),
associatedTag: null,
offset: 0,
})
)
// 次に、画像を含む関連Inscriptionを作成します。
const associatedInscriptionAccount = findAssociatedInscriptionPda(umi, {
associated_tag: 'image',
inscriptionMetadataAccount,
})
builder = builder.add(
initializeAssociatedInscription(umi, {
inscriptionMetadataAccount,
associatedInscriptionAccount,
associationTag: 'image',
})
)
await builder.sendAndConfirm(umi, { confirm: { commitment: 'finalized' } })
// 画像ファイルを開いて、生バイトを取得します。
const imageBytes: Buffer = await fs.promises.readFile('bread.png')
// そして画像を書き込みます。
const chunkSize = 800
for (let i = 0; i < imageBytes.length; i += chunkSize) {
const chunk = imageBytes.slice(i, i + chunkSize)
await writeData(umi, {
inscriptionAccount: associatedInscriptionAccount,
inscriptionMetadataAccount,
value: chunk,
associatedTag: 'image',
offset: i,
}).sendAndConfirm(umi)
}

ストレージプロバイダーとしてのInscription

NFTミントでの使用に加えて、Inscriptionは最大10MBの任意のデータをオンチェーンに保存するためにも使用できます。無制限の数の関連Inscriptionを作成することができます。

これは、JSONデータを保存する必要があるオンチェーンゲーム、テキストをオンチェーンに保存、またはNFTではないプログラム関連データを保存する際に有用です。

以下の例は、1280バイトのトランザクションサイズ制限を回避するために、3つの異なるトランザクションでNFT JSONデータをInscriptionに書き込む方法を示しています。

特定のNFT inscriptionのランクを見つける

const inscriptionAccount = generateSigner(umi)
const inscriptionMetadataAccount = await findInscriptionMetadataPda(umi, {
inscriptionAccount: inscriptionAccount.publicKey,
})
let builder = new TransactionBuilder()
builder = builder.add(
initialize(umi, {
inscriptionAccount,
})
)
builder = builder.add(
writeData(umi, {
inscriptionAccount: inscriptionAccount.publicKey,
inscriptionMetadataAccount,
value: Buffer.from('{"description": "A bread! But onchain!"'),
associatedTag: null,
offset: 0,
})
)
builder = builder.add(
writeData(umi, {
inscriptionAccount: inscriptionAccount.publicKey,
inscriptionMetadataAccount,
value: Buffer.from(', "external_url":'),
associatedTag: null,
offset: '{"description": "A bread! But onchain!"'.length,
})
)
builder = builder.add(
writeData(umi, {
inscriptionAccount: inscriptionAccount.publicKey,
inscriptionMetadataAccount,
value: Buffer.from(' "https://breadheads.io"}'),
associatedTag: null,
offset: '{"description": "A bread! But onchain!", "external_url":'.length,
})
)
await builder.sendAndConfirm(umi, { confirm: { commitment: 'finalized' } })

関連Inscriptionアカウント

Metaplex JSON標準には、JSONスキーマのfilesプロパティを介してトークンに関連ファイルをリンクするオプションが含まれています。Inscription programは、PDAの力を使用して追加データを関連付ける新しい方法を導入します!PDAはInscriptionとアソシエーションタグから派生されており、高価なJSON逆シリアル化と解析を必要とせず、追加の刻印されたデータをプログラムで導出する方法になります。

Inscription Gateway

Inscription Gatewayと一緒に、通常のToken Metadata Standardを使用し、URIをゲートウェイに向けるだけで、ウォレットやエクスプローラーなどのすべてのツールがデータを通常NFTが読まれるのと違う方法でデータを読む必要なく、直接チェーンからデータを読み取ることができます。

Metaplexがホストする以下のURL構造のゲートウェイを使用できます:https://igw.metaplex.com/<network>/<account>(例:https://igw.metaplex.com/devnet/Fgf4Wn3wjVcLWp5XnMQ4t4Gpaaq2iRbc2cmtXjrQd5hF)、またはカスタムURLでゲートウェイを自分でホストすることができます。

Inscriptionランク

Inscriptionランクは、各inscriptionの一意の番号です。この番号は、作成時の総Inscription数に基づく、存在するすべてのMetaplex Inscriptionの連続的でグローバルなランキングを表します。Inscriptionランクは、Inscription Shardingでさらに説明されている並列化されたカウンターを通じて管理されます。

あなたのInscriptionのinscriptionRankを見つけるには、inscriptionMetadataアカウントを取得し、inscriptionRank bigintを読み取る必要があります:

特定のNFT inscriptionのランクを見つける

const inscriptionAccount = await findMintInscriptionPda(umi, {
mint: mint.publicKey,
})
const inscriptionMetadataAccount = await findInscriptionMetadataPda(umi, {
inscriptionAccount,
})
const { inscriptionRank } = await fetchInscriptionMetadata(
umi,
inscriptionMetadataAccount
)

inscriptionを作成する際は、書き込みロックを避けるために常にランダムシャードを使用する必要があります。以下のように乱数を計算できます:

ランダムシャードを見つける

const randomShard = Math.floor(Math.random() * 32)

Solana上のMetaplex Inscriptionの総数は、以下のように計算できます:

総Inscription数を取得

import {
fetchAllInscriptionShard,
findInscriptionShardPda,
} from '@metaplex-foundation/mpl-inscription'
const shardKeys = []
for (let shardNumber = 0; shardNumber < 32; shardNumber += 1) {
k.push(findInscriptionShardPda(umi, { shardNumber }))
}
const shards = await fetchAllInscriptionShard(umi, shardKeys)
let numInscriptions = 0
shards.forEach((shard) => {
const rank = 32 * Number(shard.count) + shard.shardNumber
numInscriptions = Math.max(numInscriptions, rank)
})

その他にも多くの機能

これはInscription programとその提供機能の良い概要を提供しますが、まだそれで実行できることはたくさんあります。

このドキュメントの他のページでは、さらに詳しく文書化し、重要な機能を個別のページで説明することを目的としています。