Trang chủHướng dẫnAirdrop NFT là gì? Hướng dẫn thực chiến NFT Airdrop Onchain – Offchain
Blockchain

Airdrop NFT là gì? Hướng dẫn thực chiến NFT Airdrop Onchain – Offchain

CyStack blog 5 phút để đọc
CyStack blog11/05/2025
Locker Avatar

Đức Hacker

My passion is hunting down the latest attack trends—ransomware, APTs, you name it—while passing on knowledge to help businesses forge ironclad defenses. I’ve left my mark on data encryption projects and intrusion detection tools now widely used across Vietnam. I’m the shadow that strikes before the enemy does.
Locker logo social
Reading Time: 5 minutes

Nếu bạn đang làm một dự án NFT – dù là collectable, membership hay community-driven – thì việc airdrop NFT có thể là chiến lược khởi đầu cực kỳ hiệu quả. Thực tế, rất nhiều dự án mình từng build hoặc hỗ trợ đều áp dụng ít nhất 1 đợt airdrop NFT để:

  • Tăng độ nhận diện thương hiệu
  • Thưởng cho early supporter
  • Bắt cầu sang một cộng đồng khác (ví dụ: airdrop cho holder của BAYC, Azuki,…)
  • Launch utility NFT tặng cho user cũ

Vậy airdrop NFT là gì và làm thế nào để triển khai nó đúng cách?

nft airdrop

Trong bài này mình sẽ hướng dẫn chi tiết 2 hình thức phổ biến nhất của NFT airdrop:

  1. Mint trực tiếp từ contract và chuyển cho user (on-chain)
  2. Cho phép người dùng tự claim bằng allowlist + chữ ký (off-chain)

Cả hai đều đã được mình test kỹ bằng Hardhat + OpenZeppelin. Code ở đây sẵn sàng để bạn clone về dùng cho dự án thực tế.

Đọc thêm: RPC Node blockchain

Airdrop NFT là gì?

Hiểu nôm na: Airdrop NFT là việc phân phối token (ở đây là NFT) miễn phí đến một nhóm ví cụ thể, thường để làm marketing, tri ân, hoặc kích hoạt người dùng.

Bạn có thể tự mint NFT rồi gửi đến ví user, hoặc cho phép họ vào dApp và “claim” lấy NFT. Dùng cách nào thì ý tưởng chung vẫn là bạn chủ động “phát” token, không cần user phải mua hay đấu giá.

Ví dụ: dự án Gutter Cat Gang từng cho phép holder cũ mint miễn phí các NFT Gutter Dogs và Gutter Rats – đó chính là một dạng NFT airdrop.

Có thể bạn quan tâm: Chi phí deploy smart contract trên polygon

Cách Airdrop NFT: Mint trực tiếp và gửi tới ví (On-Chain)

Đây là cách nhanh gọn: bạn chủ động mint NFT và gửi trực tiếp đến các ví mà bạn đã chọn.

Đầu tiên, mình sẽ setup dự án với Hardhat + OpenZeppelin (chuẩn industry). Nếu bạn làm việc với Solidity thì combo này quá quen thuộc rồi.

Bước 1: Tạo project Hardhat & cài đặt thư viện

mkdir nft-airdrop && cd nft-airdrop
npm init -y
npm install --save-dev hardhat
npx hardhat

Chọn Create a JavaScript project → accept default

Sau đó test setup:

npx hardhat test

Cài đặt OpenZeppelin Contracts:

npm install @openzeppelin/contracts

Bước 2: Viết smart contract hỗ trợ airdrop NFT

Tạo file NFTAirdrop.sol trong folder contracts:

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "hardhat/console.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";

contract NFTAirdrop is ERC721Enumerable, Ownable {
using Counters for Counters.Counter;

Counters.Counter private _tokenIds;

constructor() ERC721("NFT Aidrop Demo", "NAD") {
console.log("Contract has been deployed!");
}

function airdropNfts(address[] calldata wAddresses) public onlyOwner {
for (uint i = 0; i < wAddresses.length; i++) {
_mintSingleNFT(wAddresses[i]);
}
}

function _mintSingleNFT(address wAddress) private {
uint newTokenID = _tokenIds.current();
_safeMint(wAddress, newTokenID);
_tokenIds.increment();
}
}

AirdropNfts được đánh dấu onlyOwner → chỉ chủ dự án mới chạy được lệnh mint này.

Bước 3: Tạo script chạy airdrop

Tạo file run.js trong folder scripts và paste code sau:

const { ethers } = require("hardhat");
const hre = require("hardhat");

async function main() {

const airdropAddresses = [
'0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
'0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc',
'0x90f79bf6eb2c4f870365e785982e1f101e93b906',
'0x15d34aaf54267db7d7c367839aaf71a00a2c6a65',
'0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc',
];

const factory = await hre.ethers.getContractFactory("NFTAirdrop");
const [owner] = await hre.ethers.getSigners();
const contract = await factory.deploy();

await contract.deployed();
console.log("Contract deployed to: ", contract.address);
console.log("Contract deployed by (Owner): ", owner.address, "\\n");

let txn;
txn = await contract.airdropNfts(airdropAddresses);
await txn.wait();
console.log("NFTs airdropped successfully!");

console.log("\\nCurrent NFT balances:")
for (let i = 0; i < airdropAddresses.length; i++) {
let bal = await contract.balanceOf(airdropAddresses[i]);
console.log(`${i + 1}. ${airdropAddresses[i]}: ${bal}`);
}

}

