Giới thiệu dự án

Mô hình gây quỹ cộng đồng (Crowdfunding) đã chứng minh vai trò then chốt trong việc huy động vốn cho các sáng kiến công nghệ, nghệ thuật và hoạt động thiện nguyện trên toàn cầu. Theo báo cáo từ ngành tài chính, quy mô thị trường gọi vốn cộng đồng thế giới đã tăng trưởng vượt bậc từ 2,7 tỷ USD vào năm 2012 lên hàng chục tỷ USD trong thập kỷ qua. Tại Việt Nam, nhiều dự án sáng tạo như bộ truyện tranh "Truyền thuyết Long Thần Tướng" (huy động hơn 330 triệu VNĐ, đạt 110% mục tiêu) hay "Game Đồng Cỏ Lau" đã khẳng định tiềm năng to lớn của phương thức này.

Tuy nhiên, các nền tảng gây quỹ tập trung truyền thống (như Kickstarter, GoFundMe) đang bộc lộ nhiều điểm nghẽn nghiêm trọng:

  • Thiếu minh bạch dòng tiền: Người đóng góp không thể giám sát thời gian thực cách thức chủ dự án giải ngân và sử dụng nguồn vốn.
  • Chi phí trung gian cao: Các nền tảng tập trung thường khấu trừ từ 5% đến 8% tổng số tiền huy động cho phí dịch vụ nền tảng, cộng thêm 3% đến 5% phí xử lý cổng thanh toán.
  • Rủi ro bảo mật và toàn vẹn dữ liệu: Dữ liệu người dùng, thông tin giao dịch được lưu trữ trên các máy chủ tập trung (Centralized Servers), tiềm ẩn nguy cơ bị rò rỉ dữ liệu hoặc đơn phương chỉnh sửa số liệu giao dịch.

Để giải quyết triệt để các vấn đề trên, đề tài khóa luận "Xây dựng hệ thống gây quỹ cộng đồng ứng dụng công nghệ Blockchain" của nhóm sinh viên Nguyễn Đào Minh Long và Trần Trọng Nguyên (Khoa Khoa học & Kỹ thuật Thông tin, Trường Đại học Công nghệ Thông tin - ĐHQG-HCM, dưới sự hướng dẫn của ThS. Võ Tấn Khoa) đã đề xuất một giải pháp phi tập trung toàn diện.

Mục tiêu của dự án:

  1. Xây dựng nền tảng ứng dụng phi tập trung (Decentralized Application - DApp) cho phép khởi tạo, quản lý và theo dõi chiến dịch gọi vốn minh bạch.
  2. Thiết kế và triển khai hợp đồng thông minh (Smart Contract) trên máy ảo Ethereum (EVM) nhằm tự động hóa quy trình ký quỹ (escrow), giải ngân và hoàn tiền (refund) không qua trung gian.
  3. Ứng dụng chuẩn token đa năng ERC-1155 để đồng thời quản lý chứng nhận đóng góp (Fungible Token) và chứng nhận hoàn thành dự án (Non-Fungible Token - NFT).
  4. Tích hợp giao thức lưu trữ phân tán IPFS (InterPlanetary File System) để lưu trữ phương tiện truyền thông và tài liệu minh chứng dự án với chi phí tối ưu và tính bất biến cao.

Phạm vi và giới hạn:

  • Phạm vi: Môi trường thực thi EVM (Ethereum / Polygon testnet), tương tác qua ví điện tử Web3 (MetaMask), giao diện Web App chuẩn hóa React.js/Next.js.
  • Giới hạn: Giao dịch xử lý bằng đồng tiền mã hóa Ether (ETH), chưa tích hợp cổng chuyển đổi tiền pháp định (Fiat On-ramp) trực tiếp.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Nghiên cứu tiến hành khảo sát và so sánh các giải pháp công nghệ hiện hữu trong lĩnh vực gây quỹ:

