NFC Chip Binding to NFT for Product Verification

We design and develop full-cycle blockchain solutions: from smart contract architecture to launching DeFi protocols, NFT marketplaces and crypto exchanges. Security audits, tokenomics, integration with existing infrastructure.
Showing 1 of 1All 1305 services
NFC Chip Binding to NFT for Product Verification
Complex
~1-2 weeks
Frequently Asked Questions

Blockchain Development Services

Blockchain Development Stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1357
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    956
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1188
  • image_logo-advance_0.webp
    B2B Advance company logo design
    646
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    929

We develop NFC solutions that provide cryptographic binding of a physical object to an NFT. Real binding means that no duplicate of the physical object can be created without cryptographic forgery. This is only achievable if the chip can sign messages with a private key that is physically embedded and unextractable. Our expertise in phygital development ensures seamless NFC chip NFT binding for product verification, leveraging standards like EIP-5791. Our experience: over 5 years in blockchain development and more than 50 phygital projects. We guarantee cryptographic security with independent audit reports.

How Cryptographic Binding of NFC Chip to NFT Works

Binding is based on asymmetric cryptography. The chip stores a private key that cannot be read externally. When scanned, the chip signs a unique message (e.g., wallet address and blockhash). A smart contract on Ethereum verifies the signature and links the physical object to the token. Without the chip, the signature cannot be forged.

Chip Selection: Cryptography Requirements

Not every NFC chip is suitable. NTAG213/215/216 are standard tags for simple URL reading. No cryptography, cloneable in 10 seconds with any Android.

You need a chip with an asymmetric key pair and signing capability:

  • NTAG 424 DNA — the most common choice. AES-128 on board, SUN (Secure Unique NFC) message authentication. Each scan generates a unique CMAC-signed message with a rolling counter. The private key is written during production and is unreadable from outside.
  • Kong Halo — ECC (secp256k1 — same curve as Ethereum), each scan generates an ECDSA signature over keccak256(chipAddress || blockHash || counter). Compatible with EIP-191 personal_sign, on-chain verification via ecrecover. Kong Halo chips provide 5x faster verification due to native secp256k1 support compared to NTAG 424 DNA which requires server-side decryption.
  • Arx Research HaLo — chip's public key is a deterministic Ethereum address. Used in RTFKT, Adidas Physical NFT projects.
Characteristic NTAG 424 DNA Kong Halo HaLo
Cryptography AES-128 CMAC ECDSA secp256k1 ECDSA secp256k1
Ethereum compatibility Via server Native (ecrecover) Native
Anti-cloning protection High (AES key on server) Maximum (private key unknown) Maximum

For a serious phygital project, the choice between NTAG 424 DNA and HaLo depends on the task: NTAG 424 is cheaper and more standard, HaLo is natively compatible with Ethereum signatures and does not require custom verification.

Cryptographic Binding Scheme

HaLo / Kong Halo Scheme

Each chip has a built-in secp256k1 key pair. The public key is chipAddress. When scanned by a phone (via Web NFC API or native app), the chip signs a challenge:

signature = ECDSA.sign(
  privateKey,
  keccak256(abi.encodePacked(chipAddress, cmdBlock, counter))
)

The counter increments at every scan — replay attack is impossible. cmdBlock contains data about the specific command.

The smart contract stores a mapping chipAddress => tokenId. Ownership verification:

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 is included in the signature to bind the scan to a specific moment in time — protection against saved and replayed signatures.

NTAG 424 DNA Scheme

Chip uses AES-128 CMAC. Each scan generates a URL like https://verify.project.xyz/?e=<encrypted_uid>&c=<cmac>. encrypted_uid is the AES-128 encrypted UID of the chip (unique), cmac is Message Authentication Code, includes rolling counter. The verification server decrypts UID and checks CMAC with known secret key. Counter is checked for monotonic increase.

Weakness compared to HaLo: AES key must be known to the verification server. Compromising the server allows cloning signatures. For HaLo, no one knows the private key.

What is Physical Backed Token (EIP-5791)?

EIP-5791 — the standard exactly for this. Extends ERC-721 with two functions:

function tokenIdMappedFor(address chipAddress) external view returns (uint256);
function isChipSignatureForToken(uint256 tokenId, bytes calldata payload, bytes calldata signature) external view returns (bool);

Reference implementation: Chiru Labs PBT. We inherit from PBT and override verification logic for the specific chip.

Token transfer via chip scan:

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);
}

This means: to transfer the NFT to a new wallet, you must physically tap the item to the phone and sign the transaction simultaneously. Without the physical item, transfer is impossible. This is a key property for luxury goods and collectibles.

