إنشاء مجموعة NFT  باستخدام  Python

أصبحت NFT) non-fungible tokens) أو (الرموز الغير قابلة للاستبدال) أكثر شيوعًا وشهرة بمرور الوقت، تم تقديم العالم السائد إلى NFT عندما أبلغت بلومبرج عن بيع عملة مشفرة إلى Visa مقابل 150 ألف دولار، أما بالنسبة لمعظم الناس، يبدو أنه مبلغ ضخم من المال مقابل صورة بسيطة موجودة فقط في العالم الرقمي.

أما الجزء الأول مكون من سلسلة NFT Creator من خلال أربع خطوات:

  • إنشاء مجموعة NFT الخاصة بك باستخدام Python.
  • إنشاء بيانات تعريف NFT.
  • نشر عقود NFT الذكية.
  • سك عملة NFT.

نظرة عامة على  NFT Creator

المنهجية

منهجية البرنامج النصي بسيطة للغاية:  إنشاء صورة أفاتار فريدة من خلال الجمع بين السمات المختلفة معًا.

احصل على بياناتك

سوف تستخدم البيانات من مستودع “Substrapunks” بواسطة usetech-llc.  

استيراد الحزم اللازمة

إليك مجموعة من الحزم المستخدمة بهذا المشروع، يمكن معرفة المزيد من المعلومات عنها عند الدخول للرابط.

from PIL import Image 
from IPython.display import display 
import random
import json
import os

تعيين سمة الندرة

تتكون كل صورة رمزية من خمس سمات:

  1. وجه (Face)
  2. آذان  (Ears)
  3. شعر (Hair)
  4. فم  (Mouth)
  5. أنف  (Nose)

مثلًا، يجب أن تكون بعض الأنوف أكثر ندرة من غيرها، لهذا، ستحتاج إلى تعيين أوزان لأنواع مختلفة من الأنوف. يجب أن يصل إجمالي المصفوفة دائمًا إلى 100.

هناك نوعان من الوجوه (أبيض وأسود)، أنت تحدد للبرنامج أن الصورة لديها فرصة 60٪ للحصول على وجه أبيض و 40٪ لتخصيص وجه أسود.

# Each image is made up a series of traits
# The weightings for each trait drive the rarity and add up to 100%

face = ["White", "Black"]
face_weights = [60, 40]

ears = ["No Earring", "Left Earring", "Right Earring", "Two Earrings"]
ears_weights = [25, 30, 44, 1]

eyes = ["Regular", "Small", "Rayban", "Hipster", "Focused"]
eyes_weights = [70, 10, 5 , 1 , 14]

hair = ['Up Hair', 'Down Hair', 'Mohawk', 'Red Mohawk', 'Orange Hair', 'Bubble Hair', 'Emo Hair',
 'Thin Hair',
 'Bald',
 'Blonde Hair',
 'Caret Hair',
 'Pony Tails']
hair_weights = [10 , 10 , 10 , 10 ,10, 10, 10 ,10 ,10, 7 , 1 , 2]

mouth = ['Black Lipstick', 'Red Lipstick', 'Big Smile', 'Smile', 'Teeth Smile', 'Purple Lipstick']
mouth_weights = [10, 10,50, 10,15, 5]

nose = ['Nose', 'Nose Ring']
nose_weights = [90, 10]

صنف سماتك

تُستخدم القواميس في حال كنت تريد اسمًا مختلفًا للسمة الخاصة بك. من أجل التبسيط ، يتم الاحتفاظ بأسماء الملفات الأصلية باستثناء الوجوه.

كما يتم تصنيف اسم السمة “face1” على أنه وجه أبيض بينما يتم تصنيف “face2” على أنه وجه أسود.

#Classify traits

face_files = {
    "White": "face1",
    "Black": "face2"
}

ears_files = {
    "No Earring": "ears1",
    "Left Earring": "ears2",
    "Right Earring": "ears3",
    "Two Earrings": "ears4"
}

eyes_files = {
    "Regular": "eyes1",
    "Small": "eyes2",
    "Rayban": "eyes3",
    "Hipster": "eyes4",
    "Focused": "eyes5"     
}

hair_files = {
    "Up Hair": "hair1",
    "Down Hair": "hair2",
    "Mohawk": "hair3",
    "Red Mohawk": "hair4",
    "Orange Hair": "hair5",
    "Bubble Hair": "hair6",
    "Emo Hair": "hair7",
    "Thin Hair": "hair8",
    "Bald": "hair9",
    "Blonde Hair": "hair10",
    "Caret Hair": "hair11",
    "Pony Tails": "hair12"
}


mouth_files = {
    "Black Lipstick": "m1",
    "Red Lipstick": "m2",
    "Big Smile": "m3",
    "Smile": "m4",
    "Teeth Smile": "m5",
    "Purple Lipstick": "m6"
}

nose_files = {
    "Nose": "n1",
    "Nose Ring": "n2"   
}

تحديد سمات الصور

تعد كل صورة رمزية قمت بإنشائها، عبارة عن مزيج من ست صور فوق بعضها البعض: الوجه والأنف والفم والأذنين والعينين.

لذلك، تكتب حلقة for لتدمج هذه السمات في صورة واحدة لعدد إجمالي محدد من الصور، ثم تنشئ قاموسًا لكل صورة تحدد السمات التي تمتلكها، ثم يتم إعطاء هذه السمات بناءً على وظيفة random choices ().

تتجاوز هذه الوظيفة قائمة سمات الوجه (أبيض، أسود) وتمنح الأبيض (فرصة 60٪) أو أسود (فرصة 40٪).