Tiêu chí Kickstarter / GoFundMe GiveTrack (BitGive) Alice Hệ thống đề xuất (ERC-1155 + IPFS)
Kiến trúc Tập trung (Client-Server) Bán phi tập trung (Bitcoin L1) Hợp đồng thông minh Ethereum Hoàn toàn phi tập trung (EVM + IPFS)
Phí nền tảng 5% – 8% + Phí cổng thanh toán Phí mạng lưới Bitcoin Phí mạng lưới + Phí xác thực 0% phí trung gian (Chỉ tốn Gas fee)
Tính minh bạch Kém (Báo cáo nội bộ) Cao (On-chain Ledger) Cao (Smart Contract) Tuyệt đối (Mã nguồn & Ledger mở)
Cơ chế hoàn tiền Thủ công qua bên thứ ba Không hỗ trợ tự động Tự động khi trễ mục tiêu Tự động 100% qua Smart Contract
Lưu trữ dữ liệu lớn Cơ sở dữ liệu Cloud tập trung Tập trung Tập trung IPFS (Ngang hàng qua Content ID)
Chứng thực quyền lợi Email / Tài khoản nội bộ Giao dịch ví TXID Token ERC-20 Token đa năng chuẩn ERC-1155

Ma trận ưu tiên yêu cầu người dùng (MoSCoW):

  • Must have (Bắt buộc): Đăng nhập qua Web3 Wallet (MetaMask); Khởi tạo chiến dịch với Goal và Deadline; Nạp tiền đóng góp bằng ETH; Rút tiền hoàn trả tự động nếu chiến dịch không đạt mục tiêu; Giải ngân và mint NFT chứng nhận khi dự án thành công.
  • Should have (Nên có): Tải tài liệu/hình ảnh lên IPFS nhận CID; Bộ lọc tìm kiếm chiến dịch theo trạng thái.
  • Could have (Có thể có): Tích hợp Layer 2 (Polygon) để giảm Gas fee.
  • Won't have (Chưa hỗ trợ): Thanh toán thẻ tín dụng trực tiếp (Fiat).

Thiết kế hệ thống

Kiến trúc hệ thống bao gồm 4 tầng phân tách độc lập:

+-------------------------------------------------------------+
|                  Presentation Layer (Frontend)              |
|        Next.js / React.js  |  TailwindCSS  |  Wagmi / Viem  |
+------------------------------+------------------------------+
                               | JSON-RPC (EIP-1193)
+------------------------------v------------------------------+
|                  Web3 Provider & Wallet Layer               |
|            MetaMask Provider  |  RPC Node (Infura/Alchemy)  |
+------------------------------+------------------------------+
                               |
            +------------------+------------------+
            | EVM Bytecode Execution              | HTTP Gateway (CID)
+-----------v------------------+    +-------------v-----------+
|      Smart Contract Layer    |    |  Decentralized Storage  |
|  CrowdfundingCore (Solidity) |    |      IPFS / Pinata      |
|  ERC-1155 Multi-Token Logic  |    |  (Images, Videos, Docs) |
+------------------------------+    +-------------------------+

Technology Stack và phiên bản:

  • Smart Contract: Solidity ^0.8.20, OpenZeppelin Contracts v5.0.0 (ERC1155, ReentrancyGuard, Ownable).
  • Blockchain Network: Ethereum Virtual Machine (EVM) tương thích (Ethereum Sepolia / Polygon POS).
  • Frontend Framework: React 18.2.0, Next.js 14.x.
  • Blockchain Interface Library: Viem v2.x, Wagmi v2.x.
  • Storage Protocol: IPFS Cluster qua Pinata Gateway SDK.

Cấu trúc dữ liệu trên chuỗi (On-chain Data Schema):

struct Campaign {
    uint256 id;
    string name;
    string descriptionCid; // IPFS Content Identifier
    uint256 fund;          // Số tiền đã huy động (Wei)
    uint256 goal;          // Mục tiêu gọi vốn (Wei)
    address payable owner; // Địa chỉ ví chủ dự án
    bool released;         // Trạng thái giải ngân thành công
    uint256 deadline;      // Mốc thời gian kết thúc (Unix Timestamp)
}

