ERC-20, ERC-721 ve ERC-1155 Nedir?
Bu yazıda Ethereum hakkında bazı temel soruları kısaca cevaplandırıp asıl konumuz olan ERC-20, ERC-721 ve ERC-1155 standartlarını anlamaya çalışacağız.
Coin ve token farkı nedir?
Öncelikle coin ve token farkını kısaca cevaplayarak başlayalım. Bir kripto paranın coin mi yoksa token mı olduğunu anlamak için ilk bakacağımız nokta, kendi blokzincirinin olup olmamasıdır. Coinler kendi blokzincirine sahipken tokenlar başka blokzincirler üzerindedirler. Örneğin Ether (ETH) kendi blokzinciri üzerinde çalışan bir “coin” iken Uniswap (UNI), Ethereum blokzinciri üzerinde çalışan bir “token”dır.
Ethereum nedir? Bir token Ethereum blokzinciri üzerinde nasıl oluşturulur?
Ethereum, üzerinde akıllı sözleşmeler ile çeşitli uygulamalar ve tokenlar oluşturulabilen merkeziyetsiz bir blokzincir projesidir. Ethereum ağında bir token oluşturmak için, bu tokenın özelliklerinin belirtildiği bir akıllı kontrat yazıp deploy etmek yeterlidir. Burada bir diğer nokta ise oluşturulacak tokenın hangi ERC standartında oluşturulacağıdır.
EIP ve ERC nedir?
EIP (Ethereum Improvement Proposals): Açılımı Ethereum iyileştirme önerileri anlamına gelen EIP’ler, Ethereum ağ yükseltmeleri veya iyileştirmeleri gibi geliştirmeler için önerilerin sunulup tartışıldığı, kabul veya ret edildiği süreçlerdir.
ERC (Ethereum Request for Comment): Ethereum ağında geliştirilen protokoller ve sözleşmelerin kurallarını tanımlayan standartlardır. Bu yazıda çok bilinen ve kullanılan ERC standartlarından ERC-20, ERC-721 ve ERC-1155 standartlarını inceleyeceğiz.
ERC-20 Nedir?
ERC-20, Ethereum ağında çalışan bir kripto para standartıdır ve ilklerdendir. ERC-20 standardı ilk olarak 2015 yılında önerilmiş ve 2017 yılında ekosistemde hızla yer almaya başlamıştır. Bu standardın bir diğer adı ise değiştirilebilir (fungible) tokendır.
ERC-20 ile oluşturulan tokenların her biri diğeri ile eşit değerdedir. ERC-20, aynı standardı kullanan tüm tokenların aynı şekilde çalışmasını sağlar. Böylece bu tokenların Ethereum ağında kolayca oluşturulması, depolanması, transfer edilmesi sağlanır.
Özetle ERC-20:
Token oluşturmak için devrimsel bir adımdır
Homojen, değiştirilebilir (fungible) token oluşturmayı destekler
Sadeliği ve kullanım kolaylığı ile ön plana çıkmıştır
Kripto ekosisteminin büyümesinde etkisi yadsınamaz
ERC-20’nin içerdiği temel fonksiyonlar şunlardır:
totalSupply(): Toplam token sayısını döndürür. Örneğin, 100.000 gibi.
balanceOf(address _owner): Bu fonksiyon, belirtilen adresin (_owner) sahip olduğu token miktarını döndürür. Örneğin, 10.000 gibi.
transfer(address _to, uint256 _value): Bu fonksiyon, belirtilen adrese (_to) belirtilen miktarda (_value) tokenı gönderir. Örneğin, 10 token göndermek için
transfer(0x123..., 10) gibi kullanılabilir.
approve(address _spender, uint256 _value): Bu fonksiyon, belirtilen adres (_spender) için belirtilen miktarda (_value) tokenın transfer yetkisini onaylar. Örneğin, 10 token için approve(0x123..., 10) gibi kullanılabilir.
allowance(address _owner, address _spender): Bu fonksiyon, belirtilen adresin (_owner) belirtilen adres için (_spender) onay verdiği token miktarını döndürür. Örneğin, 10 token onaylandıysa allowance(0x123..., 0x456...) 10 döndürür.
transferFrom(address _from, address _to, uint256 _value): Bu fonksiyon, belirtilen adresten (_from) başka bir adrese (_to) belirtilen miktarı (_value) aktarır.
ERC-721 Nedir?
ERC-721 standardı 2018 yılında CryptoKitties projesinin de kurucusu olan Dieter Shirley’in dahil olduğu bir grup tarafından NFT’ler için akıllı sözleşme tarafında bir standart oluşturmak amacı ile önerilmiştir. ERC-721, ERC-20 standardındaki “her token bir diğerinin aynısıdır” ilkesinin aksine, benzersiz (unique) tokenlar oluşturma ihtiyacına binaen ortaya çıkmıştır. Bu durumda ERC-721 ile aynı akıllı kontrattan oluşturulmuş tokenlar, birbirinden bağımsız olarak farklı değerlere sahip olabilmektedirler. Bu tokenlar bölünemezler. Akıllı kontrat tarafında ise bu durumun sağlanması için her bir tokenın kendinin benzersiz ID’sinin tanımlandığı “tokenId
” değişkeni bulunur. Bu özelliği sayesinde ERC-721, oyun içi öğeler, sanat eserleri, gayrimenkul ve çeşitli sertifikaları tokenize etmek için uygun bir standarttır.
ERC-20 ile aralarındaki en büyük fark ise ERC-721 standardı token URI dediğimiz bir linke sahiptir. Bu link NFT’nin yani tokenın metadatasını barındırmaktadır. NFT’nin adı nedir, özellikleri nelerdir, görüntüsü nasıldır gibi. ERC-721 ile her bir tokenın eşsiz olmasının yanı sıra her bir tokenın kendine has özelliklerinin olduğu eşsiz bir yapı elde ediyoruz. Bu protokol genellikle sanatsal koleksiyonlarda kullanılmakla birlikte üzerine inşa edilebilecek özellikler sayesinde pek çok kullanım alanına sahiptir.
Özetle ERC-721:
Homojen olmayan, değiştirilemez (Non-Fungible) tokenlar oluşturmayı sağlar
Gerçek hayattaki eşsiz varlıkları tokenize etmek için uygundur
ERC-721’in içerdiği temel fonksiyonlar şunlardır:
balanceOf(address _owner): Belirtilen adresin (_owner) sahip olduğu token sayısını döndürür. Örneğin, 10 gibi.
ownerOf(uint256 _tokenId): Belirtilen tokenın (_tokenId) sahibinin adresini döndürür. Örneğin, 0x123... gibi.
approve(address _to, uint256 _tokenId): Belirtilen adrese (_to) belirtilen tokenın (_tokenId) aktarımına onay verir. Örneğin, approve(0x123..., 0x456...) gibi.
getApproved(uint256 _tokenId): Belirtilen token ID'sine (_tokenId) onay verilen adresi döndürür. Örneğin, 0x123... gibi.
setApprovalForAll(address _operator, bool _approved): Belirtilen adresin (_operator) tüm token ID'leri için aktarım onayını (_approved) ayarlar. Örneğin, 0x123... adresinin tüm token ID'leri için onay vermesini sağlamak için setApprovalForAll(0x123..., true) gibi kullanılabilir.
isApprovedForAll(address _owner, address _operator): Belirtilen adresin (_owner) diğer adresin (_operator) tüm token ID'leri için onay durumunu döndürür.
transferFrom(address _from, address _to, uint256 _tokenId): Belirtilen tokenı (_tokenId) belirtilen adresten (_from) başka bir adrese (_to) aktarır.
safeTransferFrom(address _from, address _to, uint256 _tokenId): transferFrom ile benzerdir fakat burada alıcı adres ile ekstra bir approval kontrolü yaparak daha güvenli bir aktarıma olanak tanır.
ERC-1155 Nedir?
Evet, görüyoruz ki değiştirilebilir homojen token ihtiyacımıza ERC-20 yetişiyor. Değiştirilemez (Non-Fungible) token ihtiyacımıza ise ERC-721 yetişiyor.
Peki, diyelim ki içinde birkaç farklı token mekanizması ve oyun içi varlıkları temsilen birkaç farklı NFT kategorisi bulunan bir oyun projemiz var. Burada ERC-20 ve ERC-721 ile farklı akıllı sözleşmeler yazarak ihtiyacımız olan token ve NFT mekanizmasını oluşturmayı düşünüyoruz fakat aklımızı kurcalayan bir sorun var. O da her bir token ve nft grubu için ayrı ayrı akıllı sözleşmeler yazmanın maliyeti ve dahası, kullanıcıların yaptığı her bir farklı token ve NFT işleminin kullanıcıya oluşturacağı Gas maliyeti.
İşte tam burada ERC-1155 imdadımıza yetişiyor ve ihtiyacımız olan birçok değiştirilebilir ve/veya değiştirilemez tokenı tek bir akıllı sözleşme ile oluşturmamıza imkân sağlıyor. Kullanıcının Gas maliyeti problemini ise, kullanıcının yapacağı işlemleri toplu hale getirip tek bir işlemde yapabilmesini sağlayarak çözüyor ve Gas maliyetini düşürüyor.
Daha iyi anlaşılması adına detaylı bir örnek üzerinden gidelim. NFT’ler değiştirilemez (non-fungible) yani her biri eşsiz varlıklar dedik. Şimdi birçok farklı eşya kategorisi olan bir oyunu düşündüğümüzde bu eşyaları ERC-721 NFT’leri ile oluşturmanın neden uygun olmadığına daha detaylı bakalım.
Bu oyunda, kılıç kategorisinde aynı özelliklere sahip bir kılıçtan 100 adet var diyelim. Bu 100 kılıcın tamamı birebir aynıdır. Bu durumda ERC-721 kullanmak uygun olmayacaktır çünkü bu varlıklar eşsiz değil birbirleri ile eş değerde varlıklardır. Burada aklımıza, eğer eş değerde yani değiştirilebilir varlık özelliği gösteriyorlar ise neden ERC-20 ile oluşturulamazlar? sorusu gelebilir. Bu sorunun cevabı kısaca, ERC-20 standartının metadata saklama özelliği olmadığından, kılıçların görseli, ismi ve hasar gücü gibi özellikleri saklanamaz dolayısıyla kılıç örneğindeki gibi eşyalar ERC-20 ile temsil edilemezler.
İşte tam bu noktada ERC-1155 protokolü, hem ERC-20’de ki eş değer varlıklar hem de ERC-721’de ki metadataya sahip varlıkları tek bir standartta temsil etmek için geliştirildi. Geliştiricileri ERC-1155’i tek bir varlık için değil, sayısız varlık için kullanılabilecek şekilde tasarladılar. Bu sayede bir oyundaki kılıç, ok, zırh ve diğer tüm varlıkların tek bir sözleşme ile yönetilebilmesi sağlandı. Böylece, her bir tür varlık, kendine has bir token ID’ye sahip ve bu türlerden istenildiği kadar üretilebiliyor. Mesela kılıcın ID numarası “0”, kalkanın “1”, zırhın ise “2” olsun. Benim 10 kılıcım, 5 kalkanım, 1 tane de zırhım var ise, “0” ID’li 10 adet, “1” ID’li 5 adet ve “2” ID’li 1 adet varlığım vardır.
ERC-1155 birden fazla varlığı barındırması sayesinde oyunlar için biçilmiş kaftan olmakla birlikte her biri birbiri ile eş değer NFT’ler (ya da SFT – Semi-Fungible Token) özelliği sayesinde gerçek hayattaki varlıkları da blokzincir üzerinde işlemek için çok uygundur. Örneğin konser veya uçak biletleri gibi. Mesela THY yeni bir uçuş düzenleyeceği zaman o uçuşa özel bir token ID ayarlar ve bu token ID’den 100 adet üreterek yolculara bunu satar. Her bilet birbiri ile eş değerdir, fakat farklı bir uçuşun bileti ile eş değer değildir, çünkü token ID farklıdır. Bu durumda uçuştan vazgeçerseniz biletinizi hemen başka birine satabilirsiniz!
Evet, şöyle bir geriye dönüp baktığımızda, ERC-20’de sadece token adedinin önemi varken (amount
), ERC-721’de hangi tokena sahip olduğunuzun önemi vardır (tokenId). ERC-1155’te ise hangi tür tokendan, kaç adete sahip olduğunuzun önemi vardır (tokenId
ve amount
).
“Yine de ERC-1155, ERC-721 ile çok benzer” diye düşünüyorsanız farka dikkat: ERC-1155’te her token ID için en fazla 1 adet token üretirseniz, ERC-721 ile birebir aynı olur! Çünkü her token ID eşsiz yani Non-Fungible Token! Fakat biz aynı token ID’den birden fazla üretince bu token ID kendi içerisinde değiştirilebilir yani fungible oluyor. Bu yüzden de ERC-1155 tokenlara yarı değiştirilebilir (SFT – Semi-Fungible Token) deniyor. Fakat bu teknik tanımdan ziyade daha çok NFT olarak tanımlanıyorlar.
Özetle ERC-1155:
Değiştirilebilir (fungible), değiştirilemez (non-fungible), yarı-değiştirilebilir (semi-fungible) tokenları destekler
ERC-20 ve ERC-721 standartlarının işlevlerini gerçekleştirebilir
Çoklu token oluşturma imkânı sağlar
ERC-1155 ile oluşturulan tokenlar ile aynı anda yapılacak toplu işlemler, tek bir işlem maliyeti ile yapılabilir
ERC-1155’in içerdiği temel fonksiyonlar şunlardır:
safeBatchTransferFrom (address _from, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data): Bir adresten (_from) diğerine (_to) farklı tiplerde (_ids) token transfer etmek için kullanılır. Örneğin, safeBatchTransferFrom(0x123..., 0x456..., [1, 2, 3], [10, 20, 30], "") gibi kullanılabilir.
safeTransferFrom(adress _from, adress _to, uint256 _id, uint256 _value, bytes calldata _data): Tek tipte bir tokenı bir adresten (_from) diğerine (_to) tokenın ID’si (_id), miktarı (_value) girilerek tokenı transfer etmek için kullanılır. Örneğin, safeTransferFrom(0x123..., 0x456..., 1, 10, "") gibi kullanılabilir.
balanceOf(adress _owner, uint256 _id): Bu fonksiyon, belirtilen ID’ye (_id) sahip tokenlerın girilen adresteki (_owner) miktarı döndürür. Örneğin, balanceOf(0x123..., 1) => 10 adet gibi.
balanceOfBatch(adress _owner, uint256[] _ids): Bu fonksiyon belirtilen adresin (_owner) belirtilen ID’li tokenların ne kadarına sahip olduğunun miktarını içeren bir dizi döndürür. Örneğin, balanceOfBatch(0x123..., [1, 2, 3]) => [10,000, 5,000, 1,000] döndürebilir.
setApprovalForAll(adres _operator, bool _approved): Belirtilen adrese (_operator) ait onay durumunu belirtilen boolean değeri (_approved) olarak ayarlar. Örneğin, setApprovalForAll(0x123..., true) işlem yapan cüzdanın adresindeki varlıkları yönetmeye onay vermek için kullanılabilir.
isApprovedForAll(adres _owner, adres _operator): Belirtilen adresin (_operator), diğer adresin (_owner) varlıklarını yönetmesi için gereken onay durumunu döndürür. Örneğin, isApprovedForAll(0x123..., 0x456...) => true veya false döndürebilir.
SONUÇ
Özetleyecek olursak, ERC-20, ERC-721 ve ERC-1155 akıllı sözleşme standartları, Ethereum blokzinciri üzerinde ihtiyaca göre farklı türlerde token oluşturmaya yarar ve nasıl oluşturulacağını tanımlar. ERC-20, değiştirilebilir (fungible) tokenlar için kullanılırken, ERC-721, değiştirilemeyen (non-fungible) tokenler içindir. ERC-1155 ise hem değişebilir hem de değişmeyen tokenları desteklerken ayrıca hepsinin tek bir sözleşme içinde yönetilmesini de sağlar.
Kaynaklar:
https://eips.ethereum.org/EIPS/eip-20
https://eips.ethereum.org/EIPS/eip-721
https://eips.ethereum.org/EIPS/eip-1155
SCDEVSTR: https://twitter.com/scdevstr
Yazarı sosyal medya hesaplarından takip edebilirsiniz.
Twitter: https://twitter.com/blockmuchain
Github: https://github.com/fagrak