Basit Yoldan Bir ERC20 Token Nasıl Oluşturulur

Yayınlanan: 2022-03-11

Bu makalenin amacı, mümkün olan en kısa sürede bir ERC20 belirtecinin nasıl oluşturulacağını göstermektir.

Temel bilgilerle başlayalım: ERC20 jetonu nedir?

Son yıllarda, ERC20 belirteç belirtimi, Ethereum belirteçleri için fiili standart haline geldi. Başka bir deyişle, bugün piyasadaki çoğu Ethereum sözleşmesi ERC20 uyumludur. Bu makale, kendi Ethereum tokeninizi nasıl oluşturabileceğinizi detaylandıracak, ancak başlamadan önce, ERC20 standardına daha yakından bakalım.

ERC20 belirteci çizimi

ERC20 tokenlerini bu kadar çekici ve başarılı yapan nedir? Oyunda birkaç faktör var:

  1. Bu eğitimde göreceğiniz gibi, ERC20 belirteçleri basit ve dağıtılması kolaydır.
  2. ERC20 standardı önemli bir sorunu çözüyor, çünkü blok zinciri tabanlı pazar yerleri ve kripto cüzdanlar, yönettikleri token aralığıyla iletişim kurmak için tek, standartlaştırılmış bir dizi komuta ihtiyaç duyuyor. Bu, farklı jetonlar arasındaki etkileşim kurallarını ve jeton satın alma kurallarını içerir.
  3. Ethereum token standardizasyonunu sunan ilk popüler spesifikasyondu. Hiçbir şekilde ilk değildi, ancak popülaritesi sayesinde hızla endüstri standardı haline geldi.

Diğer Ethereum jetonları gibi, ERC20 jetonları da akıllı sözleşmeler olarak uygulanır ve Ethereum Sanal Makinesinde (EVM) merkezi olmayan bir şekilde yürütülür.

Solidity: Akıllı Sözleşme Programlama Dili

Ethereum akıllı sözleşmeleri Solidity'de yazılmıştır. Alternatif diller olsa da, onları bu amaç için kullanan pek yoktur. Solidity JavaScript'e benzer, bu nedenle JavaScript, hatta Java ve diğer C-benzeri diller hakkında biraz bilginiz varsa, Solidity'de kullanmak için yeterince ustalaşmadan önce bile Solidity'deki bir kod parçasının bunu yaptığını anlamakta sorun yaşamamalısınız. o.

Eğlencenin başladığı yer burasıdır, çünkü kısa sürede basit bir ERC20 sözleşmesi oluşturmaya başlayabilirsiniz. Bu basit bir iştir, bu makalenin bir ERC20 belirtecini bir saatten kısa sürede nasıl yazıp dağıtabileceğinizi gösterecek kadar basit.

Bu gösteride oluşturacağımız simge, çok fazla çan ve ıslık olmadan çıplak kemikli bir ERC20 uygulaması olacaktır. Bununla birlikte, gerçek dünyada benzer şekilde basit birçok jeton gördüm ve oldukça iyi sonuç verme eğilimindeler.

ERC20 Token Standardına Genel Bakış

ERC20 nedir?

Basitçe söylemek gerekirse, ERC20 standardı, diğer sözleşmeler, cüzdanlar veya pazar yerleri ile entegrasyona izin vermek için tüm ERC20 belirteçleri tarafından uygulanacak bir dizi işlevi tanımlar. Bu işlevler grubu oldukça kısa ve basittir.

 function totalSupply() public view returns (uint256); function balanceOf(address tokenOwner) public view returns (uint); function allowance(address tokenOwner, address spender) public view returns (uint); function transfer(address to, uint tokens) public returns (bool); function approve(address spender, uint tokens) public returns (bool); function transferFrom(address from, address to, uint tokens) public returns (bool);

ERC20 işlevleri, harici bir kullanıcının, örneğin bir kripto-cüzdan uygulamasının, bir kullanıcının bakiyesini bulmasına ve uygun yetkilendirmeyle bir kullanıcıdan diğerine para transfer etmesine olanak tanır.

Akıllı sözleşme, özel olarak tanımlanmış iki olayı tanımlar:

 event Approval(address indexed tokenOwner, address indexed spender, uint tokens); event Transfer(address indexed from, address indexed to, uint tokens);

Bu olaylar, bir kullanıcıya bir hesaptan jetonları çekme hakkı verildiğinde ve jetonlar fiilen transfer edildikten sonra çağrılacak veya yayınlanacaktır .

Standart ERC20 işlevlerine ek olarak, birçok ERC20 belirteci ayrıca ek alanlara sahiptir ve bazıları yazılı olmasa da pratikte ERC20 standardının fiili bir parçası haline gelmiştir. İşte bu tür alanlara birkaç örnek.

 string public constant name; string public constant symbol; uint8 public constant decimals;

