- PVSM.RU - https://www.pvsm.ru -
Продолжаем серию статей о первых в России проектах, разработанных на основе технологии блокчейн. Напоминаем, что мы спросили у команд-участниц хакатона InspiRussia о технологической составляющей их решений.
В этой материале речь пойдет о проекте Buydentity, который помогает бороться с проблемой контрафактных товаров.
1. Серия материалов, посвященных технологии Emer:
1.1. Секреты EmerCoin [1].
1.2. Децентрализованная нецензурированная система доменных имён [2].
1.3. Инфраструктура публичных ключей всемирного масштаба [3].
1.4. Децентрализованная беспарольная система безопасности [4].
2. Быстрые и безопасные транзакции [5].
3. Экосистема цифровой стоматологии [6].
4. Борьба с контрафактными товарами [7].
5. Loading…
Разработчики проекта Buydentity — это друзья-энтузиасты, которые решили попробовать себя в разработке с помощью блокчейна.
Участники поставили перед собой задачу разработки полезного проекта, поэтому в результате была выбрана тема по проблеме борьбы с контрафактными товарами. Прежде, чем начать разработку, участниками была проанализирована проблематика оборота контрафактной продукции в мире. Они выяснили, что:
К тому же, в целом, в мире наблюдается значительный рост рынка контрафакта. Так по данным доклада [8] Организации экономического сотрудничества и развития (ОЭСР):
Так и появился проект Buydentity (buy (покупка) и identity (подлинность)). Прототип платформы позволяет отслеживать весь жизненный цикл товара на базе технологии блокчейн, что позволяет исключить создание подделки и проверить подлинность товара в любой момент времени.
В данный момент существуют и внедрены различные решения для борьбы с контрафактом: 2D barcode, штрих код, голограмма, различные защитные покрытия, секретные чернила, микропечать и защитные микроэлементы, радиочастотные идентификаторы, защитные самоклеящиеся этикетки. Но, все перечисленные выше способы не дают стопроцентной уверенности в том, что перед вами настоящий товар, либо имеют высокую стоимость, либо могут быть подтверждены только самими производителями. Проект Buydentity позволит повысить надежность с помощью обновления информации о товаре на каждом этапе его жизненного цикла от производителя к покупателю понять его характеристики, статус, задействованных контрагентов и исключить продажу подделки или повторную продажу уже реализованного товара.
Для реализации этой идеи каждый товар должен обладать уникальным код отслеживания, который позволит в любой момент времени однозначно идентифицировать его. Например, в самом простом случае это может быть QR-код (также могут применяться NFC-метки), который наклеен на товар. Код связан с идентификационными данными о товаре (цвет, вес, номер изделия, номер партии, фото, дата и место производства, производитель и прочее), которые записаны в приватный блокчейн Ethereum [9] (платформа для создания децентрализованных онлайн-сервисов на базе блокчейна). Такая запись данных о продукции не позволяет изменить его характеристики в любой момент времени и вы смодете проследить весь путь движение товара.
Описанным выше способом можно пометить все товары и решить проблему их однозначной идентификации. Однако, указанная реализация не решает проблему создания контрафакта. Кто-нибудь может купить один настоящий продукт, копировать и тиражировать QR-код на аналогичные поддельные товары. Выход в данной ситуации следующий: в блокчейн необходимо разместить статус товара и его владельца, который будет меняться в зависимости от стадии его жизненного цикла. Для реализации описанной выше логики в проекте была развернута сеть Ethereum на основе Azure Blockchain as a Service. Они позволили гибко настраивать правила передачи собственности от одного участника к другому.
Для реализации описанной выше логики в проекте была развернута сеть Ethereum на основе Azure Blockchain as a Service, что позволило гибко настраивать правила передачи собственности от одного участника к другому. Общая схема функционирования приведена ниже.
В рамках системы Buydentity командой были разработаны:
Ниже показан примерный вид карточки товара в мобильном приложении.
Учитывая знания и опыт работы, были выбраны следующий набор технологий для реализации системы:
Для работы с сетью Ethereum команда воспользовалась клиентом Geth, который позволяет подключаться и осуществлять транзакции по протоколу http. Для тестирования и отладки был развернут приватный блокчейн, однако, при попытке доступа к интерфейсу управления с помощью .NET-библиотеки Nethereum [10], постоянно возникала ошибка подключения к клиенту. Проблема оказалась в устаревшей версии клиента Geth. Кстати, обновления можно найти в репозитории на GitHub [11].
Следующая проблема, которая оказалась относительно простой, возникла с подключением клиента Geth к удаленному клиенту в виртуальной машине Microsoft Azure. Как оказалось, она скрывалась не только в клиенте, но и в настройке фаервола виртуальной машины. С этой проблемой можно разобраться с помощью материала по настройке конечных точек виртуальных машин [12]. Для доступа к клиенту Geth извне достаточно указать флаг --wsaddr “0.0.0.0”
(по умолчанию localhost).
Смарт-контракты Ethereum были выбраны не случайно — синтаксис языка Solidity несложный, очень похож на JavaScript и можно сказать, что подобен языку C. Поэтому первая версия контракта была быстро реализована и проверена с помощью веб-IDE [13].
Далее для каждого товара мы создаем смарт-контракт, в котором хранится информация о товаре, а также цепочка всех звеньев цепи от производителя до конечного продавца. Осуществить передачу собственности на товар может только предыдущий владелец, указанный в контракте. При получении товара, новый владелец подтверждает свое право собственности через тот же самый контракт.
Таким образом, блокчейн Etherium позволяет отойти от задач криптографии и защиты важной информации и сразу приступить к реализации бизнес задач. Наличие «умных» контрактов значительно облегчает реализацию идеи передачи собственности единицы товара от участника к участнику. Вот как может выглядит смарт-контракта передачи товара на языке Solidity:
pragma solidity ^0.4.0:
contract ProductItem {
address[] _owners;
address _currentOwner;
address _nextOwner;
string _productDigest;
function ProductItem(string productDigest) {
_currentOwner = msg.sender;
_productDigest = productDigest;
_owners.push(msg.sender);
}
function setNextOwner(address nextOwner) returns(bool set) {
if (_currentOwner != msg.sender) {
return false;
}
_nextOwner = nextOwner;
return true;
}
function confirmOwnership() returns(bool confirmed) {
if (_nextOwner != msg.sender) {
return false;
}
_owners.push(_nextOwner);
_currentOwner = _nextOwner;
_nextOwner = address(0);
return true;
}
}
Здесь:
_owners
— массив всех владельцев единицы товара;_currentOwner
— текущий владелец товара;_nextOwner
— следующий владелец товара;_productDigest
— хеш, вычисленный на основе некоторых полей товара. При проверке позволит проверить неизменность описания товара;msg.sender
— встроенная переменная окружения, в которой содержится инициатор транзакции.
При создании единицы товара информация заносится в блокчейн в виде контракта, приведенного выше. Смарт-контракт невозможно обмануть, поэтому передать единицу товара в собственность сможет только тот, кто указан в переменной _currentOwner
контракта. Далее, при передаче собственности, вызывается функция setNextOwner(address next)
, устанавливая следующего возможного владельца. Когда следующий владелец принимает товар в собственность, вызывается метод confirmOwnership()
.
Как было сказано выше контракт невозможно обмануть не имея доступ к кошелькам (то есть фактически к приватным ключам) участников системы. Для того, чтобы минимизировать компрометацию пользовательских кошельков они размещены на приватном сервере внутри облака Azure. Для вычисления блоков в Ethereum развернуты несколько серверов, используя отдельный шаблон (можно найти здесь [14]). Клиенты go-ethereum
, автоматически установленные при разворачивании шаблона, связаны между собой в сеть (как это сделать описано здесь [15]). В общем виде, архитектура приложения выглядит следующим образом:
Запросы, предполагающие работу с Ethereum, перенаправляются в очередь. Затем эти сообщения обрабатываются отдельными сервисами. Реализация выглядит именно так, потому что фиксация транзакций, изменяющих состояние контракта, довольно затратная по времени операция и пользователю не обязательно дожидаться завершения этих операций.
Поскольку языком разработки backend в проекте является C#, то для взаимодействия с Ethereum была выбрана библиотека Nethereum. Ниже приведен пример публикации контракта в блокчейн:
public async Task<Contract> DeployContractAsync(EthereumAccount account, ContractMetadata metadata, HexBigInteger gas = null, params object[] ctorArgs)
{
gas = gas ?? new HexBigInteger(10*1000*1000);
var tx = await _web3.Eth.DeployContract.SendRequestAsync(metadata.Abi, metadata.ByteCode, account.Address, gas, ctorArgs).ConfigureAwait(false);
var receipt = await MineAndGetReceiptAsync(tx).ConfigureAwait(false);
var code = await _web3.Eth.GetCode.SendRequestAsync(receipt.ContractAddress).ConfigureAwait(false);
if (string.IsNullOrEmpty(code) || code.Length < 3)
{
throw new InvalidOperationException("Can't deploy contract. Check if gas is sufficient");
}
return _web3.Eth.GetContract(metadata.Abi, receipt.ContractAddress);
}
public async Task<TransactionReceipt> MineAndGetReceiptAsync(string txHash)
{
TransactionReceipt receipt = await _web3.Eth.Transactions.GetTransactionReceipt.SendRequestAsync(txHash).ConfigureAwait(false);
while (receipt == null)
{
receipt = await _web3.Eth.Transactions.GetTransactionReceipt.SendRequestAsync(txHash).ConfigureAwait(false);
await Task.Delay(1000).ConfigureAwait(false);
}
return receipt;
}
Здесь не стоит обращать внимания на типы данных, наподобие EthereumAccount
и ContractMetadata
, так как основная идея должна быть понятна. Стоит обратить внимание на строчку
var code = await _web3.Eth.GetCode.SendRequestAsync(receipt.ContractAddress)
Так при публикации контракта иногда может возникнуть исключение о недостаточном gas
. Чтобы убедиться в успешной публикации контракта мы проверяем результат вышеприведенного кода:
if (string.IsNullOrEmpty(code) || code.Length < 3)
{
throw new InvalidOperationException("Can't deploy contract. Check if gas is sufficient");
}
Ethereum blockchain очень удобен наличием «умных» контрактов, однако для приватных блокчейнов было бы актуально минимизировать время формирования блоков в базе данных, поэтому в данный момент команда ищет пути для решения данной проблемы.
Команда Buydentity после проведения хакатона активно начала развивать свой проект и представлять его на различных форумах и публичных мероприятиях. Подробную информацию о проекте можно найти на сайте [16].
На ближайшее будущее команда определила следующие основные задачи:
Сейчас команда проекта ищет производителей продукции для пилотного внедрения. По вопросам работы систем можно писать на mail@buydentity.ru.
Автор: Microsoft
Источник [17]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/bitcoin/222740
Ссылки в тексте:
[1] Секреты EmerCoin: https://habrahabr.ru/company/microsoft/blog/311690/
[2] Децентрализованная нецензурированная система доменных имён: https://habrahabr.ru/company/microsoft/blog/314368/
[3] Инфраструктура публичных ключей всемирного масштаба: https://habrahabr.ru/company/microsoft/blog/316326/
[4] Децентрализованная беспарольная система безопасности: https://habrahabr.ru/company/microsoft/blog/316864/
[5] Быстрые и безопасные транзакции: https://habrahabr.ru/company/microsoft/blog/312308/
[6] Экосистема цифровой стоматологии: https://habrahabr.ru/company/microsoft/blog/313130/
[7] Борьба с контрафактными товарами: https://habrahabr.ru/company/microsoft/blog/312054/
[8] доклада: http://www.oecd.org/governance/trade-in-counterfeit-and-pirated-goods-9789264252653-en.htm
[9] Ethereum: https://ethereum.org/
[10] Nethereum: https://github.com/Nethereum/Nethereum
[11] GitHub: https://github.com/ethereum/go-ethereum/releases
[12] материала по настройке конечных точек виртуальных машин: http://michaelsync.net/2015/09/28/where-is-the-endpoint-setting-for-vm-in-new-azure-portal
[13] веб-IDE: https://ethereum.github.io/browser-solidity/#version=soljson-v0.4.2+commit.af6afb04.js
[14] здесь: https://github.com/Azure/azure-quickstart-templates/tree/master/go-ethereum-on-ubuntu
[15] здесь: https://github.com/ethereum/go-ethereum/wiki/Connecting-to-the-network
[16] сайте: http://buydentity.ru/
[17] Источник: https://habrahabr.ru/post/312054/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.