Файл: Отчет по производственной практике, технологической (проектнотехнологической) направления 09. 03. 04 Программная инженерия.docx
Добавлен: 10.01.2024
Просмотров: 135
Скачиваний: 5
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное образовательное учреждение
высшего образования
«Южно-Уральский государственный университет
(национальный исследовательский университет)»
Высшая школа электроники и компьютерных наук
Кафедра системного программирования
ОТЧЕТ
по производственной практике, технологической
(проектно-технологической)
направления 09.03.04 «Программная инженерия»
| Выполнил: __________ студент группы КЭ-303 Дегтярев В.А. Проверил:_____________ Доцент кафедры СП, к.ф.-м.н. Турлакова С.У. Дата: _________________ Оценка: _______________ |
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное образовательное учреждение
высшего образования
«Южно-Уральский государственный университет
(национальный исследовательский университет)»
Высшая школа электроники и компьютерных наук
Кафедра системного программирования
УТВЕРЖДАЮ
Зав. кафедрой СП
__________ Л.Б. Соколинский
ЗАДАНИЕ
по производственной практике
-
Тема работы
Разработка смарт-контракта для работы с биометрическими токенами.
-
Исходные данные к работе
2.1. Нараян Прасти. Блокчейн. Разработка приложений, 2018 г.;
2.2. Документация Solidity [Электронный ресурс]. URL: https://docs.soliditylang.org/.
-
Перечень подлежащих разработке вопросов
3.1. Изучить разработку смарт-контрактов;
3.2. Спроектировать смарт-контракт;
3.3. Реализовать смарт-контракт;
3.4. Протестировать смарт-контракт.
-
Сроки
Дата выдачи задания: «27» 06 2022 г.
Срок сдачи законченной работы: «24» 07 2022 г.
Руководитель практики со стороны ЮУрГУ:
_____________________________ _____________ _________________
должность, ученая степень подпись ФИО ответственного
Руководитель практики со стороны предприятия:
_____________________________ _____________ _________________
должность, ученая степень подпись ФИО ответственного
Задание принял к исполнению:
_____________ _________________
подпись ФИО студента
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ 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, transferFrom
function 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 – Функция createBiom
function createBiom(string memory biom)
public
returns (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].
4. ТЕСТИРОВАНИЕ
Для тестирования