## Generate Traits

TOTAL_IMAGES = 100 # Number of random unique images we want to generate

all_images = [] 

# A recursive function to generate unique image combinations
def create_new_image():
    
    new_image = {} #

    # For each trait category, select a random trait based on the weightings 
    new_image ["Face"] = random.choices(face, face_weights)[0]
    new_image ["Ears"] = random.choices(ears, ears_weights)[0]
    new_image ["Eyes"] = random.choices(eyes, eyes_weights)[0]
    new_image ["Hair"] = random.choices(hair, hair_weights)[0]
    new_image ["Mouth"] = random.choices(mouth, mouth_weights)[0]
    new_image ["Nose"] = random.choices(nose, nose_weights)[0]
    
    if new_image in all_images:
        return create_new_image()
    else:
        return new_image
    
    
# Generate the unique combinations based on trait weightings
for i in range(TOTAL_IMAGES): 
    
    new_trait_image = create_new_image()
    
    all_images.append(new_trait_image)

التحقق من صحة التفرد

من الضروري عند إنشاء مشاريع خاصة ب NFT أن تكون كل صورة شخصية فريدة من نوعها، وبالتالي، عليك التحقق من أن تكون جميع الصور فريدة. بحيث يتم كتابة وظيفة بسيطة فوق كل الصور ويتم تخزينها في قائمة، ثم تعيد الصور المكررة.

بعد ذلك، قم بإضافة معرفًا فريدًا لكل صورة.

# Returns true if all images are unique
def all_images_unique(all_images):
    seen = list()
    return not any(i in seen or seen.append(i) for i in all_images)

print("Are all images unique?", all_images_unique(all_images))
# Add token Id to each image
i = 0
for item in all_images:
    item["tokenId"] = i
    i = i + 1
   
print(all_images)

عد السمات

بعد القيام بتعيين السمات، وفقًا للأوزان التي تم تحديدها مسبقًا والوظيفة العشوائية لها، وهذا يعني بأنه من غير المحتمل أن يكون لديك 60 وجهًا أبيضًا تمامًا. حتى إذا قمت بتحديد وزن الوجوه البيضاء ليكون 60، ولمعرفة مقدار كل سمة بالضبط، عليك أن ترغب في تتبع عدد السمات الموجودة الآن في مجموعتك من الصور.

للقيام بذلك، اكتب الكود التالي:

  • حدد قاموسًا لكل سمة من السمات بتصنيفاتها الخاصة وابدأ بالرقم 0.
  • قم بتكرار الصور التي تم إنشاؤها وإضافتها إلى قاموس السمات الخاص بك.
# Get Trait Counts

face_count = {}
for item in face:
    face_count[item] = 0
    
ears_count = {}
for item in ears:
    ears_count[item] = 0

eyes_count = {}
for item in eyes:
    eyes_count[item] = 0
    
hair_count = {}
for item in hair:
    hair_count[item] = 0
    
mouth_count = {}
for item in mouth:
    mouth_count[item] = 0
    
nose_count = {}
for item in nose:
    nose_count[item] = 0

for image in all_images:
    face_count[image["Face"]] += 1
    ears_count[image["Ears"]] += 1
    eyes_count[image["Eyes"]] += 1
    hair_count[image["Hair"]] += 1
    mouth_count[image["Mouth"]] += 1
    nose_count[image["Nose"]] += 1
    
print(face_count)
print(ears_count)
print(eyes_count)
print(hair_count)
print(mouth_count)
print(nose_count)

إنشاء الصور

هذا هو الجزء الجميل في إنشاء الصور، سيتم تنفيذ البرنامج النصيّ لكل صورة كما يلي:

  • افتح ملف خصائص الصورة حيث حددنا السمات.
  • حدد صورة السمة المعنية في دليلك باستخدام حزمة PIL.
  • اجمع كل السمات في صورة واحدة.
  • التحويل إلى RGB، هذا هو النموذج الألوان الأكثر استخدامًا.
  • قم بحفظه على جهاز الحاسوب.
#### Generate Images

os.mkdir(f'./images')

for item in all_images:

    im1 = Image.open(f'./scripts/face_parts/face/{face_files[item["Face"]]}.png').convert('RGBA')
    im2 = Image.open(f'./scripts/face_parts/eyes/{eyes_files[item["Eyes"]]}.png').convert('RGBA')
    im3 = Image.open(f'./scripts/face_parts/ears/{ears_files[item["Ears"]]}.png').convert('RGBA')
    im4 = Image.open(f'./scripts/face_parts/hair/{hair_files[item["Hair"]]}.png').convert('RGBA')
    im5 = Image.open(f'./scripts/face_parts/mouth/{mouth_files[item["Mouth"]]}.png').convert('RGBA')
    im6 = Image.open(f'./scripts/face_parts/nose/{nose_files[item["Nose"]]}.png').convert('RGBA')

    #Create each composite
    com1 = Image.alpha_composite(im1, im2)
    com2 = Image.alpha_composite(com1, im3)
    com3 = Image.alpha_composite(com2, im4)
    com4 = Image.alpha_composite(com3, im5)
    com5 = Image.alpha_composite(com4, im6)

                     

    #Convert to RGB
    rgb_im = com5.convert('RGB')
    file_name = str(item["tokenId"]) + ".png"
    rgb_im.save("./images/" + file_name)

المصدر: https://betterprogramming.pub/create-your-own-nft-collection-with-python-82af40abf99f