ERC-1155 Çoklu Token Standardı
Giriş
Birden fazla Token türünü yöneten sözleşmeler için standart bir arayüz. Dağıtılan tek bir sözleşme; misli token'lar, misli olmayan token'lar veya diğer yapılandırmaların (ör. yarı misli token'lar) herhangi bir kombinasyonunu içerebilir.
Çoklu Token Standardı ile ne kastedilmektedir?
Fikir basittir ve herhangi bir sayıda misli ve misli olmayan Token türünü temsil edebilen ve kontrol edebilen bir akıllı sözleşme arayüzü oluşturmayı amaçlar. Bu şekilde, ERC-1155 Token'ı bir ERC-20 ve ERC-721 Token'ı ile aynı işlevleri ve hatta her ikisini aynı anda yerine getirebilir. Hem ERC-20 hem de ERC-721 standartlarının işlevselliğini geliştirerek daha verimli hale getirir ve bariz uygulama hatalarını düzeltir.
ERC-1155 Token'ı, EIP-1155 (opens in a new tab) içinde tam olarak açıklanmıştır.
Ön Koşullar
Bu sayfayı daha iyi anlamak için öncelikle Token standartları, ERC-20 ve ERC-721 hakkında okumanızı öneririz.
ERC-1155 İşlevleri ve Özellikleri:
- Toplu Transfer: Tek bir çağrıda birden fazla varlığı transfer edin.
- Toplu Bakiye: Tek bir çağrıda birden fazla varlığın bakiyesini alın.
- Toplu Onay: Tüm Token'ları bir adrese onaylayın.
- Kancalar (Hooks): Token alma kancası.
- NFT Desteği: Arz sadece 1 ise, onu NFT olarak ele alın.
- Güvenli Transfer Kuralları: Güvenli transfer için kurallar dizisi.
Toplu Transferler
Toplu transfer, normal ERC-20 transferlerine çok benzer şekilde çalışır. Normal ERC-20 transferFrom işlevine bakalım:
// ERC-20
function transferFrom(address from, address to, uint256 value) external returns (bool);
// ERC-1155
function safeBatchTransferFrom(
address _from,
address _to,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external;
ERC-1155'teki tek fark, değerleri bir dizi olarak geçirmemiz ve ayrıca bir kimlik (id) dizisi geçirmemizdir. Örneğin ids=[3, 6, 13] ve values=[100, 200, 5] verildiğinde, ortaya çıkan transferler şunlar olacaktır:
_fromadresinden_toadresine 3 kimlikli 100 Token transfer edilir._fromadresinden_toadresine 6 kimlikli 200 Token transfer edilir._fromadresinden_toadresine 13 kimlikli 5 Token transfer edilir.
ERC-1155'te sadece transferFrom vardır, transfer yoktur. Normal bir transfer gibi kullanmak için, gönderen (from) adresini işlevi çağıran adrese ayarlamanız yeterlidir.
Toplu Bakiye
İlgili ERC-20 balanceOf çağrısı da benzer şekilde toplu işlem desteğine sahip bir ortak işleve sahiptir. Hatırlatmak gerekirse, ERC-20 sürümü şöyledir:
// ERC-20
function balanceOf(address owner) external view returns (uint256);
// ERC-1155
function balanceOfBatch(
address[] calldata _owners,
uint256[] calldata _ids
) external view returns (uint256[] memory);
Bakiye çağrısı için daha da basiti, tek bir çağrıda birden fazla bakiyeyi alabiliriz. Sahipler dizisini ve ardından Token kimlikleri dizisini geçiririz.
Örneğin _ids=[3, 6, 13] ve _owners=[0xbeef..., 0x1337..., 0x1111...] verildiğinde, dönüş değeri şu olacaktır:
[
balanceOf(0xbeef...),
balanceOf(0x1337...),
balanceOf(0x1111...)
]
Toplu Onay
// ERC-1155
function setApprovalForAll(
address _operator,
bool _approved
) external;
function isApprovedForAll(
address _owner,
address _operator
) external view returns (bool);
Onaylar ERC-20'den biraz farklıdır. Belirli miktarları onaylamak yerine, setApprovalForAll aracılığıyla bir operatörü onaylanmış veya onaylanmamış olarak ayarlarsınız.
Mevcut durumu okumak isApprovedForAll aracılığıyla yapılabilir. Görebileceğiniz gibi, bu ya hep ya hiç işlemidir. Kaç Token'ın onaylanacağını veya hangi Token sınıfının onaylanacağını tanımlayamazsınız.
Bu, kasıtlı olarak basitlik göz önünde bulundurularak tasarlanmıştır. Bir adres için yalnızca her şeyi onaylayabilirsiniz.
Alma Kancası (Receive Hook)
function onERC1155BatchReceived(
address _operator,
address _from,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external returns(bytes4);
EIP-165 (opens in a new tab) desteği göz önüne alındığında, ERC-1155 yalnızca akıllı sözleşmeler için alma kancalarını destekler. Kanca işlevi, şu şekilde verilen sihirli, önceden tanımlanmış bir bytes4 değeri döndürmelidir:
bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
Alıcı sözleşme bu değeri döndürdüğünde, sözleşmenin transferi kabul ettiği ve ERC-1155 Token'larını nasıl işleyeceğini bildiği varsayılır. Harika, artık bir sözleşmede sıkışmış Token'lar yok!
NFT Desteği
Arz sadece bir olduğunda, Token esasen misli olmayan bir token'dır (NFT). Ve ERC-721 için standart olduğu gibi, bir meta veri URL'si tanımlayabilirsiniz. URL istemciler tarafından okunabilir ve değiştirilebilir, buraya (opens in a new tab) bakın.
Güvenli Transfer Kuralı
Önceki açıklamalarda zaten birkaç güvenli transfer kuralına değindik. Ancak kuralların en önemlilerine bakalım:
- Çağıranın,
_fromadresi için Token'ları harcaması onaylanmış olmalıdır veya çağıran_fromadresine eşit olmalıdır. - Transfer çağrısı şu durumlarda geri alınmalıdır:
_toadresi 0 ise._idsuzunluğu,_valuesuzunluğu ile aynı değilse._idsiçindeki Token(lar) için sahip(ler)in bakiyelerinden herhangi biri, alıcıya gönderilen_valuesiçindeki ilgili miktar(lar)dan düşükse.- Başka herhangi bir hata oluşursa.
Not: Kanca dahil tüm toplu işlevler, toplu olmayan sürümler olarak da mevcuttur. Bu, yalnızca bir varlığı transfer etmenin muhtemelen hala en yaygın kullanılan yol olacağı göz önüne alınarak gaz verimliliği için yapılır. Güvenli transfer kuralları da dahil olmak üzere açıklamalarda basitlik sağlamak için bunları dışarıda bıraktık. İsimler aynıdır, sadece 'Batch' (Toplu) kelimesini çıkarın.