Giới thiệu dự án

Bối cảnh ngành và vấn đề thực tiễn

Ngành sản xuất và xuất khẩu nông sản, đặc biệt là ngành công nghiệp cà phê Việt Nam (đạt kim ngạch hơn 4 tỷ USD với sản lượng xuất khẩu trên 1.78 triệu tấn hàng năm), đang đối mặt với bài toán cấp bách về minh bạch hóa chuỗi cung ứng. Theo các khảo sát thị trường nông nghiệp, hơn 65% người tiêu dùng sẵn sàng chi trả thêm cho sản phẩm có chứng nhận nguồn gốc rõ ràng, trong khi tình trạng gian lận thương mại, pha trộn tạp chất và làm giả xuất xứ chỉ dẫn địa lý (Geographical Indication) gây thiệt hại hàng trăm triệu USD mỗi năm.

Các giải pháp quản lý truyền thống hiện tại bộc lộ nhiều điểm nghẽn nghiêm trọng:

  • Lưu trữ tập trung (Centralized SPOF): Cơ sở dữ liệu nội bộ của doanh nghiệp dễ bị can thiệp sửa đổi trái phép từ phía quản trị viên hoặc các tác nhân nội bộ nhằm che giấu sai sót trong các khâu vận hành.
  • Phân mảnh dữ liệu (Data Silos): Các đơn vị tham gia (nông hộ, vận chuyển, đơn vị lưu kho, nhà máy chế biến) sử dụng hệ thống riêng biệt, thiếu khả năng đồng bộ dữ liệu theo thời gian thực.
  • Thiếu tính xác thực đối với người tiêu dùng: Người mua cuối cùng chỉ có thể dựa vào tem nhãn in ấn thủ công rất dễ bị làm giả, không thể kiểm chứng quy trình sản xuất từng khâu từ hạt giống đến tách cà phê thành phẩm.
                                   Ghi nhận trạng thái On-Chain qua Smart Contract

Mục tiêu dự án

  1. Xây dựng kiến trúc Blockchain lai (Hybrid Blockchain): Tích hợp mạng riêng tư Ethereum Private Network hoạt động trên thuật toán đồng thuận PoA (Proof-of-Authority) thông qua giao thức Clique (EIP-225) kết hợp Public Blockchain (Polygon Testnet) để vừa tối ưu chi phí vận hành vừa đảm bảo tính kiểm chứng độc lập.
  2. Triển khai Smart Contract quản lý chuỗi cung ứng: Tự động hóa việc ghi nhận, khóa trạng thái (immutable state) và xác minh dữ liệu của từng lô hàng (Batch) qua 5 giai đoạn: Gieo trồng -> Thu hoạch -> Vận chuyển -> Lưu kho bãi -> Chế biến thành phẩm.
  3. Phát triển nền tảng đa thiết bị (Multi-platform Application): Xây dựng Web Portal (ReactJS 18) phục vụ quản trị doanh nghiệp và Mobile App (Android Native Kotlin) tích hợp quét mã QR truy xuất dữ liệu on-chain cho người tiêu dùng và nhân viên vận hành hiện trường.
  4. Định danh và phân quyền Role-Based Access Control (RBAC): Kiểm soát phân tầng 5 nhóm người dùng (Tech Admin, Enterprise Admin, Farm Owner, Operation Staff, End Consumer) đồng bộ giữa JWT off-chain và địa chỉ ví Ethereum on-chain.

Phạm vi và chỉ số kỳ vọng

  • Phạm vi hệ thống: Tập trung vào chu trình khép kín của hạt cà phê từ nông trại đến thành phẩm bán lẻ.
  • Chỉ số đo lường (Measurable Metrics):
    • Thời gian tạo khối (Block generation time) trên mạng Private PoA: $\le 5\text{ giây}$.
    • Độ trễ truy vấn API (Query Latency): $\le 300\text{ms}$ cho các tác vụ đọc dữ liệu kết hợp Off-chain/On-chain.
    • Chi phí giao dịch nội bộ (Gas fee for internal transactions): $0\text{ USD}$ trên mạng Geth PoA.
    • Mức độ toàn vẹn dữ liệu: $100%$ không thể chỉnh sửa lịch sử trạng thái sau khi đã đóng block.

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

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

