Stability AI를 사용하여 이미지를 생성했다고 가정해 봅시다. 이미지에 적절한 라이선스를 추가하지 않으면 다른 사람들이 자유롭게 사용할 수 있습니다. 이 튜토리얼에서는 Stability AI로 생성한 이미지에 라이선스를 추가하여 다른 사람들이 사용하려면 반드시 귀하로부터 적절한 라이선스를 받아야 하도록 하는 방법을 배우게 됩니다.
Stability는 크기가 큰 이미지를 생성하므로 저장 비용이 많이 듭니다. 선택적으로 생성된 이미지를 압축하여 더 빠른 로딩 속도와 더 저렴한 저장 비용을 얻을 수 있습니다.
main.ts
import fs from "fs";import axios from "axios";import FormData from "form-data";async function main() { // previous code here ... const condensedImgBuffer = await sharp(response.data) .png({ quality: 10 }) // Adjust the quality value as needed (between 0 and 100) .toBuffer();}main();
이제 이미지가 생성되었으니 IPFS에 저장하여 접근할 수 있는 URL을 받아야 합니다. 이 튜토리얼에서는 Pinata를 사용할 것입니다. 이는 이미지 저장을 쉽게 만들어주는 분산 저장 솔루션입니다.
별도의 파일 uploadToIpfs.ts에서 함수를 생성하세요 uploadBlobToIPFS 이 함수는 우리의 버퍼를 IPFS에 업로드합니다:
uploadToIpfs.ts
import { PinataSDK } from "pinata-web3";const pinata = new PinataSDK({ pinataJwt: process.env.PINATA_JWT, // you can put your pinata gateway here, or leave it empty pinataGateway: process.env.PINATA_GATEWAY,});// upload our image to ipfs by putting it in a public groupexport async function uploadBlobToIPFS( blob: Blob, fileName: string): Promise<string> { const file = new File([blob], fileName, { type: "image/png" }); const { IpfsHash } = await pinata.upload.file(file); return IpfsHash;}
메인 파일로 돌아가서 uploadBlobToIPFS 함수를 호출하여 이미지를 저장하세요:
main.ts
import fs from "fs";import axios from "axios";import FormData from "form-data";import { uploadBlobToIPFS } from "./uploadToIpfs.ts";async function main() { // previous code here ... // convert the buffer to a blob const blob = new Blob([condensedImgBuffer], { type: "image/png" }); // store the blob on ipfs const imageCid = await uploadBlobToIPFS(blob, "lighthouse.png");}main();
Story에 이미지를 등록할 때 라이선스 조건을 IP에 첨부할 수 있습니다. 이는 실제로 법적 구속력이 있는 조건으로, 라이선싱 모듈에 의해 온체인에서 강제되며, 분쟁 모듈에 의해 이의 제기가 가능하며, 최악의 경우 전통적인 방식으로 법정에서 오프체인으로 집행될 수 있습니다.
우리가 만든 이미지를 수익화하고 싶다고 가정해 봅시다. 누군가 이 이미지를 사용하고 싶을 때마다(상품, 광고 등에) 10 $WIP의 초기 발행 수수료를 지불해야 합니다. 또한 파생 작품으로 수익을 얻을 때마다 5%의 수익을 로열티로 지불해야 합니다.
main.ts
import fs from "fs";import axios from "axios";import FormData from "form-data";import { uploadBlobToIPFS, uploadJSONToIPFS } from "./uploadToIpfs.ts";import { client, account } from "./utils";import { createHash } from "crypto";import { LicenseTerms, WIP_TOKEN_ADDRESS } from "@story-protocol/core-sdk";import { zeroAddress, parseEther } from "viem";async function main() { // previous code here ... const commercialRemixTerms: LicenseTerms = { transferable: true, royaltyPolicy: "0xBe54FB168b3c982b7AaE60dB6CF75Bd8447b390E", // RoyaltyPolicyLAP address from https://docs.story.foundation/developers/deployed-smart-contracts defaultMintingFee: parseEther("1"), // 1 $WIP expiration: BigInt(0), commercialUse: true, commercialAttribution: true, // must give us attribution commercializerChecker: zeroAddress, commercializerCheckerData: zeroAddress, commercialRevShare: 5, // can claim 50% of derivative revenue commercialRevCeiling: BigInt(0), derivativesAllowed: true, derivativesAttribution: true, derivativesApproval: false, derivativesReciprocal: true, derivativeRevCeiling: BigInt(0), currency: WIP_TOKEN_ADDRESS, uri: "", };}main();
자신만의 커스텀 ERC-721 NFT 컬렉션을 만들고 register 함수를 사용하세요 - nftContract 및 tokenId - 대신mintAndRegisterIp 함수를 사용합니다. 작동하는 코드 예제는 여기를 참조하세요. 이는 이미 자신만의 커스텀 로직이 있는 커스텀 NFT 컨트랙트가 있거나, IP 자체가 NFT인 경우에 유용합니다.