Анатомия ERC721

Анатомия ERC721 Каталог ICO

Давайте попробуем разобраться в устройстве невзаимозаменяемых токенов на Эфириуме. Почти все слышали о игре на блокчейне Ethereum CryptoKitties. Игра наделала шума в криптовалютном обществе из-за собственной очень идеи и воздействия на сеть Эфириума. CryptoKitties – игра, где можно брать, продавать, обменивать и разводить цифровых котят. Их можно представить как «игрушки Beanie Babies, которые могут плодиться», в том смысле что любой котик так либо по другому уникален. Данная неповторимость делает криптокотят нужными коллекционными объектами, потому что кого-либо могут заинтриговать свойства тех либо других котят и он может возжелать иметь их много.

Но коллекционирование не ограничивается цифровыми продуктами. люди постоянно что-то собирали; это не новость. От монет до карточек с покемонами – люди обожают собирать. Это хобби, формирующееся в итоге неповторимого энтузиазма к редчайшим предметам. Подобно тому как стоимость продукта связана с его редкостью, стоимость коллекционного предмета для собирателя связана с его редкостью посреди остальных предметов.

Редчайшие коллекционные предметы можно сымитировать при помощи токенов на Эфириуме, придерживающихся новейшего эталона ERC721. Рабочее предложение Эфириума 721 (Ethereum Request for Comments 721, либо ERC721) – это предложение о улучшении Эфириума, представленное Дитером Ширли в конце 2017 г. Это предложенный эталон, который дозволяет смарт-контрактам работать как торгуемые токены, подобно ERC20. Токены ERC721 неповторимы тем, что они невзаимозаменяемы.

Нечто (к примеру, средства либо продукт) считается взаимозаменяемым, если одну его часть либо количество можно поменять иной равной частью либо количеством при расчёте либо погашении долга.

Взаимозаменяемость – это, на самом деле, черта актива, либо в данном случае токена, определяющая, могут ли объекты либо количества такого же либо схожего типа стопроцентно подменять друг друга в процессе обмена либо использования. к примеру, за пятидолларовую купюру можно приобрести газ-воду в магазине.Анатомия ERC721Она владеет стоимостью и может употребляться для покупки продуктов, имеющих такую же либо наименьшую стоимость. Но если кто-то захотит приобрести газ-воду за бейсбольную карточку, обладатель магазина её не воспримет.

Анатомия ERC721Почему обладатель магазина не воспримет показанную выше карточку с Карлосом Сантаной, если она стоит $5, как и купюра? Поэтому что бейсбольная карточка и баксовая купюра владеют различными чертами, определяющими их стоимость для различных людей. Семилетний ребёнок быть может готов дать за бейсбольную карточку $7, поэтому что ему нравится разноцветная картина. Но обладатель магазина не оценит её даже в $5, просто поэтому, что она не выпущена Федеральной запасной системой, как бакс. Неповторимые характеристики бейсбольной карточки и баксовой купюры лишают их взаимозаменяемости, поэтому что они по-разному оцениваются зависимо от обмена и не постоянно могут употребляться друг заместо друга.

Если гласить о коллекционных предметах, то два предмета в коллекции не взаимозаменяемы, если они владеют различными чертами. Золотая монета не взаимозаменяема с медной монетой, поэтому что из-за различных черт они имеют разную Ценность для коллекционеров.

Токены ERC721 могут употребляться в любом обмене, но их стоимость – итог уникальности и редкости всякого токена. Эталон описывает функции name, symbol, totalSupply, balanceOf, ownerOf, approve, takeOwnership, transfer, tokenOfOwnerByIndex и tokenMetadata. Он также описывает два действия: Transfer и Approval.

Примечание: Вот лаконичный пример объявления договора ERC721:

contract ERC721 {
// ERC20 compatible functions
function name() constant returns (string name);
function symbol() constant returns (string symbol);
function totalSupply() constant returns (uint256 totalSupply);
function balanceOf(address _owner) constant returns (uint balance);
// Functions that define ownership
function ownerOf(uint256 _tokenId) constant returns (address owner);
function approve(address _to, uint256 _tokenId);
function takeOwnership(uint256 _tokenId);
function transfer(address _to, uint256 _tokenId);
function tokenOfOwnerByIndex(address _owner, uint256 _index) constant returns (uint tokenId);
// Token metadata
function tokenMetadata(uint256 _tokenId) constant returns (string infoUrl);
// Events
event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
}