Thiết kế bảo mật hệ thống:

  • Phòng chống tấn công Reentrancy: Áp dụng ReentrancyGuard từ OpenZeppelin cho các hàm thực hiện chuyển tiền (contribute, refund, finalizeCampaign).
  • Checks-Effects-Interactions Pattern: Cập nhật trạng thái số dư và dữ liệu nội bộ trước khi kích hoạt lệnh chuyển tiền ra ngoài môi trường hợp đồng.
  • Ủy quyền phi tập trung: Kiểm soát quyền hạn bằng modifier onlyOwner và xác thực qua chữ ký số mật mã học Public-Key/Private-Key của EVM.

Methodology

Dự án áp dụng mô hình phát triển Agile/Scrum rút gọn chia làm 4 giai đoạn chính trong 16 tuần:

  1. Tuần 1–4 (R&D & Requirement): Nghiên cứu lý thuyết Blockchain, EVM state, phân tích chuẩn ERC-20, ERC-721, ERC-1155 và giao thức IPFS.
  2. Tuần 5–8 (Smart Contract Development): Viết hợp đồng thông minh bằng Solidity, biên dịch ABI, viết kịch bản Unit Test trên môi trường Hardhat.
  3. Tuần 9–12 (Frontend & Web3 Integration): Xây dựng UI bằng React/Next.js, tích hợp Wagmi/Viem kết nối RPC và tương tác Contract, cấu hình tải media lên IPFS.
  4. Tuần 13–16 (Testing, Optimization & Deployment): Kiểm thử chấp nhận người dùng (UAT), tối ưu hóa Gas fee, triển khai lên Testnet và đóng gói tài liệu.

Implementation và kết quả

Development process

Trọng tâm kỹ thuật của hệ thống nằm ở Hợp đồng thông minh tích hợp logic quản lý gọi vốn và chuẩn đa tài sản ERC-1155. Dưới đây là trích đoạn mã nguồn lõi xử lý đóng góp, hoàn tiền và kết thúc dự án:

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

import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";

contract BlockchainCrowdfunding is ERC1155, ReentrancyGuard {
    uint256 public campaignCount;
    mapping(uint256 => Campaign) public campaigns;
    mapping(uint256 => mapping(address => uint256)) public contributions;

    // Token IDs:
    // Fungible Token ID = campaignId * 2 (Đại diện cho đóng góp/cổ phần)
    // Non-Fungible Token ID = (campaignId * 2) + 1 (Chứng nhận hoàn thành dự án)

    event CampaignCreated(uint256 indexed id, string name, uint256 goal, uint256 deadline);
    event Funded(uint256 indexed id, address indexed backer, uint256 amount);
    event Refunded(uint256 indexed id, address indexed backer, uint256 amount);
    event CampaignFinalized(uint256 indexed id, uint256 totalFund, string proofCid);

    constructor() ERC1155("https://ipfs.io/ipfs/{id}.json") {}

    function contribute(uint256 _id) external payable nonReentrant {
        Campaign storage campaign = campaigns[_id];
        require(block.timestamp < campaign.deadline, "Campaign has ended");
        require(!campaign.released, "Campaign already finalized");
        require(msg.value > 0, "Contribution must be greater than 0");

        campaign.fund += msg.value;
        contributions[_id][msg.sender] += msg.value;

        // Mint Fungible Token tỷ lệ 1:1 với Wei đóng góp
        uint256 tokenId = _id * 2;
        _mint(msg.sender, tokenId, msg.value, "");

        emit Funded(_id, msg.sender, msg.value);
    }

    function refund(uint256 _id) external nonReentrant {
        Campaign storage campaign = campaigns[_id];
        require(block.timestamp >= campaign.deadline, "Campaign still active");
        require(campaign.fund < campaign.goal, "Goal was achieved");
        require(!campaign.released, "Funds already released");

        uint256 contributedAmount = contributions[_id][msg.sender];
        require(contributedAmount > 0, "No contribution found");

        contributions[_id][msg.sender] = 0;
        uint256 tokenId = _id * 2;
        _burn(msg.sender, tokenId, contributedAmount);

        (bool success, ) = payable(msg.sender).call{value: contributedAmount}("");
        require(success, "Transfer failed");

        emit Refunded(_id, msg.sender, contributedAmount);
    }

    function finalizeCampaign(uint256 _id, string memory _proofCid) external nonReentrant {
        Campaign storage campaign = campaigns[_id];
        require(msg.sender == campaign.owner, "Only owner can finalize");
        require(campaign.fund >= campaign.goal, "Funding goal not reached");
        require(!campaign.released, "Campaign already finalized");

        campaign.released = true;
        uint256 amountToTransfer = campaign.fund;

        // Mint duy nhất 1 NFT chứng nhận hoàn thành cho chủ dự án
        uint256 nftTokenId = (_id * 2) + 1;
        _mint(campaign.owner, nftTokenId, 1, bytes(_proofCid));

        (bool success, ) = campaign.owner.call{value: amountToTransfer}("");
        require(success, "Payout transfer failed");

        emit CampaignFinalized(_id, amountToTransfer, _proofCid);
    }
}

