توکن ERC20

توکن ERC20 برای استفاده در پلتفرم اتریوم طراحی شده است. آنها از استانداردهایی تبعیت می کنند و به همین دلیل می توانند به اشتراک گزارده شده و با سایر توکن ها مبادله شوند و یا حتی به کیف پول رمزارز انتقال یابند.

این استانداردها توسط جامعه اتریوم ایجاد شده اند و دارای سه نقش اساسی و شش نقش اجباری هستند.

بیان تأثیرات توکن ERC20 بر دنیای رمزارزها سخت است. این توکن ها به تنهایی مسئول صنعت عرضه اولیه بیلیون دلاری هستند و نقش بزرگی در پررنگ شدن نقش رمزارزها دارند.

مسیری به سوی قراردادهای هوشمند:

تکنولوژی بلاک چین و رمزارزها با ایجاد بیت کوین توسط Satoshi Nakamoto مورد توجه قرار گرفت. بیت کوین به دلایل مختلف یک ابتکار انقلابی بود. برای اولین بار افراد صاحب یک سیستم ارزی که در مالکیت خودشان بود، شدند. امکان ارسال بیت کوین با استفاده از کیف پول بیت کوین برای هر شخصی ممکن است بدون اینکه نیاز باشد به بانک مراجعه شود.

بیت کوین به عنوان نسل اول بلاک چین شناخته می شود. اگرچه، در اجرای معاملات بیت کوین حجم گسترده ای از محدودیت ها وجود دارد. در واقع، نیازی نیست معاملات همواره ساده باشند. اگر تمایل دارید با استفاده از یک معامله ساده یک به یک پولی برای دوستتان ارسال کنید، بیت کوین گزینه خوبی به نظر می رسد. اگرچه، اگر بخواهید با شرط انجام یک کار در زمان مشخص پولی برای دوستتان ارسال کنید، آیا بیت کوین همچنان بهترین گزینه است؟ چطور می توانید معاملات پیچیده این چنینی را کنترل کرد؟

اتریوم و قراردادهای هوشمند:

Vitalik Buterin فهمید که تکنولوژی بلاک چین کاربردهای گسترده تری علاوه بر یک سیستم پرداخت دارد. به بیان ساده تر، اتریوم در حال برنامه ریزی برای تبدیل شدن به یک ابر کامپیوتر است که در آن هر کسی در هر جائی می تواند قدرت محاسباتی اجاره کند و یک Dapp ایجاد کند که می تواند روی اتریوم اجرا شود.

چگونه می توان یک Dapp ایجاد کرد؟ بدین منظور نیاز داریم نگاهی به قراردادهای هوشمند بیاندازیم. قراردادهای هوشمند قراردادهای اتوماتیک هستند. این قراردادها خود-اجرا هستند یعنی با داشتن شرایط خاص اجرا می شوند.

کارکرد قراردادهای هوشمند:

توکن ERC20

قراردادهای هوشمند نحوه انجام تسک ها در اکوسیستم اتریوم است. وقتی شخصی بخواهد تسک خاصی را در اتریوم انجام دهد باید یک قرارداد هوشمند با یک نفر یا افراد دیگر شروع کند.

اجازه دهید به مبحث قبلی برگردیم.

قراردادهای هوشمند به شما کمک می کنند تا جزئیات قراردادهای هوشمند را به فرمت ساده کد کنید. این مفهوم توسط Nick Szabo مطرح شده است. براساس نظر او، بهترین مثال عینی قرارداد هوشمند یک ماشین فروش خودکار است.

وقتی چیزی از یک ماشین خودکار می خرید، شما مبلغ را وارد ماشین می کنید، سپس انتخاب می کنید و ماشین آن را به شما می دهد. شما به طور مستقیم با ماشین ارتباط برقرار می کنید بدون اینکه واسطه ای بین شما باشد. مراحل خرید به صورت زیر است:

  • سپرده گذاری پول
  • انتخاب محصول

و سپس چیزی که قصد خرید آن را داشتید بدست می آورید.