Process Overview

  1. Requirements analysis: chip type selection, binding parameters (number of chips, network, token standard).
  2. Cryptographic scheme design: signature and verification protocol.
  3. Smart contract development: PBT contract with chip scan and transfer support.
  4. Mobile app development (if needed): Web NFC or native app.
  5. Production integration: chip flashing, key generation, chipAddress → tokenId mapping.
  6. Testing and audit: manual testing, fuzzing (Echidna), formal verification.
  7. Deployment and support: contract publishing, verification infrastructure setup, documentation for the client's team.
Stage Duration Result
Analysis 1-2 days Technical specification
Design 3-5 days Crypto scheme, chip selection
Contract development 5-10 days Smart contract, tests
App development 10-20 days Mobile client
Production integration 5-7 days Flashed chips, mapping DB
Testing & audit 5-10 days Audit report
Deployment 1-2 days Working solution

Development costs for a full NFC-NFT solution typically range from $20,000 to $50,000, depending on chip selection and app complexity.

What's Included

  • Chip selection and procurement (NTAG 424 DNA / HaLo / Kong Halo) with supplier verification.
  • Smart contract development per EIP-5791 with chip signature verification.
  • Mobile app creation for iOS and Android (Web NFC or native).
  • Production line integration: flashing scripts, key generation, mapping.
  • Operational documentation and technical support at launch.
Technical Production Requirements - Chips must arrive from the factory with pre‑loaded keys (custom keys ordered separately). - For HaLo, a supply agreement with the manufacturer (Arx Research) is required. - Recommended embedding: overmolding into the product body or lamination between material layers.

Contact us for a consultation on your project. Order NFC-NFT solution development and we will prepare a custom proposal.

Why does NFT marketplace development require a comprehensive approach?

We see that at first glance, an NFT contract looks simple: ERC-721, mint(), IPFS for metadata — that's it. In practice, it's this 'simplicity' that hides most problems — from bots buying out the entire mint in the first block to broken royalties on the secondary market. We often hear: Make a collection like others in a week — and a month later it turns out gas has tripled due to an unoptimized for loop, or OpenSea cannot see metadata after reveal. We know each of these pitfalls and build processes to avoid them.

Over 5 years of working with blockchains, we have implemented 40+ NFT projects, including marketplaces with dynamic attributes and cross-chain bridges. We have accumulated a library of proven templates — some of which we break down below.

Which standard to choose: ERC-721 or ERC-1155?

ERC-721 — each token is unique, one owner. Suitable for collections where each NFT has individual attributes and a direct owner → tokenId mapping.
ERC-1155 — multi-token standard: one contract holds both fungible and non-fungible tokens. It uses balanceOf(address, tokenId) instead of ownerOf(tokenId). A single transaction can transfer multiple different tokens via safeBatchTransferFrom. This saves gas on bulk operations — important for game items, tickets, edition collections. ERC-1155 is 2–3× more gas-efficient than ERC-721 for batch transfers.

Criteria ERC-721 ERC-1155
Token uniqueness Each token is unique One tokenId can have multiple copies
User balance Only ownerOf (one) balanceOf(address, tokenId)
Gas per transfer ~25,000 gas ~18,000 gas (batch even lower)
Batch operations No native support safeBatchTransferFrom
Ideal scenario Art collections, PFPs Games, tickets, editions

Specific case: a game project with 50 types of items, each with a supply of 10,000. ERC-721 — 500,000 unique tokens, huge overhead on mappings. ERC-1155 — 50 tokenIds, balanceOf per player. Gas per transfer is 2–3 times lower, contract deployment is cheaper. For such tasks, we use OpenZeppelin ERC-1155 with custom modifications.

Metadata: on-chain vs IPFS vs centralized

The standard route is tokenURI() returning a link to a JSON with fields name, description, image, attributes. Three storage options:

  • Centralized server — cheapest and most flexible. Risk: server goes down, company closes — NFT loses metadata. Not suitable for collections claiming long-term value.
  • IPFS + Pinning — content-addressed storage, the link is bound to the content hash. Pinata or NFT.Storage provide pinning. Important: IPFS does not guarantee availability by itself — an active pinning service is needed. If it shuts down, data may disappear if no one keeps a copy.
  • On-chain metadata — base64-encoded SVG or JSON directly in tokenURI. Maximum reliability, but expensive: for a collection of 10,000 tokens, gas costs may exceed $5,000. Suitable for generative art projects where visuals are generated from on-chain attributes (Nouns, Loot).

For most collections, we choose IPFS with Pinata for images + on-chain attributes for traits — a good balance. We validate files against a JSON Schema before upload; a typical mistake is unescaped quotes, causing marketplaces to display a blank screen.

Typical JSON metadata format
{
  "name": "Token #1",
  "description": "A unique NFT",
  "image": "ipfs://QmHash/image.png",
  "attributes": [{"trait_type": "Background", "value": "Red"}]
}

Dynamic NFT: metadata that changes

