Разработка 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[]) в контракте. Либо chips прошиваются с уже известными 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 без физической передачи работы.