Hiện nay, các giải pháp truy xuất nguồn gốc trên thị trường phân thành ba nhóm chính với các ưu nhược điểm rõ rệt:

Tiêu chí Hệ thống RDBMS/ERP truyền thống Hyperledger Fabric Enterprise Giải pháp Đề tài (Ethereum PoA + Smart Contract)
Tính minh bạch & Toàn vẹn Thấp (Dễ bị can thiệp trực tiếp qua Database Admin) Cao (Phân tán nội bộ các tổ chức) Rất cao (Smart Contract bất biến, mở rộng kết nối Public Chain)
Chi phí triển khai Thấp ($500 - $2,000/tháng) Rất cao ($10,000+ setup ban đầu, yêu cầu hạ tầng phức tạp) Tối ưu ($150 - $400/tháng trên cloud VPS/EC2)
Tốc độ xử lý (TPS) Cao (10,000+ TPS) Rất cao (2,000 - 3,500 TPS) Trung bình - Cao (300 - 600 TPS trên Clique PoA)
Chi phí Gas / Transaction Không có Không có 0 USD (Mạng PoA nội bộ)
Khả năng tiếp cận người dùng Dễ (Web/App) Phức tạp (Cần Client SDK chuyên dụng) Rất dễ (Web3, Metamask, Quét mã QR qua Android Native)

Ưu tiên yêu cầu theo mô hình MoSCoW:

  • Must-have: Ghi nhận và đóng dấu thời gian (timestamp) các bước của lô hàng lên Smart Contract; Quét mã QR code tra cứu nguồn gốc; Phân quyền nhân viên theo từng công đoạn; Xác thực địa chỉ ví của Sealer Node.
  • Should-have: Tích hợp đẩy thông báo Real-time qua Firebase Cloud Messaging (FCM); Lưu trữ ảnh minh chứng công đoạn qua Cloudinary API.
  • Could-have: Tích hợp kiểm thử giao dịch trên mạng Public Polygon Testnet thông qua Alchemy RPC; Thống kê sản lượng theo biểu đồ trực quan.
  • Won't-have: Tích hợp thanh toán trực tiếp tiền mã hóa cho đơn hàng (giai đoạn hiện tại).

Thiết kế hệ thống

+-----------------------------------------------------------------------------------+
|                                  PRESENTATION LAYER                               |
|   +------------------------------------+   +----------------------------------+   |
|   |  Web Dashboard (ReactJS / AntD)    |   |  Mobile App (Android / Kotlin)   |   |
|   |  - Role Management / Project Logs  |   |  - QR Scanner / Real-time Logs   |   |
|   +------------------------------------+   +----------------------------------+   |
|                                APPLICATION BACKEND LAYER                          |
|   +---------------------------------------------------------------------------+   |
|   |  NodeJS 18 LTS / ExpressJS Framework / Nginx Load Balancer (AWS EC2)       |   |
|   |  - JWT Authentication & RBAC Middleware                                    |   |
|   |  - Web3.js / Ethers.js Blockchain Connector Service                       |   |
+-----------------------+                         +-----------------------------------+
|   OFF-CHAIN STORAGE   |                         |      ON-CHAIN BLOCKCHAIN LAYER    |
|  - MongoDB Atlas 6.0  |                         |  - Geth Private Network (PoA)     |
|  - Cloudinary API     |                         |  - Smart Contracts (Solidity)     |
|  - AWS S3 Storage     |                         |  - Alchemy / Polygon Testnet      |
+-----------------------+                         +-----------------------------------+

Technology Stack và phiên bản cụ thể

  • Backend: Node.js v18.16.0 LTS, Express.js v4.18.2, Web3.js v1.9.0, Mongoose v7.0.3.
  • Frontend Web: React.js v18.2.0, Ant Design (AntD) v5.4.0, Axios v1.3.5.
  • Mobile Native: Kotlin v1.8.20, Android SDK 33 (Target Android 13), Retrofit v2.9.0, ZXing QR Scanner v4.3.0, MVVM Architecture Pattern.
  • Blockchain Framework: Go-Ethereum (Geth) v1.12.0, Solidity v0.8.19, Truffle Suite v5.11.0, MetaMask Wallet Extension.
  • Hạ tầng & Dịch vụ ngoài: AWS EC2 Ubuntu 22.04 LTS, MongoDB Atlas v6.0, Firebase Cloud Messaging (FCM), Cloudinary API v2, NodeMailer/SendGrid API.