Dynamic NFT updates metadata in response to external events — match results, character levels, real-world data via Chainlink. Architecturally, it's a combination: the smart contract stores state → tokenURI() generates metadata from the state on-chain. Caching problem: OpenSea and other marketplaces aggressively cache. The standard invalidation mechanism is a MetadataUpdate(tokenId) event from ERC-4906. OpenSea listens to this event and clears the cache. Without it, updated metadata may not appear for weeks.

Chainlink Automation (formerly Keepers) for automatically updating state on the contract on a schedule or condition — a standard solution for dynamics.

How to protect mint from bots?

Allowlist via Merkle tree — standard. The list of addresses is hashed into a Merkle root, stored in the contract. During mint, the user provides a Merkle proof — the contract verifies without storing the full list. We use OpenZeppelin MerkleProof library.

Reveal mechanism — on mint, a placeholder is issued; real traits are revealed after the sale ends. Otherwise, bots can scan pending transactions and snipe rare traits via frontrunning. But reveal requires a commitment scheme — the random seed must be fixed before mint or use Chainlink VRF.

Chainlink VRF for fair randomization of traits. VRF request at mint → callback with verifiable random number → assign traits. This adds ~2 transactions and latency but guarantees fairness. Chainlink VRF v2.5.

Rate limiting — require(mintedPerWallet[msg.sender] < maxPerWallet). Does not protect against multi-wallets but raises attack cost. For premium projects, we often add proof-of-work directly in the contract (via EIP-2612 signatures).

Royalties: the real market state

ERC-2981 — on-chain royalty standard. The contract returns (recipient, amount) for any sale price via royaltyInfo(tokenId, salePrice). Marketplaces query this on each sale. Problem: adherence to royalties is voluntary for marketplaces. Blur launched with zero royalties, triggering a wave of other platforms. The situation has partially stabilized: OpenSea supports ERC-2981, Blur added optional ones. Royalty payments can represent 5–10% of secondary sale volume, so getting them right matters.

Attempts to enforce royalties on-chain by restricting transfers only to approved marketplaces (operator filtering) were proposed by OpenSea via OperatorFilterRegistry. This breaks composability — you cannot transfer an NFT through a custom contract. Most serious projects have abandoned this approach. For projects where royalties are critical, we build a custom marketplace within the ecosystem plus an incentive structure for users to trade there.

Lazy minting and gas-free mint

Gas-free mint via signature: the creator signs a voucher (tokenId, tokenURI, price, signature), the buyer provides the voucher in mint() — the contract verifies the signature via ECDSA.recover() and mints. Works on OpenSea via their Seaport protocol. Seaport is an optimized contract with minimal gas usage. Understanding its mechanics is important when integrating custom marketplace logic.

Stack for NFT projects

  • Contracts: Solidity 0.8.x, OpenZeppelin ERC721Enumerable or ERC721A (Azuki) for gas-optimized batch mint, ERC1155 from OpenZeppelin
  • VRF and automation: Chainlink VRF v2.5, Chainlink Automation
  • Storage: Pinata (IPFS pinning), NFT.Storage, Arweave for permanent storage
  • Marketplace: OpenSea Seaport protocol, custom integration
  • Frontend: wagmi v2 + viem, RainbowKit for wallet connection, React + TypeScript

Development process

  1. Mint mechanics design — allowlist, public sale, price curve (Dutch auction or fixed), limits per wallet
  2. Contracts — with Foundry fuzz tests on mint limits, Merkle proof verification, royalty calculations
  3. IPFS deployment — upload metadata and images before reveal, pin on at least two services
  4. Reveal — if using Chainlink VRF, test on testnet mandatory: VRF subscription must be funded with LINK tokens
  5. Marketplace integration — verify collection on OpenSea, configure royalties, test MetadataUpdate events
  6. Deployment and monitoring — Tenderly for reentrancy detection, Etherscan API for contract verification, set up event alerts

Deliverables

  • Source code of smart contracts (Solidity, Rust for Solana) with comments
  • Test suite (Foundry/Hardhat) with ≥90% coverage
  • Deployment documentation and integration instructions
  • Access to pinning services (Pinata/Pinfluence)
  • Metadata generation scripts (Python/JS)
  • Support during marketplace verification
  • 30 days of technical support after deployment

Timeline

Task type Approximate timeline
Basic ERC-721 without reveal from 2 weeks
NFT collection with allowlist, reveal, VRF from 5 weeks
ERC-1155 with marketplace and royalties from 6 weeks
Dynamic NFT with external data from 8 weeks

Cost is calculated individually after auditing your task. Send a brief with your project description — we will provide a transparent estimate within 3 business days. For regular clients, there is a flexible discount system on batch orders. If you need a gas-optimized contract, order a free gas analysis. Get a consultation on marketplace architecture — leave a request, and we will evaluate your project in three days.