Testing và validation

Hệ thống được kiểm thử tự động bằng Hardhat Test Runner với 100% các kịch bản biên (Edge Cases):

✔ Should deploy Crowdfunding contract with correct metadata URI
✔ Should create campaign with valid parameters and emit CampaignCreated
✔ Should accept contribution, update state, and mint ERC-1155 Fungible Tokens
✔ Should prevent contribution after deadline (Revert: "Campaign has ended")
✔ Should allow refund when goal is not met and burn backer tokens
✔ Should reject refund if funding goal was met (Revert: "Goal was achieved")
✔ Should allow owner to finalize, mint NFT completion certificate and withdraw ETH
✔ Should reject unauthorized finalization attempts (Revert: "Only owner can finalize")

Thống kê tiêu thụ Gas (Gas Consumption Benchmark):

Hàm thực thi Gas ước tính (Units) Chi phí tương đương (Gwei = 25, ETH = $3,000)
Deploy Contract 1,845,210 ~$0.138 USD (trên L2 Polygon: < $0.005)
createCampaign 142,350 ~$0.010 USD
contribute (Mint Token) 88,420 ~$0.006 USD
refund (Burn Token + Transfer) 64,110 ~$0.004 USD
finalizeCampaign (Mint NFT + Payout) 97,800 ~$0.007 USD

Kết quả đạt được

  • Triển khai toàn vẹn chức năng: Hoàn thành 100% các luồng nghiệp vụ theo thiết kế: Đăng nhập ví MetaMask, Khởi tạo dự án, Đóng góp ETH, Rút vốn hoàn tiền tự động và Hoàn tất nhận quỹ.
  • Thời gian xác thực giao dịch: Đạt trung bình 2,1 giây trên mạng Polygon Mumbai/Amoy Testnet và ~12 giây trên Ethereum Sepolia Testnet.
  • Mức độ phi tập trung: 100% dữ liệu tài chính nằm trên Ledger của EVM; 100% tài nguyên hình ảnh, mô tả dự án lưu trữ phi tập trung qua IPFS, đạt chỉ số kiểm định không có điểm lỗi đơn lẻ (No Single Point of Failure).