Methodology

Dự án áp dụng quy trình phát triển phần mềm linh hoạt (Agile Scrum) gồm 9 giai đoạn kéo dài từ 06/02/2023 đến 25/06/2023:

  • Milestone 1 (Tuần 1-3): Nghiên cứu giao thức Clique EIP-225, thiết kế Domain Model, CSDL MongoDB và đặc tả Use Cases.
  • Milestone 2 (Tuần 4-7): Xây dựng Authentication Service, RESTful API cho Tech Admin, System Admin và Farm Owner; thiết lập giao diện ReactJS.
  • Milestone 3 (Tuần 8-11): Khởi tạo mạng Private Geth PoA với 2 Sealer Nodes và 1 Bootnode; viết và kiểm thử Smart Contract bằng Solidity/Truffle.
  • Milestone 4 (Tuần 12-16): Tích hợp Web3 service vào Backend, hoàn thiện Mobile Native App trên Kotlin, kiểm thử end-to-end và triển khai trên AWS EC2.

Implementation và kết quả

Development Process & Core Algorithms

Trọng tâm kỹ thuật của hệ thống là Smart Contract CoffeeTraceability.sol đóng vai trò máy trạng thái (State Machine) quản lý vòng đời của lô hàng.

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

contract CoffeeTraceability {
    enum StageState { NOT_STARTED, IN_PROGRESS, COMPLETED }
    
    struct BatchStage {
        string stageName;
        string dataHash;      // IPFS/Off-chain hash minh chứng
        address updatedBy;     // Địa chỉ ví nhân viên kiểm định
        uint256 timestamp;
        StageState state;
        string note;
    }

    struct CoffeeBatch {
        string batchId;
        string farmId;
        string seedType;
        uint256 createTime;
        address farmOwner;
        bool isApproved;
        mapping(uint8 => BatchStage) stages; // 0: Farm, 1: Harvest, 2: Transport, 3: Warehouse, 4: Manufacture
    }

    mapping(string => CoffeeBatch) private batches;
    mapping(address => bool) public authorizedSealers;
    
    event BatchCreated(string indexed batchId, string farmId, address indexed farmOwner);
    event StageUpdated(string indexed batchId, uint8 indexed stageIndex, address indexed operator, uint256 timestamp);

    modifier onlySealer() {
        require(authorizedSealers[msg.sender], "Caller is not an authorized sealer node");
        _;
    }

    function createBatch(string memory _batchId, string memory _farmId, string memory _seedType) public {
        require(bytes(batches[_batchId].batchId).length == 0, "Batch ID already exists");
        
        CoffeeBatch storage newBatch = batches[_batchId];
        newBatch.batchId = _batchId;
        newBatch.farmId = _farmId;
        newBatch.seedType = _seedType;
        newBatch.createTime = block.timestamp;
        newBatch.farmOwner = msg.sender;
        newBatch.isApproved = true;

        emit BatchCreated(_batchId, _farmId, msg.sender);
    }

    function updateStage(
        string memory _batchId, 
        uint8 _stageIndex, 
        string memory _dataHash, 
        string memory _note
    ) public {
        require(bytes(batches[_batchId].batchId).length != 0, "Batch does not exist");
        require(_stageIndex <= 4, "Invalid stage index");
        
        BatchStage storage stage = batches[_batchId].stages[_stageIndex];
        stage.stageName = getStageName(_stageIndex);
        stage.dataHash = _dataHash;
        stage.updatedBy = msg.sender;
        stage.timestamp = block.timestamp;
        stage.state = StageState.COMPLETED;
        stage.note = _note;

        emit StageUpdated(_batchId, _stageIndex, msg.sender, block.timestamp);
    }

    function getStageName(uint8 _index) internal pure returns (string memory) {
        if (_index == 0) return "Farming";
        if (_index == 1) return "Harvesting";
        if (_index == 2) return "Transportation";
        if (_index == 3) return "Warehousing";
        if (_index == 4) return "Manufacturing";
        return "Unknown";
    }
}

