ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM
----🙣🕮🙡----
BÁO CÁO ĐỒ ÁN 1
TÌM HIỂU CƠNG NGHỆ BLOCKCHAIN VÀ SCHAT
Giảng viên hướng dẫn:
Thầy Phan Trung Hiếu
Sinh viên thực hiện
19520976 – Đặng Hải Thịnh
19521399 – Nguyễn Văn Dũng
Thành phố Hồ Chí Minh, tháng 6 năm 2022
1
Mục Lục
I.
II.
BÁO CÁO ĐỒ ÁN 1
1
Tổng quan về đề tài
5
1. Khảo sát hiện trạng
5
1.1.
Định hướng phần mềm
5
1.2.
Nhu cầu thực tế đề tài
5
1.3.
Hiện trạng đơn vị cần xây dựng
5
1.4.
Nền tảng
5
1.5.
Hiện trạng đề tài
5
1.6.
Phạm vi sử dụng
5
1.7.
Đối tượng sử dụng
5
2. Blockchain là gì
5
2.1.
Nguồn gốc:
5
2.2.
Khái niệm:
6
2.3.
Đặc điểm của cơng nghệ Blockchain
10
2.4.
Ứng dụng của Blockchain trong thực tế
12
Cơ sở lý thuyết
14
1. React Native
14
1.1.
Nguồn gốc
14
1.2.
Khái niệm
14
1.3.
Một số khái niệm cơ bản
14
1.4.
Ưu nhược điểm
19
1.5.
So sánh Native với Web và Hybrid
20
2. Nest Js
21
2
III.
2.1.
Khái niệm
21
2.2.
Tại sao lại dùng Nest:
21
2.3.
Một số khái niệm cơ bản
21
2.4.
Uư nhược điểm
24
2.5.
Next vs Nuxt vs Nest
24
Phân tích yêu cầu
30
1. Sơ đồ Usecase
30
2. Đặc tả usecase
30
2.1.
Thành phần xác thực
30
2.2.
Hệ thống chat
35
IV. Thiết kế hệ thống
38
1. Thiết kế kiến trúc hệ thống:
38
2. Thiết kế mơ hình dữ liệu:
39
2.1.
Sơ đồ lớp
39
2.2.
Đặc tả lớp dữ liệu
40
2.3.
Thiết kế luồng sử lí:
42
3. Thiết kế giao diện:
48
3.1.
Màn hình chào mừng:
48
3.2.
Màn hình đăng nhập
49
3.3.
Trang đăng kí
50
3.4.
Trang xác nhận OTP
51
3.5.
Màn hình chính
53
3.6.
Màn hình gọi điện thoại
54
3.7.
Màn hình gọi điện thoại với video
56
3
3.8.
Màn hình chat
57
3.9.
Màn hình thơng tin nhóm chat
59
3.10.
Màn hình phân cơng cơng tác
61
3.11.
Màn hình chi tiết cơng việc
63
3.12.
Màn hình cài đặt
65
Kết quả dự án
V.
67
1. Giới thiệu về sản phẩm
67
2. Môi trường triển khai
68
2.1.
Backends
68
2.2.
Frontends
68
3. Chức năng sản phẩm đã phát triển
IV.
Kết luận
68
68
1.1.
Thuận lợi
69
1.2.
Khó khăn
69
2. Ưu nhược điểm
69
3. Hướng phát triển
69
VI.
Phụ lục
70
1. Tài liệu tham khảo
70
2. Bảng phân công công việc
70
4
I. Tổng quan về đề tài
1. Khảo sát hiện trạng
1.1. Định hướng phần mềm
•
•
Hỗ trợ các chat giữa hai hay nhiều người, hỗ trợ các nhóm quản lí các dự án, phân công công
việc, giao tiếp giữa các thành viên.
Cung cấp các chức năng quản lí cơ bản, khơng tập trung quá vào một lĩnh vực cụ thể.
1.2. Nhu cầu thực tế đề tài
•
Hiện nay, với sự phát triển vượt bật của công nghệ thông tin, sự bảo mật ngày càng được chú
trọng. Tiếp theo đó ngày càng có nhiều các project được triển khai trên tồn cầu, quy mơ và
độ phức tạp của các project ngày càng lớn, việc quản lí cũng trở nên ngày càng khó khăn.
1.3. Hiện trạng đơn vị cần xây dựng
•
•
Thành viên nhóm biết cách sử dụng điện thoại thơng minh.
Điện thoại phải có kết nối internet.
1.4. Nền tảng
•
•
Nền tảng phát triển: React Native, NestJS
Nền tảng triển khai: Mobile app
1.5. Hiện trạng đề tài
•
•
Có khá nhiều ứng dụng tương tự
Hạn chế, vấn đề còn tồn tại:
o Ứng dụng tồn tại nhiều quảng cáo
o Phần quản lí, chưa có giao diện hợp lí
o Vẫn cịn nhiều vụ đánh cắp thơng tin.
1.6. Phạm vi sử dụng
•
Sử dụng tất cả mọi người, phù hợp các nhóm phát triển dự án
1.7. Đối tượng sử dụng
•
Bất kỳ ai.
2. Blockchain là gì
2.1. Nguồn gốc:
5
Khái niệm Blockchain được bắt đầu từ hai người đàn ông tên là Stuart Haber và W. Scott Stornetta.
Họ đã xuất bản một bài báo có tên là “How to timestamp a digital document” vào năm 1991. Và
trong bài báo này, các khái niệm về thứ mà ngày nay chúng ta gọi là Blockchain và hoặc hầu hết
các đặc điểm và ý tưởng đằng sau đều được triển khai trong bài báo. Tuy nhiên, họ không phải là
người đã đưa ra khái niệm cụ thể về Blockchain, mà thực chất khái niệm này được đưa ra trong
bài báo của Satoshi Nakamoto.
Một khối, vì nó là một bản ghi, do đó, bên trong nó sẽ chứa dữ liệu. Ví dụ, nó có thể chỉ chứa một
chuỗi ký tự hoặc một giá trị số nguyên nào đó. Tiếp theo, một trường dữ liệu khác được chứa bên
trong khối là Previous Hash, giá trị băm của một khối trước đó, giá trị này đóng vai trị cực kỳ
quan trọng trong chuỗi khối, bởi nó giúp liên kết các khối lại với nhau. Đồng thời, khối này cũng
sẽ có một giá trị băm của chính nó được lưu trong trường tên là Hash. Và các bạn có thể coi giá trị
băm giống như một dấu vân tay của khối. Nó thực hiện lấy hai phần tử đầu tiên, dữ liệu và giá trị
băm của khối trước đó và tìm ra một giá trị số tương tự đại diện cho dữ liệu được lưu trong khối.
2.2. Khái niệm:
2.2.1.
Thuật toán SHA-256:
Mỗi người trong số chúng ta đều có một dấu vân tay, sẽ có khả năng có một số người có cùng dấu
vân tay, nhưng điều này là rất khó xảy ra. Theo một cách nào đó, chúng ta có thể nói rằng dấu vân
tay là dấu hiệu nhận dạng của một người. Và đây là một khái niệm được ứng dụng mạnh mẽ bởi
các bộ phận pháp y, trong đó, họ có thể xác định tội phạm chỉ bằng dấu vân tay và lấy đó làm bằng
chứng trước tịa.
Vậy điều gì sẽ xảy ra nếu chúng ta có thể áp dụng nguyên tắc tương tự vào các tài liệu kỹ thuật
số? trong kỹ thuật số, chúng ta sử dụng "dấu vân tay" dưới dạng mật mã băm, cụ thể là thuật tốn
SHA-256 có dạng như sau:
Thuật toán SHA-256 được phát triển bởi NSA (Cơ quan An ninh quốc gia Mỹ). Thuật tốn này rất
an tồn và được nhiều nơi trên thế giới sử dụng nó để lưu trữ mật khẩu, kiểm tra các tài liệu kỹ
thuật số và trên thực tế, trong Blockchain, nó cũng đã được áp dụng. Đây là một trong những điều
cốt lõi của chuỗi khối.
2.2.2.
Sổ cái bất biến
6
Làm thế nào để bạn có thể chứng minh với người khác rằng đó là nhà của bạn? Tại sao bạn không
thể đi đến bất kỳ ngôi nhà nào trên phố và nói rằng đó là nhà của bạn?
Thứ bạn nhận được sau khi trả một khoản tiền khổng lồ cho ngơi nhà đó là một tờ giấy chứng từ,
đảm bảo đó là ngơi nhà của bạn. Và ai có chứng từ đó sẽ là chủ sở hữu của ngơi nhà.
Tuy nhiên, điều gì sẽ xảy ra nếu ngơi nhà của bạn bỗng dưng bị sập do nhà bên cạnh đang sửa nhà
hoặc điều gì sẽ xảy ra nếu ai đó lấy trộm cuốn sổ của bạn?
Đột nhiên bạn khơng cịn ngơi nhà nữa. Bạn có thể vẫn đang sống trong ngơi nhà và có thể nghĩ
đó là của mình. Nhưng trong thực tế, cuốn sổ đã mất và không có chứng từ nào để chứng minh
rằng bạn sở hữu ngơi nhà đó. Vậy làm thế nào chúng ta có thể khắc phục tình trạng này?
Giả sử chúng ta có tất cả các dữ liệu được lưu trữ trong một chuỗi khối thay vì trên giấy tờ thơng
thường. Mỗi khi ai đó mua bán một ngơi nhà, một khối mới sẽ được thêm vào chuỗi. Chúng ta sẽ
không thể bị mất chúng.
Nếu kẻ hacker cố gắng giả mạo dữ liệu trong khối, điều sẽ xảy ra là nó sẽ làm thay đổi giá trị băm
của khối. Và liên kết mật mã trong chuỗi khối sẽ khơng bị phá vỡ vì giá trị băm ở khối bị thay đổi,
khác với giá trị băm được ghi lại trong khối trước đó. Và nếu hắn muốn khắc phục điều này, hắn
sẽ phải thay đổi toàn bộ tất cả các khối sao cho liên kết mật mã được khôi phục và kết nối chặt chẽ
với nhau. Tuy nhiên, điều này là rất khó để xảy ra bởi có rất nhiều khối và việc tìm ra giá trị phù
hợp cho mỗi khối là điều rất khó (khơng phải là khơng làm được).
Và đó là lý do tại sao chúng ta nói rằng chuỗi khối là một sổ cái bất biến vì bạn sẽ khơng thể thay
đổi dữ liệu ngay khi dữ liệu giả mạo được lưu trong khối.
2.2.3.
Mạng ngang hàng P2P
Như vừa rồi chúng ta vừa nói việc thay đổi dữ liệu là rất khó, Tuy nhiên, câu hỏi ở đây là nếu
hacker cố gắng tấn công sổ cái hoặc thực hiện một số thay đổi dữ liệu, điều gì sẽ ngăn cản kẻ xâm
nhập? Nếu hắn có đủ thời gian, hắn vẫn có thể thay đổi tồn bộ các khối trong chuỗi thì kết quả sẽ
ra sao?
Giả sử tài sản có thể có trị giá vài trăm nghìn đơ la, điều này thực sự khiến cho những hacker sẵn
sàng đánh đổi để thay đổi dữ liệu trong khối, thay thế tên của bạn bằng tên của hắn, và sau đó giá
7
trị băm sẽ được cập nhật và kẻ hacker thực hiện thay đổi giá trị băm của các khối và cứ tiếp tục
như vậy cho các khối khác. Vậy điều gì ngăn cản hắn làm điều đó?
Trong một hệ thống phân tán, chúng ta có rất nhiều máy tính và tất cả chúng đều được kết nối với
nhau. Chuỗi khối được sao chép trên tất cả các máy tính có trong mạng. Giả sử chúng ta có 6 máy
tính trong mạng, trên thực tế con số này có thể là hàng nghìn hoặc thậm chí hàng triệu máy tính.
Sổ cái lưu trữ tất cả các giao dịch có thể nằm trên máy tính của bạn, nằm trên máy tính của tơi và
trên máy tính của người khác và cứ như vậy. Mọi thứ sẽ được kết nối thông qua các khóa mật mã.
Và như chúng ta đã thảo luận, kẻ hacker sẽ cần phải xem qua tất cả các khối trong chuỗi và thực
hiện thay đổi các giá trị băm của chúng, tính tốn lại giá trị băm cho mỗi khối màu đen. Tuy nhiên,
trong các mạng ngang hàng phân tán, có một điều đặc biệt là tất cả chuỗi trên mỗi máy đều được
đồng bộ hóa một cách liên tục. Đó là cách mà các hệ thống được thiết kế, nó sẽ kiểm tra để xem
liệu các khối trên các chuỗi của các máy có khớp với nhau hay khơng.
Nếu có bất kỳ sự thay đổi nào trong khối của một chuỗi, những máy tính ngang hàng sẽ phát hiện
ra có một vấn đề, đó là chuỗi khối của chúng đã bị thay đổi dữ liệu. Và chúng sẽ ra hiệu cho chuỗi
khối trên máy tính đó rằng chuỗi khối đó có vẻ đã bị tấn cơng bởi nó không khớp với các chuỗi
khối khác.
Những giá trị bị thay đổi sẽ được sửa chữa và đồng bộ hóa lại với giá trị của những chuỗi còn lại.
Như vậy, tất cả các giá trị trên các chuỗi khác được sao chép qua và chuỗi khối sẽ được khôi phục
trở về các giá trị ban đầu của nó. Do vậy, những gì xảy ra trong trường hợp này là như bạn có thể
thấy, hacker khơng thể chỉ tấn cơng một máy tính, khơng thể chỉ tấn cơng một chuỗi khối và thay
đổi các giá trị ở đó, mà hắn sẽ phải tấn công tất cả các chuỗi khối trên các máy tính cùng một lúc.
Bằng cách tấn cơng này, những kẻ hacker sẽ phải thực hiện thao tác đó rất nhanh trong vài giây,
tối đa là vài phút, tùy thuộc vào cấu trúc của nền tảng Blockchain.
2.2.4.
Giá trị Nonce
Nếu nó đơn giản đến mức chỉ cần lấy số khối, dữ liệu và giá trị băm trước đó đưa vào thuật tốn
băm nhằm tạo ra một giá trị băm cho khối và khoảng thời gian tính tốn chỉ mất nửa giây, vậy tồn
bộ cách thức hoạt động của Mining là gì? Tại sao lại có rất nhiều, hàng trăm nghìn dàn máy đào
8
trên khắp thế giới được sử dụng để tính tốn các giá trị băm này? Trong trường hợp này, trường
Nonce sẽ giúp chúng ta kiểm soát giá trị băm của khối hiện tại.
Chúng ta có thể tự do thay đổi giá trị của Nonce và Nonce về cơ bản chỉ là một giá trị số, điều này
sẽ cho phép chúng ta thay đổi một cách ngẫu nhiên giá trị băm. Chúng ta sử dụng từ "ngẫu nhiên"
ở đây bởi trong thuật tốn băm, chúng ta khơng thể dự đốn trước nó sẽ đưa ra giá trị gì. Chúng ta
thay đổi Nonce và thuật toán sẽ trả về một số ngẫu nhiên.
Cách hoạt động của Mining
Như vậy, mấu chốt là tất cả những điều mà những máy đào này đang làm là chỉ thực hiện lặp lại
các thao tác tính tốn, thay đổi, thay đổi và thay đổi Nonce để hy vọng có được giá trị băm phù
hợp. Và bất kỳ ai đốn được nó trước tiên sẽ được phép thêm một khối và quá trình lặp lại cho
khối tiếp theo.
Điều quan trọng về giá trị băm là hiệu ứng tuyết lở. Các bạn hãy nhớ rằng trong hiệu ứng tuyết lở,
khi thay đổi Nonce, giá trị băm sẽ thay đổi hồn tồn. Trong ví dụ bên trên, bạn có thể thấy rằng
với giá trị Nonce 23, giá trị băm sẽ nằm ở trên, sau đó giá trị băm ứng với Nonce 21 nằm ở dưới,
điều này sẽ cho phép các máy đào dự đốn rằng có vẻ như bằng cách giảm giá trị Nonce, giá trị
băm sẽ giảm xuống. Trên thực tế, mọi thứ hồn tồn khơng phải vậy. Giá trị băm là hoàn toàn
ngẫu nhiên.
2.2.5.
Khả năng kháng lỗi Byzantine
Hệ thống kháng lỗi Byzantine (BFT) là hệ thống có thể giải quyết được vấn đề của bài toán các
vị tướng quân Byzantine. Điều này có nghĩa là hệ thống BFT có thể tiếp tục hoạt động ngay cả khi
một số nút bị lỗi hoặc thực hiện hành động gây hại.
Bây giờ, làm thế nào để điều này được áp dụng vào chuỗi khối hoặc giống như các hệ thống phân
tán khác? Chúng ta có thể có ai đó đang cố gắng tấn công hệ thống và chúng ta cần đưa ra một
giao thức đồng thuận, giống như chiến thuật mà những vị tướng Byzantine đã nghĩ ra.
2.2.6.
Giao thức đồng thuận
Có nhiều loại giao thức đồng thuận ở đây có thể nêu tới 2 loại phổ biến là Proof of work, proof of
stake.
9
Vấn đề cần nói ở đây là điều gì sẽ xảy ra nếu kẻ tấn công cố gắng đặt một khối vào cuối chuỗi, cố
gắng thêm một khối mới độc hại hoặc có dữ liệu trái phép?
Giả sử một khối A được khai thác bởi một máy tính A1 và trước khi thơng tin này đến được với
máy tính B1, thì máy tính B1 đã khai thác xong khối A. Đối với chuỗi khối, đây là một vấn đề cần
giải quyết vì nó cần có sự đồng thuận về cách tiếp tục phát triển lớn dần của chuỗi, nếu không, sẽ
có hiện tượng xảy ra trùng lặp khi các khối được đưa vào.
•
Giải quyết vấn đề 1
Mỗi nút nằm trước khối đó được thêm vào, trước khi khối đó được truyền vào mạng, mỗi nút đơn
lẻ sẽ tiến hành một loạt kiểm tra rất nghiêm ngặt, chúng kiểm tra các giá trị băm, kiểm tra khối
trước đó trùng khớp với giá trị băm trước đó trong trường giá trị băm, kiểm tra timestamp để kiểm
tra giao dịch và rất nhiều thứ khác. Và nếu kết quả kiểm tra không được chấp nhận, các khối sẽ
không được chấp nhận. Về cơ bản, mạng sẽ không cho phép các khối độc hại được thêm vào chuỗi.
Và đó là lý do tại sao có một khoản thưởng tài chính để mọi người cùng chơi theo cùng các quy
tắc. Đó là cách chúng ta giải quyết bài tốn số một.
•
Vấn đề 2
Những gì các nút làm là các nút màu tím sẽ có một khối màu tím. Các nút màu cam sẽ có một khối
màu cam, và chuỗi khối sẽ có hai dạng khác nhau tại thời điểm này. Vì vậy, chúng ta có 2 chuỗi
cạnh tranh nhau. Những gì chúng ta sẽ làm là chờ đợi cho đến khi một khối khác được thêm vào.
Và khi khối đó được thêm vào, sẽ có một chuỗi dài hơn. Về cơ bản, chuỗi nào thêm một khối trước
đầu tiên thì chuỗi đó sẽ thắng, tức là chuỗi nào dài hơn chuỗi đó sẽ thắng. Trong Blockchain, chuỗi
dài nhất là thắng. Chuỗi nào có nhiều khối cuối cùng sẽ giành chiến thắng và thay thế chuỗi cịn
lại. Và điểm chính ở đây là vùng mạng có sức mạnh băm cao nhất cuối cùng sẽ tạo ra chuỗi dài
nhất.
2.3. Đặc điểm của công nghệ Blockchain
Công nghệ Blockchain đóng vai trị giống như một cuốn sổ cái ghi lại tất cả các giao dịch xảy ra
trong hệ thống nên các đặc điểm chính của blockchain bao gồm:
2.3.1.
Phân loại:
10
Blockchain được chia làm 3 loại chính :Publish, Private và Permissoined.
•
Public blockchain
Đây là hệ thống Blockchain mà bất kỳ ai cũng có quyền ghi và đọc dữ liệu trên các chuỗi của
nó. Q trình xác thực trên loại blockchain này đỏi hỏi phải có hàng nghìn thậm chí tới hàng
vạn nút tham gia. Do đó việc tấn cơng hệ thống này gần hư là bất khả thi.
•
Private blockchain
Đây là hệ thống mà chỉ có người dùng quyền đọc dữ liệu mà khơng có quyền ghi chép vì
điều này thuộc về một bên thứ ba tuyệt đối tin cậy.
Bên thứ ba này có quyền quyết định mọi thay đổi trong chuỗi. Thời gian xác nhận giao dịch
tương đối ngắn vì chỉ cần một vài thiết bị tham gia vào quá trình xác thực.
•
Permissoined blockchain
Cịn được biết đến với cái tên Consortium. Đây là một dạng của private bockchain nhưng bổ
sung thêm một số tính năng nhất định. Nó chứa đựng sự kết hợp của “niềm tin” khi tham gia
vào Publish và “niềm tin tuyệt đối” khi tham gia vào Private.
2.3.2.
•
Ưu điểm:
Khơng thể làm giả, không thể phá huỷ các chuỗi blockchain
Các chuỗi của blockchain gần như không thể phá huỷ được và theo lý thuyết thì chỉ có máy
lượng tử mới có thể can thiệp và giải mã chuỗi blockchain.
Nó chỉ có thể bị phá huỷ hồn tồn khi khơng có internet trên tồn cầu.
•
Bất biến
Dữ liệu trong blockchain gần như không thể sửa đổi. Để thay đổi được dứ liệu cần phải có sự
đồng thuận giữa các nút mạng và dữ liệu đó sẽ được lưu trữ vĩnh viễn.
•
Bảo mật dữ liệu
11
Các thông tin, dữ liệu trong các chuỗi được phân tán và an tồn tuyệt đối. Chỉ có người nắm
giữ private key mới có quyền truy xuất dữ liệu đó.
•
Minh bạch
Ai cũng có thể theo dõi đường đi của các dữ liệu trong blockchain từ địa chỉ này tới địa chỉ
khác và có thể thống kê tồn bộ lịch sử dữ liệu trên địa chỉ đó.
•
Ẩn danh:
người dùng có thể giao dịch một cách an tồn, bảo mật mà khơng cần phải lo ngại về người
khác biết được danh tính của mình.
2.3.3.
•
Nhược điểm:
Tiêu tốn nhiều năng lượng
Mỗi blockchain đã sao chép chính nó đến mọi nút giao dịch trên Blockchain nên đã tạo ra
một lượng dư thừa khá lớn. Mỗi lần giao dịch có rất nhiều nút trên mạng địi hổi cần tiêu thụ
một lượng điện năng khá lớn.
•
Tốn khơng gian lưu trữ
Để vận hành một nút ( Node) trên blockchain bitcoin bạn cần tait xuống 60 GB dữ liệu. Nếu
thị trường phát triển càng mạnh thì sẽ có nhiều blockchain với dung lượng lớn hơn rất nhiều.
•
Tính khơng thể phá vỡ cũng là nhược điểm của nó.
Nếu bạn đặt một thứ gí đó lên Blockchain bạn cần chắc chắn là sẽ khoong hối hận vì giao
dịch một khi được thực hiện sẽ không thể đảo ngược hoặc làm lại. Nó sẽ ở trên blockchain
vĩnh viễn theo đúng nghĩa đen.
2.4. Ứng dụng của Blockchain trong thực tế
Tính bảo mật và phi tập trung đã khiến blockchain phù hợp để thực hiện các bản ghi dữ liệu sự
kiện, hồ sơ y tế, quản lý hộ tịch, quản lý giao dịch, truy xuất nguồn gốc thực phẩm, hay trong các
cuộc bầu cử bỏ phiếu.
12
2.4.1.
•
Đối với sản xuất:
Nếu doanh nghiệp sản xuất sữa ứng dụng Blockchain vào quản lý chất lượng sản phẩm
thì nhà quản lý & người tiêu dùng có thể truy xuất được các thơng tin.
•
Nhà sản xuất có thể thống kê và lưu trữ tồn bộ sữa đó trên thị trường, biết được số lượng
sữa được tiêu thụ, số lượng sữa cịn hạn & đã hết hạn.
•
Đối với người tiêu dùng:
•
Người tiêu dùng có thể ứng dụng Blockchain để kiểm tra thơng tin hộp sữa có phải hàng
chính hãng hay khơng nhằm ngăn chặn sản phẩm nhái trên thị trường.
•
Walmart – nhà bán lẻ tại Mỹ là một trong những doanh nghiệp tiên phong sử dụng
Blockchain. Hiện tại, thương hiệu đã sử dụng Blockchain để theo dõi nguồn thịt lợn nhập
từ Trung Quốc.
2.4.2.
Đối với lĩnh vực y tế:
•
quản lý hồ sơ bệnh án bệnh nhân
•
quản lý chuỗi cung ứng thuốc, thiết bị y tế
•
tăng cường tính minh bạch và tự động hóa trong các giao dịch khám chữa bệnh.
•
Đối với ngành tài chính:
•
Quản lý và giảm thiểu rủi ro trong thanh toán do các vấn đề về trục trặc kỹ thuật, vỡ nợ
trước khi thanh tốn giao dịch
•
Sổ cái kỹ thuật số ln xác minh, thanh tốn và cập nhật những giao dịch ngang hàng
một cách liên tục
•
Xác thực thơng tin khách hàng, khả năng tín dụng khơng cần thơng qua trung gian
•
Hệ thống quản lý thơng minh cho phép liên tục đổi mới, lặp lại và cải tiến, dựa trên sự
đồng thuận của tất cả người dùng trong mạng lưới.
Công nghệ Blockchain được xem là phương pháp cắt giảm chi phí và thời gian thanh tốn bù trừ
giao dịch liên ngân hàng cũng như tạo ra hệ thống an toàn hơn. Điều đặc biệt là nhiều tổ chức tài
chính đã hình thành các liên minh để thương mại hóa cơng nghệ Blockchain: Ví như liên minh
R3 của 3 ngân hàng lớn nhất của nước Úc bao gồm Westpac, Commonwealth, NAB cùng với 40
ngân hàng và nhiều tổ chức tài chính khác trên toàn thế giới.
13
Tại Việt Nam, công nghệ Blockchain được ứng dụng chủ yếu trong các lĩnh vực: dịch vụ tài
chính (hơn 83%), chuỗi cung ứng (40%), dịch vụ công cộng (30%), năng lượng (30%), giáo dục
(30%),... Cho đến hiện tại, phần lớn startup sử dụng Blockchain trong lĩnh vực tài chính như
VBTC.
Blockchain là kho tàng quý giá hay chỉ là phế phẩm tùy thuộc vào cách sử dụng của mỗi doanh
nghiệp. Tận dụng tốt, doanh nghiệp sẽ nhanh chóng vươn lên dẫn đầu trong cuộc cạnh tranh
khốc liệt trên thi trường.
II. Cơ sở lý thuyết
1. React Native
1.1. Nguồn gốc
React Native được phát triển bởi Facebook với mục đính ban đầu là áp dụng vào mạng xã hội lớn
nhất hành tinh: Facebook. Do đặc tính cơng nghệ của mạng xã hội, Facebook cần phải tạo ra nền
tảng phát triển ứng dụng di động đa nền tảng có hiệu năng khơng thua kém so với ứng dụng được
phát triển độc lập cho từng nền tảng. React Native hiện tại chỉ hỗ trợ phát triển ứng dụng di động
hệ điều hành Android và iOS, ít hơn so với Ionic (Android, iOS, Windows Phone).
React Native chính thức trở thành mã nguồn mở vào tháng 3 năm 2015. Cho đến nay, React Native
được áp dụng trong nhiều ứng dụng của ta và cả nước ngoài.
1.2. Khái niệm
React Native là một framework cho phép các lập trình viên sử dụng JavaScript để làm mobile apps
trên cả Android và iOS với có trải nghiệm và hiệu năng như native. React Native vượt trội ở chỗ
chỉ cần viết một lần là có thể build ứng dụng cho cả iOS lẫn Android.
React native cho phép xây dựng các ứng dụng trên android vs ios chỉ với một ngôn ngữ thống nhất
là javascript nhưng mang lại trải nghiệm native app thực sự. Không như các framework hybrid
khác(viết một lần triển khai nhiều nơi), React native tập trung vào việc một lập trình viên làm việc
hiệu quả trên môi trường đa nền tảng như thế nào?
1.3. Một số khái niệm cơ bản
14
1.3.1.
Component:
Components là một khái niệm cơ bản của cả React và React native. Chính việc chia
nhỏ ứng dụng thành các components nhỏ tạo nên tính tái sử dụng cao và khả năng mở
rộng
của
chúng.
Hãy
thử
phân
tích
một
ví
dụ
đơn
giản
trước.
Đây là một list cơ bản về thơng tin của album có tên albumn, tên ca sĩ thể hiện, ảnh
thumbnail của ca sĩ và ảnh bìa của album cùng một nút bấm mua. Chúng ta có thể hình
dung ra rằng List đó sẽ là một Scroll view và các item trong đó là biểu thị cho một
album. Đây có thể là một cách chia các component cho ví dụ này.
15
Ngoài những component chúng ta xây dựng và sử dụng lại đó, thì Reat native sẵn
có đó là một tá các component mặc định rồi.
1.3.2.
Prop:
16
Props là viết tắt của Properties. Một điều mà cần phải nhớ khi sử dụng props đó là khơng bao giờ
nên thay đổi giá trị của nó, hay nói cách khác, đây là một dữ liệu immutable.
Các component nhận props từ component cha. Giá trị của props trong các component này chỉ được
phép đọc giá trị chứ không được thay đổi (Read Only). Trong React thì dữ liệu sẽ đi theo một
chiều, có nghĩa là từ component cha => các component con.
Đây là một ví dụ sử dụng props, cung cấp cho một component tên là Header.
Props title được sử dụng trong component Header để render ra tiêu đề của nó.
1.3.3.
State:
State thì hoạt động khác với Props. State là dữ liệu nội bộ của một Component, trong khi props là
dữ liệu được truyền cho Component. Chính vì vậy chúng ta hồn tồn có thể thay đổi state, và coi
nó là một kiểu dữ liệu mutable. Vì đặc điểm này nên chúng ta hay sử dụng State để thay đổi dữ
liệu của view, binding data lại view khi có thay đổi. Nhưng chúng ta không dùng this.state để gán
lại giá trị thay đổi cho nó, mà chúng ta sẽ dùng this.setState. Function này sẽ trigger cho class rằng
hãy render lại component và các component con của nó, cịn this.state thì khơng.
17
Đây là một ví dụ về sự dụng state để thay đổi giá trị. Giống như việc truyền datasource cho
tableview vậy, ban đầu datasource chính là state này rỗng và sau đó được trả về dự liệu sau khi
call api. Và từ đó thay đổi state sẽ làm cho component render lại dữ liệu.
Cịn đây là hình ảnh consoleLog ở trên debuger, chúng ta có thể thấy rõ ràng lúc đầu state.albums
vẫn cịn rỗng và sau đó khi call api, và có data trả về, nhờ vào việc setState lại view có thể render
và hiển thị ra ngồi.
18
1.4. Ưu nhược điểm
Ưu điểm:
•
Có thể tái sử dụng code
React Native cho phép các developer có thể tái sử dụng code trong khi phát triển các
ứng dụng đa nền tảng. Đặc biệt, developer có thể tái sử dụng hầu như 80-90% các
đoạn code thay vì phải viết và tạo các ứng dụng riêng biệt cho các nền tảng khác
nhau.
Ưu điểm này giúp người dùng:
•
- Tiết kiệm thời gian và giảm chi phí phát triển của một ứng dụng.
- Tận dụng nguồn nhân lực tốt hơn
- Duy trì ít code hơn, ít bugs hơn
- Các tính năng trong cả 2 platforms cũng tương tự nhau.
Cộng đồng người dùng lớn
React Native được đánh giá là một trong những Framework được yêu thích nhất
(khảo sát của stack overflow vào năm 2019).
Nhờ cộng đồng người dùng rất lớn trên tồn thế giới, việc tìm sự hỗ trợ nếu gặp phải
bugs sẽ dễ dàng hơn.
•
Tính ổn định và tối ưu
Được phát triển bởi Facebook, React Native có hiệu năng ổn định khá cao.
Mã React Native giúp đơn giản hóa q trình xử lý dữ liệu.
Đội ngũ phát triển ứng dụng không quá lớn.
Xây dựng ứng dụng ít native code nhất cho nhiều hệ điều hành khác nhau.
Trải nghiệm người dùng tốt hơn khi so sánh với ứng dụng Hybrids
Nhược điểm:
•
•
Yêu cầu Native code.
Hiệu năng kém hơn so với Native App.
19
•
•
•
•
Bảo mật chưa thật sự tốt do dùng JavaScript. Do sử dụng JavaScript, người dùng
cũng sẽ bị ảnh hưởng bởi những đặc điểm của JavaScript: dễ làm dễ sai, dẫn đến
khó duy trì về sau.
Quản lý bộ nhớ.
Tùy biến chưa thật sự tốt ở một số module.
Khơng thích hợp cho các app cần năng lực tính tốn cao (hash, crypto, etc).
1.5. So sánh Native với Web và Hybrid
1.5.1.
Native vs Web:
Ứng dụng web là một ứng dụng mà người dùng không cần tải xuống và thay vào đó truy
cập thơng qua trình duyệt web qua mạng. Các trình duyệt web mẫu bao gồm Google
Chrome, Safari và Mozilla Firefox. Các web app cung cấp chức năng từ quyền truy cập
tài khoản ngân hàng để xem video trên YouTube, ví dụ như Safari trên iPhone.
Mặc dù các ứng dụng gốc phụ thuộc vào một thiết bị cụ thể, phần lớn các ứng dụng web
có thể được viết bằng JavaScript, CSS và phiên bản HTML tiêu chuẩn để sử dụng phổ
biến trên nhiều trình duyệt khác nhau. Các ứng dụng web có thể sử dụng một cơ sở mã
duy nhất vì chúng khơng được thiết kế dành riêng cho một thiết bị cụ thể nào. Các ứng
dụng web rất nhanh và đơn giản để xây dựng, nhưng khơng linh hoạt và nhanh chóng như
các ứng dụng native.
1.5.2.
Native vs Hybrid:
Ứng dụng lai (Hybrid App) là sự kết hợp giữa ứng dụng native và ứng dụng web. Hoạt
động bên trong của một ứng dụng lai tương tự như một ứng dụng web, nhưng nó được cài
đặt như một ứng dụng gốc. Các ứng dụng lai có quyền truy cập vào API thiết bị nội bộ,
có nghĩa là chúng có thể sử dụng các tài nguyên như máy ảnh, lưu trữ và GPS. Instagram
là một ví dụ điển hình của ứng dụng lai.
Các ứng dụng lai được xây dựng với HTML và CSS. Các lập trình viên tạo một cơ sở mã,
sau đó thực hiện các thay đổi nhỏ để điều chỉnh ứng dụng theo từng nền tảng. Các hybrid
app thường chạy một ứng dụng web thông qua một container hoặc WebView, một trình
duyệt có thể được chứa bên trong một ứng dụng di động.
20
Các ứng dụng hybrid có nhiều điểm khác với các ứng dụng native theo nhiều cách. Các
ứng dụng hybrid dựa trên các ứng dụng web và chứa các yếu tố điều hướng giống như
các ứng dụng web. Ngồi ra, khơng có chế độ ngoại tuyến cho ứng dụng lai - nó chỉ hoạt
động khi có kết nối internet. Ngược lại, ứng dụng native là gì? Là các ứng dụng gốc có
thể hoạt động ngoại tuyến.
Sự khác biệt về chi phí giữa các ứng dụng native và hybrid là tối thiểu. Trong cả 2 loại
ứng dụng, lập trình viên đều phải viết mã để khởi chạy trên nhiều nền tảng. Nói chung,
nếu thời gian phát triển của một ứng dụng ít hơn 4 – 6 tháng, thì một hybrid app là thích
hợp hơn vì ta có thể xây dựng chúng nhanh hơn.
2. Nest Js
2.1. Khái niệm
Nest (NestJS) là một framework để xây dựng các ứng dụng server-side bằng Node.js hiệu quả, và
dễ mở rộng. Nó sử dụng ngơn ngữ bậc cao của Javascript là TypeScript (nhưng vẫn cho phép các
lập trình viên sử dụng Javascript thuần túy) và kết hợp các tính chất của OOP (Lập trình hướng đối
tượng), FP (Lập trình chức năng) và FRP (Lập trình phản ứng chức năng).
Về bản chất Nest sử dụng các framework máy chủ HTTP mạnh mẽ như là Express (mặc định) và
có thể tùy chọn cấu hình để sử dụng Fastify.
Nest cung cấp một tầng trừu tượng trên các framework Node.js phổ biến này (Express / Fastify),
nhưng cũng hỗ trợ API của họ trực tiếp cho các lập trình viên. Điều này cho phép các lập trình viên
tự do sử dụng vơ số các mơ-đun của bên thứ ba có sẵn cho nền tảng cơ bản. Có thể hiểu là tất cả
các package mà chúng ta cài thêm khi sử dụng Express / Fastify đều có thể tích hợp được vào Nestjs.
2.2. Tại sao lại dùng Nest:
Trong những năm gần đây, nhờ có Node.js, JavaScript đã trở thành ngôn ngữ chung cho
cả Frontend và Backend. Điều này đã tạo ra các công c tuyệt vời như Angular, React và
Vue, giúp cải thiện năng suất của lập trình viên và cho phép tạo ra các ứng dụng frontend
nhanh, tính mở rộng cao. Tuy nhiên, trong khi có rất nhiều thư viện, cơng cụ tuyệt vời tồn
tại cho Node, nhưng khơng có thư viện nào giải quyết hiệu quả vấn đề chính là kiến trúc.
Có hiểu là chưa có 1 mơ hình phát triển dự án backend cố định như RubyOnRails.
Nest cung cấp một kiến trúc ứng dụng vượt trội cho phép các lập trình viên và các nhóm
tạo ra các ứng dụng có thể kiểm tra cao, có thể mở rộng và dễ bảo trì.
2.3. Một số khái niệm cơ bản
21
2.3.1.
Controller
Khi có request HTTP đến, cơ chế routing sẽ chuyển request này đến controller tương ứng để xử lý
và trả về phản hồi thích hợp. Để tạo một controller thì ta dùng @Controller() để liên kết class
Controller với request tương ứng. Ngồi ra thì ta cũng có thể dùng lệnh $ nest g controller users
trong cmd để tạo controller.
Như vậy chúng ta đã tạo ra một API với url GET: /users. Trong @Controller thì ta đã sử dụng tiền
tố users làm route path, việc sử dụng như vậy sẽ tập hợp các route liên quan và giảm thiểu việc lặp
code. Để xác định method cụ thể cho một request chúng ta sẽ định nghĩa @Get() trên hàm
findAll().Việc khai báo như vậy sẽ giúp Nest có thể ánh xạ request Get: /users đến hàm findAll()
này để xử lý và response lại cho client.
Ngồi Get() thì Nest cũng cung cấp đầy đủ các phương thức như những framework khác, như
@Post(), @Delete(), @Put(), @Path(),… Ta có thể cấu hình http status code và header như đoạn
code dưới đây:
2.3.2.
Provider
22
Provider là thành phần cơ bản trong Nest, một provider có thể được đưa vào làm một dependency
để tạo ra mối liên hệ giữa nhiều đối tượng khác nhau. Các lớp như services, repositories hay helpers
có thể được xem như provider bằng cách thêm decorator @Injectable() vào.
Các provider trong NestJS có thể được đưa vào một class thơng qua constructor, sau đó Nest sẽ
đảm nhiệm việc xử lý các dependency, giúp cho việc quản lý những dependency này trở nên đơn
giản hơn rất nhiều.
Để tạo một service chứa các logic xử lý của UserController, ta có thể tạo một UserService trong
file user.service.ts dưới đây, hoặc dùng lệnh $ nest g service cats trong cmd:
2.3.3.
Module
Một module được thiết kế để đóng gói các logic liên quan của những chức năng cần triển khai đến
client một cách độc lập. Một module trong Nest là class được định nghĩa với decorator @Module()
của Nest, dùng để mơ tả các thuộc tính như controller, provider hay dependency của module này.
Một file module cơ bản sẽ có dạng như sau:
23
2.4. Uư nhược điểm
2.4.1.
Ưu điểm:
•
Clean structure (cấu trúc rõ ràng): Nestjs chia rõ ràng các module riêng (ví dụ như
module về user, posts, tags...), mỗi module lại có các file rõ ràng như module,
controller, service, repository .... để xử lý việc khác nhau trong mỗi module. Việc
chia như vậy rất tốt vì giảm thiểu được việc tạo ra các cấu trúc làm lộn xộn dự án.
• Highly scalable (dễ dàng mở rộng) : Việc chia làm các module riêng nên việc mở
rộng rất dễ dàng, muốn thêm feature mới thì chỉ việc tạo thêm module mới để xử
lý feature đó.
• Testable : Nest hỗ trợ luôn chúng ta rồi nên chỉ việc viết test thôi. Trong mỗi
module các file để viết test là các file có đi .spec.ts
• Maintaince : Việc nest chia thành các module xử lý một việc của module đó nên
rất rõ ràng rất rõ ràng, và cấu trúc dự án cũng không lộn xộn nên nếu muốn
update phần nào thì dễ dàng tìm ra module mà sửa...
• Code chặt chẽ: nest viết chủ yếu bằng Typescript nên nest thừa hưởng được
những ưu điểm từ nó như việc tái cấu trúc bằng việc sử dụng OOP, định nghĩa rõ
ràng chặt chẽ (ví dụ tạo ra 1 hàm A, truyền vào 1 biến kiểu string, thì những nơi
gọi nó truyền vào mà ko đúng kiểu sẽ báo lỗi ln) nên giảm thiểu tỷ lệ mắc lỗi ...
• Phù hợp với nhiều người : Nestjs hỗ trợ cả Typescript và js thuần túy nên việc
chuyển qua từ các framework khác hoặc những lập trình viên mới rất dễ dàng tiếp
cận nó. Đối với lập trình viên đã sử dụng qua Express thì rất dễ dàng, vì ngồi
những Object nó định nghĩa thì nest vẫn sử dụng được những object của Express
(ví dụ Req, Res ...)
a. Nhược điểm:
• Cộng đồng chỉ đang phát triển chưa thực sự quá lớn mạnh.
• Tài liệu tham khảo khiêm tốn.
• Kiến trúc được lấy cảm hứng từ Angular: Nếu tìm hiểu sâu về nest, có một số
khái niệm giống Angular, điều này mơ hình chung gây khó khăn cho lập trình
viên chưa biết về Angular.
2.5. Next vs Nuxt vs Nest
24
2.5.1.
Next
Ưu điểm:
• Mọi thành phần đều được áp dụng SSR một cách mặc định.
• Code được phân cắt tự động để giúp tải trang nhanh hơn.
• Khơng tải lên những phần code khơng dùng tới.
• Định tuyến (routing) phía client một cách đơn giản (page-based).
• Mơi trường Webpack-based dev có hỗ trợ Hot Module Replacement (HMR).
• Lấy dữ liệu một cách vơ cùng đơn giản.
• Có thể triển khai cùng với Express hoặc bất kì server Node.js HTTP nào.
• Có thể tuỳ chỉnh cấu hình Babel và Webpack theo ý bạn.
• Dễ dàng triển khai ở bất cứ đâu có hỗ trợ Node.js.
• Được tích hợp sẵn cơng cụ tối ưu hố tìm kiếm (SEO) cho các trang của bạn.
Nhược điểm:
•
Next.js khơng phải là Back-end; nếu bạn cần xử lí Back-end như cơ sở dữ liệu, hệ
thống tài khoản,… bạn cần làm nó ở 1 ứng dụng tách biệt phía Back-end.
• Next vơ cùng mạnh mẽ, nhưng nếu dùng nó chỉ để làm một ứng dụng đơn giản thì
là điều khơng cần thiết…
• Mọi dữ liệu cần phải được tải ở cả 2 phía client và server.
• Việc chuyển giao từ một ứng dụng phía server sang một ứng dụng Next.js chắc
chắn khơng nhanh một chút nào, nó cịn phụ thuộc vào project của bạn. Đôi khi,
bạn sẽ phải bỏ rất nhiều sức lực để làm được điều đó.
Hiệu suất:
So với 2 frameworks cịn lại, Next.js có một điểm số cao hơn Nuxt.js nhưng lại không tốt
bằng Nest.js
25