AI 생성 예술 작품은 단순한 픽셀 배열 이상입니다. 각 작품 뒤에는 생성 과정, 창작자 정보, 사용된 모델, 프롬프트, 파라미터 등 풍부한 메타데이터가 있습니다. 이러한 정보를 체계적으로 기록하고 전달하는 것은 투명성, 출처 추적, 저작권 관리, 그리고 생태계 전반의 상호운용성을 위해 필수적입니다.
WIA-ART-002 표준은 AI 생성 예술을 위한 포괄적인 데이터 형식과 메타데이터 스키마를 정의합니다. 이 장에서는 이미지 파일 형식, 메타데이터 구조, 블록체인 통합을 위한 출처 기록, 그리고 다양한 플랫폼 간의 데이터 교환 방법을 다룹니다.
WIA-ART-002는 다양한 용도와 요구사항을 충족하기 위해 여러 이미지 파일 형식을 지원합니다:
| 형식 | 특징 | 용도 | 메타데이터 지원 |
|---|---|---|---|
| PNG | 무손실, 투명도 지원 | 최종 결과물, 보관용 | EXIF, XMP, tEXt 청크 |
| JPEG/JPG | 손실 압축, 작은 파일 크기 | 웹 공유, 미리보기 | EXIF, XMP, IPTC |
| WebP | 효율적 압축, 투명도 | 웹 최적화 | EXIF, XMP |
| AVIF | 차세대 압축, HDR | 고품질 웹 배포 | EXIF, XMP |
| TIFF | 무손실, 다층 | 아카이브, 인쇄 | EXIF, IPTC, XMP |
PNG는 WIA-ART-002에서 권장하는 주요 형식으로, tEXt 청크를 통해 커스텀 메타데이터를 저장할 수 있습니다:
// TypeScript: PNG 메타데이터 임베딩
import { PNG } from 'pngjs';
import { WIAArtMetadata } from 'wia-art-002';
function embedMetadata(imageBuffer: Buffer, metadata: WIAArtMetadata): Buffer {
const png = PNG.sync.read(imageBuffer);
// WIA-ART-002 메타데이터를 tEXt 청크로 저장
png.text = {
'wia-art-002:version': '1.0',
'wia-art-002:metadata': JSON.stringify(metadata),
'wia-art-002:signature': signMetadata(metadata)
};
return PNG.sync.write(png);
}
// 사용 예시
const metadata: WIAArtMetadata = {
standard: 'WIA-ART-002',
version: '1.0',
artwork: {
id: 'art-2024-001',
title: 'Cyberpunk Cityscape',
created: '2024-01-15T10:30:00Z',
creator: {
type: 'human-ai-collaboration',
human: {
address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',
name: 'Alice Chen'
},
aiModel: {
name: 'stable-diffusion-xl',
version: '1.0',
provider: 'Stability AI'
}
},
generation: {
prompt: 'futuristic cyberpunk city at night, neon lights...',
negativePrompt: 'blurry, low quality, distorted',
seed: 42,
steps: 50,
cfgScale: 7.5,
sampler: 'DPM++ 2M Karras',
size: { width: 1024, height: 1024 }
}
}
};
const imageWithMetadata = embedMetadata(originalImage, metadata);
WIA-ART-002 메타데이터는 계층적 JSON 구조로 정의되며, 다음 주요 섹션으로 구성됩니다:
{
// 표준 식별
"standard": "WIA-ART-002",
"version": "1.0",
// 작품 정보
"artwork": {
"id": "unique-identifier",
"title": "작품 제목",
"description": "작품 설명",
"created": "ISO 8601 타임스탬프",
"modified": "마지막 수정 시간",
"tags": ["tag1", "tag2"]
},
// 창작자 정보
"creator": {
"type": "human|ai|human-ai-collaboration",
"human": { /* 인간 창작자 정보 */ },
"aiModel": { /* AI 모델 정보 */ }
},
// 생성 파라미터
"generation": {
"prompt": "텍스트 프롬프트",
"negativePrompt": "부정 프롬프트",
"seed": 난수 시드,
"steps": 샘플링 단계,
"cfgScale": 가이던스 스케일,
/* 추가 파라미터 */
},
// 출처 및 권리
"provenance": {
"blockchain": "체인 이름",
"transactionHash": "블록체인 트랜잭션",
"ipfsHash": "IPFS 해시"
},
"rights": {
"license": "라이선스 유형",
"commercialUse": boolean,
"derivatives": boolean
}
}
AI 생성 예술의 특성상, 창작 과정에 인간과 AI가 모두 관여합니다. WIA-ART-002는 이를 명확히 구분하고 기록합니다:
// 인간-AI 협업 창작자 정보
{
"creator": {
"type": "human-ai-collaboration",
// 인간 창작자
"human": {
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
"name": "Alice Chen",
"role": "prompt-engineer", // 또는 "artist", "designer"
"contribution": "프롬프트 작성, 파라미터 조정, 최종 선택"
},
// AI 모델 정보
"aiModel": {
"name": "stable-diffusion-xl",
"version": "1.0",
"provider": "Stability AI",
"trainingData": {
"dataset": "LAION-5B",
"ethicalClearance": true,
"artistOptOut": "https://haveibeentrained.com/"
},
"modelHash": "sha256:abc123...",
"inferenceProvider": "Replicate.com"
},
// 선택적: 추가 기여자
"additionalContributors": [
{
"address": "0x123abc...",
"role": "concept-artist",
"contribution": "초기 컨셉 스케치 제공"
}
]
}
}
재현성(Reproducibility)을 위해 모든 생성 파라미터를 상세히 기록합니다:
| 파라미터 | 타입 | 설명 | 필수 |
|---|---|---|---|
prompt |
string | 정 프롬프트 (최대 10,000자) | 필수 |
negativePrompt |
string | 부정 프롬프트 | 선택 |
seed |
integer | 난수 생성 시드 (재현성) | 필수 |
steps |
integer | 샘플링 단계 수 (1-200) | 필수 |
cfgScale |
float | 분류자 없는 가이던스 스케일 (1-30) | 필수 |
sampler |
string | 샘플러 알고리즘명 | 필수 |
size |
object | 이미지 크기 {width, height} | 필수 |
controlNet |
array | ControlNet 설정 | 선택 |
lora |
array | LoRA 모델 및 가중치 | 선택 |
initImage |
string | img2img 초기 이미지 해시 | 선택 |
denoisingStrength |
float | img2img 디노이징 강도 (0-1) | 선택 |
WIA-ART-002는 블록체인을 활용하여 변조 불가능한 출처 기록을 유지합니다. 이는 작품의 진위성을 보장하고, 소유권 이력을 투명하게 추적할 수 있게 합니다:
// 블록체인 출처 기록 구조
{
"provenance": {
// 블록체인 정보
"blockchain": "ethereum",
"network": "mainnet", // 또는 "goerli", "polygon", 등
"contractAddress": "0xABC123...",
"tokenId": "12345",
"standard": "ERC-721", // 또는 "ERC-1155"
// 민팅 정보
"mintTransaction": {
"hash": "0x789def...",
"block": 18234567,
"timestamp": "2024-01-15T10:30:00Z",
"minter": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"
},
// IPFS 저장
"ipfs": {
"imageHash": "QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX",
"metadataHash": "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG",
"gateway": "https://ipfs.io/ipfs/"
},
// 소유권 이력
"ownershipHistory": [
{
"owner": "0x742d35...",
"from": "2024-01-15T10:30:00Z",
"to": "2024-02-20T14:20:00Z",
"transactionHash": "0x789def..."
},
{
"owner": "0x456abc...",
"from": "2024-02-20T14:20:00Z",
"to": null, // 현재 소유자
"transactionHash": "0xfedcba..."
}
],
// 검증 정보
"verification": {
"verified": true,
"verifier": "WIA-Official-Registry",
"verificationDate": "2024-01-15T10:35:00Z",
"signature": "0x1234..."
}
}
}
블록체인이 항상 필요한 것은 아닙니다. 오프체인 방식도 지원하며, 중앙화된 레지스트리나 분산 데이터베이스를 사용할 수 있습니다:
{
"provenance": {
"type": "offchain",
"registry": "WIA-Central-Registry",
"registryUrl": "https://registry.wia-official.org",
"artworkId": "art-2024-001",
"registeredAt": "2024-01-15T10:30:00Z",
// 디지털 서명
"signature": {
"algorithm": "ECDSA",
"publicKey": "0x04abc123...",
"signature": "0x789def...",
"message": "SHA-256 hash of artwork + metadata"
},
// 타임스탬프 증명
"timestamp": {
"service": "OpenTimestamps",
"proof": "base64-encoded-proof",
"bitcoinBlock": 823456
}
}
}
WIA-ART-002는 다양한 오픈 및 상업 라이선스를 지원합니다:
| 라이선스 | 상업적 사용 | 수정 허용 | 재배포 | 귀속 필요 |
|---|---|---|---|---|
| CC0 | 허용 | 허용 | 허용 | 불필요 |
| CC-BY-4.0 | 허용 | 허용 | 허용 | 필수 |
| CC-BY-SA-4.0 | 허용 | 허용 | 동일 라이선스 | 필수 |
| CC-BY-NC-4.0 | 불허 | 허용 | 허용 | 필수 |
| CC-BY-ND-4.0 | 허용 | 불허 | 허용 | 필수 |
| All Rights Reserved | 금지 | 금지 | 금지 | N/A |
| Custom | 별도 정의 | 별도 정의 | 별도 정의 | 별도 정의 |
{
"rights": {
// 기본 라이선스
"license": "CC-BY-SA-4.0",
"licenseUrl": "https://creativecommons.org/licenses/by-sa/4.0/",
// 권리 세부사항
"commercialUse": true,
"derivatives": true,
"distribution": true,
"attributionRequired": true,
"shareAlike": true,
// 귀속 정보
"attribution": {
"name": "Alice Chen",
"url": "https://aliceart.com",
"required": "Alice Chen / Stable Diffusion XL 1.0"
},
// 추가 제한사항
"restrictions": [
"불법적 목적으로 사용 금지",
"AI 모델 재학습에 사용 금지 (선택적)"
],
// 커스텀 라이선스 (선택적)
"customLicense": {
"text": "전체 라이선스 텍스트...",
"url": "https://example.com/custom-license.txt"
},
// 저작권 정보
"copyright": {
"holder": "Alice Chen",
"year": 2024,
"notice": "© 2024 Alice Chen. All rights reserved."
}
}
}
메타데이터의 무결성을 보장하기 위해 ECDSA 디지털 서명을 사용합니다:
// TypeScript: 메타데이터 서명 및 검증
import { ethers } from 'ethers';
class MetadataSignature {
// 메타데이터 서명
static async sign(metadata: object, privateKey: string): Promise {
const wallet = new ethers.Wallet(privateKey);
// 메타데이터를 정규화된 JSON으로 변환
const normalized = JSON.stringify(metadata, Object.keys(metadata).sort());
// SHA-256 해시
const hash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(normalized));
// 서명
const signature = await wallet.signMessage(ethers.utils.arrayify(hash));
return signature;
}
// 서명 검증
static verify(metadata: object, signature: string, address: string): boolean {
// 메타데이터를 정규화된 JSON으로 변환
const normalized = JSON.stringify(metadata, Object.keys(metadata).sort());
// SHA-256 해시
const hash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(normalized));
// 서명으로부터 주소 복구
const recoveredAddress = ethers.utils.verifyMessage(
ethers.utils.arrayify(hash),
signature
);
// 주소 비교
return recoveredAddress.toLowerCase() === address.toLowerCase();
}
}
// 사용 예시
const metadata = { /* WIA-ART-002 메타데이터 */ };
const privateKey = '0x...'; // 창작자의 개인키
const signature = await MetadataSignature.sign(metadata, privateKey);
// 메타데이터에 서명 추가
metadata.signature = {
value: signature,
signer: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',
timestamp: new Date().toISOString()
};
JSON Schema를 사용하여 메타데이터의 구조적 유효성을 검증합니다:
// JSON Schema for WIA-ART-002 Metadata
const wiaArt002Schema = {
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "WIA-ART-002 Metadata Schema",
"type": "object",
"required": ["standard", "version", "artwork", "creator"],
"properties": {
"standard": {
"type": "string",
"const": "WIA-ART-002"
},
"version": {
"type": "string",
"pattern": "^\\d+\\.\\d+$"
},
"artwork": {
"type": "object",
"required": ["id", "title", "created"],
"properties": {
"id": { "type": "string" },
"title": { "type": "string" },
"created": { "type": "string", "format": "date-time" }
}
},
"creator": {
"type": "object",
"required": ["type"],
"properties": {
"type": {
"type": "string",
"enum": ["human", "ai", "human-ai-collaboration"]
}
}
}
}
}
// 검증 함수
import Ajv from 'ajv';
function validateMetadata(metadata: any): { valid: boolean; errors?: string[] } {
const ajv = new Ajv();
const validate = ajv.compile(wiaArt002Schema);
const valid = validate(metadata);
return {
valid,
errors: valid ? undefined : validate.errors?.map(e => e.message)
};
}