İşte ERC20 ve Solidity terminolojisi ile ilgili birkaç nokta:

  • Sözleşmenin kendisinin dışında bir public işlevine erişilebilir
  • view temelde sabit anlamına gelir, yani sözleşmenin dahili durumu işlev tarafından değiştirilmez
  • Bir event , Solidity'nin istemcilere, örneğin uygulamanızın ön yüzünün, sözleşmedeki belirli olaylar hakkında bilgilendirilmesine izin verme yöntemidir.

Temel Java/JavaScript becerilerine zaten sahipseniz, çoğu Solidity dil yapısı açık olmalıdır.

Solidity'de ERC20 Token Yazma

Sağlamlıkta ERC20 belirteçleri

Artık temelleri özetlediğimize ve bir ERC20 belirteci oluşturmak için ne gerektiğini açıkladığımıza göre, biraz mantık yazmaya başlamanın zamanı geldi.

İlk olarak, iki eşleme nesnesi tanımlamamız gerekiyor. Bu, bir ilişkisel veya anahtar/değer dizisi için Solidity kavramıdır:

 mapping(address => uint256) balances; mapping(address => mapping (address => uint256)) allowed;

mapping(address => uint256) ifadesi, anahtarları address türünden (hesap adreslerini belirtmek için kullanılan bir sayı) ve değerleri uint256 olan bir ilişkisel diziyi tanımlar - tipik olarak jeton bakiyelerini depolamak için kullanılan 256 bitlik bir tam sayı.

İlk eşleme nesnesi, balances , her sahip hesabının belirteç bakiyesini tutacaktır.

İzin verilen ikinci eşleme nesnesi, her biri için allowed verilen para çekme miktarıyla birlikte belirli bir hesaptan çekilmesi onaylanan tüm hesapları içerecektir.

Gördüğünüz gibi, izin verilen eşlemenin değer alanı, kendi başına, onaylanmış para çekme toplamına bir eşleme çizim hesabı adresidir.

Bu eşlemeler, diğer tüm sözleşme alanlarıyla birlikte blok zincirinde depolanacak ve değişikliklerin tüm ağ kullanıcı düğümlerine yayılmasıyla sonuçlanacak şekilde çıkarılacaktır .

Blockchain depolaması pahalıdır ve sözleşmenizin kullanıcılarının bir şekilde ödeme yapması gerekecektir. Bu nedenle, her zaman depolama boyutunu en aza indirmeye çalışmalı ve blok zincirine yazmalısınız.

Artık gerekli veri yapılarına sahip olduğumuza göre, ERC20 mantığını gerçekten uygun fonksiyonlara yazmaya başlayabiliriz.

ICO Jetonlarının Sayısını Ayarlama

ICO jetonlarının sayısını nasıl belirleriz? Pekala, maksimum ICO token sayısını belirlemenin birkaç yolu vardır ve bu konu tek başına uzun bir tartışmaya değer olabilir.

ECR20 eğitimimizin ihtiyaçları için en basit yaklaşımı kullanacağız: Sözleşme oluşturma zamanında toplam jeton miktarını ayarlayın ve başlangıçta hepsini “sözleşme sahibine”, yani akıllı sözleşmeyi uygulayan hesaba atayın:

 uint256 totalSupply_; constructor(uint256 total) public { totalSupply_ = total; balances[msg.sender] = _totalSupply; }

Yapıcı, sözleşme dağıtıldıktan hemen sonra Ethereum tarafından otomatik olarak çağrılan özel bir işlevdir. Genellikle, sözleşmenin dağıtım hesabı tarafından geçirilen parametreleri kullanarak belirtecin durumunu başlatmak için kullanılır.

msg , Ethereum'un kendisi tarafından bildirilen ve doldurulan global bir değişkendir. Sözleşmeyi gerçekleştirmek için önemli veriler içerir. Burada kullandığımız alan: msg.sender , mevcut sözleşme işlevini yürüten Ethereum hesabını içerir.

Yalnızca dağıtım hesabı, bir sözleşmenin oluşturucusuna girebilir. Sözleşme başlatıldığında, bu işlev mevcut jetonları 'sözleşme sahibi' hesabına tahsis eder.

Toplam Jeton Temini Alın

 function totalSupply() public view returns (uint256) { return totalSupply_; }

Bu işlev, sahibine bakılmaksızın bu sözleşme tarafından tahsis edilen tüm belirteçlerin sayısını döndürür.

Sahibinin Token Bakiyesini Alın

 function balanceOf(address tokenOwner) public view returns (uint) { return balances[tokenOwner]; }

balanceOf , sahibinin adresiyle tanımlanan bir hesabın mevcut jeton bakiyesini döndürür.