فرض کنید شما و دوستتان آلیس می خواهید با استفاده از یک قرارداد هوشمند با هم در ارتباط باشید. مقداری توکن اتر را در یک قرارداد هوشمند بلوکه می کنید، پس از تکمیل تعدادی تسک توسط آلیس، اترهای بلوکه شده برای آلیس ارسال می شود.

قراردادهای هوشمند و عرضه اولیه:

قراردادهای هوشمند موقعیت های جدیدی را برای توسعه دهندگان ایجاد کرده اند تا ابتکار خود را به کار ببندند. این توسعه دهندگان با استفاده از عرضه اولیه سرمایه مورد نیاز برای تدارک  پروژه هایشان را کسب می کنند.

عرضه اولیه، در واقع اولین حضور عمومی رمزارز و یا IPO است. اگرچه، عرضه اولیه به نسبت IPO نسبت به جذب کارآفرینان سیاست بازتری دارد که دلایل را در زیر می بینیم:

  • در درجه اول، عرضه پروژه در عرضه اولیه بسیار ساده تر است. تنها کاری که باید انجام دهید این است که وایت پیپر پروژه خود را ارائه دهید.
  • هر شخصی می تواند در پروژه ای که علاقه مند است با خرید توکن DAPP خاص سرمایه گذاری کند و عضوی از پروژه شود.

البته یک نکته ای دیگری وجود دارد که باید قبل از ورود به مبحث عرضه اولیه بدانیم. توسعه دهندگان باید در مقابل سرمایه گذاری چیزی بپردازند که به آن توکن می گویند.

یک توکن یک مفهوم در اکوسیستم خاص است. این می تواند ارزش، stake، حق رأی و یا سایر موارد باشد. یک توکن محدود به یک نقش خاصی نیست؛ می تواند نقش های زیادی را در اکوسیستم بر عهده داشته باشد. نقش های توکن عبارتند از:

  • Toll: یک توکن می تواند یک گیت به Dapp باشد. اساساً، برای دسترسی به DAPP، نیاز به توکن خواهید داشت.
  • حق رأی، توکن ها همچنین ممکن است برای صاحبان آنها حق رأی ایجاد کنند. مثلاً داشتن توکن  EOS به معنای دراختیار داشتن حق رأی در روند تولید بلاک است.
  • Value Exchange: این نقش بسیار رایج است. توکن ها می توانند یک سیستم اقتصادی داخلی در اپلیکیشن ها ایجاد کنند.
  • افزایش تجربه کاربر: توکن می تواند صاحبان را قادر به افزایش تجربه کاربر در داخل محیط خاص کنند. برای مثال، در Brave (مرورگر وب)، صاحبان توکن Brave حق دارند تا تجربه مشتری را با استفاده از توکن هایشان به منظور افزایش تبلیغات در پلتفرم Brave افزایش دهند.
  • ارز: توکن می تواند به عنوان ذخیره ارزش به منظور ایجاد معامله در داخل و خارج اکوسیستم مورد استفاده قرار گیرد.

تاکنون در مورد قراردادهای هوشمند، عرضه اولیه و توکن ها صحبت کردیم. اگرچه، مانعی در مسیرمان وجود دارد. با یک مثال این موضوع را روشن خواهیم کرد.

بازیهای کامپیوتری آرکید:

توکن ERC20

یک آرکید بازیهای کامپیوتری قدیمی مدرسه را تصور کنید. مراحلی که قبل از شروع بازی باید انجام دهید چیست:

  • تبدیل پول فیات به سکه آرکید
  • قرار دادن سکه در دستگاه (دستگاه طوری طراحی شده که آن سکه خاص را می پذیرد)
  • تبدیل باقیمانده سکه ها به پول فیات

آیا توانستید بین آرکید و پلتفرم قرارداد هوشمند ارتباطی برقرار کنید؟ دستگاههای بازی آرکید مشابه یک Dapp هستند و سکه های آرکید را می توان توکن محلی در نظر گرفت. برای دسترسی به سرویس های Dapp باید توکن محلی داشته باشد. البته، مشکلی در این بین وجود دارد. برای اینکه سکه در دستگاه جای بگیرد باید دارای ابعاد خاصی باشد. اگر دستگاههایی ساخته شوند که به جای سکه دایره ای سکه مربعی بپذیرند چه اتفاقی خواهد افتاد؟

