ERC-1155 Çoklu Token Standardı
Son düzenleme: @kaanmetu(opens in a new tab), 15 Ağustos 2023
Giriş
Birden çok token türünü yöneten sözleşmeler için standart bir arayüz. Dağıtılan tek bir sözleşme; değiştirilebilir token, değiştirilemez token veya diğer yapılandırmaların (örneğin yarı-değişebilir token) herhangi bir kombinasyonunu içerebilir.
Çoklu-Token Standardı ne anlama geliyor?
Basit bir fikirdir: Herhangi bir sayıda değiştirilebilir ve değiştirilemez token türünü temsil edebilen ve kontrol edebilen bir akıllı sözleşme arayüzü oluşturmayı amaçlar. Böylece ERC-1155 token'ı, ERC-20 ve ERC-721 token'ı ile aynı işlevleri gerçekleştirebilir. Hatta ikisini aynı anda bile yapabilir. Bu, hem ERC-20 hem de ERC-721 standartlarının işlevselliğini iyileştirerek daha verimli kılar ve bariz uygulama hatalarını düzeltir.
ERC-1155 token'ı, EIP-1155(opens in a new tab)'te 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 okuma yapmanızı öneririz.
ERC-1155 Fonksiyonları ve Özellikleri:
- Toplu Aktarım: Tek bir aramada birden çok varlığı aktarın.
- Toplu Bakiye: Birden fazla varlığın bakiyesini tek bir çağrıda alın.
- Toplu Onay: Bir adres için tüm token'ları onaylayın.
- Kancalar: Token kancalarını alın.
- NFT Desteği: Arz yalnızca 1 ise, bunu NFT olarak düşünün.
- Güvenli Aktarım Kuralları: Güvenli aktarım için birtakım kurallar.
Toplu Aktarımlar
Toplu aktarım, normal ERC-20 aktarımlarına çok benzer şekilde çalışır. Normal ERC-20 transferFrom
fonksiyonuna bakalım:
1// ERC-202function transferFrom(address from, address to, uint256 value) external returns (bool);34// ERC-11555function safeBatchTransferFrom(6 address _from,7 address _to,8 uint256[] calldata _ids,9 uint256[] calldata _values,10 bytes calldata _data11) external;Tümünü gösterKopyala
ERC-1155'teki tek fark, değerleri bir dizi olarak geçirmemiz ve ayrıca bir dizi kimlik geçirmemizdir. Örneğin, ids=[3, 6, 13]
ve values=[100, 200, 5]
olduğunda, elde edilen aktarımlar şöyle olacaktır
- Kimliği 3 olan 100 token'ı
_from
'dan_to
'ya aktarın. - Kimliği 6 olan 200 token'ı
_from
'dan_to
'ya aktarın. - 13 kimliğine sahip 5 token'ı
_from
'dan_to
'ya aktarın.
ERC-1155'de sadece transferFrom
bulunur, transfer
yoktur. Normal bir transfer
gibi kullanmak için, gönderen adresini fonksiyonu çağıran adrese ayarlayın.
Toplu Bakiye
İlgili ERC-20 balanceOf
çağrısı da aynı şekilde toplu destekli ortak fonksiyonuna sahiptir. Bir hatırlatma olarak, ERC-20 sürümü şudur:
1// ERC-202function balanceOf(address owner) external view returns (uint256);34// ERC-11555function balanceOfBatch(6 address[] calldata _owners,7 uint256[] calldata _ids8) external view returns (uint256[] memory);Kopyala
Bakiye çağrısı için daha da basit şekilde tek bir aramada birden fazla bakiye alabiliriz. Sahip dizisini ve ardından token kimlikleri dizisini geçiriyoruz.
Örneğin, _ids=[3, 6, 13]
ve _owners=[0xbeef..., 0x1337..., 0x1111...]
olduğunda döndürülen değer şu olacaktır
1[2 balanceOf(0xbeef...),3 balanceOf(0x1337...),4 balanceOf(0x1111...)5]Kopyala
Toplu Onay
1// ERC-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);Tümünü gösterKopyala
Onaylar, ERC-20'den biraz farklıdır. Belirli miktarları onaylamak yerine, setApprovalForAll
aracılığıyla bir operatörü onaylandı veya onaylanmadı olarak ayarlarsınız.
Mevcut durumun okunması isApprovedForAll
üzerinden yapılabilir. Gördüğünüz gibi, bir "ya hep ya hiç" işlemidir. Kaç token onaylanacağını ve hatta hangi token sınıflarının onaylanacağını tanımlayamazsınız.
Bu kasıtlı olarak basitlik göz önünde bulundurularak tasarlanmıştır. Her şeyi yalnızca bir adres için onaylayabilirsiniz.
Alma Kancası
1function onERC1155BatchReceived(2 address _operator,3 address _from,4 uint256[] calldata _ids,5 uint256[] calldata _values,6 bytes calldata _data7) external returns(bytes4);Kopyala
EIP-165(opens in a new tab) desteği göz önünde bulundurulduğunda, ERC-1155 yalnızca akıllı sözleşmeler için alma kancalarını destekler. Kanca fonksiyonu, şu şekilde olan bir sihirli önceden tanımlanmış bytes4 değeri döndürmelidir:
1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))Kopyala
Alıcı sözleşme bu değeri döndürdüğünde, sözleşmenin aktarımı kabul ettiği ve ERC-1155 token'larını nasıl kullanacağını bildiği varsayılır. Harika, artık bir sözleşmede sıkışmış token'lar yok!
NFT Desteği
Arz yalnızca bir olduğunda, token esasen bir değiştirilemez 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 modifiye edilebilir, burada(opens in a new tab) görebilirsiniz.
Güvenli Aktarım Kuralı
Birkaç güvenli aktarım kuralına daha önceki açıklamalarda değinmiştik. Ama kuralların en önemlisine bir bakalım:
- Arayanın,
_from
adresi için token'ları harcaması için onaylanmış olması veya arayanın,_from
değerine eşit olması gerekir. - Transfer çağrısı şu durumlarda geri dönmelidir
_to
adresi 0'sa._ids
uzunluğu_values
uzunluğuyla eşit değilse._ids
içindeki token'lar için sahiplerin herhangi bir bakiyesi, alıcıya gönderilen_values
içindeki ilgili miktardan daha düşükse.- başka herhangi bir hata gerçekleşirse.
Not: Kanca dahil tüm toplu fonksiyonlar, toplu olmayan sürümler olarak da mevcuttur. Bu, yalnızca bir varlığın aktarılmasının muhtemelen hâlâ en yaygın kullanılan yol olacağı düşünülerek, gaz verimliliği için yapılır. Güvenli aktarım kuralları da dahil olmak üzere açıklamalarda basitlik için bunlardan bahsetmedik. İsimler aynıdır: Sadece "Batch"i kaldırın.