1. Trang chủ
  2. » Cao đẳng - Đại học

đồ án 2 tìm hiểu solidity và xây dựng ứng dụng lottery

59 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tìm hiểu Solidity và xây dựng ứng dụng Lottery
Tác giả Đặng Anh Khoa
Người hướng dẫn ThS. Trần Anh Dũng
Trường học Đại học Quốc gia Thành phố Hồ Chí Minh
Chuyên ngành Công nghệ phần mềm
Thể loại báo cáo môn học
Năm xuất bản 2023
Thành phố TP. Hồ Chí Minh
Định dạng
Số trang 59
Dung lượng 1,53 MB

Cấu trúc

  • Chương 1: MỞ ĐẦU (21)
    • 1.1. Lý do chọn đề tài (21)
    • 1.2. Mục đích nghiên cứu (22)
      • 1.2.1. Khám phá đột phá công nghệ Blockchain (22)
      • 1.2.2. Một ứng dụng hệ thống xổ số độc đáo (22)
      • 1.2.3. Định hình tương lai của blockchain (22)
    • 1.3. Đối tượng nghiên cứu (22)
      • 1.3.1. Sinh Viên và Học Viên (22)
      • 1.3.2. Giảng Viên và Người Hướng Dẫn (23)
      • 1.3.3. Nhà Phát Triển và Quản Trị Website (23)
      • 1.3.4. Người Dùng Kết Quả (End Users) (23)
    • 1.4. Phạm vi nghiên cứu (23)
      • 1.4.1. Công nghệ nghiên cứu (23)
        • 1.4.1.1. Back-end (23)
        • 1.4.1.2. Front-end (24)
      • 1.4.2. Phạm vi chức năng (24)
        • 1.4.2.1. Chức năng cơ bản (24)
        • 1.4.2.2. Chức năng nâng cao (24)
      • 1.4.3. Phạm vi kỹ thuật (25)
        • 1.4.3.1. Phát triển hợp đồng thông minh (25)
        • 1.4.3.2. Front-end và tương tác người dùng (25)
        • 1.4.3.3. Tích hợp công nghệ Chainlink (25)
        • 1.4.3.4. Kiểm thử và tối ưu hóa (25)
        • 1.4.3.5. Phạm vi đánh giá và phản hồi (25)
    • 1.5. Mục tiêu đề tài (26)
  • Chương 2: KIẾN THỨC NỀN TÀNG (27)
    • 2.1. Blockchain [1] (27)
    • 2.2. Ethereum [2] (28)
    • 2.3. Ngôn ngữ lập trình Solidity [3] (30)
    • 2.4. Hardhat [4] (32)
    • 2.5. Chai (33)
    • 2.6. React [5] (34)
    • 2.7. Next.js [6] (36)
      • 2.7.1. Các tính năng của NextJS (36)
        • 2.7.1.1. Routing (36)
        • 2.7.1.2. Rendering (37)
        • 2.7.1.3. Styling (38)
    • 2.8. Ethers.js [7] (39)
  • Chương 3: THIẾT KẾ HỆ THỐNG (41)
    • 3.1. Mô hình hệ thống (41)
      • 3.1.1. Front-end (42)
      • 3.1.2. Smart Contract (Back-end) (42)
      • 3.1.3. Blockchain (42)
      • 3.1.4. Công cụ phát triển và kiểm thử (42)
      • 3.1.5. Giao tiếp hệ thống (43)
    • 3.2. Tương tác với hợp đồng thông minh (43)
      • 3.2.1. Tương tác với hợp đồng (43)
        • 3.2.1.1. Sử dụng Ethers.js (43)
        • 3.2.1.2. Tạo instances của hợp đồng (43)
        • 3.2.1.3. Gọi các hàm hợp đồng (43)
      • 3.2.2. Lưu trữ và quản lý ABI và địa chỉ hợp đồng (44)
      • 3.2.3. Tích hợp, tương tác với UI và tối ưu hóa hiệu suất (44)
      • 3.2.4. Bảo mật và xác thực (45)
    • 3.3. Quy trình tự động của hợp đồng khi sử dụng dịch vụ của Chainlink (45)
      • 3.3.1. Chainlink Keepers (45)
      • 3.3.2. Tự động chọn người chiến thắng (46)
      • 3.3.3. Chainlink VRF (46)
  • Chương 4: THIẾT KẾ GIAO DIỆN NGƯỜI DÙNG (47)
    • 4.1. Danh sách màn hình (47)
    • 4.2. Mô tả chi tiết các màn hình (47)
      • 4.2.1. Màn hình Home (47)
        • 4.2.1.1. Giao diện (47)
        • 4.2.1.2. Các thành phần (48)
        • 4.2.1.3. Danh sách biến cố (48)
      • 4.2.2. Màn hình sau khi kết nối ví thành công (49)
        • 4.2.2.1. Giao diện (49)
        • 4.2.2.2. Các thành phần (50)
        • 4.2.2.3. Danh sách biến cố (50)
  • Chương 5: Triển khai và kiểm thử (51)
    • 5.1. Triển khai ứng dụng (51)
      • 5.1.1. Môi trường triển khai (51)
        • 5.1.1.1. Localhost Hardhat (51)
        • 5.1.1.2. Testnet Sepolia (51)
        • 5.1.1.3. Hosting trên Vercel (51)
    • 5.2. Kiểm thử ứng dụng (52)
      • 5.2.1. Kiểm thử hợp đồng thông minh (52)
        • 5.2.1.1. Công cụ và thư viện (52)
        • 5.2.1.2. Kiểm thử đơn vị (Unit testing) (52)
        • 5.2.1.3. Kiểm thử môi trường thử nghiệm (staging test) (54)
      • 5.2.2. Kết luận (55)
  • Chương 6: KẾT LUẬN (56)
    • 6.1. Kết quả (56)
    • 6.2. Đạt được (56)
    • 6.3. Khó khăn (56)
  • TÀI LIỆU THAM KHẢO (59)

Nội dung

Đồ á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

Ngày đăng: 15/05/2024, 09:24

HÌNH ẢNH LIÊN QUAN

Hình 3.1: Sơ đồ kiến trúc tổng quan - đồ án 2 tìm hiểu solidity và xây dựng ứng dụng lottery
i ̀nh 3.1: Sơ đồ kiến trúc tổng quan (Trang 41)

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w