برای اجرای یکپارچه ماشین، صاحبان آرکید باید قوانین وضع می کردند. این قانون بدین شرح بود: تمام دستگاهها باید از سکه های گرد پشتیبانی کنند و اشکال دیگر نباید پذیرفته شود و این قوانین همان کاری است که ERC20 انجام می دهد.

مشکل طراحی توکن های مختلف:

در ابتدا، به نظر می رسید هر توکن ICO تلاش می کرد تا “چرخ را دوباره اختراع کند” از آنجائیکه نگرانی در مورد اجرا وجود داشت. هر یک از توکن ها لیستی از توابع خود را داشتند. بنابراین، منجر به ایجاد موانع نوظهوری شد.

برای ایجاد یک اکوسیستم سالم بر روی اتریوم، لازم است که Dappهای ساخته شده روی آن بتوانند دائماً با یکدیگر در ارتباط باشند. اگرچه، اگر دو توکن ERC20 داشته باشیم چه اتفاقی می افتد. مثلاً فرض کنید توکن آلفا و بتا داریم و هر دو دارای ساختار قرارداد هوشمند متفاوتی هستند. بدین منظور، توسعه دهندگان باید بدقت این قراردادها را مطالعه کنند و در مورد نحوه ارتباط  توکن ها با یکدیگر اطلاعات دقیقی بدست آورند.

اگر 100 توکن با 100 قرارداد مختلف وجود داشته باشد، نیازمندیها و شرایط مورد نیاز برای اطمینان از انتقال ها بین تمام توکن ها به عملیات پیچیده ریاضی نیاز دارد که به هیچ وجه ایده آل نیست.

نیاز به تغییرات بشدت احساس می شد و در نهایت در 19 نوامبر 2015، Fabian Vogelsteller راهکاری ارائه کرد.

ورود توکن ERC20:

توکن ERC20

توکن ERC20 یک راهنمای قوانین و تعدیلاتی است که به ایجاد طرح برای قراردادهای هوشند براساس اتریوم به منظور ایجاد توکن هایشان کمک می کند. واژه “ERC” خلاصه شده عبارت Ethereum Request for Comment است، درحالیکه عدد “20” عدد تخصیص داده شده به درخواست است.

بنابراین، حال که با مفهوم توکن ERC20 آشنا شدید، اجازه دهید به بحث در مورد مفاهیم پشت پرده آن نیز بپردازیم.

ساختار توکن ERC20:

آنها از قوانینی پشیبانی می کنند بنابراین قابل به اشتراک گذاری و مبادله هستند و امکان انتقال به کیف پول رمزارز وجود دارد. استاندارد توکن ERC20 از سه قانون اختیاری و 6 قانون اجباری تشکیل شده است. قوانین اجباری توکن ERC20 عبارتند از:

  • totalSupply
  • balanceOf
  • transfer
  • transferFrom
  • approve
  • allowance

از طرف دیگر، قوانین اختیاری توکن ERC20 شامل:

  • Token Name
  • Symbol
  • Decimal (up to 18)

اجازه دهید در مورد قوانین اختیاری قبل از قوانین اجباری صحبت کنیم.

3 قانون اختیاری:

اگرچه، اجباری به نامگذاری توکن ها نیست، ولی هویت بخشیدن به آن ضروری است. نام به صورت زیر اعلان می شود:

string public constant name = “Token Name”

پس از آن نشان (symbol) وجود دارد که اهمیت آن چندان قابل فهم نیست. OmiseGO یک مثال خوب در این مورد است. افراد به جای OmiseGO بیشتر با OMG آشنا هستند. یک نشان جذاب رمز موفقیت در برندینگ است. آنها به شکل زیر نشان داده می شوند:

string public constant symbol = “SYM”