main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});

Chạy lệnh:

npx hardhat run scripts/run.js

Kết quả sẽ là:

  • Contract deploy thành công
  • Từng ví trong danh sách được mint 1 NFT
  • Gas fee do owner chịu hoàn toàn

Airdrop NFT bằng Off-Chain Allowlist + Digital Signature

Nếu bạn cần airdropping NFTs cho vài trăm (hoặc vài nghìn) ví thì mint trực tiếp là… tốn tiền và tốn gas. Cách hay hơn là dùng allowlist + signature → user tự claim NFT, bạn không tốn gas cho từng mint.

Dưới đây là flow chuẩn:

  • Bạn giữ danh sách các ví eligible (off-chain)
  • Bạn ký message cho từng ví
  • User mang signature + ví của họ lên contract để claim NFT
  • Contract xác thực signature → cho phép mint nếu hợp lệ

Bước 1: Viết contract hỗ trợ off-chain allowlist

Tạo file NftAllowlist.sol:

// SPDX-License-Identifier: MIT pragma solidity ^0.8.4;

import "hardhat/console.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";

contract NFTAllowlist is ERC721Enumerable, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIds; mapping(bytes => bool) public signatureUsed;

constructor() ERC721("NFT Allowlist Demo", "NAD") { console.log("Contract has been deployed!"); }

function recoverSigner(bytes32 hash, bytes memory signature) public pure returns (address) { bytes32 messageDigest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); return ECDSA.recover(messageDigest, signature); }

function claimAirdrop(uint _count, bytes32 hash, bytes memory signature) public { require(recoverSigner(hash, signature) == owner(), "Address is not allowlisted"); require(!signatureUsed[signature], "Signature has already been used.");

   for (uint i = 0; i < _count; i++) {
       _mintSingleNFT();
   }

   signatureUsed[signature] = true;

}

function _mintSingleNFT() private { uint newTokenID = _tokenIds.current(); _safeMint(msg.sender, newTokenID); _tokenIds.increment(); } }

Bước 2: Tạo script ký message và claim NFT

Tạo runAllowlist.js:

  1. Airdropping NFTs cho collection

Về logic, có 2 bước:

  1. Lấy danh sách ví đang hold token từ một smart contract (ERC721 hoặc ERC1155)
  2. Sử dụng danh sách này làm đầu vào cho airdrop (mint trực tiếp, hoặc ký allowlist như phần trên)

Làm sao lấy được danh sách holder?

Có 3 cách phổ biến:

  • Truy vấn on-chain: Dùng Web3/Ethers để gọi balanceOf() trên contract NFT, kèm theo với enum toàn bộ tokenId → tìm ra owner từng NFT. Cách này chậm, nhưng on-chain 100%.
  • Sử dụng dịch vụ indexer: Dùng một dịch vụ backend (tự build hoặc dùng của bên thứ ba) để crawl sự kiện Transfer của contract NFT → từ đó dựng lại state ai đang hold cái gì.
  • Sử dụng API NFT indexer (như Alchemy, Moralis, Covalent,…): Bạn gọi một endpoint để lấy về list ví đang hold NFT của một contract cụ thể. Cách này nhanh, dễ setup, phù hợp cho airdrop quy mô lớn.

Mình không đi sâu vào cách gọi API cụ thể nào ở đây, nhưng bạn hoàn toàn có thể tự chọn giải pháp phù hợp tuỳ vào cách bạn muốn xử lý logic backend hay frontend.

Lưu ý:

  • Một NFT có thể được chuyển giữa các ví → hãy query dữ liệu theo block hoặc thời điểm snapshot cụ thể.
  • Đừng quên lọc duplicate ví nếu holder sở hữu nhiều NFT trong cùng collection.

Sau khi bạn có danh sách ví, bạn có thể:

  • Dùng on-chain mint: viết contract + script airdropNfts()
  • Hoặc generate chữ ký cho từng ví để họ tự claim qua claimAirdrop()

Xem thêm: Solidity programming tutorial

Lời kết

Airdrop NFT là một trong những chiến thuật growth/marketing hữu hiệu nhất trong hệ sinh thái Web3. Dù bạn là indie dev hay đang chạy một dự án nghiêm túc, việc biết cách airdropping NFTs sẽ giúp bạn:

  • Kích hoạt người dùng sớm
  • Tạo phần thưởng cho loyalty
  • Bắt nhịp cộng đồng khác
  • Tiết kiệm chi phí (nếu dùng off-chain allowlist)

Bài viết liên quan:

0 Bình luận

Đăng nhập để thảo luận

CyStack blog

Mẹo, tin tức, hướng dẫn và các best practice độc quyền của CyStack

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.