Файл: Отчет по производственной практике, технологической (проектнотехнологической) направления 09. 03. 04 Программная инженерия.docx
Добавлен: 10.01.2024
Просмотров: 437
Скачиваний: 14
по производственной практике, технологической (проектно-технологической)направления 09.03.04 «Программная инженерия»
| | Выполнил: __________ студент группы КЭ-303 Дегтярев В.А. Проверил:_____________ Доцент кафедры СП, к.ф.-м.н. Турлакова С.У. Дата: _________________ Оценка: _______________ |
-
Тема работы
-
Исходные данные к работе
-
Перечень подлежащих разработке вопросов
-
Сроки
должность, ученая степень подпись ФИО ответственногоЗадание принял к исполнению:_____________ _________________подпись ФИО студентаОГЛАВЛЕНИЕ
ВВЕДЕНИЕ 4
1. АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ 5
2. ПРОЕКТИРОВАНИЕ 7
3. РЕАЛИЗАЦИЯ 9
4. ТЕСТИРОВАНИЕ 12
ЗАКЛЮЧЕНИЕ 14
ЛИТЕРАТУРА 15
ВВЕДЕНИЕ
Постановка задачиЦелью производственной практики является разработка смарт-контракта для управления биометрическими токенами. Для достижения поставленной цели необходимо решить следующие задачи:-
изучить литературу по разработке смарт-контрактов; -
спроектировать смарт-контракт; -
реализовать смарт-контракт; -
протестировать смарт-контракт.
1. АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ
1.1. Предметная область проектаСмарт-контракт представляет собой программный код, работающий в среде виртуальной машины Ethereum. Он запускается на всех узлах сети, и результаты его работы также реплицируются на все узлы. В более узком смысле под смарт-контрактом понимается набор функций и данных (текущее состояние), находящихся по определенному адресу в блокчейне [1].Блокчейн — выстроенная по определённым правилам непрерывная последовательная цепочка блоков, содержащих информацию. Связь между блоками обеспечивается не только нумерацией, но и тем, что каждый блок содержит свою собственную хеш-сумму и хеш-сумму предыдущего блока [2].Невзаимозаменяемый токен (NFT) — это токен на базе блокчейна, который предоставляет право собственности на конкретный актив, например, изображение, видео или биометрику человека [3].1.2. Анализ аналогичных проектовCryptoKitties [4]CryptoKitties — онлайн-игра в форме децентрализованного приложения, которая позволяет игрокам покупать, продавать, собирать и разводить виртуальных кошек разных типов. Каждая кошка является уникальным токеном. Проект использует блокчейн Ethereum. Смарт-контракт проекта написан на языке Solidity и реализует стандарт ERC721.PhotoChromic [5]Сервис предназначен для создания биометрики человека и последующего хранения этих данных в виде токена в блокчейне. Проект использует блокчейн Ethereum. Смарт-контракт проекта написан на языке Solidity и реализует стандарт ERC721.Выводы по первой главеПосле анализа источников было принято решение использовать блокчейн Ethereum и язык программирования Solidity. Разрабатываемый смарт-контракт должен реализовывать стандарт ERC721.
2. ПРОЕКТИРОВАНИЕ
2.1. Функциональные требованияМожно выделить следующий набор функциональных требований к системе:1) система должна иметь возможность создать токен, который будет хранить биометрику человека;2) система должна иметь возможность вывести все токены, имеющиеся у владельца;3) система должна иметь возможность отправить токены;4) система должна иметь возможность вывести владельца токена;5) система должна иметь возможность сжеть токен.2.2. Нефункциональные требованияМожно выделить следующий набор нефункциональных требований к системе:1) система должна быть написана с помощью языка программирования Solidity;2) система должна быть развернута в сети блокчейн Ethereum;2.3. Функции смарт-контрактаИсходя из требований, в смарт-контракте должны быть реализованы следующие функции:1) функция, которая создает токен с биометрикой;2) функция, которая возвращает все токены, имеющиеся у владельца;3) функция, которая позволяет отправить токен от одного владельца к другому;4) функция, которая возвращает владельца токена;5) функция, которая позволяет владельцу сжеть токен.Выводы по второй главе В процессе анализа требований были составлены функциональные и нефункциональные требования. Кроме того, были определены функции, которые необходимо реализовать в смарт-контракте.
3. РЕАЛИЗАЦИЯ
Каждый токен имеет уникальный числовой идентификатор. В смарт-контракте токен реализует стандарт ERC721 [1]. Это означает, что должны быть реализованы определенные функции стандарта. Код функций представлен в листинге 1.Листинг 1 – Необходимые для реализации функции стандарта ERC721//@dev Returns the number of tokens in ``owner``'s account.function balanceOf(address owner) external view returns (uint256 balance);//@dev Returns the owner of the `tokenId` token.function ownerOf(uint256 tokenId) external view returns (address owner);//@dev Transfers `tokenId` token from `from` to `to`.function transferFrom(address from,address to,uint256 tokenId) external;Функция balanceOf возвращает количество токенов у владельца.Функция ownerOf возвращает адрес владельца конкретного токена.Функция transferFrom отправляет токен из одного адреса на другой.Код реализованных функций представлен в листинге 2.Листинг 2 – Реализованные функции balanceOf, ownerOf, transferFromfunction balanceOf(address owner) public view virtual override returns (uint256) {require(owner != address(0), "ERC721: address zero is not a valid owner");return _balances[owner];}function ownerOf(uint256 tokenId) public view virtual override returns (address) {address owner = _owners[tokenId];require(owner != address(0), "ERC721: invalid token ID");return owner;}function transferFrom(address from,address to,uint256 tokenId) external virtual {require(trueOwnerOf(tokenId) == from, "Biometric: Only the creator of the token can send a token");require(to != address(0), "ERC721: transfer to the zero address");_beforeTokenTransfer(from, to, tokenId);_approve(address(0), tokenId);_balances[from] -= 1;_balances[to] += 1;_owners[tokenId] = to;emit Transfer(from, to, tokenId);_afterTokenTransfer(from, to, tokenId);} Функция createBiom создает токен и сохраняет в нем введенную биометрику. Код функции представлен в листинге 3.Листинг 3 – Функция createBiomfunction createBiom(string memory biom)publicreturns (uint256){uint256 newItemId = _tokenIds.current();address person = _msgSender();_mint(person, newItemId);_setTokenURI(newItemId, biom);_tokenIds.increment();return newItemId;} Вфункции _mint реализовано первоначальное присвоение токена владельцу. В функции _setTokenURI реализовано сохранение биометрики у токена. Код функций представлен в листинге 4.
Листинг 4 – Функции _mint и _setTokenURI
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_trueOwnerIdsCount[to] += 1;
_owners[tokenId] = to;
_trueOwners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId);
}
function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
_tokenURIs[tokenId] = _tokenURI;
}
В функции burn реализован процесс «сжигания» токена, то есть отправка токена на адрес 0x0000000000000000000000000000000000000000, к которому ни у кого нет доступа. Код функции представлен в листинге 5.
Листинг 5 – Функция burn
function burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
address trueOwner = trueOwnerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
_approve(address(0), tokenId);
_balances[owner] -= 1;
_trueOwnerIdsCount[trueOwner] -= 1;
delete _owners[tokenId];
delete _trueOwners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId);
}
В функции getTokenIdsByTrueOwner реализован возврат всех идентификаторов токенов конкретного владельца. Код функции представлен в листинге 6.
Листинг 6 – Метод getTokenIdsByTrueOwner
function getTokenIdsByTrueOwner(address _owner) public view returns(uint[] memory) {
uint[] memory result = new uint[](_trueOwnerIdsCount[_owner]);
uint counter = 0;
for (uint i = 0; i < _tokenIds.current(); i++) {
if (_trueOwners[i] == _owner) {
result[counter] = i;
counter++;
}
}
return result;
Выводы по третьей главе
В данной главе были реализованы все необходимые функции смарт-контракта. Адрес смарт-контракта в тестовой сети Rinkeby: 0xb72Bb84Ff57031dfbD3750034A0B191fb47eBc45 [6].