Продолжаем серию статей о первых в России проектах, разработанных на основе технологии блокчейн. Напоминаем, что мы спросили у команд-участниц хакатона InspiRussia о технологической составляющей их решений.
В этой материале речь пойдет о проекте Buydentity, который помогает бороться с проблемой контрафактных товаров.
Цикл статей «Погружение в технологию блокчейн»
1. Серия материалов, посвященных технологии Emer:
1.1. Секреты EmerCoin.
1.2. Децентрализованная нецензурированная система доменных имён.
1.3. Инфраструктура публичных ключей всемирного масштаба.
1.4. Децентрализованная беспарольная система безопасности.
2. Быстрые и безопасные транзакции.
3. Экосистема цифровой стоматологии.
4. Борьба с контрафактными товарами.
5. Loading…
Buydentity: Борьба с контрафактом
Разработчики проекта Buydentity — это друзья-энтузиасты, которые решили попробовать себя в разработке с помощью блокчейна.
Участники поставили перед собой задачу разработки полезного проекта, поэтому в результате была выбрана тема по проблеме борьбы с контрафактными товарами. Прежде, чем начать разработку, участниками была проанализирована проблематика оборота контрафактной продукции в мире. Они выяснили, что:
- У государств нет системного подхода в области регулирования контрафакта.
- Большинству людей достаточно сложно отличить подделку от настоящего товара. Тем более качество подделок с каждым годом становится все выше.
- Все чаще стали подделывать востребованные и недорогие товары, а не товары премиум-класса.
- Между покупателем и производителем очень длинная цепочка из различных контрагентов и посредников. Невозможно понять каким образом тот или иной товар попал на полки конкретного магазина.
К тому же, в целом, в мире наблюдается значительный рост рынка контрафакта. Так по данным доклада Организации экономического сотрудничества и развития (ОЭСР):
- Годовой оборот контрафактной продукции в мире в 2015 году достиг $461 млрд;
- На долю контрафакта продукции в мире приходится примерно 2,5% мирового импорта;
- На рынке стран Европейского союза подделки занимают около 5% от общего объема торговли;
- Наиболее часто подделывают продукцию из США (20%), Италии (15%), Франции и Швейцарии (по 12%), Японии и Германии (по 8%).
Так и появился проект Buydentity (buy (покупка) и identity (подлинность)). Прототип платформы позволяет отслеживать весь жизненный цикл товара на базе технологии блокчейн, что позволяет исключить создание подделки и проверить подлинность товара в любой момент времени.
В данный момент существуют и внедрены различные решения для борьбы с контрафактом: 2D barcode, штрих код, голограмма, различные защитные покрытия, секретные чернила, микропечать и защитные микроэлементы, радиочастотные идентификаторы, защитные самоклеящиеся этикетки. Но, все перечисленные выше способы не дают стопроцентной уверенности в том, что перед вами настоящий товар, либо имеют высокую стоимость, либо могут быть подтверждены только самими производителями. Проект Buydentity позволит повысить надежность с помощью обновления информации о товаре на каждом этапе его жизненного цикла от производителя к покупателю понять его характеристики, статус, задействованных контрагентов и исключить продажу подделки или повторную продажу уже реализованного товара.
Buydentity: Реализация идеи
Для реализации этой идеи каждый товар должен обладать уникальным код отслеживания, который позволит в любой момент времени однозначно идентифицировать его. Например, в самом простом случае это может быть QR-код (также могут применяться NFC-метки), который наклеен на товар. Код связан с идентификационными данными о товаре (цвет, вес, номер изделия, номер партии, фото, дата и место производства, производитель и прочее), которые записаны в приватный блокчейн Ethereum (платформа для создания децентрализованных онлайн-сервисов на базе блокчейна). Такая запись данных о продукции не позволяет изменить его характеристики в любой момент времени и вы смодете проследить весь путь движение товара.
Описанным выше способом можно пометить все товары и решить проблему их однозначной идентификации. Однако, указанная реализация не решает проблему создания контрафакта. Кто-нибудь может купить один настоящий продукт, копировать и тиражировать QR-код на аналогичные поддельные товары. Выход в данной ситуации следующий: в блокчейн необходимо разместить статус товара и его владельца, который будет меняться в зависимости от стадии его жизненного цикла. Для реализации описанной выше логики в проекте была развернута сеть Ethereum на основе Azure Blockchain as a Service. Они позволили гибко настраивать правила передачи собственности от одного участника к другому.
Для реализации описанной выше логики в проекте была развернута сеть Ethereum на основе Azure Blockchain as a Service, что позволило гибко настраивать правила передачи собственности от одного участника к другому. Общая схема функционирования приведена ниже.
В рамках системы Buydentity командой были разработаны:
- Личный кабинет контрагента. Кабинет позволяет создавать товары и их отдельные единицы, отслеживать статус и перемещение товара, создавать уникальные QR-коды, передавать товар другому контрагенту.
- Мобильное приложение iOS для проверки подлинности товара. Покупатель сканирует QR-код и видит детальную информацию о товаре на экране своего мобильного телефона.
Ниже показан примерный вид карточки товара в мобильном приложении.
Учитывая знания и опыт работы, были выбраны следующий набор технологий для реализации системы:
- Framework: Angular 2, .Net Framework;
- Платформа: ASP.NET Core, Microsoft Azure (Etherium Blockchain as a Service);
- Языки программирования: C#, TypeScript, JavaScript;
- База данных: PostgreSQL;
- Мобильное приложение: Objective-C.
Ключевые проблемы и их решение
Для работы с сетью Ethereum команда воспользовалась клиентом Geth, который позволяет подключаться и осуществлять транзакции по протоколу http. Для тестирования и отладки был развернут приватный блокчейн, однако, при попытке доступа к интерфейсу управления с помощью .NET-библиотеки Nethereum, постоянно возникала ошибка подключения к клиенту. Проблема оказалась в устаревшей версии клиента Geth. Кстати, обновления можно найти в репозитории на GitHub.
Следующая проблема, которая оказалась относительно простой, возникла с подключением клиента Geth к удаленному клиенту в виртуальной машине Microsoft Azure. Как оказалось, она скрывалась не только в клиенте, но и в настройке фаервола виртуальной машины. С этой проблемой можно разобраться с помощью материала по настройке конечных точек виртуальных машин. Для доступа к клиенту Geth извне достаточно указать флаг --wsaddr “0.0.0.0”
(по умолчанию localhost).
Смарт-контракты Ethereum были выбраны не случайно — синтаксис языка Solidity несложный, очень похож на JavaScript и можно сказать, что подобен языку C. Поэтому первая версия контракта была быстро реализована и проверена с помощью веб-IDE.
Далее для каждого товара мы создаем смарт-контракт, в котором хранится информация о товаре, а также цепочка всех звеньев цепи от производителя до конечного продавца. Осуществить передачу собственности на товар может только предыдущий владелец, указанный в контракте. При получении товара, новый владелец подтверждает свое право собственности через тот же самый контракт.
Таким образом, блокчейн 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 развернуты несколько серверов, используя отдельный шаблон (можно найти здесь). Клиенты go-ethereum
, автоматически установленные при разворачивании шаблона, связаны между собой в сеть (как это сделать описано здесь). В общем виде, архитектура приложения выглядит следующим образом:
Запросы, предполагающие работу с Ethereum, перенаправляются в очередь. Затем эти сообщения обрабатываются отдельными сервисами. Реализация выглядит именно так, потому что фиксация транзакций, изменяющих состояние контракта, довольно затратная по времени операция и пользователю не обязательно дожидаться завершения этих операций.
Работа с 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 после проведения хакатона активно начала развивать свой проект и представлять его на различных форумах и публичных мероприятиях. Подробную информацию о проекте можно найти на сайте.
На ближайшее будущее команда определила следующие основные задачи:
- Интеграция Buydentity с Offchain системами производителей и ритейлеров, что позволит быстро встраивать наше решение в уже существующие бизнес-процессы;
- Расширение способов маркировки товара: RFID-метки, NFC-чипы, лазерная маркировка и так далее;
- Разработка конструктора создания товаров для внесения максимально широкого перечня данных о продукции;
- Соответствие существующим международным стандартам маркировки продукции;
- Отслеживание подозрительных сканирований товара и отправка жалоб на контрафактный товар.
Сейчас команда проекта ищет производителей продукции для пилотного внедрения. По вопросам работы систем можно писать на mail@buydentity.ru.
Автор: Microsoft