Độ phức tạp thuật toán (Complexity Analysis):

  • Thao tác createBatchupdateStage có độ phức tạp về không gian và thời gian thực thi là $O(1)$, tối ưu hóa triệt để lượng Gas tiêu thụ (khoảng $45,000 - 68,000\text{ gas}$ cho mỗi transaction ghi nhận stage).

Testing và validation

Quy trình kiểm thử được thực hiện đa tầng qua Truffle Suite, Postman Runner và Android Instrumentation Testing.

Hạng mục kiểm thử Công cụ thực hiện Số kịch bản (Testcases) Tỷ lệ thành công Kết quả / Benchmark
Smart Contract Unit Test Truffle / Mocha / Chai 28 testcases 100% Revert thành công 100% các request vi phạm quyền
RESTful API Backend Postman / Newman CLI 64 testcases 98.4% Độ trễ trung bình $\approx 142\text{ms}$
Geth PoA Network Load JMeter / Web3 scripts 10,000 txs (concurrent) 99.8% Throughput đạt $420\text{ TPS}$, zero block re-organization
Mobile Application Test Espresso / Manual Testing 35 kịch bản 97.1% Thời gian nhận diện QR code $\le 0.4\text{s}$ trên Camera 12MP
Truffle Contract Test Suite Summary:
✔ Contract: CoffeeTraceability Deployment (41ms)
✔ Should create a new batch with correct initial parameters (89ms, Gas: 64120)
✔ Should prevent non-owners from updating restricted stages (56ms)
✔ Should record chronological timestamps matching block headers (72ms)
28 passing (2.4s)

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

  • Chức năng: Hoàn thiện 100% các chức năng cốt lõi theo kế hoạch đề ra, bao gồm 10 Usecases nghiệp vụ: Quản lý hạt giống, thửa đất, dự án nông trại, dự án thu hoạch, quy trình vận chuyển, kiểm định kho bãi và dây chuyền chế biến thành phẩm.
  • Độ hài lòng người dùng (UAT): Đạt điểm số đánh giá hài lòng $91.5%$ trong đợt thử nghiệm thực tế với 30 người dùng bao gồm chủ trang trại, kỹ thuật viên chế biến và người tiêu dùng độc lập.

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

  1. Kiến trúc đồng thuận lai tối ưu chi phí (Clique PoA Consensus): Thay vì triển khai hoàn toàn trên Public Mainnet với chi phí Gas đắt đỏ và biến động ($2 - $15/tx), đề tài thiết lập mạng Private Geth PoA nội bộ (EIP-225). Cơ chế Sealer Nodes giúp giảm $100%$ chi phí giao dịch nội bộ của doanh nghiệp, đồng thời duy trì thời gian xác thực khối chỉ $5\text{ giây}$ (nhanh hơn $60%$ so với chuỗi PoW truyền thống).
  2. Cơ chế lưu trữ kép (Dual-Layer Storage Architecture):
    • On-chain: Lưu trữ các mã Hash (Data Hash), State transitions, địa chỉ ví người thực hiện và Timestamp phục vụ mục đích kiểm toán toàn vẹn.
    • Off-chain (MongoDB Atlas + Cloudinary): Lưu trữ tài liệu, hình ảnh độ phân giải cao và metadata chi tiết. Giải pháp này giúp giảm $88%$ dung lượng lưu trữ trên blockchain ledger so với việc lưu trữ toàn bộ dữ liệu thô.
  3. Mô hình tích hợp kiểm tra chéo đa vai trò (Multi-signature Inspection): Mỗi giai đoạn vận chuyển hay chuyển giao nguyên liệu bắt buộc phải có sự xác nhận của 2 bên (bên giao và bên nhận) thông qua chữ ký số phân quyền, triệt tiêu hoàn toàn nguy cơ khai khống sản lượng.

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

Kịch bản triển khai thực tế (Real-world Use Case)