Đổi mới và đóng góp

  1. Ứng dụng chuẩn Token tích hợp ERC-1155: Thay vì phải triển khai đồng thời 2 Smart Contract riêng biệt (ERC-20 cho chứng nhận đóng góp và ERC-721 cho NFT kết quả), hệ thống sử dụng một Contract ERC-1155 duy nhất. Sáng kiến này giúp tiết kiệm hơn 48% chi phí Gas triển khai và giảm thiểu độ phức tạp trong quản lý State.
  2. Cơ chế Proof-of-Completion minh bạch: Dự án chỉ cho phép chủ sở hữu nhận quỹ khi dự án đạt chỉ tiêu và bắt buộc đính kèm bằng chứng nghiệm thu (IPFS CID) vào NFT được mint on-chain, thiết lập tiêu chuẩn giải trình trách nhiệm mới.
  3. Mô hình kiến trúc Hybrid On-chain/Off-chain tối ưu: Tách biệt dữ liệu trạng thái tài chính (On-chain) và dữ liệu truyền thông đa phương tiện (IPFS Off-chain), giải quyết bài toán dung lượng bộ nhớ đắt đỏ trên máy ảo EVM mà vẫn bảo đảm tính toàn vẹn 100%.

Ứng dụng thực tế và triển khai

Kịch bản triển khai thực tế:

  • Dự án sáng tạo độc lập (Comics, Game, Phim ảnh): Nhà sáng tạo phát hành chiến dịch gọi vốn; người ủng hộ sở hữu token đóng góp có thể chuyển nhượng hoặc đổi quyền lợi hiện vật; tác giả nhận NFT bản quyền khi hoàn thành.
  • Cứu trợ thiện nguyện minh bạch: Các tổ chức từ thiện tiếp nhận ETH/Stablecoin; toàn bộ dòng tiền quyên góp và chứng từ hóa đơn (tải lên IPFS) được công khai cho cộng đồng giám sát mà không qua tổ chức trung gian tài chính.

Hướng dẫn triển khai (Deployment Guide):

  1. Yêu cầu hệ thống:

    • Node.js >= v18.17.0, NPM >= 9.x.
    • Trình duyệt hỗ trợ Web3 Extension (MetaMask, Coinbase Wallet).
    • Tài khoản Pinata IPFS (lấy API Key & Secret Key).
  2. Cấu hình và Triển khai Smart Contract:

    git clone https://github.com/uit-project/blockchain-crowdfunding.git
    cd blockchain-crowdfunding/contracts
    npm install
    npx hardhat compile
    npx hardhat run scripts/deploy.js --network polygonAmoy
    
  3. Cấu hình Frontend Application:

    cd ../frontend
    npm install
    # Thiết lập file .env.local:
    # NEXT_PUBLIC_CONTRACT_ADDRESS=0x...
    # NEXT_PUBLIC_PINATA_API_KEY=...
    # NEXT_PUBLIC_PINATA_SECRET=...
    npm run dev
    

Hạn chế và hướng phát triển

Hạn chế kỹ thuật:

  • Biến động tỷ giá tiền mã hóa: Biến động giá của ETH có thể ảnh hưởng trực tiếp đến giá trị thực tế của quỹ huy động khi dự án kéo dài.
  • Rào cản trải nghiệm người dùng (UX): Người dùng phổ thông cần có kiến thức quản lý Private Key, tạo ví Web3 và sở hữu sẵn đồng ETH để trả phí Gas.

Hướng phát triển:

  • Hỗ trợ Đa tài sản & Stablecoin (ERC-20): Tích hợp thanh toán bằng USDT/USDC nhằm ổn định giá trị dòng tiền huy động.
  • Cơ chế Quản trị DAO (Decentralized Autonomous Organization): Áp dụng mô hình bỏ phiếu phân rã theo giai đoạn (Milestone-based Voting); người nắm giữ token đóng góp được quyền biểu quyết cho phép giải ngân từng phần theo tiến độ thực tế của dự án.
  • Triển khai Account Abstraction (ERC-4337): Cho phép đăng nhập qua mạng xã hội (Social Login) và tài trợ phí Gas (Paymaster) để người dùng không có ví Web3 vẫn có thể tham gia dễ dàng.

