Đồ án tập trung vào việc xây dựng một ứng dụng xổ số phi tập trung, sử dụng Ethereum Smart Contracts, và được hỗ trợ bởi công nghệ Chainlink VRF Verifiable Random Function để đảm bảo tín
KIẾN THỨC NỀN TÀNG
Blockchain [1]
Blockchain là công nghệ chuỗi – khối, cho phép truyền tải dữ liệu một cách an toàn dựa trên hệ thống mã hóa vô cùng phức tạp, tương tự như cuốn sổ cái kế toán của một công ty, nơi mà tiền được giám sát chặt chẽ và ghi nhận mọi giao dịch trên mạng ngang hàng
Mỗi khối (block) đều chứa thông tin về thời gian khởi tạo và được liên kết với khối trước đó, kèm theo đó là một mã thời gian và dữ liệu giao dịch Dữ liệu khi đã được mạng lưới chấp nhận thì sẽ không có cách nào thay đổi được Blockchain được thiết kế để chống lại việc gian lận, thay đổi của dữ liệu.Các khái niệm của blockchain:
Các đặc điểm của blockchain
28 o Không thể làm giả, không thể phá hủy các chuỗi Blockchain: theo như lý thuyết thì chỉ có máy tính lượng tử mới có thể giải mã Blockchain và công nghệ Blockchain biến mất khi không còn Internet trên toàn cầu o Bất biến: dữ liệu trong Blockchain không thể sửa (có thể sửa nhưng sẽ để lại dấu vết) và sẽ lưu trữ mãi mãi o Bảo mật: Các thông tin, dữ liệu trong Blockchain được phân tán và an toàn tuyệt đối o Minh bạch: Ai cũng có thể theo dõi dữ liệu Blockchain đi từ địa chỉ này tới địa chỉ khác và có thể thống kê toàn bộ lịch sử trên địa chỉ đó o Hợp đồng thông minh: là hợp đồng kỹ thuật số được nhúng vào đoạn code if-this-then-that (IFTTT), cho phép chúng tự thực thi mà không cần bên thứ ba.
Ethereum [2]
Ethereum là nền tảng điện toán phân tán, mã nguồn mở dựa trên công nghệ chuỗi khối (blockchain) có khả năng thực thi hợp đồng thông minh (smart contract)
- tức là điều khoản được ghi trong hợp đồng sẽ được thực thi một cách tự động khi các điều kiện trước đó được thỏa mãn, không ai có thể can thiệp vào
Ethereum là một dự án Blockchain Layer 1 cho phép nhiều lập trình viên xây dựng ứng dụng phi tập trung (DApps) và tổ chức tự trị phi tập trung (DAOs) Trong đó: Ứng dụng phi tập trung (DApps - Decentralized Application) là phần mềm được triển khai độc lập, không nằm trên một máy chủ duy nhất mà được lưu trữ một cách phân tán trên kho lưu trữ phi tập trung và có thể được viết bằng bất kỳ ngôn ngữ nào
Tổ chức tự trị phi tập trung (DAOs - Decentralized Autonomous
Organizations) là tổ chức được vận hành bởi các thành viên dựa trên một bộ quy tắc được mã hóa bằng code Tất cả thành viên đều có quyền biểu quyết để đưa ra quyết định quan trọng của DAOs
Hợp đồng thông minh (Smart contract):
Hợp đồng thông minh là điểm nổi bật nhất của Ethereum Công nghệ này cho phép người dùng số hóa điều kiện chi phối mối quan hệ, tương tác giữa các bên tham gia giao dịch
Chẳng hạn, người A quyết định vay từ người B 1.000 tether (USDT) chỉ khi B gửi ether trị giá 2.000 đô la làm tài sản thế chấp Bằng cách sử dụng hợp đồng thông minh, A có thể xác định một độc lập các điều kiện xác thực thỏa thuận này, thay vì tin tưởng vào một người trung gian môi giới
Nếu thực hiện đúng, hợp đồng thông minh sẽ tự động giải phóng 1.000 USDT cho B sau khi anh ấy gửi và khóa 2.000 USD làm tài sản thế chấp Ngoài ra, khi A hoàn trả khoản vay, hợp đồng thông minh sẽ giải phóng tài sản thế chấp và gửi lại khoản vay cho B
Do đó, hợp đồng thông minh cung cấp một hệ thống không cần sự tin cậy giữa 2 bên, trong đó A hoặc B không cần phải lo lắng về rủi ro của đối tác Nó cũng loại bỏ sự cần thiết của người trung gian Tại đây, A và B cũng không cần phải trả thêm khoản chi phí nào cho dịch vụ trung gian hoặc ký quỹ trước khi họ có thể thực hiện giao dịch ngang hàng (P2P)
Sự đổi mới này đã mở ra nhiều trường hợp sử dụng blockchain hơn, dẫn đến sự bùng nổ của các ứng dụng phi tập trung.
Ngôn ngữ lập trình Solidity [3]
Solidity là ngôn ngữ lập trình chủ yếu dùng để viết các smart contract (hợp đồng thông minh) trên nền tảng Ethereum, được coi là một trong những nền tảng hàng đầu về hợp đồng thông minh trong lĩnh vực tiền điện tử Với Solidity, người dùng có thể xây dựng NFT marketplace (thị trường tài sản số), Metaverse, sàn giao dịch phi tập trung (DEX), cũng như các nền tảng tài chính phi tập trung (DeFi) trên Ethereum
Sau khi được đề xuất bởi Gavin Wood, một trong những đồng sáng lập
Ethereum, vào năm 2014, ngôn ngữ Solidity đã được phát triển bởi các thành viên
31 trong dự án Ethereum Đây là một ngôn ngữ lập trình cấp cao, được dành cho những lập trình viên muốn xây dựng các ứng dụng trên nền tảng Ethereum Với sự kết hợp linh hoạt giữa chữ cái và số, Solidity giúp các nhà phát triển viết chương trình một cách dễ dàng hơn Đây là một ngôn ngữ lập trình hướng contract, thuộc phạm vi của hệ sinh thái Ethereum Tuy nhiên, nó sử dụng câu lệnh và cú pháp gần giống với các ngôn ngữ lập trình cơ bản phổ biến như C#, Java, PHP
Ngôn ngữ lập trình Solidity được áp dụng để tạo ra các hợp đồng thông minh trên nền tảng Ethereum, mở ra khả năng cho nhiều trường hợp sử dụng đa dạng như:
- Tạo ra Fungible, Non-Fungible token (NFT)
- Phát triển các nền tảng cho vay phi tập trung cho Fungible token:
- Xây dựng các thị trường giao dịch Non-Fungible token: Opensea,
Hardhat [4]
Hardhat là một môi trường phát triển để biên dịch, triển khai, test và debug Dapp Ethereum
Một số điểm tính năng nổi bật của Hardhat:
- Tích hợp mạng local hardhat, dễ dàng chạy và debug code ngay trên local
- Debug dễ dàng hơn: Với Hardhat, chúng ta có thể debug code Solidity dễ dàng hơn khi có thể console.log ra các biến (Solidity vốn ko hỗ trợ console.log)
- Hệ thống plugin: Giúp developer có thể bổ sung chức năng, tùy vào từng dự án cụ thể
Chai
Chai là một thư viện kiểm thử (testing library) cho JavaScript, cung cấp khả năng so sánh dựa trên cú pháp gần gũi với ngôn ngữ tự nhiên thông qua các hàm kiểm tra (assertions) để đánh giá tính đúng đắn của mã Khi phát triển hợp đồng thông minh, việc kiểm thử là một phần không thể thiếu để đảm bảo rằng logic kinh doanh được thực hiện chính xác và không có lỗ hổng an ninh
Khi sử dụng Hardhat, Chai được tích hợp sẵn thông qua plugin
@nomicfoundation/hardhat-chai-matchers, cho phép sử dụng các hàm kiểm tra của Chai cùng với các thêm vào (matchers) đặc biệt phục vụ cho việc kiểm thử hợp đồng thông minh Các matchers này giúp so sánh các đối tượng như BigNumbers, địa chỉ Ethereum, và sự kiện (events) một cách thuận tiện hơn
Cú Pháp Cơ Bản của Chai:
Chai cung cấp ba phong cách kiểm tra khác nhau:
- Assert: Phong cách kiểm tra có cú pháp mệnh lệnh
- Expect: Phong cách kiểm tra dùng cú pháp hàm chuỗi, tạo ra các mệnh đề kiểm tra có cấu trúc
- Should: Phong cách kiểm tra tương tự như Expect, nhưng nó mở rộng đối tượng để sử dụng từ khóa should.
React [5]
React (ReactJs hay React.js) là 1 thư viện JavaScript mã nguồn mở được phát triển bởi đội ngũ kỹ sư đến từ Facebook; nó được giới thiệu vào năm 2011, cho đến nay là đã được hơn 10 năm Nguyên lý xây dựng của React dựa trên components (component-based approach), có thể tái sử dụng và phù hợp với ứng dụng 1 trang (Single Page Application – SPA) React giúp lập trình viên xây dựng giao diện người dùng dựa trên JSX (môt cú pháp mở rộng của JavaScript), tạo ra các DOM ảo (virtual DOM) để tối ưu việc render 1 trang web
Các Level lập trình với React:
- JSX (JavaScript XML): 1 cú pháp mở rộng của JavaScript được React sử dụng
- Components: thành phần, với React thì tất cả được tạo nên từ components Phân biệt được Functional Components và Class Components
- Props và State: thuộc tính và trạng thái của 1 component trong React
- Component Life Cycle: vòng đời của 1 component trong React
- React Hook: 1 khái niệm được React đưa vào từ phiên bản 16.8 giúp cải thiện việc tái sử dụng chức năng trong React
- High Order Components: một kỹ thuật nâng cao trong React giúp tái sử dụng lại các components
- State Managements: Việc quản lý các biến trạng thái là 1 bài toán cơ bản và quan trọng nhất trong 1 ứng dụng React Có khá nhiều thư viện giải quyết bài toán này: useContext Hook, Redux, MobX
- Custom Hook: tự mình tạo ra các hook để giúp tái sử dụng logic trong code React
- Refs và DOM: Ref cho phép chúng ta truy cập đến DOM node, giúp chúng ta tham chiếu đến 1 node để sử dụng các thuộc tính và action của chúng
- Framework ReactJS: NextJS, Gatsby, Appollo
- Thư viện xử lý API giao tiếp với backend: Axios, Fetch
- UI Library: Chakra UI, Material UI, Ant Design
- Tạo form submit dữ liệu: React Hook Form, Formik
Next.js [6]
NextJS là framework mã nguồn mở được xây dựng trên nền tảng của React, cho phép chúng ta xây dựng các trang web tĩnh có tốc độ siêu nhanh và thân thiện với người dùng, cũng như xây dựng các ứng dụng web React
NextJS được ra đời vào năm 2016, thuộc sở hữu của Vercel NextJS bắt đầu trở nên phổ biến vào năm 2018 và tiếp tục tăng trưởng mạnh mẽ trong cộng đồng phát triển web vào những năm sau đó Sự kết hợp của các tính năng như Server-side Rendering (SSR) với Static Site Generation (SSG) đã giúp NextJS trở thành sự lựa chọn hấp dẫn cho nhiều dự án phát triển ứng dụng web
2.7.1 Các tính năng của NextJS
2.7.1.1 Routing o Automatic Routin o Nested Routing o Dynamic Routes o Link Component
Hình 2.8: Server Side Rendering
Cơ chế của SSR như sau:
- Khi user truy cập vào một trang web, trình duyệt sẽ gửi request tới server
- Server sẽ nhận request, truy cập vào dữ liệu trong database, render ra HTML
- Trả HTML kèm với CSS, JS về cho browser
- Browser nhận được HTML thì tiến hành tải xuống và render ra UI nhưng lúc này chưa có JS
- Browser tải xuống JS và thực thi các câu lệnh JS
- Website load xong và có thể tương tác bình thường Ưu điểm của SSR:
- Load lần đầu nhanh vì toàn bộ dữ liệu đã được xử lý ở phía server, client chỉ cần nhận về và hiển thị ra cho user
- Tốt cho SEO vì dữ liệu được render dưới dạng HTML (bạn ấn chuột phải chọn View Page Source một trang web bất kì là sẽ thấy điều này), giúp cho bot của Google khi quét sẽ thấy được toàn bộ dữ liệu
- Lập trình viên chỉ cần code trên 1 project là đã có thể tạo ra trang web hoàn chỉnh có cả Frontend lẫn Backend, không cần tách ra làm 2 project
- Server sẽ phải xử lý nhiều dữ liệu dẫn đến quá tải
- Khi user chuyển trang thì cả trang sẽ phải load lại để lấy dữ liệu từ server, dẫn đến trải nghiệm không tốt
SSG là một phương pháp mà NextJS cung cấp sẵn cho chúng ta, cho phép bạn tạo các trang tĩnh và lưu chúng xuống dưới dạng file html tĩnh Điều này giúp cải thiện hiệu suất tải trang và cung cấp trải nghiệm người dùng tốt hơn vì nội dung được lấy từ file html và hiển thị ngay lập tức mà không cần đợi việc tải về từ phía server
2.7.1.3.1 CSS Modules Để style cho ứng dụng NextJS, cách dễ nhất là có thể tạo các file CSS/SCSS riêng lẻ cho từng component hoặc sử dụng file chung cho toàn dự án
Ngoài ra cũng có thể sử dụng các thư viện CSS-in-JS như Styled-Components để viết trực tiếp css vào code
NextJS cũng hỗ trợ sử dụng cùng các CSS framework như TailwindCSS, Bootstrap hoặc MaterialUI.
Ethers.js [7]
Ethers.js là thư viện JavaScript phổ biến được sử dụng để tương tác với
Ethereum Blockchain Cả hai cung cấp một API để giao tiếp với nút Ethereum từ trình duyệt web hoặc ứng dụng Node.js, cho phép thực hiện các giao dịch, tương tác với hợp đồng thông minh và truy vấn dữ liệu từ blockchain
Các tính năng nổi bật ethers.js gồm có:
- Giữ private key ở client một cách an toàn
- Import và export JSON wallets
- Import và export ví theo chuẩn BIP 39
- Hỗ trợ ABI, ABIv2 và Human-Readable ABI
- Kết nối với Ethereum nodes thông qua nhiều provider như JSON-RPC, INFURA, Etherscan, Alchemy, Cloudflare, MetaMask
- Nhẹ (88kb khi nén và 284kb khi không nén)
THIẾT KẾ HỆ THỐNG
Mô hình hệ thống
Hình 3.1: Sơ đồ kiến trúc tổng quan Ứng dụng Lottery trên blockchain được thiết kế với mục tiêu tạo ra một hệ thống xổ số tự động, minh bạch và công bằng Hệ thống này sử dụng công nghệ blockchain để đảm bảo tính không thể thay đổi và công bằng trong việc lựa chọn
42 người chiến thắng Kiến trúc tổng quan của hệ thống bao gồm 3 thành phần chính: Front-end, Smart Contract (Back-end) và Blockchain
3.1.1 Front-end o Sử dụng React và Next.js cho việc xây dựng giao diện o Sử dụng Thư viện Web3 để kết nối trực tiếp từ giao diện người dùng tới hợp đồng thông minh o Chức năng chính: Cho phép người dùng tham gia xổ số, xem thông tin về xổ số như tiền thường, số người chơi, người chiến thắng gần nhất, và đếm ngược thời gian cho đến lúc tìm ra người chiến thắng
3.1.2 Smart Contract (Back-end) o Sử dụng Solidity cho việc viết hợp đồng o Tích hợp các dịch vụ của Chainlink như VRF và Keepers cho việc tự động kiểm tra điều kiện và thực hiện chức năng của hợp đồng và đảm bảo chọn ra ngẫu nhiên người chiến thắng o Chức năng chính: Xử lý việc tham gia của người chơi, lựa chọn người chiến thắng và phân phối giải thưởng
3.1.3 Blockchain o Sử dụng nền tảng Ethereum blockchain để triển khai và chạy hợp đồng thông minh o Đặc tính là đảm bảo tính minh bạch và không thể thay đổi của dữ liệu, đồng thời cung cấp một cơ sở dữ liệu phân tán và an toàn
3.1.4 Công cụ phát triển và kiểm thử o Sử dụng môi trường phát triển Hardhat để triển khai, chạy và kiểm thử hợp đồng o Sử dụng các công cụ như Chai Matchers và Hardhat Gas Reporter cho việc kiểm thử tự động và đánh giá hiệu suất của hợp đồng
3.1.5 Giao tiếp hệ thống o Giao tiếp giữa front-end và smart contract thông qua các cuộc gọi hàm được thực hiện bằng thư viện Web3 o Front-end được cập nhật thông tin từ smart contract một cách động và thời gian thực, phản ánh các thay đổi trong hợp đồng và trạng thái của Lottery.
Tương tác với hợp đồng thông minh
Hệ thống tập trung vào việc lưu trữ và tương tác với dữ liệu trên blockchain, nên cơ sở dữ liệu sẽ tập trung vào việc tối ưu hóa giao tiếp với hợp đồng thông minh và quản lý cập nhật file ABI và địa chỉ hợp đồng sau khi triển khai
3.2.1 Tương tác với hợp đồng
Hệ thống sử dụng thư viện Ethers.js để tạo kết nối và tương tác với Ethereum blockchain, ngoài ra còn cho phép thực hiện các giao dịch và gọi các hàm của hợp đồng thông minh
3.2.1.2 Tạo instances của hợp đồng
Tạo Instances của hợp đồng để sử dụng địa chỉ và ABI của hợp đồng Instance này cho phép tương tác trực tiếp với hợp đồng từ front-end
3.2.1.3 Gọi các hàm hợp đồng:
Yêu cầu người chơi gửi số lượng người ETH cụ thể (0.01 ETH) và hợp đồng trạng thái mở (OPEN) Nếu phí gia nhập không đủ thì sẽ bị revert với lỗi là:
Raffle NotEnoughETHEntered Hợp đồng có 2 trạng thái là: OPEN và
CALCULATING, nếu như hợp đồng trạng thái CALCULATING thì sẽ bị revert với lỗi là: Raffle_NotOpen Gia nhập thành công thì sẽ thêm vào danh sách s_player và emit 1 Event RaffleEnter, sau đó bắt đầu thời gian đếm ngược (đối với
44 người đầu tiên tham gia, từ người thứ 2 tham gia thời gian vẫn tiếp tục chứ không reset)
Truy vấn khoảng thời gian cho mỗi vòng xổ số
Lấy thông tin về người chiến thắng gần nhất
Truy vấn số lượng người chơi hiện tại
Lấy thời gian của lần cập nhật cuối cùng
Kiểm trả trạng thái hiện tại của xổ số (có 2 trạng thái OPEN và
3.2.2 Lưu trữ và quản lý ABI và địa chỉ hợp đồng o abi.json và contractAddresses.json: cả 2 file được quản lý trong thư mục của front-end và được cập nhật tự động mỗi khi hợp đồng thông minh được triển khai hoặc cập nhật o Quá trình cập nhật được tự động hóa thông qua script update-frontend mỗi khi deploy để đảm bảo front-end luôn có dữ liệu mới nhất về hợp đồng thông minh
3.2.3 Tích hợp, tương tác với UI và tối ưu hóa hiệu suất o Sử dụng Ethers.js để thực hiện các giao dịch và gọi hàm một cách hiểu quả o Kết hợp React Hooks như “useState” và “useEffect” để theo dõi và cập nhật trạng thái của hợp đồng thông minh, được sử dụng trong component “LotteryEntrance” để theo dõi các trạng thái như số lượng người chơi, người chiến thắng gần nhất và thời gian đếm ngược
45 o Thông tin về trạng thái được cache tại client-side, giúp giảm tỉa truy vấn liên tục đến blockchain o Sử dụng React State để lưu trữ và cập nhật dữ liệu, giúp tối ưu hiệu suất và giảm chi phí gas
3.2.4 Bảo mật và xác thực
- Quy trình xác thực khi người dùng tham gia: o Người dùng kích hoạt yêu cầu “enterRaffle” từ giao diện người dùng o Ethers.js xử lý yêu cầu và tạo ra một giao dịch yêu cầu người dùng phải trả phí để được tham gia, phí này bao gồm phí tham gia và phí gas cho giao dịch o Giao dịch được gửi đến Metamask hoặc ví Ethereum tương thích khác để xác nhận và ký o Sau khi được ký, giao dịch được gửi đến blockchain để xử lý o Quá trình này giúp đảm bảo mọi giao dịch đều chính xác và hợp lệ trước khi được thực hiện trên hợp đồng thông minh
Quy trình tự động của hợp đồng khi sử dụng dịch vụ của Chainlink
3.3.1 Chainlink Keepers o Keepers đưuọc sử dụng để tự động hóa các nhiệm vụ theo định kỳ mà không cần tương tác từ bên ngoài o Keeper sẽ luôn kiểm tra điều kiện của checkUpkeep để xác định xem đã đến lúc chọn người chiến thắng hay chưa checkUpkeep trả về TRUE với các điều kiện: hợp đồng trạng thái OPEN (isOpen), có ít nhất 1 người chơi (hasPlayer), thời gian đã đếm ngược xong
(timePassed), và hợp đồng có số dư (hasBalance)
3.3.2 Tự động chọn người chiến thắng: o Khi checkUpkeep trả về FALSE Thì sẽ revert với lỗi
Raffle UpkeepNotNeeded, ngược lại trả về TRUE thì hợp đồng sẽ kích hoạt hàm performUpkeep hợp đồng chuyển qua trạng thái
CALCULATING và sẽ bắt đầu quy trình VRF để yêu cầu số ngẫu nhiên (RequestRandomWords) và gửi 1 Event
RequestedRaffleWinner o Quy trình này đảm bảo tính công bằng khi chọn người chiến thằng mà không cần tương tác thủ công
3.3.3 Chainlink VRF o VRF Node sẽ gọi tiếp fulfillRandomWords sau khi có randomWords Hàm này sẽ gửi toàn bộ tiền trong hợp đồng cho người chiến thắng bất kì dựa vào randomWords sau đó reset hợp đồng và gửi 1 Event WinnerPicked
THIẾT KẾ GIAO DIỆN NGƯỜI DÙNG
Danh sách màn hình
STT Tên màn hình Loại màn hình Diễn giải
Màn hình chào mừng người chơi sau khi kết nối ví tiền, hiển thị thông tin xổ số và nút tham gia
Bảng 4.1: Danh sách các màn hình
Mô tả chi tiết các màn hình
4.2.1.1 Giao diện: o Header chứa tiêu đề và Button “Connect Wallet” được thiết kế đơn giản và rõ ràng o Body sẽ thay đổi nội dung dựa trên trạng thái kết nối và mạng blockchain
Hình 4.1: Màn hình Home (chưa kết nối ví điện tử)
Hình 4.2: Màn hình Home sau khi nhấn nút Connect Wallet
STT Kiểu Ràng buộc Ý nghĩa
1 Header Chứa tên ứng dụng và nút kết nối ví
2 Button Interactive Cho phép người dùng kết nối ví tiền điện tử thông qua Web3uikit
3 Text Dynamic Hiển thị thông báo yêu cầu kết nối ví hoặc thông tin hỗ trợ mạng
4 Button Interactive Nút “Enter Raffle” hiển thị sau khi kết nối ví thành công và cho phép tham gia xổ số
Bảng 4.2: Mô tả đối tượng trên màn hình Home
STT Biến cố Xử lý
1 Nhấn nút “Connect Wallet” Mở danh mục ví tiền điện tử để kết nối
2 Kết nối ví thành công Hiển thị thông tin số dư và địa chỉ ví của người dùng, cập nhật nội dung body
3 Nhấn “Enter Raffle” Gửi yêu cầu tham gia xổ số, qua hợp đồng thông minh, và chờ xác nhận giao dịch
Bảng 4.3: Biến cố và xử lý trên màn hình Home
4.2.2 Màn hình sau khi kết nối ví thành công
4.2.2.1 Giao diện o Thông tin và số dư và địa chỉ ví hiển thị phía bên phải của header o Body hiển thị thông tin xổ số như phí tham gia (Entrance Fee), số lượng người chơi hiện tại (Current number of players), và địa chỉ người chiến thắng gần nhất (The most previous winner)
Hình 4.3: Màn hình sau khi kết nối ví thành công
STT Kiểu Ràng buộc Ý nghĩa
1 Text Hiển thị thông tin xổ số cần thiết cho người dùng
2 Button Interactive Nút “Enter Raffle” cho phép người dùng gửi ETH và tham gia xổ số
Bảng 4.4: Mô tả đối tượng sau khi kết nối ví thành công
STT Biến cố Xử lý
1 Nhấn “Enter Raffle” Xác nhận việc tham gia xổ số và gửi phí tham gia đến hợp đồng thông minh
Bảng 4.5: Biến cố xử lý sau khi kết nối ví thành công
Triển khai và kiểm thử
Triển khai ứng dụng
5.1.1.1 Localhost Hardhat o Ứng dụng đã được chạy thử nghiệm và kiểm tra cẩn thận trên môi trường phát triển cục bộ sử dụng Hardhat Network Điều này đã cho phép mô phỏng một mạng Ethereum, cung cấp khả năng triển khai, thực hiện các giao dịch và tương tác với hợp đồng thông minh mà không cần tiêu tốn gas thực o Script mockOfChain đã được phát triển để mô phỏng chức năng của Chainlink Keepers, giả định việc thực hiện gọi hàm performUpkeep khi điều kiện được đáp ứng, tăng thời gian mô phỏng và mô phỏng phản hồi từ Chainlink VRF để chọn người chiến thắng trong raffle
5.1.1.2 Testnet Sepolia o Sau các bước kiểm tra ban đầu và xác nhận hoạt động ổn định trên môi trường phát triển cục bộ, hợp đồng thông minh đã được triển khai lên Testnet Sepolia Việc triển khai hợp đồng thông minh lên một môi trường thử nghiệm công cộng đã được thực hiện thành công và đã được xác minh thông qua Etherscan, mở đường cho các tương tác và kiểm thử giao dịch trực tiếp
5.1.1.3 Hosting trên Vercel o Giao diện người dùng của ứng dụng đã được hosting trên Vercel, cho phép triển khai nhanh chóng và dễ dàng Điều này cũng cung cấp tính năng Continuous Deployment từ nguồn lưu trữ vGitHub, đảm bảo rằng người dùng luôn có quyền truy cập vào phiên bản mới nhất của ứng dụng
Kiểm thử ứng dụng
5.2.1 Kiểm thử hợp đồng thông minh
5.2.1.1 Công cụ và thư viện o Chai matcher o Ethers.js
5.2.1.2 Kiểm thử đơn vị (Unit testing)
5.2.1.2.1 Mục tiêu kiểm thử o Mục tiêu chính của kiểm thử đơn vị là xác minh từng thành phần nhỏ nhất của hợp đồng thông minh hoạt động độc lập và chính xác theo đúng các yêu cầu và đặc tả kỹ thuật đã được định nghĩa trước
5.2.1.2.2 Môi trường phát triển o Kiểm thử đơn vị được thực hiện trong môi trường phát triển cục bộ sử dụng Hardhat Network, cho phép mô phỏng gần như hoàn hảo với môi trường Ethereum thực tế nhưng không yêu cầu gas và thời gian khai thác
5.2.1.2.3 Các trường hợp kiểm thử
STT Tính năng kiểm thử Mô tả kiểm thử Kết quả
1 Khởi tạo hợp đồng thông minh Kiểm tra các giá trị khởi tạo và trạng thái hợp đồng Thành công
2 Đăng ký người dùng vào raffle
Kiểm tra việc đăng ký và ghi nhận người dùng vào hợp đồng Thành công
Kiểm tra hợp đồng chỉ cho phép người dùng tham gia khi gửi đủ ETH Thành công
4 Phát ra sự kiện khi người dùng tham gia Hợp đồng sẽ phát ra sự kiện RaffleEnter khi có người dùng tham gia thành công Thành công
Không cho phép người chơi tham gia khi hợp đồng đang tính toán
Hợp đồng sẽ revert với lỗi Raffle NotOpen khi người chơi tham gia trong khi hợp đồng đang tính toán Thành công
6 Kiểm tra từng điều kiện của upkeep
Kiểm tra điều kiện của upkeep dựa trên thời gian, có người tham gia, có số dư trong hợp đồng và hợp đồng đang mở
Thực hiện performUpkeep khi checkupkeep là đúng
Kiểm tra performUpkeep chỉ được thực hiện khi checkupkeep trả về là true Thành công
Từ chối performUpkeep khi checkupkeep không đáp ứng
Hợp đồng sẽ revert với lỗi Raffle UpkeepNotNeeded khi mà thực hiện performUpkeep trong khi checkupkeep trả về là false
Cập nhật trạng thái raffle và lấy requestId khi performUpkeep
Sau khi thực hiện performUpkeep, hợp đồng sẽ cập nhật trạng thái là đang tính toàn và lấy requestId từ sự kiện
Thực hiện fulfillRandomWords sau khi performUpkeep
Kiểm tra chỉ cho phép thực hiện fulfillRandomWords sau khi thực hiện performUpkeep Thành công
Thực hiện toàn bộ quá trình của hợp đồng
Kiểm tra toàn bộ quá trình của hợp đồng từ khi có người tham gia đến khi kết thúc, khi kết thúc sẽ chọn ra được người chiến thắng, khởi tạo lại và gửi đủ tiền cho người chiến thắng
Bảng 5.1: Các trường hợp kiểm thử của Unit Testing
Hình 5.1: Toàn bộ các kiểm thử Unit Tests thành công
5.2.1.3 Kiểm thử môi trường thử nghiệm (staging test)
5.2.1.3.1 Mục tiêu kiểm thử o Kiểm thử môi trường thử nghiệm nhằm mục đích xác minh hợp đồng thông minh và các thành phần liên quan hoạt động ổn định trong một môi trường mạng lưới blockchain thực tế và tương tác đúng với các dịch vụ ngoại vi như Chainlink Keepers và VRF
5.2.1.3.2 Triển khai và kiểm thử trên Testnet Sepolia o Hợp đồng thông minh đã được triển khai lên Testnet Sepolia và đã được xác minh, điều này cho phép thực hiện kiểm thử môi trường thử nghiệm trực tiếp trên blockchain mà không cần thông qua giao diện người dùng
5.2.1.3.3 Các trường hợp kiểm thử
STT Tính năng kiểm thử Mô tả kiểm thử Kết quả
Chainlink Keepers và Chainlink VRF
Kiểm thử việc kết nối và tương tác với Chainlink Keepers và VRF trên mạng thực tế để đảm bảo quy trình chọn người thắng cuộc hoạt động chính xác
2 Xác định người chiến thắng ngẫu nhiên
Thực hiện kiểm thử quá trình Chainlink VRF chọn người chiến thắng một cách ngẫu nhiên và công bằng
3 Đảm bảo việc gửi tiền thưởng cho người thắng cuộc
Kiểm thử việc gửi tiền thưởng tự động đến ví của người chiến thắng sau khi được chọn qua Chainlink VRF Thành công
Kiểm tra trạng thái hợp đồng sau khi chọn người thắng cuộc Đảm bảo rằng hợp đồng thông minh trở lại trạng thái mở (open) và sẵn sàng cho vòng xổ số tiếp theo sau khi người thắng cuộc được chọn
Kiểm tra số dư cuối cùng của người thắng cuộc
Kiểm tra việc cập nhật số dư của người thắng cuộc sau khi nhận được tiền thưởng từ hợp đồng thông minh Thành công
6 Kiểm tra thời gian kết thúc của sự kiện
Xác minh rằng thời gian kết thúc của sự kiện lớn hơn thời gian bắt đầu, đảm bảo quy trình đã thực hiện đúng như thiết kế Thành công
Bảng 5.2: Các trường hợp kiểm thử của staging test
5.2.2 Kết luận o Quá trình kiểm thử hợp đồng thông minh đã diễn ra mà không gặp phải bất kỳ lỗi nào, đảm bảo tính toàn vẹn và an toàn của ứng dụng
Từ kiểm thử đơn vị tới kiểm thử môi trường thử nghiệm, mọi chức năng của hợp đồng đã hoạt động như mong đợi, xác nhận sự sẵn sàng của hệ thống cho việc triển khai chính thức