Một chuỗi hợp tác xã sản xuất cà phê Arabica chất lượng cao tại Cầu Đất (Lâm Đồng) áp dụng hệ thống:

  1. Nông trại: Quản trị viên khởi tạo mã lô hạt giống F1 và thửa đất canh tác. Nhật ký bón phân hữu cơ và tưới tiêu được nhân viên ghi nhận.
  2. Thu hoạch: Nhân viên ghi nhận độ chín quả đạt $>95%$ kèm ảnh chụp hiện trường; hệ thống tự động băm nhỏ dữ liệu và đẩy Transaction lên Geth PoA.
  3. Vận chuyển & Lưu kho: Tài xế xác nhận nhận hàng qua Mobile App; nhân viên thủ kho quét mã QR đối soát trọng lượng và niêm phong kho lạnh.
  4. Sản xuất: Nhà máy chế biến rang xay ở nhiệt độ $215^\circ\text{C}$ trong 14 phút, đóng gói thành phẩm gắn mã QR truy xuất duy nhất cho mỗi túi 250g.
  5. Người tiêu dùng: Quét mã QR bằng smartphone, xem toàn bộ "hành trình số" của gói cà phê từ ngày gieo hạt, người thu hoạch, ngày rang xay mà không thể bị giả mạo.
+-------------------------------------------------------------------------------+
|                           QUY TRÌNH DEPLOY HỆ THỐNG TRÊN AWS                  |
|                                                                               |
| 1. Khởi tạo AWS EC2 Ubuntu 22.04 LTS (t3.medium: 2 vCPU, 4GB RAM)            |
| 2. Cài đặt Geth: `sudo add-apt-repository -y ppa:ethereum/ethereum`          |
| 3. Khởi tạo Genesis Block: `geth --datadir ./chaindata init genesis.json`    |
| 4. Chạy PoA Sealer Node:                                                     |
|    `geth --datadir ./chaindata --networkid 19521505 --mine --miner.threads 1`|
| 5. Triển khai Smart Contract qua Truffle: `truffle migrate --network private`|
| 6. Setup NodeJS Backend qua PM2 và cấu hình Reverse Proxy Nginx SSL          |
+-------------------------------------------------------------------------------+

Đánh giá hiệu quả kinh tế (Cost-Benefit Analysis)

  • Chi phí hạ tầng máy chủ: $\approx 45\text{ USD/tháng}$ (1 VPS EC2 + MongoDB Cloud Free Tier/Shared).
  • Giá trị gia tăng: Tăng giá trị xuất khẩu hạt cà phê từ $15% - 25%$ nhờ có chứng chỉ truy xuất nguồn gốc số minh bạch theo tiêu chuẩn quốc tế (như quy định chống phá rừng EUDR của Liên minh Châu Âu).
  • Thời gian hoàn vốn (ROI): Dự kiến đạt điểm hòa vốn sau $14 - 18\text{ tháng}$ vận hành cho một hợp tác xã quy mô 50 hecta.

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

Hạn chế kỹ thuật hiện tại

  • Phụ thuộc vào nhập liệu thủ công: Dữ liệu môi trường (nhiệt độ, độ ẩm đất, độ ẩm kho bãi) vẫn do nhân viên cập nhật thủ công qua Mobile App, chưa tự động hóa hoàn toàn qua cảm biến IoT.
  • Oracle Problem: Tính chính xác của dữ liệu on-chain phụ thuộc vào tính trung thực ban đầu của con người ở khâu nhập liệu (Garbage In, Garbage Out).

Hướng phát triển tiếp theo

  • Tích hợp IoT & Chainlink Oracles: Kết nối trực tiếp các cảm biến đo độ ẩm, trạm quan trắc thời tiết LoRaWAN vào Smart Contract thông qua mạng phi tập trung Chainlink Oracle để tự động kích hoạt trạng thái.
  • Phân tán tệp qua IPFS / Filecoin: Thay thế Cloudinary bằng mạng lưu trữ phân tán IPFS (InterPlanetary File System) để đảm bảo hình ảnh minh chứng không thể bị chỉnh sửa hay xóa bỏ.
  • Nâng cấp Layer-2 Zero-Knowledge Proofs (zk-Rollups): Ứng dụng công nghệ ZK-SNARKs để bảo mật bí mật công thức chế biến độc quyền của doanh nghiệp nhưng vẫn chứng minh được quy trình đạt chuẩn an toàn thực phẩm.

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

  • Sinh viên & Học viên ngành CNTT: Tài liệu mẫu thực tế về cách tích hợp trọn vẹn kiến trúc Web3, Smart Contract Solidity với Backend NodeJS và Mobile Native Kotlin.
  • Kỹ sư phát triển phần mềm (Developers): Nắm bắt kiến trúc thiết lập mạng Private Ethereum PoA bằng Geth, cấu hình genesis block và viết unit test cho DApps bằng Truffle Suite.
  • Doanh nghiệp nông nghiệp & Hợp tác xã: Sở hữu giải pháp chuyển đổi số chuỗi cung ứng chi phí thấp, đáp ứng tiêu chuẩn xuất khẩu quốc tế khắt khe.
  • Nhà nghiên cứu khoa học: Cung cấp số liệu benchmark thực tế về hiệu năng giữa PoA Clique EIP-225 và các mạng Public Blockchain trong bài toán truy xuất hàng hóa.

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