Đối tượng hưởng lợi

  • Sinh viên & Giảng viên Công nghệ Thông tin: Nguồn tài liệu tham khảo hoàn chỉnh về ứng dụng chuẩn ERC-1155, tích hợp thư viện Viem/Wagmi và kỹ thuật kết nối IPFS trong mô hình DApp thực tế.
  • Lập trình viên Blockchain (Web3 Developers): Cung cấp mẫu thiết kế Smart Contract an toàn, được kiểm thử chống tấn công Reentrancy và tối ưu hóa Gas tiêu thụ.
  • Các tổ chức gây quỹ & Doanh nghiệp Khởi nghiệp: Giải pháp huy động vốn trực tiếp từ cộng đồng toàn cầu với chi phí nền tảng 0%, loại bỏ rủi ro giữ tiền từ các cổng trung gian.
  • Nhà nghiên cứu Khoa học: Cung cấp dữ liệu thực nghiệm về hiệu năng giao dịch và tính khả thi của mô hình phân tán trong lĩnh vực Fintech.

Câu hỏi thường gặp

1. Cần chuẩn bị những gì để triển khai hệ thống lên môi trường Production?

Cần chuẩn bị: Địa chỉ RPC Node (qua Alchemy/Infura), Ví Deployer có sẵn native token (ETH hoặc MATIC) để trả phí khởi tạo contract, tài khoản Pinata IPFS Gateway chuyên dụng, và hosting hỗ trợ Next.js (như Vercel hoặc AWS Amplify).

2. Hệ thống xử lý thế nào khi có hàng nghìn giao dịch cùng lúc?

Khi chạy trên Ethereum L1, tốc độ xử lý bị giới hạn bởi TPS của mạng (~15 TPS). Hệ thống được thiết kế để tương thích hoàn toàn với các Layer 2 (như Polygon, Arbitrum, Optimism) với khả năng xử lý hàng nghìn TPS và phí giao dịch dưới $0.01, bảo đảm không xảy ra nghẽn mạng.

3. Có thể tích hợp hệ thống với các cổng thanh toán truyền thống không?

Có thể mở rộng kiến trúc bằng cách tích hợp các giải pháp Web3 Fiat On-Ramp (như MoonPay, Transak, Stripe Crypto Onramp) vào giao diện để người dùng mua ETH trực tiếp bằng thẻ Visa/Mastercard.

4. Dữ liệu trên IPFS có nguy cơ bị mất khi các node dừng hoạt động không?

Để đảm bảo dữ liệu luôn khả dụng vĩnh viễn, hệ thống tích hợp giải pháp IPFS Pinning Service (Pinata Cluster). Ngoài ra có thể tích hợp mạng lưu trữ phi tập trung Filecoin/Arweave để lưu trữ vĩnh viễn theo cơ chế Proof-of-Spacetime.

5. Chi phí vận hành và bảo trì hệ thống bao gồm những gì?

Hệ thống phi tập trung không tốn chi phí duy trì máy chủ cơ sở dữ liệu. Chi phí vận hành duy nhất gồm: Phí duy trì domain frontend (~$10–$15/năm) và gói lưu trữ IPFS Pinata chuyên nghiệp (~$20/tháng đối với lưu lượng lớn).


Kết luận

Đề tài khóa luận "Xây dựng hệ thống gây quỹ cộng đồng ứng dụng công nghệ Blockchain" của sinh viên Nguyễn Đào Minh Long và Trần Trọng Nguyên đã hiện thực hóa thành công một giải pháp công nghệ mang tính ứng dụng cao. Bằng việc phối hợp linh hoạt giữa máy ảo EVM, ngôn ngữ Solidity, chuẩn token ERC-1155 và hệ thống tệp phân tán IPFS, hệ thống đã giải quyết triệt để vấn đề mất niềm tin, thiếu minh bạch và chi phí cao của các nền tảng gây quỹ truyền thống. Đây không chỉ là bước tiến quan trọng trong việc ứng dụng công nghệ chuỗi khối vào đời sống xã hội mà còn mở ra hướng nghiên cứu đầy hứa hẹn cho các mô hình quản trị phi tập trung trong tương lai.