Jetonları Başka Bir Hesaba Aktarın

 function transfer(address receiver, uint numTokens) public returns (bool) { require(numTokens <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender] — numTokens; balances[receiver] = balances[receiver] + numTokens; emit Transfer(msg.sender, receiver, numTokens); return true; }

Adından da anlaşılacağı gibi, transfer işlevi, numTokens miktarını, sahibinin bakiyesinden başka bir kullanıcının veya receiver bakiyesine taşımak için kullanılır. Aktaran sahip, msg.sender yani işlevi yürüten kişidir; bu, yalnızca belirteçlerin sahibinin bunları başkalarına aktarabileceği anlamına gelir.

Solidity'nin bir yüklemi öne sürme yolu require . Bu durumda, transfer eden hesabın transferi gerçekleştirmek için yeterli bakiyesi vardır. Bir require ifadesi başarısız olursa, işlem blok zincirine herhangi bir değişiklik yazılmadan hemen geri alınır.

Çıkmadan hemen önce, işlev ERC20 olay Transfer başlatır ve kayıtlı dinleyicilerin tamamlanmasına tepki vermesini sağlar.

Jetonları Çekmek için Temsilciyi Onayla

Bu işlev genellikle bir belirteç pazar yeri senaryosunda kullanılır.

 function approve(address delegate, uint numTokens) public returns (bool) { allowed[msg.sender][delegate] = numTokens; emit Approval(msg.sender, delegate, numTokens); return true; }

msg.sender approve temsilci hesabını - muhtemelen pazar yerinin kendisini - kendi hesabından jetonları çekmesine ve diğer hesaplara transfer etmesine izin vermektir.

Gördüğünüz gibi, bu işlev, sahiplerinin bir pazarda token sunduğu senaryolar için kullanılır. Pazar yerinin, önceden onay beklemeden işlemi tamamlamasını sağlar.

Yürütmenin sonunda, bu işlev bir Approval olayı başlatır.

Para Çekme için Onaylanan Jeton Sayısını Alın

 function allowance(address owner, address delegate) public view returns (uint) { return allowed[owner][delegate]; }

Bu işlev, approve işlevinde ayarlandığı gibi, bir sahip tarafından belirli bir temsilciye onaylanan jeton sayısını döndürür.

Temsilci Tarafından Token Transferi

transferFrom işlevi, daha önce tartıştığımız approve işlevinin eşidir. Para çekme için onaylanmış bir temsilcinin, sahip fonlarını bir üçüncü taraf hesabına transfer etmesine izin verir.

 function transferFrom(address owner, address buyer, uint numTokens) public returns (bool) { require(numTokens <= balances[owner]); require(numTokens <= allowed[owner][msg.sender]); balances[owner] = balances[owner] — numTokens; allowed[owner][msg.sender] = allowed[from][msg.sender] — numTokens; balances[buyer] = balances[buyer] + numTokens; Transfer(owner, buyer, numTokens); return true; }

İşlev başlangıcındaki iki require ifade, işlemin meşru olduğunu, yani sahibinin transfer etmek için yeterli jetona sahip olduğunu ve temsilcinin (en azından) numTokens geri çekilmesi için onayı olduğunu doğrulamak içindir.

numTokens tutarını sahibinden alıcıya aktarmaya ek olarak, bu işlev aynı zamanda temsilcinin ödeneğinden numTokens da çıkarır. Bu, temel olarak, belirli bir ödeneği olan bir delegenin, tipik pazar davranışı olan birkaç ayrı para çekme işlemine ayırmasına izin verir.

Burada durabilir ve geçerli bir ERC20 uygulamasına sahip olabiliriz. Ancak, endüstriyel bir güç belirteci istediğimiz için bir adım daha ileri gitmek istiyoruz. Bu, kodumuzu biraz daha güvenli hale getirmemizi gerektiriyor, ancak yine de belirteci basit olmasa da nispeten basit tutabileceğiz.

SafeMath Sağlamlık Kitaplığı

SafeMath , bilgisayar korsanlarının sözleşmeleri bozduğu bilinen bir yol olan tamsayı taşması saldırısıyla başa çıkmayı amaçlayan bir Solidity kitaplığıdır. Böyle bir saldırıda hacker, ilgili tamsayıları maksimum değerlerinin üzerine çıkaracak parametreleri ileterek sözleşmeyi yanlış sayısal değerler kullanmaya zorlar.

Solidity'de Safemath kitaplığı: illüstrasyon

SafeMath , aritmetik eylemi gerçekleştirmeden önce taşmayı test ederek buna karşı koruma sağlar ve böylece taşma saldırısı tehlikesini ortadan kaldırır. Kitaplık o kadar küçüktür ki, sözleşme boyutu üzerindeki etkisi minimumdur, performans göstermez ve çok az depolama maliyeti cezası verir.

