Продолжаем серию статей о первых в России проектах, разработанных на основе технологии блокчейн. Напоминаем, что мы спросили у команд-участниц хакатона InspiRussia о технологической составляющей их решений.

В этой материале речь пойдет о проекте Buydentity, который помогает бороться с проблемой контрафактных товаров.



Цикл статей «Погружение в технологию блокчейн»


1. Серия материалов, посвященных технологии Emer:
1.1. Секреты EmerCoin.
1.2. Децентрализованная нецензурированная система доменных имён.
1.3. Инфраструктура публичных ключей всемирного масштаба.
1.4. Децентрализованная беспарольная система безопасности.
2. Быстрые и безопасные транзакции.
3. Экосистема цифровой стоматологии.
4. Борьба с контрафактными товарами.
5. Loading…

Buydentity: Борьба с контрафактом


Разработчики проекта Buydentity — это друзья-энтузиасты, которые решили попробовать себя в разработке с помощью блокчейна.

Участники поставили перед собой задачу разработки полезного проекта, поэтому в результате была выбрана тема по проблеме борьбы с контрафактными товарами. Прежде, чем начать разработку, участниками была проанализирована проблематика оборота контрафактной продукции в мире. Они выяснили, что:

  1. У государств нет системного подхода в области регулирования контрафакта.
  2. Большинству людей достаточно сложно отличить подделку от настоящего товара. Тем более качество подделок с каждым годом становится все выше.
  3. Все чаще стали подделывать востребованные и недорогие товары, а не товары премиум-класса.
  4. Между покупателем и производителем очень длинная цепочка из различных контрагентов и посредников. Невозможно понять каким образом тот или иной товар попал на полки конкретного магазина.

К тому же, в целом, в мире наблюдается значительный рост рынка контрафакта. Так по данным доклада Организации экономического сотрудничества и развития (ОЭСР):

  • Годовой оборот контрафактной продукции в мире в 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 (Ethereum 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.

Далее для каждого товара мы создаем смарт-контракт, в котором хранится информация о товаре, а также цепочка всех звеньев цепи от производителя до конечного продавца. Осуществить передачу собственности на товар может только предыдущий владелец, указанный в контракте. При получении товара, новый владелец подтверждает свое право собственности через тот же самый контракт.

Таким образом, блокчейн Ethereum позволяет отойти от задач криптографии и защиты важной информации и сразу приступить к реализации бизнес задач. Наличие «умных» контрактов значительно облегчает реализацию идеи передачи собственности единицы товара от участника к участнику. Вот как может выглядеть смарт-контракта передачи товара на языке 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.
Поделиться с друзьями
-->

Комментарии (0)