Циљ овог чланка је да демонстрира како створити ЕРЦ20 токен у што краћем времену.
Почнимо са основама: Шта је то ЕРЦ20 токен?
Последњих година, спецификација ЕРЦ20 токена постала је дефацто стандард за Етхереум токене. Другим речима, већина данашњих уговора Етхереум-а је у складу са ЕРЦ20. Овај чланак ће детаљно објаснити како можете да направите свој Етхереум токен, али пре него што започнемо, погледајмо ближе стандард ЕРЦ20.
Шта чини ЕРЦ20 жетоне тако атрактивним и успешним? У игри је неколико фактора:
Баш као и други Етхереум токени, ЕРЦ20 токени се имплементирају као паметни уговори и извршавају на Етхереум Виртуал Мацхине (ЕВМ) на децентрализован начин.
Паметни уговори Етхереум написани су у Солидити. Иако постоје алтернативни језици, ретко ко их користи у ове сврхе. Солидност је слична ЈаваСцрипт-у, тако да ако имате неко знање о ЈаваСцрипт-у, или чак о Јава-и и другим језицима сличним Ц-у, не бисте требали имати проблема да откријете да ли је део кода у Солидити-у, чак и пре него што заправо савладате Солидити довољно да га користите то.
Ту забава започиње, јер бисте за кратко време могли да започнете креирање једноставног ЕРЦ20 уговора. Ово је једноставан задатак, довољно једноставан да ће овај чланак показати како можете написати и применити ЕРЦ20 токен за мање од сат времена.
Токен који ћемо створити у овој демонстрацији биће гола кост ЕРЦ20 имплементације, без превише звона и звиждука. Међутим, видео сам много сличних једноставних жетона у стварном свету, и они раде прилично добро.
Поједностављено, ЕРЦ20 стандард дефинише скуп функција које треба да примене сви ЕРЦ20 токени како би се омогућила интеграција са другим уговорима, новчаницима или тржиштима. Овај скуп функција је прилично кратак и основни.
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);
Функције ЕРЦ20 омогућавају спољном кориснику, рецимо апликацији за крипто-новчаник, да сазна стање корисника и пребаци средства са једног корисника на другог уз одговарајуће овлашћење.
како тумачити резултате Монте Карло симулације
Паметни уговор дефинише два посебно дефинисана догађаја:
event Approval(address indexed tokenOwner, address indexed spender, uint tokens); event Transfer(address indexed from, address indexed to, uint tokens);
Ови догађаји ће бити позвани или емитован када се кориснику одобре права за повлачење жетона са рачуна и након што се токени стварно пренесу.
Поред стандардних функција ЕРЦ20, многи токени ЕРЦ20 садрже и додатна поља, а неки су постали де фацто део стандарда ЕРЦ20, ако не у писаној форми, онда у пракси. Ево неколико примера таквих поља.
string public constant name; string public constant symbol; uint8 public constant decimals;
Ево неколико тачака у вези са ЕРЦ20 и номенклатуром Солидити:
public
функцији се може приступити изван самог уговораview
у основи значи константно, тј. функција неће променити унутрашње стање уговораevent
је начин да Солидити дозволи клијентима нпр. сучеље ваше пријаве да бисте били обавештени о одређеним догађајима у оквиру уговораВећина конструкција језика Солидити требало би да буде јасна ако већ поседујете основне Јава / ЈаваСцрипт вештине.
Сад кад смо изложили основе и објаснили шта је потребно за креирање ЕРЦ20 токена, време је да започнемо са писањем неке логике.
Прво, морамо да дефинишемо два објекта за мапирање. Ово је појам Солидити за асоцијативни низ или кључ / вредност:
mapping(address => uint256) balances; mapping(address => mapping (address => uint256)) allowed;
Израз mapping(address => uint256)
дефинише асоцијативни низ чији су кључеви типа address
- број који се користи за означавање адреса рачуна, а чије су вредности типа uint256
- 256-битни цели број који се обично користи за чување стања жетона.
Први објект мапирања, balances
, задржава стање токена на сваком рачуну власника.
Други објект мапирања, allowed
, обухватиће све рачуне којима је одобрено повлачење са датог рачуна, заједно са износом повлачења дозвољеним за сваки.
Као што видите, поље вредности дозвољеног мапирања само је по себи пресликавање адресе рачуна рачуна на одобрену суму за повлачење.
Ова мапирања, заједно са свим осталим уговорним пољима, чуваће се и биће миниран што резултира ширењем промена на све мрежне корисничке чворове.
Блоцкцхаин складиште је скупо и корисници вашег уговора ће морати да плате, на овај или онај начин. Због тога увек треба да покушате да смањите величину меморије и уписујете у блок ланац.
перформансе сцала вс јава 8
Сада када имамо потребне структуре података, можемо почети да стварно уписујемо ЕРЦ20 логику у одговарајуће функције.
Како постављамо број ИЦО токена? Па, постоји неколико начина за постављање максималног броја ИЦО токена и о овом питању би могло бити вредно саме расправе.
За потребе нашег ЕЦР20 водича користићемо најједноставнији приступ: Поставите укупан износ токена у време креирања уговора и у почетку доделите све „власнику уговора“, тј. Рачуну који је применио паметни уговор:
uint256 totalSupply_; constructor(uint256 total) public { totalSupply_ = total; balances[msg.sender] = _totalSupply; }
Конструктор је посебна функција коју Етхереум аутоматски позива одмах након примене уговора. Обично се користи за иницијализацију стања токена помоћу параметара које прослеђује налог за примену у уговору.
msg
је глобална променљива коју је прогласио и населио сам Етхереум. Садржи важне податке за извршење уговора. Поље које овде користимо: msg.sender
садржи рачун Етхереум-а који извршава тренутну функцију уговора.
Само налог за примену може да уђе у конструктор уговора. Када је уговор покренут, ова функција додељује доступне токене на рачун „власника уговора“.
function totalSupply() public view returns (uint256) { return totalSupply_; }
Ова функција ће вратити број свих токена додељених овим уговором, без обзира на власника.
function balanceOf(address tokenOwner) public view returns (uint) { return balances[tokenOwner]; }
balanceOf
вратиће тренутно стање токена на рачуну, идентификовано адресом власника.
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; }
Као што му само име говори, transfer
функција се користи за померање numTokens
износ токена са стања власника на стање другог корисника или receiver
. Власник преноса је msg.sender
односно онај који извршава функцију, што подразумева да само власник токена може да их пренесе другима.
Солидити-ов начин утврђивања предиката је require
. У овом случају рачун за пренос има довољан салдо да изврши пренос. Ако је require
изјава не успе, трансакција се одмах враћа уназад без икаквих промена записаних у блоцкцхаин.
Непосредно пре изласка, функција активира ЕРЦ20 догађај Transfer
омогућавајући регистрованим слушаоцима да реагују на његово довршавање.
Ова функција се најчешће користи у сценарију тржишта токена.
function approve(address delegate, uint numTokens) public returns (bool) { allowed[msg.sender][delegate] = numTokens; emit Approval(msg.sender, delegate, numTokens); return true; }
Шта approve
чини да дозволи власнику, тј. msg.sender
да одобри делегатски рачун - могуће и само тржиште - да повуче токене са свог рачуна и пренесе их на друге рачуне.
Као што видите, ова функција се користи за сценарије у којима власници нуде токене на тржишту. Омогућава тржишту да финализује трансакцију без чекања на претходно одобрење.
шта су гешталт принципи
На крају извршења, ова функција активира Approval
догађај.
function allowance(address owner, address delegate) public view returns (uint) { return allowed[owner][delegate]; }
Ова функција враћа тренутни одобрени број токена од стране власника одређеном делегату, како је постављено у approve
функцију.
Тхе transferFrom
функција је равнотежа approve
функција, о којој смо претходно разговарали. Омогућава делегату одобреном за повлачење да преноси власничка средства на рачун треће стране.
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; }
Двоје require
изјаве при покретању функције треба да верификују да ли је трансакција легитимна, тј. да власник има довољно токена за пренос и да делегат има одобрење за (бар) numTokens
да се повуче.
Поред преноса numTokens
износ од власника до купца, ова функција такође одузима numTokens
од додатка делегата. Ово у основи омогућава делегату са датим додатком да га подијели на неколико засебних повлачења, што је типично понашање на тржишту.
Могли бисмо се овде зауставити и имати ваљану имплементацију ЕРЦ20. Међутим, желимо ићи корак даље, јер желимо знак индустријске снаге. То захтева да наш код учинимо мало сигурнијим, мада ћемо и даље моћи да држимо токен релативно једноставним, ако не и основним.
СафеМатх је Солидити библиотека чији је циљ суочавање са једностраним начинима на који хакери крше уговоре: нападом преко целокупног броја. У таквом нападу, хакер присиљава уговор да користи нетачне нумеричке вредности прослеђујући параметре који ће узети одговарајуће целе бројеве прошлост њихове максималне вредности.
СафеМатх штити од овога тестирањем на преливање пре извођења аритметичке акције, чиме уклања опасност од преливања. Библиотека је толико мала да је утицај на величину уговора минималан, не доносећи перформансе и мале казне за трошкове складиштења.
Додајмо СафеМатх на наш код:
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; } }
СафеМатх користи assert
изјаве за проверу исправности прослеђених параметара. Требало би assert
неуспех, извршавање функције ће бити одмах заустављено и све промене блока ће се вратити.
Даље, додајмо следећу изјаву којом уводимо библиотеку у компајлер Солидити:
using SafeMath for uint256;
Затим наивну аритметику коју смо користили заменимо функцијама СафеМатх:
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);
У Солидити-у су функције и догађаји паметног уговора умотани у целину која се назива а уговор које можете у тишини превести у „блок-класу“. Испод је уговор компатибилан са ЕРЦ20 који смо креирали, укључујући и садржај нашег кода. Поља имена и симбола могу се мењати по жељи. Већина жетона држи децималну вредност на 18, па ћемо и ми учинити исто.
Дошло је време примените наш уговор на блоцкцхаин . Након примене, наш уговор ће се пренети на све чворове који учествују у мрежи. Све измене и допуне уговора учињене ће се пренети на све чворове који учествују.
Програмери Етхереум обично користе алате за примену као што су Тартуф . Чак је и Тартуф превише за ограничене потребе овог чланка, а зове се једноставна мрежна алатка Ремик ће бити довољан.
Да бисте га користили, мораћете да инсталирате Додатак МетаМаск у вашем прегледачу и на Ринкеби (Етхереум тест нетворк) налогу са барем мало Ринкеби Етхер-а у себи. То су релативно једноставни кораци, па нећемо улазити у детаље.
У случају да немате ниједно, пређите на МетаМаск и Ринкеби за везе за преузимање и за добијање јасних упутстава за инсталацију и употребу.
Сада када имамо све градивне блокове на месту, прећи ћемо на Ремик и налепите горњи код, укључујући прагма ред и СафеМатх библиотеку, у мрежни уређивач.
Затим ћемо скочити на другу картицу с десне стране под називом „ Трцати И кликните на „ Развити . “ Појавиће се искачући прозор МетаМаск који тражи да потврдимо трансакцију. Наравно, ми ћемо то одобрити.
Гист : хттпс://гист.гитхуб.цом/гиладХаимов/8е81дбде10ц9аефф69а1д683ед6870бе#филе-басицерц20-сол
Честитамо! Управо сте применили свој први ЕРЦ20 токен, као истинит Етхереум профессионал . Као што је и обећано, токен је једноставан и лаган, али у потпуности функционалан, у складу са стандардом ЕРЦ20 и заштићен МатхСафе-ом. Спреман је за куповину, плаћање и пренос кроз читав Блоцкцхаин.
Не, ни изблиза, јер се наша кратка демонстрација једва огреба по површини и бави се само једним аспектом развоја паметних уговора.
Паметни уговори могу бити много сложенији, у зависности од ваше пословне логике, вашег моделирања корисничке интеракције, без обзира допуштате ли ковање и сагоревање токена, промене животног циклуса које уносите у уговор, потребу за могућностима на нивоу администратора која обично долази са скуп функција које је одобрио администратор итд. Схватили сте слику.
Ипак, ако можете да поновите оно што смо овде урадили, то је чврст темељ да проширите своје знање и пређете на сложеније уговоре када је то потребно.
Паметни уговор је део кода изведен на виртуелној машини Етхереум. Паметни уговор Етхереум је непроменљив и може слати или примати етер и податке.
Поједностављено, ЕРЦ20 токени су уговори који имплементирају ЕРЦ20 стандард. Операције којима се управљају ови уговори укључују добијање укупне понуде и биланса токена и методе коришћене за њихов пренос.
стварни трошак калкулатора за запослене
Развој Етхереума тренутно се изводи у Солидити, програмском језику оријентисаном на уговор инспирисаном ЈаваСцриптом, Питхоном и Ц ++.
ЕРЦ је скраћеница од Етхереум Рекуест фор Цоммент. Овом захтеву је додељен број 20, па отуда и суфикс.