Файл: Отчет по производственной практике, технологической (проектнотехнологической) направления 09. 03. 04 Программная инженерия.docx

ВУЗ: Не указан

Категория: Отчет по практике

Дисциплина: Не указана

Добавлен: 10.01.2024

Просмотров: 139

Скачиваний: 5

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное автономное образовательное учреждение
высшего образования

«Южно-Уральский государственный университет

(национальный исследовательский университет)»

Высшая школа электроники и компьютерных наук

Кафедра системного программирования

ОТЧЕТ
по производственной практике, технологической


(проектно-технологической)

направления 09.03.04 «Программная инженерия»





Выполнил: __________

студент группы КЭ-303

Дегтярев В.А.

Проверил:_____________

Доцент кафедры СП, к.ф.-м.н.

Турлакова С.У.

Дата: _________________

Оценка: _______________


МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное автономное образовательное учреждение
высшего образования

«Южно-Уральский государственный университет

(национальный исследовательский университет)»

Высшая школа электроники и компьютерных наук

Кафедра системного программирования

УТВЕРЖДАЮ

Зав. кафедрой СП

__________ Л.Б. Соколинский
ЗАДАНИЕ

по производственной практике

  1. Тема работы

Разработка смарт-контракта для работы с биометрическими токенами.

  1. Исходные данные к работе

2.1. Нараян Прасти. Блокчейн. Разработка приложений, 2018 г.;

2.2. Документация Solidity [Электронный ресурс]. URL: https://docs.soliditylang.org/.

  1. Перечень подлежащих разработке вопросов

3.1. Изучить разработку смарт-контрактов;

3.2. Спроектировать смарт-контракт;

3.3. Реализовать смарт-контракт;

3.4. Протестировать смарт-контракт.

  1. Сроки

Дата выдачи задания: «27» 06 2022 г.

Срок сдачи законченной работы: «24» 07 2022 г.
Руководитель практики со стороны ЮУрГУ:
_____________________________ _____________ _________________

должность, ученая степень подпись ФИО ответственного
Руководитель практики со стороны предприятия:
_____________________________ _____________ _________________


должность, ученая степень подпись ФИО ответственного
Задание принял к исполнению:

_____________ _________________

подпись ФИО студента

ОГЛАВЛЕНИЕ

ВВЕДЕНИЕ 4

1. АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ 5

2. ПРОЕКТИРОВАНИЕ 7

3. РЕАЛИЗАЦИЯ 9

4. ТЕСТИРОВАНИЕ 12

ЗАКЛЮЧЕНИЕ 14

ЛИТЕРАТУРА 15

ВВЕДЕНИЕ


Постановка задачи

Целью производственной практики является разработка смарт-контракта для управления биометрическими токенами. Для достижения поставленной цели необходимо решить следующие задачи:

  1. изучить литературу по разработке смарт-контрактов;

  2. спроектировать смарт-контракт;

  3. реализовать смарт-контракт;

  4. протестировать смарт-контракт.

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. ТЕСТИРОВАНИЕ


Для тестирования