Kodumuza SafeMath'i ekleyelim :

 library SafeMath { // Only relevant functions function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a — b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } }

SafeMath , geçirilen parametrelerin doğruluğunu doğrulamak için assert deyimlerini kullanır. assert olması durumunda, işlev yürütmesi derhal durdurulacak ve tüm blok zinciri değişiklikleri geri alınacaktır.

Ardından, Solidity derleyicisine kitaplığı tanıtan aşağıdaki ifadeyi ekleyelim:

using SafeMath for uint256;

Ardından, başlangıçta kullandığımız saf aritmetiği SafeMath işlevleriyle değiştiriyoruz:

 balances[msg.sender] = balances[msg.sender].sub(numTokens); balances[receiver] = balances[receiver].add(numTokens); balances[buyer] = balances[buyer].add(numTokens); balances[owner] = balances[owner].sub(numTokens);

Hepsini Birlikte Paketlemek

Solidity'de, bir akıllı sözleşmenin işlevleri ve olayları, sessizce bir "blockchain sınıfına" çevirebileceğiniz, sözleşme adı verilen bir varlığa sarılır. Aşağıda, kodumuzun bir Gist'i de dahil olmak üzere oluşturduğumuz ERC20 uyumlu sözleşme bulunmaktadır. İsim ve sembol alanları isteğe göre değiştirilebilir. Çoğu jeton ondalık değeri 18'de tutar, bu yüzden biz de aynısını yapacağız.

Ethereum Sözleşme Dağıtımı

Sözleşmemizi blok zincirine yerleştirme zamanı geldi. Dağıtımın ardından, sözleşmemiz ağa katılan tüm düğümlere aktarılacaktır. Sözleşmede yapılan tüm değişiklikler, katılan tüm düğümlere yayılacaktır.

Ethereum geliştiricileri genellikle Truffle gibi dağıtım araçlarını kullanır. Truffle bile bu makalenin sınırlı ihtiyaçları için aşırıya kaçıyor ve Remix adlı basit bir çevrimiçi araç yeterli olacaktır.

Bunu kullanmak için tarayıcınıza MetaMask eklentisini ve içinde en azından bir miktar Rinkeby Ether bulunan bir Rinkeby (Ethereum test ağı) hesabını yüklemeniz gerekir. Bunlar nispeten basit adımlardır, bu yüzden ayrıntılara girmeyeceğiz.

İkisine de sahip değilseniz, indirme bağlantıları ve net kurulum ve kullanım talimatları için MetaMask ve Rinkeby'ye gidin.

Artık tüm yapı taşlarını yerine getirdiğimize göre, Remix'e gideceğiz ve pragma satırı ve SafeMath kitaplığı da dahil olmak üzere yukarıdaki kodu çevrimiçi düzenleyiciye yapıştıracağız.

Ardından, sağdaki “ Çalıştır ” adlı ikinci sekmeye atlayacağız ve “ Dağıt ” ı tıklayacağız. İşlemi onaylamamızı isteyen bir MetaMask açılır penceresi görünecektir. Elbette onaylayacağız.

resim alt metni

  • Yeşil kutu: Rinkeby'de olduğunuzdan emin olun
  • Mavi kutu: Toplam jeton kaynağınızı ayarlayın
  • Kırmızı kutu: Dağıt!

Özet : https://Gist.github.com/giladHaimov/8e81dbde10c9aeff69a1d683ed6870be#file-basicerc20-sol

Tebrikler! Gerçek bir Ethereum profesyoneli gibi, ilk ERC20 jetonunuzu az önce dağıttınız. Söz verildiği gibi, belirteç basit ve hafiftir, ancak tamamen işlevseldir, ERC20 standardına uygundur ve MathSafe ile güvence altına alınmıştır. Blockchain üzerinden satın alınmaya, ödemeye ve transfer edilmeye hazırdır.

Akıllı sözleşmelerin hepsi bu kadar mı?

Hayır, yakın bile değil, çünkü kısa gösterimimiz yüzeyi zar zor çiziyor ve akıllı sözleşme geliştirmenin yalnızca bir yönü ile ilgileniyor.

Akıllı sözleşmeler, iş mantığınıza, kullanıcı etkileşiminin modellenmesine, jeton basımına ve yazılmasına izin verip vermediğinize, sözleşmeye dahil ettiğiniz yaşam döngüsü değişikliklerine, genellikle bir sistemle birlikte gelen yönetici düzeyinde yetenek ihtiyacına bağlı olarak çok daha karmaşık olabilir. yönetici tarafından yetkilendirilen işlevler kümesi vb. Resmi aldın.

Yine de, burada yaptığımızı tekrarlayabilirseniz, bu, bilginizi genişletmek ve gerektiğinde daha karmaşık sözleşmelere geçmek için sağlam bir temeldir.