Ana içeriğe geç
Change page

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-20
2function transferFrom(address from, address to, uint256 value) external returns (bool);
3
4// ERC-1155
5function safeBatchTransferFrom(
6 address _from,
7 address _to,
8 uint256[] calldata _ids,
9 uint256[] calldata _values,
10 bytes calldata _data
11) external;
Tümünü göster
Kopyala

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

  1. Kimliği 3 olan 100 token'ı _from'dan _to'ya aktarın.
  2. Kimliği 6 olan 200 token'ı _from'dan _to'ya aktarın.
  3. 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-20
2function balanceOf(address owner) external view returns (uint256);
3
4// ERC-1155
5function balanceOfBatch(
6 address[] calldata _owners,
7 uint256[] calldata _ids
8) 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-1155
2function setApprovalForAll(
3 address _operator,
4 bool _approved
5) external;
6
7function isApprovedForAll(
8 address _owner,
9 address _operator
10) external view returns (bool);
Tümünü göster
Kopyala

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 _data
7) 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:

  1. Arayanın, _from adresi için token'ları harcaması için onaylanmış olması veya arayanın, _from değerine eşit olması gerekir.
  2. Transfer çağrısı şu durumlarda geri dönmelidir
    1. _to adresi 0'sa.
    2. _ids uzunluğu _values uzunluğuyla eşit değilse.
    3. _ids içindeki token'lar için sahiplerin herhangi bir bakiyesi, alıcıya gönderilen _values içindeki ilgili miktardan daha düşükse.
    4. 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.

Daha fazla bilgi

Bu makale yararlı oldu mu?