Розробка NFC-чипа з привязкою до NFT
Фізичні об'єкти та NFT — очевидна концепція, погана реалізація якої робить весь проект бессмисленним. Якщо привязка зводиться до «сканюй чип — відкривається ссилка на OpenSea», то NFT тут декоративний елемент. Реальна зв'язь означає, що фізичному об'єкту неможна створити дубліката без криптографічної підробки. Це розв'язне — але тільки якщо чип вмітить підписувати сообщения приватним ключем, який фізично вбудований та не витягується.
Вибір чипа: вимоги до криптографії
Не кожен NFC чип підходит. NTAG213/215/216 — стандартні Mifare теги для простого считування URL. Ніякої криптографії, клонуються за 10 секунд з будь-яким Android та NFC Tools Pro.
Потрібен чип з asymmetric key pair та signing capability:
NXP NTAG 424 DNA — найпоширеніший вибір. AES-128 на борту, SUN (Secure Unique NFC) message authentication. При кожному считуванні генерує унікальне CMAC-підписане сообщение з rolling counter. Приватний ключ записується при виробництві та не читається извне. Вартість — $1-3 за чип у партії.
Kong Halo — розроблений спеціально для phygital NFT. ECC (secp256k1 — та ж крива, що в Ethereum), кожне считування генерує ECDSA підпис над keccak256(chipAddress || blockHash || counter). Сумісний з EIP-191 personal_sign, верифікація signature on-chain через ecrecover. Нативна інтеграція з ERS (Ethereum Registrar Standards) протоколом.
Arx Research HaLo — аналогічний Kong Halo. Використовується в RTFKT, Adidas Physical NFT проектах. Публічний ключ чипа — детермінований адрес Ethereum.
Для серйозного phygital проекту вибір між NTAG 424 DNA та HaLo залежит від завдання: NTAG 424 дешевше та стандартніше, HaLo нативно сумісний з Ethereum підписами та не вимагає кастомної верифікації.
Криптографічна схема привязки
HaLo / Kong Halo схема
Кожен чип має вбудовану ключову пару secp256k1. Публічний ключ — chipAddress. При считуванні телефоном (через Web NFC API або нативний додаток) чип підписує challenge:
signature = ECDSA.sign(
privateKey,
keccak256(abi.encodePacked(chipAddress, cmdBlock, counter))
)
counter інкрементується при кожному считуванні — replay attack неможливий. cmdBlock містить дані про конкретну команду.
Смарт-контракт зберігає маппинг chipAddress => tokenId. Верифікація ownership:
function verifyChipSignature(
uint256 tokenId,
bytes calldata signatureFromChip,
bytes32 blockHash,
uint256 blockNumber
) external view returns (bool) {
require(block.number - blockNumber <= MAX_BLOCK_AGE, "Stale");
address chipAddress = chipAddressOf[tokenId];
bytes32 digest = keccak256(abi.encodePacked(
chipAddress,
blockHash
));
address recovered = ECDSA.recover(digest, signatureFromChip);
return recovered == chipAddress;
}
blockHash включається в підпис щоб привязати скан до конкретного моменту часу — захист від збережених та відтворених підписів.
NTAG 424 DNA схема
Чип використовує AES-128 CMAC. Кожне считування генерує URL вроде:
https://verify.project.xyz/?e=<encrypted_uid>&c=<cmac>
encrypted_uid — зашифрований AES-128 UID чипа (унікальний), cmac — Message Authentication Code, включає rolling counter. Верифікаційний сервер розшифровує UID та перевіряє CMAC з known secret key. Counter перевіряється на монотонне зростання.
Слабість порівняно з HaLo: AES ключ повинен бути відомий верифікаційному серверу. Компрометація сервера = можливість клонування підписів. Для HaLo приватний ключ не знає ніхто.
Контракт привязки: PBT стандарт
EIP-5791 (Physical Backed Token) — стандарт саме для цього. Розширює ERC-721 двома функціями:
function tokenIdMappedFor(address chipAddress) external view returns (uint256);
function isChipSignatureForToken(uint256 tokenId, bytes calldata payload, bytes calldata signature) external view returns (bool);
Референсна реалізація — Chiru Labs PBT. Наслідуємось від PBT, переопределяємо логіку верифікації під конкретний чип.
Передача токена через chip scan — transferTokenWithChip():
function transferTokenWithChip(
bytes calldata signatureFromChip,
uint256 blockNumberUsedInSig
) external {
require(block.number - blockNumberUsedInSig <= getMaxBlockhashValidWindow(), "Expired");
bytes32 blockHash = blockhash(blockNumberUsedInSig);
require(blockHash != bytes32(0), "Block too old");
bytes32 digest = keccak256(abi.encodePacked(msg.sender, blockHash));
address chipAddress = digest.recover(signatureFromChip);
uint256 tokenId = _chipAddressToTokenId[chipAddress];
_transfer(ownerOf(tokenId), msg.sender, tokenId);
}
Це означає: щоб перенести NFT на новий гаманець, потрібно фізично прикласти предмет до телефону та одночасно підписати транзакцію. Без фізичного предмета — передача неможлива. Це ключова властивість для luxury goods та collectibles.
Мобільний додаток та Web NFC
Считування HaLo чипів:
- Web NFC API (Chrome Android): працює без додатка, тільки Android
- iOS: вимагає нативного додатка (NFC entitlement Apple)
- React Native + react-native-nfc-manager: кроссплатформенний варіант
Приклад сканування через Web NFC:
const ndef = new NDEFReader();
await ndef.scan();
ndef.addEventListener("reading", ({ message }) => {
const record = message.records[0];
const decoder = new TextDecoder();
const url = decoder.decode(record.data);
// Парсимо параметри, вызываємо верифікацію
handleChipScan(url);
});
Для HaLo потрібна їхня JavaScript SDK (@arx-research/libhalo) — абстрагує низькорівневу роботу з APDU командами.
Виробництво та прошивка
Чипи прошиваються batch-скриптом: генеруються ключові пари (якщо чип дозволяє кастомні ключі) або записуються public keys з фабричних пар в базу даних. Кожен чип маппится на chipAddress.
При мінті NFT колекції: frontend отримує список chipAddress → tokenId та вызывает setChipAddresses(tokenId[], chipAddress[]) в контракті. Або чипи прошиваються з вже відомими tokenId та контракт верифікує маппинг при першому сканованні.
Захист від підміни чипа при виробництві: чип заламінований або залитий в виріб так, що фізичне витягнення розрушує предмет. Стікери з чипами вразливі до переклейки — не підходять для дорогих товарів.
Застосування та сценарії
Luxury goods: кроссовки, годинники, сумки — chip scan підтверджує аутентичність та ownership history. Resale рынок бачит повний provenance.
Ticketing + physical collectible: концертний білет з NFC = NFT + physical stub. Після мероприятия NFT залишається як proof of attendance, chip scan при вході = on-chain check-in.
Ігрові фігурки / trading cards: scan фігурки мінтить game item в метавселенній. Sell фізичної фігурки = transfer NFT через chip signature.
Арт: художник деплоїть 1/1 NFT з chip у рамі. Покупка картини = transfer через chip scan. Неможливо продати NFT без фізичної передачі роботи.