در نهایت، تقسیم پذیری “divisibility ” وجود دارد که به ما در تعیین کمترین ارزش یک توکن کمک می کند. تقسیم پذیری صفر یعنی کمترین ارزش توکن یک است. تقسیم پذیری 2 از طرف دیگر، یعنی کمترین ارزش توکن 0.01 خواهد بود. ماکزیمم تعداد رقم بعد از اعشار 18 رقم است که به شکل زیر نمایش داده می شود:

uint8 public constant decimals = 18

حال به بررسی قوانین اجباری می پردازیم.

6 قانون اجباری شامل:

  • totalSupply

totalSupply تعداد کل توکن ERC20 را تعیین می کند. هدف این روش این است که تعداد کل توکن در گردش در اکوسیستم تعیین شود. این کد به شکل زیر است:

contract MyERCToken {
uint256 _totalSupply = 1000000;
function totalSupply() constant returns (uint256 theTotalSupply) {
theTotalSupply = _totalSupply;
return theTotalSupply;
}
}
  • balanceOf

تابع balanceOf تعداد توکنی که یک آدرس خاص، در اینجا صاحب قرارداد، در اکانت خود دارد می باشد. کد به شکل زیر است:

contract MyERCToken {
// Create a table so that we can map addresses
// to the balances associated with them
mapping(address => uint256) balances;
 // Owner of this contract
 address public owner;
 function balanceOf(address _owner) constant returns (uint256 balance) {
 // Return the balance for the specific address
   return balances[_owner];
 }
}
  • approve()

پس از بررسی بالانس حساب، صاحبان قرارداد می توانند موافقت خود را به کاربران بدهند تا مقدار مورد نیاز توکن از آدرس قرارداد جمع آوری کنند. تابع توافق همچنین معاملات را براساس موجودی توکن (total supply) بررسی می کند تا مطمئن شوند چیزی اضافی و یا کم نباشد. به عبارت دیگر، تقلب غیرممکن است.

contract MyERCToken {
// Create a table so that we can map
 // the addresses of contract owners to
 // those who are allowed to utilize the owner's contract
 mapping(address => mapping (address => uint256)) allowed;
 function approve(address _spender, uint256 _amount) returns (bool success) {
   allowed[msg.sender][_spender] = _amount;
   // Fire the event "Approval" to execute any logic
   // that was listening to it
   Approval(msg.sender, _spender, _amount);
   return true;
 }
}
  • transfer()

حال تمام مراحل بررسی به پایان رسیده است و مشخص است که کاربران توکن مورد نیاز برای انجام معامله را دارند. صاحبان قرارداد می توانند با استفاده از تابع transfer() اقدام به ارسال توکن ها کنند.

این تابع به صاحبان قرارداد اجازه می دهد مقدار مشخصی توکن به آدرس دیگر ارسال کنند، درست مانند معاملات رمزارز سنتی، اجازه می دهد تا تعداد معینی توکن از موجودی کلی به اکانت کاربر ارسال شود. قبل از شروع بازی، بازیکنان باید BLU تهیه کنند.

contract MyERCToken {
mapping(address => uint256) balances;
// Note: This function returns a boolean value
// indicating whether the transfer was successful
function transfer(address _to, uint256 _amount) returns (bool success) {
// If the sender has sufficient funds to send
// and the amount is not zero, then send to
// the given address
if (balances[msg.sender] >= _amount
&& _amount > 0
&& balances[_to] + _amount > balances[_to]) {
balances[msg.sender] -= _amount;
balances[_to] += _amount;
// Fire a transfer event for any
// logic that's listening
Transfer(msg.sender, _to, _amount);
return true;
} else {
return false;
}
}
}
  • transferFrom():

پیشتر در مورد تابع انتقال صحبت کردیم اما هدف از معرفی یک تابع انتقال دیگر چیست؟ در اینجا با ذکر یک مثال دلیل اهمیت تابع transferFrom() در قرارداد توکن  ERC20 را توضیح خواهیم داد.

همه ما باید هر ماه مبالغی را بپردازیم. این هزینه ها می تواند اجاره، قبض و سایر هزینه ها باشد. لازم نیست تمام هزینه ها را خودتان پرداخت کنید. می توانید با استفاده از یک سیستم پرداخت اتوماتیک بانک هزینه ها را بسادگی و به صورت خودکار پرداخت کنید.