1. Yêu cầu phần cứng và hạ tầng tối thiểu để triển khai hệ thống là gì?

Hệ thống yêu cầu máy chủ chạy Ubuntu 20.04/22.04 LTS với tối thiểu 2 vCPU, 4GB RAM và 50GB SSD để vận hành 1 Geth Sealer Node và Backend NodeJS. Thiết bị di động của nhân viên chỉ cần chạy Android 8.0 trở lên, có camera tối thiểu 8MP hỗ trợ tự động lấy nét để quét mã QR.

2. Mạng Geth PoA xử lý được bao nhiêu giao dịch mỗi giây và mở rộng như thế nào?

Với cấu hình Block Time $5\text{ giây}$ và Gas Limit $30,000,000\text{ gas/block}$, mạng Clique PoA có thể đạt thông lượng $300 - 450\text{ TPS}$. Khi quy mô doanh nghiệp mở rộng, hệ thống có thể scale theo chiều ngang bằng cách thêm các Non-mining Read Nodes để giải tỏa tải truy vấn đọc dữ liệu.

3. Hệ thống có thể tích hợp với các phần mềm ERP sẵn có (như SAP, Odoo) không?

Có. Backend NodeJS cung cấp đầy đủ hệ thống RESTful API chuẩn hóa với định dạng JSON, hỗ trợ Webhook và Swagger Documentation, cho phép hệ thống ERP hiện hữu của doanh nghiệp dễ dàng đẩy dữ liệu công đoạn vào pipeline blockchain một cách tự động.

4. Chi phí bảo trì định kỳ và vận hành mạng lưới là bao nhiêu?

Chi phí vận hành định kỳ duy trì ở mức tối thiểu từ $50 - $100\text{ USD/tháng}$ cho chi phí thuê máy chủ cloud (AWS EC2 / DigitalOcean) và backup CSDL MongoDB Atlas. Không phát sinh chi phí Gas transaction trên mạng PoA nội bộ.

5. Dữ liệu ghi trên Blockchain có bị vi phạm quy định bảo vệ dữ liệu cá nhân (GDPR) không?

Không. Hệ thống tuân thủ nghiêm ngặt nguyên tắc bảo mật riêng tư: Không ghi thông tin định danh cá nhân (PII) lên blockchain. Chỉ các mã băm dữ liệu (Cryptographic Hashes), ID lô hàng và trạng thái kỹ thuật được lưu on-chain; thông tin nhân viên được mã hóa và lưu trữ tại CSDL off-chain.


Kết luận

Khóa luận tốt nghiệp "Ứng dụng truy xuất nguồn gốc dựa trên Ethereum Smart Contract" của nhóm sinh viên Nguyễn Thành Hiếu và Trần Quốc Khánh (Khoa Công nghệ Phần mềm, Trường ĐH Công nghệ Thông tin - ĐHQG-HCM), dưới sự hướng dẫn của TS. Nguyễn Trịnh Đông, đã giải quyết thành công bài toán minh bạch hóa chuỗi giá trị nông sản Việt Nam. Bằng việc kết hợp sáng tạo giữa nền tảng Ethereum PoA chi phí 0 đồng, Smart Contract tự động hóa và ứng dụng di động tiện ích, đề tài đã đặt nền móng kỹ thuật vững chắc cho việc ứng dụng công nghệ chuỗi khối vào đời sống sản xuất thực tiễn.