Ниже приведён обзор всякого поля договора.

внимание: Приведённый тут код имеет только образовательное назначение и не был протестирован. Пожалуйста, не используйте его в настоящих приложениях!

ERC20-совместимые функции

ERC721 описывает несколько функций, дающих ему некую сопоставимость со эталоном токенов ERC20. Это необходимо, чтоб имеющимся кошелькам было проще показывать базисную информацию о токене. Эти функции разрешают смарт-контракту, соответственному данному эталону, работать как рядовая криптовалюта вроде биткойна либо эфира. Для этого определяются функции, дозволяющие юзерам делать такие деяния, как пересылка токенов и проверка баланса счёта.

name

Данная функция употребляется для сообщения наружным договорам и приложениям наименования токена. к примеру, функция быть может реализована последующим образом:

contract MyNFT {
function name() constant returns (string name){
return «My Non-Fungible Token»;
}
}

symbol

Эта функция также обеспечивает сопоставимость со эталоном токенов ERC20. Она докладывает наружным программкам короткое заглавие, либо знак, токена.

contract MyNFT {
function symbol() constant returns (string symbol){
return «MNFT»;
}
}

totalSupply

Данная функция задаёт общее количество монет, доступных в блокчейне. Предложение не непременно обязано быть константой.

contract MyNFT {
// Это число быть может произвольным

uint256 private totalSupply = 1000000000;

function totalSupply() constant returns (uint256 supply){
return totalSupply;
}
}

balanceOf

Эта функция употребляется, чтоб отыскать количество токенов, принадлежащих определенному адресу.

contract MyNFT {
mapping(address => uint) private balances;
function balanceOf(address _owner) constant returns (uint balance)
{
return balances[_owner];
}
}

Функции владения

Данные функции определяют, как договор будет разглядывать права принадлежности на токены и как эти права могут передаваться. Более важные посреди этих функций – takeOwnership и transfer, действующие соответственно как функции снятия и пересылки и являющиеся необходимыми для способности перевода токенов меж юзерами.

ownerOf

Эта функция описывает адресок обладателя токена. Так как токены ERC721 невзаимозаменяемые и, как следует, неповторимые, в блокчейне им присвоены неповторимые идентификаторы. Найти обладателя токена можно при помощи его ID.

contract MyNFT {
mapping(uint256 => address) private tokenOwners;
mapping(uint256 => bool) private tokenExists;
function ownerOf(uint256 _tokenId)
constant returns (address owner) {
require(tokenExists[_tokenId]);
return tokenOwners[_tokenId];
}
}

approve

Эта функция одобряет разрешение другому субъекту переводить токен от имени обладателя. К примеру, если Алиса обладает 1 MyNFT, она может вызвать функцию approve для собственного друга Боба. Опосля удачного вызова Боб может позднее распоряжаться токеном от имени Алисы либо стать его обладателем. больше о передаче прав принадлежности можно выяснить из описания функций takeOwnership и transfer.

contract MyNFT {
mapping(address => mapping (address => uint256)) allowed;
function approve(address _to, uint256 _tokenId){
require(msg.sender == ownerOf(_tokenId));
require(msg.sender != _to);
allowed[msg.sender][_to] = _tokenId;
Approval(msg.sender, _to, _tokenId);
}
}

takeOwnership

Эта функция действует как функция снятия, так как иная сторона может вызвать её, чтоб снять токены со счёта юзера. Таковым образом, takeOwnership может употребляться, когда юзер получил одобрение (approve) на владение определённым количеством токенов и хочет снять эти токены со счёта другого юзера.

contract MyNFT {
function takeOwnership(uint256 _tokenId){
require(tokenExists[_tokenId]);
address oldOwner = ownerOf(_tokenId);
address newOwner = msg.sender;
require(newOwner != oldOwner);
require(allowed[oldOwner][newOwner] == _tokenId);
balances[oldOwner] -= 1;
tokenOwners[_tokenId] = newOwner;
balances[newOwner] += 1;
Transfer(oldOwner, newOwner, _tokenId);
}
}

transfer