تابع transferFrom() نیز دقیقاً همین کار را انجام می دهد. این تابع به شما کمک می کند که سیستم انتقال را اتوماتیک کنید.

کد این تابع به صورت زیر است:

contract MyERCToken {
mapping(address => uint256) balances;
function transferFrom(address _from, address _to, uint256 _amount) returns (bool success) {
if (balances[_from] >= _amount
&& allowed[_from][msg.sender] >= _amount
&& _amount > 0
&& balances[_to] + _amount > balances[_to]) {
balances[_from] -= _amount;
balances[_to] += _amount;
Transfer(_from, _to, _amount);
return true;
} else {
return false;
}
}
}
  • allowance()

یکی از مهم ترین داده هایی که قرارداد باید بداند بالانس حساب کاربر است. در نهایت، کاربر باید حداقل توکن مورد نیاز برای انجام معامله را داشته باشد.

به همین دلیل، قراردادهای توکن ERC20 شامل تابع allowance() هستند. اگر کاربران حداقل توکن مورد نیاز را نداشته باشند، تابع قرارداد را حذف می کند. کد این تابع به صورت زیر است:

function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
return allowed[_owner][_spender];
}

اتصال کدها به یکدیگر:

حال که در مورد عملکرد توابع مختلف دانستیم، قرارداد توکن ERC20 را بررسی می کنیم. کد به صورت زیر خواهد بود:

pragma solidity ^0.4.15;
contract MyERCToken
{
// Create a table so that we can map addresses
// to the balances associated with them
mapping(address => uint256) balances;
// Create a table so that we can map
// the addresses of contract owners to
// those who are allowed to utilize the owner's contract
mapping(address => mapping (address => uint256)) allowed;
// In this case, the total supply
// of MyERCToken is fixed, but
// it can very much be changed
uint256 _totalSupply = 1000000;
// Owner of this contract
address public owner;
function totalSupply() constant returns (uint256 theTotalSupply) {
// Because our function signature
// states that the returning variable
// is "theTotalSupply", we'll just set that variable
// to the value of the instance variable "_totalSupply"
// and return it
theTotalSupply = _totalSupply;
return theTotalSupply;
}
function balanceOf(address _owner) constant returns (uint256 balance) {
return balances[_owner];
}
function approve(address _spender, uint256 _amount) returns (bool success) {
allowed[msg.sender][_spender] = _amount;
// Fire the event "Approval" to execute any logic
// that was listening to it
Approval(msg.sender, _spender, _amount);
return true;
}
// Note: This function returns a boolean value
// indicating whether the transfer was successful
function transfer(address _to, uint256 _amount) returns (bool success) {
// If the sender has sufficient funds to send
// and the amount is not zero, then send to
// the given address
if (balances[msg.sender] >= _amount
&& _amount > 0
&& balances[_to] + _amount > balances[_to]) {
balances[msg.sender] -= _amount;
balances[_to] += _amount;
// Fire a transfer event for any
// logic that's listening
Transfer(msg.sender, _to, _amount);
return true;
} else {
return false;
}
}
function transferFrom(address _from, address _to, uint256 _amount) returns (bool success) {
if (balances[_from] >= _amount
&& allowed[_from][msg.sender] >= _amount
&& _amount > 0
&& balances[_to] + _amount > balances[_to]) {
balances[_from] -= _amount;
balances[_to] += _amount;
Transfer(_from, _to, _amount);
return true;
} else {
return false;
}
}
function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
return allowed[_owner][_spender];
}
// Triggered whenever approve(address _spender, uint256 _value) is called.
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
// Triggered when tokens are transferred.
event Transfer(address indexed _from, address indexed _to, uint256 _value);
}

مزیت های توکن ERC20:

حال که در مورد توکن ERC20 دانستیم، باید از مزیت های اصلی آن نیز آگاه باشیم.

  • راحتی استفاده. همانطور که قبلاً اشاره کردیم، اگر هر شخص توکن های خود با توابع خود ایجاد می کرد، یک فاجعه به بار می آمد. بعلاوه، ذخیره آن توکن ها در کیف پول و لیست کردن آن در صرافی بسیار مشکل ساز می شد. انتقال توکن ها می توانست قرارداد را نقض کرده و آن را مستعد حمله هکرها کند.
  • از آنجائیکه قوانین توکن ERC20 طرحی برای توسعه دهندگان ارائه می کنند، کاربران می توانند بسادگی با توکن ها کار کنند بدون اینکه نیاز باشد از ابتدا شروع کنند.
  • یک فاکتور مهم که در ارزش کلی شبکه اتریوم مؤثر است، نقدپذیری توکن ERC20 است. اگر پروژه های روی اتریوم فعال بوده و با یکدیگر در ارتباط باشند، پروژه ها و کاربران بیشتر به شبکه اتریوم جذب می شوند.

معایب توکن ERC20:

  • باگ transfer():

اگر چه توکن ERC20 ویژگی های خوب زیادی دارند، اما نقدهای زیادی در مورد آن وجود دارد. در اتریوم، دو نوع اکانت وجود دارد، اکانت خارجی (EOA)، که توسط رمز اختصاصی کنترل می شود و اکانت قرارداد، که توسط کد قرارداد کنترل می شوند.

اگر بخواهیدبا اکانت EOA دیگری در ارتباط باشید، می توانید از تابع transfer() برای ارسال توکن مورد نیاز استفاده کنید. اگرچه، اگر بخواهید توکن ها را به اکانت قرارداد ارسال کنید و از تابع transfer() استفاده کنید، با یک باگ روبرو می شوید که تاکنون منجر به از دست رفتن میلیون ها دلار شده است.

مشکل اصلی تابع transfer() این است که پس از اجرا دریافت کننده از رسید پول مطلع نمی شود حتی اگر معامله با موفقیت انجام شود. توسعه دهنده ای به نام “Dexaran” کسی بود که در مورد این باگ صحبت کرد.

بنابراین، با وجود چنین باگی استفاده از توابع approval() و transferFrom() گزینه های بهتری به نظر می رسند.  اگرچه، استفاده از این توابع ایمن نبوده و شرایط برای حمله double spent بوجود می آید.

  • سهولت ورود:

مسئله بعدی این است که ERC20 ایجاد توکن شخصی توسط افراد را تسهیل کرده است. در نتیجه، بازار پر از عرضه اولیه و توکن های اسکم شده است.

آینده توکن ERC20:

درحالیکه وجود توکن ERC20 برای رشد اکوسیستم رمزارز مهم است، این حقیقت که توکن ERC20 بشدت فراگیر شده پابرجاست. استانداردهای دیگری مثل ERC223، ERC 777 و غیره بوجود آمده است اما همچنان توکن ERC20 بسیار رایج است.

Dexaran موارد زیر را از دلایل عمده استفاده از توکن ERC20 می داند:

  • عدم مسئولیت پذیری توسعه دهندگان توکن در مورد تخلفات مربوطه
  • اتریوم هنوز در حال گسترش استاندارد توکن ERC20 است، حتی پس از آنکه معلوم شد این استاندارد دارای باگ است. مشکلی مشابه پیشتر در مورد  TheDAO نیز بوجود آمده بود.
  • دلیل اصلی توسعه دهندگان از استفاده از این استاندارد دریافت سرمایه بوده و ایجاد محصول نمی باشد.
  • استفاده از استاندارد دیگر منجر به افزایش اثرات شبکه ای می شود. این مسئله چیزی نیست که بدنبال آن باشیم به این دلیل که اتریوم دارای مشکل مقیاس پذیری نیز می باشد.

تغییرات همیشه کند است و اینطور به نظر می رسد که برای گسترش یک استاندارد جدید بیشتر منتظر بمانیم. البته، نمی توان استاندارد توکن ERC20 را مجرم دانست و باید بخاطر تأثیری که بر فضای رمزارزها گذاشته مورد احترام قرار گیرد.

0

پاسخ دادن

دیدگاه خود را وارد کنید
لطفا نام خود را وارد کنید