Занурення в технологію блокчейн: Боротьба з контрафактними товарами

Продовжуємо серію статей про перше в Росії проектах, розроблених на основі технології блокчейн. Нагадуємо, що ми запитали у команд-учасниць хакатона 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 (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.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.