Данная функция – ещё один метод передачи токенов. transfer дозволяет обладателю токена переслать его другому юзеру, подобно обыкновенной криптовалюте. Но перевод быть может инициирован, лишь если принимающий счёт ранее получил от отправляющего счёта одобрение на владение токеном.

contract MyNFT {
mapping(address => mapping(uint256 => uint256)) private ownerTokens;
function removeFromTokenList(address owner, uint256 _tokenId) private {
for(uint256 i = 0;ownerTokens[owner][i] != _tokenId;i++){
ownerTokens[owner][i] = 0;
}
}
function transfer(address _to, uint256 _tokenId){
address currentOwner = msg.sender;
address newOwner = _to;
require(tokenExists[_tokenId]);
require(currentOwner == ownerOf(_tokenId));
require(currentOwner != newOwner);
require(newOwner != address(0));
removeFromTokenList(_tokenId);
balances[oldOwner] -= 1;
tokenOwners[_tokenId] = newOwner;
balances[newOwner] += 1;
Transfer(oldOwner, newOwner, _tokenId);
}
}

tokenOfOwnerByIndex (опционально – рекомендуется)

Любой обладатель невзаимозаменяемых токенов может сразу обладать наиболее чем одним токеном. Но потому что любому токену присвоен неповторимый идентификатор, быть может трудно выслеживать отдельные токены, принадлежащие юзеру. Потому договор ведёт учёт идентификаторов всех токенов, принадлежащих любому юзеру. Как следует, любой отдельный токен можно отыскать по его индексу в перечне (массиве) токенов, принадлежащих юзеру. tokenOfOwnerByIndex дозволяет отыскать токен данным способом.

contract MyNFT {
mapping(address => mapping(uint256 => uint256)) private ownerTokens;
function tokenOfOwnerByIndex(address _owner, uint256 _index) constant returns (uint tokenId){
return ownerTokens[_owner][_index];
}
}

Функция метаданных

Как уже говорилось, невзаимозаменяемые объекты являются такими благодаря собственной композиции параметров. бакс и бейсбольная карточка не взаимозаменяемые, поэтому что они владеют различными чертами. Но хранить в блокчейне данные, описывающие определяющие свойства всякого токена, очень недешево и не рекомендуется. Заместо этого можно хранить в блокчейне ссылки на любой атрибут токена, такие как IPFS-хеш либо HTTP(S)-адрес, чтоб наружная программка могла отыскать больше инфы о токене при помощи логических операций. Такие ссылки – это данные о данных, либо метаданные.

tokenMetadata (опционально – рекомендуется)

Эта функция дозволяет найти метаданные токена, либо ссылку на его данные.

contract MyNFT {
mapping(uint256 => string) tokenLinks;
function tokenMetadata(uint256 _tokenId) constant returns (string infoUrl) {
return tokenLinks[_tokenId];
}
}

Действия

Действия запускаются, когда договор их вызывает, и опосля пуска транслируются хоть каким отслеживающим программкам. Наружные программки выслеживают действия блокчейна, чтоб опосля пуска действия выполнить логические операции, используя предоставляемую событием информацию. Эталон ERC721 описывает два последующих действия.

Transfer

Это событие срабатывает, когда токен меняет обладателя. Оно транслируется, когда Право принадлежности на токен перебегает от 1-го юзера другому. Оно обрисовывает, какой счёт выслал токен, какой счёт его получил и какой токен (по ID) был передан.

contract MyNFT {
event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
}

Approval

Это событие запускается, когда один юзер одобряет передачу прав на токен другому юзеру (т. е. когда производится approve). Оно обрисовывает, какому счёту на данный момент принадлежит токен, какому счёту разрешено заполучить токен в дальнейшем и для какого токена (по ID) одобрена передача права принадлежности.

contract MyNFT {
event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
}

Начальный код моей реализации эталона ERC721 можно отыскать тут.

Подобно ERC20, предложение эталона ERC721 открыло способности применять смарт-контракты как невзаимозаменяемые объекты. Как можно узреть на примере таковых приложений, как CryptoKitties, Decentraland, CryptoPunks и почти все остальные, невзаимозаменяемые токены оказались весьма нужными продуктами. Даже WikiLeaks обладает несколькими высоко ценящимися криптокотятами! Но основное, этот эталон ещё больше расширит криптовалютную экономику и будет содействовать её предстоящему развитию.

Источник

Оцените статью
Добавить комментарий