このガイドでは、OCAP クライアントを使用して、アセットとしても知られる非代替性トークン(NFT)のライフサイクル全体を管理するための包括的なウォークスルーを提供します。新しいアセットをゼロから作成し、そのプロパティを更新し、標準化されたミントのためのアセットファクトリーを設立し、そのファクトリーから新しいアセットを取得する方法を学びます。
新しいアセットの作成
createAsset メソッドを使用して、ブロックチェーン上にユニークでスタンドアロンなアセットを作成できます。各アセットには、その初期プロパティから派生したユニークなオンチェーンアドレスが割り当てられます。
const { wallet } = getWallet(); // ユーザーのウォレットオブジェクト
async function createNewAsset() {
try {
const [hash, address] = await client.createAsset({
moniker: 'My Unique Digital Artwork',
data: {
typeUrl: 'json',
value: {
description: 'A one-of-a-kind piece created by Artist X.',
imageUrl: 'https://example.com/path/to/image.png',
},
},
readonly: true,
transferrable: true,
wallet: wallet,
});
console.log(`アセット作成トランザクションが送信されました: ${hash}`);
console.log(`新しいアセットのアドレス: ${address}`);
return address;
} catch (error) {
console.error('アセットの作成中にエラーが発生しました:', error);
}
}
createNewAsset();パラメータ
- moniker
string(required) — アセットの名前。 - parent
string(default:'') — 親アセットのアドレス(もしあれば)。 - data
object(required) — アセットのデータペイロード。typeUrlとvalueを含める必要があります。 - readonly
boolean(default:false) — trueの場合、アセットは作成後に更新できません。 - transferrable
boolean(default:true) — trueの場合、アセットは別のアカウントに転送できます。 - ttl
number(default:0) — アセットの初回消費後の生存期間(秒単位)。 - display
object— アセットの表示情報を含むオブジェクト。 - endpoint
object— アセットのエンドポイント詳細を含むオブジェクト。 - tags
string[](default:[]) — アセットを分類するための文字列の配列。 - wallet
WalletObject(required) — アセットの初期所有者のウォレットオブジェクト。 - delegator
string(default:'') — 委任によってこのトランザクションを承認したアカウントのアドレス。
戻り値
トランザクションハッシュと新しいアセットのオンチェーンアドレスを含む配列に解決される Promise。
- response
Promise<[string, string]>— [transactionHash, assetAddress]
既存アセットの更新
アセットが readonly: false で作成された場合、updateAsset メソッドを使用してその moniker と data フィールドを変更できます。アセットは、そのユニークなアドレスによって識別されます。
const { wallet } = getWallet(); // ユーザーのウォレットオブジェクト
const assetAddress = 'z362...'; // 更新するアセットのアドレス
async function updateExistingAsset() {
try {
const hash = await client.updateAsset({
address: assetAddress,
moniker: 'My Updated Digital Artwork',
data: {
typeUrl: 'json',
value: {
description: 'An updated description for my unique piece.',
imageUrl: 'https://example.com/path/to/new_image.png',
},
},
wallet: wallet,
});
console.log(`アセット更新トランザクションが送信されました: ${hash}`);
} catch (error) {
console.error('アセットの更新中にエラーが発生しました:', error);
}
}
updateExistingAsset();パラメータ
- address
string(required) — 更新するアセットのオンチェーンアドレス。 - moniker
string(required) — アセットの新しい名前。 - data
object(required) — アセットの更新されたデータペイロード。 - wallet
WalletObject(required) — 現在のアセット所有者のウォレットオブジェクト。
戻り値
トランザクションハッシュに解決される Promise。
- response
Promise<string>— transactionHash
アセットファクトリーの作成
アセットファクトリーは、複数の類似したアセットを作成するためのテンプレートです。新しいアセットをミントするための構造、ルール、ロジックを定義し、それぞれを個別に作成するよりも効率的です。これは、イベントチケット、証明書、コレクティブルの発行などのユースケースに最適です。
const { wallet } = getWallet(); // ファクトリー所有者のウォレット
const factoryDefinition = {
name: 'Conference Ticket Factory',
description: 'Mints tickets for the 2024 Tech Conference.',
limit: 1000, // 最大1000枚のチケットがミント可能
input: {
// アセットのミントに必要なデータを定義
type: 'object',
properties: {
attendeeName: { type: 'string' },
ticketType: { type: 'string', enum: ['General', 'VIP'] },
},
},
output: {
// ミントされるアセットの構造を定義
moniker: 'Ticket for {{attendeeName}}',
description: '{{ticketType}} admission for the 2024 Tech Conference.',
transferrable: false, // チケットは譲渡不可
},
hooks: [],
};
async function createFactory() {
try {
const [hash, factoryAddress] = await client.createAssetFactory({
factory: factoryDefinition,
wallet: wallet,
});
console.log(`ファクトリー作成トランザクションが送信されました: ${hash}`);
console.log(`新しいファクトリーのアドレス: ${factoryAddress}`);
} catch (error) {
console.error('アセットファクトリーの作成中にエラーが発生しました:', error);
}
}
createFactory();パラメータ
- factory
object(required) — ファクトリーのプロパティとミントロジックを定義するオブジェクト。- name
string(required) — ファクトリーの名前。 - description
string(required) — ファクトリーの目的の説明。 - limit
number(default:0) — このファクトリーからミントできるアセットの最大数。0は無制限を意味します。 - trustedIssuers
string[]— このファクトリーからのミントを許可されたアカウントアドレスのリスト。 - input
object(required) — アセットをミントするために必要な入力データを定義します。 - output
object(required) — ミントされるアセットの構造とプロパティを定義します。 - hooks
object[]— ミントプロセス中に実行するフックのリスト。 - data
object— ファクトリーと共に保存する追加の任意のデータ。
- name
- wallet
WalletObject(required) — ファクトリー所有者のウォレットオブジェクト。
戻り値
トランザクションハッシュと新しいファクトリーのオンチェーンアドレスを含む配列に解決される Promise。
- response
Promise<[string, string]>— [transactionHash, factoryAddress]
ファクトリーからのアセットの取得
ファクトリーからアセットを取得するのは2段階のプロセスです。まず、ミントデータを準備し、これにより作成されるアセットをプレビューできます。次に、トランザクションをブロックチェーンに送信して、アセットを正式に取得します。
この分離は、アプリケーションがユーザーに最終的なトランザクションに署名して送信する前に何を受け取るかを表示できるため便利です。
ステップ1:アセットデータの準備
preMintAsset メソッドは、ファクトリーアドレスとユーザーが提供した入力値を受け取り、最終的なアセットデータを生成します。これはオフチェーンで行われ、トランザクションは不要です。
const factoryAddress = 'z2...'; // 以前に作成されたファクトリーのアドレス
const { wallet: issuerWallet } = getIssuerWallet(); // ファクトリーの所有者または信頼された発行者
const { wallet: userWallet } = getUserWallet(); // 新しいアセットを所有するユーザー
async function prepareAssetForMinting() {
try {
const mintingData = await client.preMintAsset({
factory: factoryAddress,
inputs: {
attendeeName: 'John Doe',
ticketType: 'VIP',
},
owner: userWallet.address,
wallet: issuerWallet,
});
console.log('ミント用のアセットデータを準備しました:', mintingData);
return mintingData;
} catch (error) {
console.error('アセットの準備中にエラーが発生しました:', error);
}
}ステップ2:トランザクションの送信
ミントデータが準備されると、ユーザー(将来のアセット所有者)が acquireAsset トランザクションに署名して送信します。preMintAsset からの itx オブジェクトがペイロードとして使用されます。
async function acquireNewAsset() {
// まず、ステップ1からミントデータを取得します
const itx = await prepareAssetForMinting();
if (!itx) return;
try {
const hash = await client.acquireAsset({
itx: itx,
wallet: userWallet, // ユーザーのウォレットがトランザクションに署名します
});
console.log(`アセット取得トランザクションが送信されました: ${hash}`);
console.log(`新しいアセットは次のアドレスで利用可能になります: ${itx.address}`);
} catch (error) {
console.error('アセットの取得中にエラーが発生しました:', error);
}
}
acquireNewAsset();acquireAsset のパラメータ
- itx
object(required) —preMintAssetメソッドから返される内部トランザクションオブジェクト。 - wallet
WalletObject(required) — アセットを取得するユーザーのウォレット。 - delegator
string(default:'') — 委任によってこのトランザクションを承認したアカウントのアドレス。
戻り値
acquireAsset 操作のトランザクションハッシュに解決される Promise。
- response
Promise<string>— transactionHash
ファクトリーからのアセットのミント
ユーザー主導の acquireAsset フローに加えて、承認された発行者(ファクトリー所有者や信頼された発行者など)がアセットをミントし、ユーザーのアカウントに直接送信できます。このプロセスでも preMintAsset を使用してデータを準備しますが、最終的なトランザクションは発行者によって署名された mintAsset です。
このフローは、エアドロップ、証明書の授与、または受け取るユーザーが最終的なトランザクションを開始する必要がない場合に便利です。
ステップ1:アセットデータの準備
このステップは取得フローと同じです。発行者は preMintAsset を呼び出して、トランザクションペイロード(itx)をオフチェーンで生成します。
const factoryAddress = 'z2...'; // ファクトリーのアドレス
const { wallet: issuerWallet } = getIssuerWallet(); // ファクトリーの所有者または信頼された発行者
const userAddress = 'z1...'; // アセットを受け取るユーザーのアドレス
async function prepareAssetForMinting() {
try {
const mintingData = await client.preMintAsset({
factory: factoryAddress,
inputs: {
attendeeName: 'Jane Smith',
ticketType: 'General',
},
owner: userAddress,
wallet: issuerWallet, // ここでは発行者のウォレットが使用されます
});
console.log('ミント用のアセットデータを準備しました:', mintingData);
return mintingData;
} catch (error) {
console.error('アセットの準備中にエラーが発生しました:', error);
}
}ステップ2:ミントトランザクションの送信
発行者は準備された itx オブジェクトを使用して mintAsset を呼び出します。トランザクションは発行者のウォレットで署名され、新しく作成されたアセットは前のステップで指定された所有者に割り当てられます。
async function mintNewAsset() {
// まず、ステップ1からミントデータを取得します
const itx = await prepareAssetForMinting();
if (!itx) return;
try {
// 発行者のウォレットがトランザクションに署名します
const hash = await client.mintAsset({
itx: itx,
wallet: issuerWallet,
});
console.log(`アセットミントトランザクションが送信されました: ${hash}`);
console.log(`${userAddress} 向けの新しいアセットは次のアドレスで利用可能になります: ${itx.address}`);
} catch (error) {
console.error('アセットのミント中にエラーが発生しました:', error);
}
}
mintNewAsset();mintAsset のパラメータ
- itx
object(required) —preMintAssetメソッドから返される内部トランザクションオブジェクト。 - wallet
WalletObject(required) — アセットをミントする発行者のウォレット。
戻り値
mintAsset 操作のトランザクションハッシュに解決される Promise。
- response
Promise<string>— transactionHash