Technical Event #06: From Container to Kubernetes, and beyond.
As part of the Technical Event Series, in this #06 issue, let’s meet Mr. Thang Chung – Senior Solution Architect at NashTech with a very interesting topic, especially for those who are interested and working on Front-end, Back-end, and Cloud (Azure, AWS, GCP): From Container to Kubernetes, and beyond.
Technical Event #06: From Container to Kubernetes and beyond
Kiến trúc của các ứng dụng Web 3.0 (hay “DApps”) hoàn toàn khác với các ứng dụng Web 2.0.
Lấy Medium làm ví dụ, đây là một trang blog đơn giản cho phép người dùng xuất bản nội dung của riêng họ và tương tác với nội dung từ người khác.
Một ứng dụng web 2.0 nghe có vẻ đơn giản, nhưng có rất nhiều thứ đi vào cấu trúc của Medium để biến mọi thứ trở nên khả thi:
Đầu tiên, phải có một nơi để lưu trữ dữ liệu cần thiết, chẳng hạn như người dùng, bài đăng, thẻ, bình luận, lượt thích,… Điều này đòi hỏi một cơ sở dữ liệu được cập nhật liên tục.
Thứ hai, backend code (được viết bằng ngôn ngữ như Node.js, Java hoặc Python) phải định nghĩa logic nghiệp vụ của Medium. Ví dụ: Điều gì xảy ra khi người dùng mới đăng ký, xuất bản blog mới hoặc nhận xét trên blog của người khác?
Thứ ba, frontend code (thường được viết bằng JavaScript, HTML và CSS) phải định nghĩa logic giao diện người dùng của Medium. Ví dụ: Trang web trông như thế nào và điều gì sẽ xảy ra khi người dùng tương tác với từng phần tử trên trang?
Kết hợp tất cả lại với nhau, khi bạn viết một bài đăng blog trên Medium, bạn sẽ tương tác với frontend, frontend nói chuyện với backend, backend giao tiếp với cơ sở dữ liệu. Tất cả các code này được lưu trữ trên các máy chủ tập trung và được gửi đến người dùng thông qua trình duyệt internet.
Dưới đây là tóm tắt về cách hoạt động của hầu hết các ứng dụng Web 2.0 ngày nay.
Cách hoạt động của Web 2.0
Nhưng mọi thứ đang thay đổi.
Công nghệ blockchain (chuỗi khối) đã mở ra một hướng đi mới thú vị cho các ứng dụng Web 3.0. Trong bài viết này, chúng ta sẽ tập trung vào những gì mà Ethereum blockchain mang lại.
Điều gì làm cho ứng dụng Web 3.0 khác biệt?
Không giống như các ứng dụng Web 2.0 như Medium, ứng dụng Web 3.0 loại bỏ người đứng giữa (middleman). Không có cơ sở dữ liệu tập trung nào lưu trữ trạng thái ứng dụng và không có máy chủ web tập trung nào chứa logic backend.
Thay vào đó, bạn có thể tận dụng blockchain để xây dựng ứng dụng trên một máy trạng thái phi tập trung (decentralized state machine) được duy trì bởi các nút ẩn danh (anonymous node) trên internet.
“Máy trạng thái”, ý tôi là máy duy trì một số trạng thái chương trình nhất định và các trạng thái tương lai được phép trên máy đó. Blockchain là các máy trạng thái được khởi tạo với một số trạng thái ban đầu và có các quy tắc rất nghiêm ngặt (tức là sự đồng thuận) giúp xác định cách trạng thái đó có thể chuyển đổi.
Hơn nữa, không có thực thể nào kiểm soát máy trạng thái phi tập trung này – nó được duy trì chung bởi tất cả mọi người trong mạng.
Vậy còn máy chủ backend thì sao?
Thay vì backend của Medium được kiểm soát ra sao, trong Web 3.0, bạn có thể viết các hợp đồng thông minh xác định logic của các ứng dụng của bạn và triển khai chúng trên máy trạng thái phi tập trung. Điều này có nghĩa là mọi người muốn xây dựng một ứng dụng blockchain sẽ triển khai code của họ trên máy trạng thái được chia sẻ này.
Còn frontend? Nó gần như không thay đổi, với một số ngoại lệ mà chúng tôi sẽ đề cập sau.
Kiến trúc sẽ trông như thế này:
Kiến trúc Web 3.0
Nhìn cận cảnh kiến trúc web 3.0
Bây giờ, chúng ta hãy đi sâu hơn một chút vào cái gì làm cho điều này trở nên khả thi.
1) Blockchain
Ethereum blockchain thường được gọi là “máy tính thế giới”. Đó là bởi vì nó là một máy trạng thái xác định, truy cập toàn cầu được duy trì bởi mạng lưới các nút ngang hàng. Các thay đổi trạng thái trên máy trạng thái này được điều chỉnh bởi các quy tắc đồng thuận mà các nút ngang hàng trong mạng tuân theo.
Vì vậy, nói cách khác, nó được thiết kế để trở thành một máy trạng thái mà bất kỳ ai trên thế giới đều có thể truy cập và ghi vào. Do đó, máy này không thuộc sở hữu của bất kỳ thực thể nào – mà là của tất cả mọi người trong mạng.
Một điều nữa cần biết: Dữ liệu chỉ có thể được ghi vào Ethereum blockchain – bạn không bao giờ có thể cập nhật dữ liệu hiện có.
2) Hợp đồng thông minh (Smart Contracts)
Hợp đồng thông minh là một chương trình chạy trên Ethereum blockchain và định nghĩa logic đằng sau những thay đổi trạng thái xảy ra trên blockchain. Hợp đồng thông minh được viết bằng các ngôn ngữ cấp cao, chẳng hạn như Solidity hoặc Vyper.
Hợp đồng thông minh viết bằng ngôn ngữ cấp cao
Vì mã hợp đồng thông minh được lưu trữ trên Ethereum blockchain, nên bất kỳ ai cũng có thể kiểm tra logic ứng dụng của tất cả các hợp đồng thông minh trên mạng lưới.
3) Máy ảo Ethereum (EVM)
Tiếp theo, bạn có Máy ảo Ethereum, giúp thực thi logic được định nghĩa trong các hợp đồng thông minh và xử lý các thay đổi trạng thái xảy ra trên máy trạng thái truy cập toàn cầu này.
EVM không thể hiểu các ngôn ngữ cấp cao như Solidity và Vyper, thường được sử dụng để viết các hợp đồng thông minh. Thay vào đó, bạn phải biên dịch ngôn ngữ cấp cao thành bytecode, để EVM có thể thực thi.
4) Frontend
Cuối cùng, chúng ta có frontend. Như đã đề cập trước đây, nó xác định logic giao diện người dùng, nhưng giao diện người dùng cũng giao tiếp với logic ứng dụng được định nghĩa trong hợp đồng thông minh.
Giao tiếp giữa frontend và hợp đồng thông minh phức tạp hơn một chút so với biểu đồ trên. Hãy xem xét kỹ hơn điều này ở phần tiếp theo
Cách frontend code giao tiếp với các hợp đồng thông minh trên Ethereum?
Chúng ta muốn frontend của mình giao tiếp với các hợp đồng thông minh để chúng có thể gọi các chức năng, nhưng hãy nhớ lại rằng Ethereum là một mạng phi tập trung. Mỗi nút trong mạng Ethereum đều giữ một bản sao của tất cả các trạng thái trên máy trạng thái Ethereum, bao gồm mã và dữ liệu được liên kết với mọi hợp đồng thông minh.
Khi chúng ta muốn tương tác với dữ liệu và mã trên blockchain, chúng ta cần tương tác với một trong những nút này. Đó là vì bất kỳ nút nào cũng có thể phát đi (broadcast) yêu cầu thực hiện giao dịch trên EVM. Sau đó, một miner sẽ thực hiện giao dịch và ‘tuyên truyền’ sự thay đổi trạng thái kết quả tới phần còn lại của mạng.
Có hai cách để phát đi một giao dịch mới:
Thiết lập nút của riêng bạn để chạy phần mềm Ethereum blockchain
Sử dụng các nút được cung cấp bởi các dịch vụ của bên thứ ba như Infura, Alchemy và Quicknode
Nếu bạn sử dụng dịch vụ của bên thứ ba, bạn sẽ không phải đối mặt với tất cả các vấn đề đau đầu khi tự mình chạy một nút. Trên hết, việc thiết lập một nút Ethereum mới trên máy chủ của riêng bạn có thể mất nhiều ngày. (Có rất nhiều dữ liệu để đồng bộ hóa – Nó thậm chí có thể chiếm nhiều băng thông và bộ nhớ hơn so với một máy tính xách tay thông thường có thể xử lý.)
Hơn nữa, chi phí lưu trữ toàn bộ Ethereum blockchain sẽ tăng lên khi DApp của bạn mở rộng và bạn cần thêm nhiều nút hơn để mở rộng cơ sở hạ tầng của mình. Đó là lý do tại sao, khi cơ sở hạ tầng của bạn trở nên phức tạp hơn, bạn sẽ cần các kỹ sư DevOps toàn thời gian. Họ sẽ giúp bạn duy trì cơ sở hạ tầng để đảm bảo thời gian hoạt động và thời gian phản hồi nhanh chóng.
Tất cả những điều này để nói rằng, tránh được những vấn đề đau đầu này là lý do mà nhiều DApp chọn sử dụng các dịch vụ như Infura hoặc Alchemy để quản lý cơ sở hạ tầng nút cho họ. Tất nhiên, có một sự đánh đổi vì điều này tạo ra một điểm nghẽn tập trung (centralized chokepoint), nhưng chúng ta hãy nói về cái hang thỏ đó vào một ngày khác. 😉
Tiếp tục, hãy nói về các nhà cung cấp. Các nút mà bạn kết nối khi cần tương tác với blockchain (dù bạn tự thiết lập chúng hay sử dụng các nút hiện có từ các dịch vụ của bên thứ ba) thường được gọi là “nhà cung cấp”.
Nhà cung cấp trên ứng dụng web 3.0
Mọi Ethereum client (tức là nhà cung cấp) đều triển khai đặc tả JSON-RPC. Điều này đảm bảo rằng có một bộ phương pháp thống nhất khi các ứng dụng frontend muốn tương tác với blockchain. Nếu bạn chưa biết về JSON-RPC, thì đó là một giao thức gọi thủ tục từ xa (RPC) không trạng thái, nhẹ, giúp xác định một số cấu trúc dữ liệu và quy tắc xử lý. Đây là giao thức bất khả tri (transport-adnostic), vì vậy, các khái niệm có thể được sử dụng trong cùng một quy trình, qua socket, qua HTTP hoặc trong nhiều môi trường truyền thông báo khác nhau. Nó sử dụng JSON (RFC 4627) làm định dạng dữ liệu.
Khi bạn kết nối với blockchain thông qua một nhà cung cấp, bạn có thể đọc trạng thái được lưu trữ trên blockchain. Nhưng nếu bạn muốn viết lên trạng thái, vẫn còn một việc nữa bạn cần làm trước khi có thể gửi giao dịch tới blockchain – “ký” giao dịch bằng khóa cá nhân của bạn.
Ví dụ: hãy tưởng tượng chúng ta có DApp cho phép người dùng đọc hoặc xuất bản các bài đăng trên blog lên blockchain. Bạn có thể có một nút trên giao diện người dùng cho phép bất kỳ ai truy vấn các bài đăng trên blog được viết bởi một người dùng cụ thể. (Hãy nhớ rằng việc đọc từ blockchain không yêu cầu người dùng phải ký một giao dịch.)
Tuy nhiên, khi người dùng muốn xuất bản một bài đăng mới lên chuỗi, DApp sẽ yêu cầu người dùng “ký” vào giao dịch bằng khóa riêng của họ – chỉ sau đó DApp mới chuyển giao giao dịch đó sang blockchain. Nếu không, các nút sẽ không chấp nhận giao dịch.
Việc “ký” giao dịch này là nơi mà Metamask xuất hiện.
Ký giao dịch bằng Metamask
Metamask là một công cụ giúp các ứng dụng dễ dàng xử lý việc quản lý khóa và ký kết giao dịch. Nó đơn giản thế này: Metamask lưu trữ các khóa riêng của người dùng trong trình duyệt và bất cứ khi nào giao diện người dùng cần người dùng ký giao dịch, nó sẽ gọi đến Metamask.
Metamask cũng cung cấp kết nối với blockchain (như một “nhà cung cấp”) bởi nó đã có kết nối với các nút do Infura cung cấp vì nó cần nó ký giao dịch. Theo cách này, Metamask vừa là nhà cung cấp vừa là người ký. 🤯
Lưu trữ trên Blockchain
Tất nhiên, kiến trúc này có ý nghĩa nếu bạn đang xây dựng một ứng dụng nơi tất cả các hợp đồng thông minh và dữ liệu hoàn toàn sống trên Ethereum blockchain. Nhưng bất kỳ ai đã xây dựng ứng dụng trên Ethereum đều biết rằng việc lưu trữ mọi thứ trên blockchain trở nên rất tốn kém.
Hãy nhớ rằng, với Ethereum, người dùng trả tiền mỗi khi họ thêm dữ liệu mới vào blockchain. Đó là bởi vì việc thêm một trạng thái vào máy trạng thái phi tập trung sẽ làm tăng chi phí cho các nút đang duy trì máy trạng thái đó.
Yêu cầu người dùng trả thêm tiền để sử dụng DApp của bạn mỗi khi giao dịch của họ yêu cầu thêm trạng thái mới không phải là trải nghiệm người dùng tốt nhất. Một cách để chống lại điều này là sử dụng giải pháp lưu trữ ngoài chuỗi phi tập trung, như IPFS hoặc Swarm.
IPFS là một hệ thống tệp phân tán để lưu trữ và truy cập dữ liệu. Vì vậy, thay vì lưu trữ dữ liệu trong cơ sở dữ liệu tập trung, hệ thống IPFS phân phối và lưu trữ dữ liệu trong một mạng ngang hàng. Điều này giúp bạn dễ dàng lấy ra khi cần.
IPFS cũng có một lớp khuyến khích (incentive layer) được gọi là “Filecoin”. Lớp này khuyến khích các nút trên khắp thế giới lưu trữ và truy xuất dữ liệu này. Bạn có thể sử dụng nhà cung cấp như Infura (cung cấp cho bạn nút IPFS) hoặc Pinata (cung cấp dịch vụ dễ sử dụng, nơi bạn có thể “ghim” các tệp của mình vào IPFS và lấy mã băm IPFS và lưu trữ trên blockchain) .
Swarm tương tự ở chỗ là mạng lưu trữ phi tập trung, nhưng có một điểm khác biệt đáng chú ý. Trong khi Filecoin là một hệ thống riêng biệt, hệ thống khuyến khích của Swarm được tích hợp sẵn và thực thi thông qua các hợp đồng thông minh trên Ethereum blockchain để lưu trữ và truy xuất dữ liệu.
Bây giờ, với IPFS hoặc Swarm, kiến trúc ứng dụng của chúng ta trông giống như sau:
IPFS hoặc Swarm trên Kiến trúc ứng dụng
Những độc giả tinh ý cũng có thể nhận thấy trong sơ đồ bên dưới rằng frontend code không được lưu trữ trên blockchain. Chúng ta có thể lưu trữ mã này trên AWS như chúng ta thường làm trong Web 2.0, nhưng điều đó tạo ra một điểm giới hạn tập trung cho DApp của bạn. Điều gì sẽ xảy ra nếu AWS gặp sự cố? Điều gì sẽ xảy ra nếu nó kiểm duyệt ứng dụng của bạn?
Đó là lý do tại sao, nếu bạn muốn xây dựng một ứng dụng phi tập trung thực sự, bạn có thể chọn lưu trữ giao diện người dùng của mình trên một giải pháp lưu trữ phi tập trung, như IPFS hoặc Swarm.
Vì vậy, bây giờ kiến trúc ứng dụng của bạn trông giống như sau:
Lưu trữ Frontend trên IPFS hoặc Swarm
Truy vấn blockchain
Tới lúc này, chúng ta đã nói về cách ghi vào blockchain bằng cách ký các giao dịch và sau đó gửi chúng đến blockchain. Nhưng còn việc đọc dữ liệu từ các hợp đồng thông minh trên blockchain thì sao? Có hai cách chính để làm điều này:
1) Sự kiện hợp đồng thông minh (Smart Contract Events)
Bạn có thể sử dụng thư viện Web3.js để truy vấn và nghe các sự kiện hợp đồng thông minh. Bạn có thể nghe các sự kiện cụ thể và chỉ định một lệnh gọi lại mỗi khi sự kiện được kích hoạt. Ví dụ: nếu bạn có một hợp đồng thông minh gửi một luồng thanh toán liên tục từ người A đến người B mỗi khối, thì bạn có thể tạo ra một sự kiện mỗi khi một khoản thanh toán mới được thực hiện cho người B. Frontend code của bạn có thể lắng nghe các sự kiện đang được kích hoạt bằng hợp đồng thông minh và thực hiện các hành động cụ thể dựa trên hợp đồng đó.
2) Biểu đồ (Graph)
Cách tiếp cận trên mặc dù ổn, nhưng nó có một số hạn chế. Ví dụ: điều gì sẽ xảy ra nếu bạn triển khai một hợp đồng thông minh và sau đó nhận ra rằng bạn cần một sự kiện được phát ra mà ban đầu bạn không bao gồm? Rất tiếc, bạn phải triển khai lại hợp đồng thông minh mới với sự kiện và dữ liệu đó. Hơn nữa, việc sử dụng các lệnh gọi lại để xử lý các logic giao diện người dùng khác nhau trở nên rất phức tạp.
Đây là lúc “Biểu đồ” xuất hiện.
Biểu đồ là một giải pháp lập chỉ mục ngoài chuỗi giúp truy vấn dữ liệu trên Ethereum blockchain dễ dàng hơn. Biểu đồ cho phép bạn xác định các hợp đồng thông minh nào cần lập chỉ mục, các sự kiện và lệnh gọi hàm nào cần nghe và cách chuyển các sự kiện tiếp theo thành các thực thể mà logic frontend của bạn (hoặc bất kỳ thứ gì đang sử dụng API) có thể sử dụng. Nó sử dụng GraphQL làm ngôn ngữ truy vấn, mà nhiều frontend engineer yêu thích vì cách nó biểu đạt so với các API REST truyền thống.
Bằng cách lập chỉ mục dữ liệu blockchain, Biểu đồ cho phép chúng ta truy vấn dữ liệu trên chuỗi trong logic ứng dụng với độ trễ thấp.
Bây giờ, kiến trúc DApp của bạn trông giống như sau:
The Graph
Chúng ta gần xong rồi, nhưng vẫn còn một chủ đề chính: mở rộng quy mô.
Mở rộng DApp
Như bạn có thể đã nghe qua, Ethereum không mở rộng – ít nhất là chưa.
Gas Price trung bình của Ethereum
Phí giao dịch trung bình
Kích thước khối trung bình
Rõ ràng, chúng ta có một vấn đề ở đây. Việc xây dựng DApp trên Ethereum với phí gas cao và các khối đầy đủ dẫn đến trải nghiệm người dùng rất tệ. Rất may, có một số giải pháp đang được phát triển.
Một giải pháp chia tỷ lệ phổ biến là Polygon, một giải pháp chia mở rộng L2. Thay vì thực hiện các giao dịch trên blockchain chính, Polygon có các “sidechains” xử lý và thực hiện các giao dịch. Một sidechain là một chuỗi khối thứ cấp giao tiếp với chuỗi chính. Sidechain thường xuyên gửi tổng hợp các khối mới nhất của nó trở lại chuỗi chính.
Sidechain và Blockchain
Ý tưởng là: Các giải pháp L2 thực hiện giao dịch (tức là phần chậm) ngoài chuỗi, với dữ liệu giao dịch được lưu trên chuỗi. Điều này cho phép chúng ta mở rộng quy mô chuỗi khối vì chúng ta không phải thực hiện mọi giao dịch trên chuỗi. Điều này cũng làm cho các giao dịch nhanh hơn và rẻ hơn – và chúng vẫn có thể giao tiếp với chuỗi khối Ethereum chính khi cần thiết.
Giải pháp L2
Gom tất cả lại
Nếu tất cả những điều này khiến bạn quay cuồng, thì không chỉ mỗi bạn đâu. Việc kết hợp tất cả các công cụ này lại với nhau rất phức tạp và có thể dẫn đến trải nghiệm khó khăn cho nhà phát triển. Nhưng đừng lo – chúng ta đang bắt đầu thấy các framework mới thực sự cải thiện trải nghiệm cho các nhà phát triển.
Ví dụ: Hardhat là một framework dành cho nhà phát triển giúp các nhà phát triển Ethereum xây dựng, triển khai và thử nghiệm các hợp đồng thông minh của họ dễ dàng hơn. Hardhat cung cấp “Mạng Hardhat”, mà các nhà phát triển có thể sử dụng để triển khai các hợp đồng thông minh của họ trên một mạng cục bộ – mà không cần phải xử lý các môi trường trực tiếp. Hơn thế nữa, nó cung cấp một hệ sinh thái plugin tuyệt vời giúp cuộc sống của các nhà phát triển dễ dàng hơn nhiều. Hardhat cũng cung cấp chức năng console.log (), tương tự như javascript, cho mục đích gỡ lỗi.
Tất nhiên, đây chỉ là khởi đầu. Tôi hy vọng rằng chúng ta tiếp tục thấy công cụ dành cho nhà phát triển tốt hơn trong tương lai.
Bên cạnh chuỗi Technical Event, Gambaru xin giới thiệu đến các bạn chuỗi Short Demo, giới thiệu những tool / platform thịnh hành và mới nổi dành cho cộng đồng IT.
Short Demo #01 – Kubeflow Fundamentals bởi Quân Đặng
Tham gia các Short Demo, các bạn sẽ có cơ hội hiểu thêm cách sử dụng những tool đó ra sao, hấp dẫn nữa là trực tiếp thảo luận cùng các speaker đến từ Gambaru và những “tai to mặt lớn” trong cộng đồng IT.
Số đầu tiên, chúng ta hãy cùng anh Quân Đặng – Machine Learning Engineer tại One Mount Group tìm hiểu và thảo luận về Kubeflow.
Đây là công cụ đầy hứa hẹn, giúp các bạn cung cấp môi trường để phát triển và vận hành máy học. Sẽ rất bổ ích dành cho những bạn nào đã, và đang trong quá trình tìm hiểu về MLOps.
Bài viết chủ đề Knowledge Graph (Đồ thị tri thức) dựa theo các chia sẻ của Tiến Sĩ Hiển Nguyễn tại chương trình Technical Event số thứ #04 do Gambaru tổ chức. Một số nội dung trong bài được rút gọn và không đề cập chi tiết như tại buổi chia sẻ, bạn có thể tham khảo thêm bằng việc xem video ở cuối bài viết.
Một số khái niệm trên đồ thị
Đồ thị là 1 bộ gồm 2 tập V và E. V là tập các đỉnh của đồ thị và E là tập các cạnh của đồ thị.
1 Đồ thị sẽ gồm tập đỉnh và tập cạnh.
Thông thường trong ứng dụng thực tế, các đồ thị sẽ tập trung vào các đồ thị hữu hạn (hữu hạn đỉnh)
Ví dụ 1 đồ thị cơ bản
Đồ thị cơ bản
Ứng dụng của đồ thị
Đồ thị có thể được dùng để:
Biểu diễn ngữ nghĩa của văn bản
Biểu diễn các biểu thức toán học
Biểu diễn thông tin Social network
Người dùng, các mối quan hệ của người dùng
Ứng dụng của đồ thị
Đồ thị có hướng và vô hướng
Đồ thị có hướng: Phân biệt thứ tự các đỉnh trong cạnh
Đồ thị có hướng
Đồ thị vô hướng: Không phân biệt thứ tự các đỉnh
Đồ thị vô hướng
Đồ thị có trọng số: Trên đồ thị, ngoài tập đỉnh và tập cạnh thì bổ sung 1 ánh xạ đi từ tập cạnh đến mặt số thực và khi đó ánh xạ được gọi là trọng số của 1 cạnh.
Kề nhau
2 cạnh kề nhau nếu có chung 1 đỉnh
Kề nhau
Bậc của đỉnh
Số cạnh được nối đến 1 đỉnh nào đó.
Với đồ thị có hướng thì có cạnh vào và cạnh ra
Các loại đồ thị
Đồ thị đơn
Đồ thị đơn là đồ thị mà 2 đỉnh bất kỳ được nối với nhau bởi không quá 1 cạnh và không có khuyên (đi 1 vòng lại chính nó)
Đa đồ thị là nếu có ít nhất 1 cặp đỉnh được nối với nhau bởi 2 cạnh trở lên và không có khuyên
Trong nghiên cứu, người ta thường hay quy về dạng đồ thị đơn để dễ nghiên cứu, biểu diễn
Đồ thị đủ
Là đồ thị có bậc n và giữa 2 đỉnh bất kỳ, đều có đỉnh
Đồ thị đủ
Đồ thị lưỡng phân
Là đồ thị có tập đỉnh thành V1, và V2. 2 tập này sẽ nối 1 đỉnh trong V1 với 1 đỉnh trong V2. Giữa các đỉnh trong 1 tập không nối với nhau.
Đồ thị lưỡng phân
Đồ thị lưỡng phân
Đồ thị con
Được xây dựng từ việc bỏ đi 1 số đỉnh trong đồ thị ban đầu và bỏ đi 1 số cạnh.
Đồ thị con
Đồ thị bù
Là đồ thị ‘adapt’ vào đồ thị đang có để trở thành 1 đồ thị đầy đủ.
Đồ thị bù
Các phương pháp biểu diễn đồ thị
Biểu diễn hình học
Biểu diễn bằng hình vẽ, biểu diễn trên mặt phẳng
Biểu diễn hình học
Biểu diễn bằng ma trận liên kết đỉnh cạnh
Biểu diễn bằng 1 ma trận với m dòng và n cột
Ma trận liên kết đỉnh cạnh
Ma trận liên kết đỉnh cạnh
Biểu diễn bằng ma trận kề
Biểu diễn bằng ma trận vuông
Biểu diễn bằng ma trận vuông
Biểu diễn bằng danh sách kề
Đẳng cấu đồ thị
2 đồ thị được gọi là đẳng cấu nếu có 1 phép tương ứng 1-1 giữa tập đỉnh và phép tương ứng 1-1 giữa tập cạnh.
Đẳng cấu đồ thị
Một số bài toán trên đồ thị
Duyệt đồ thị
Duyệt đồ thị theo chiều sâu
Duyệt đồ thị theo chiều rộng
Tìm đường ngắn nhất
Thuật toán Dijkstra
Thuật toán Ford-Bellman
Thuật toán Floyd
Thuật giải sử dụng các heuristic
Hãy xem video dưới bài viết để nghe Thầy Hiển diễn giải chính xác các bài toán bên trên nhé.
Ứng dụng biểu diễn tri thức dạng quan hệ
Biểu diễn tri thức dạng quan hệ
Tri thức con người có rất nhiều dạng khác nhau. Vậy làm thế nào để đưa được tri thức con người lên trên máy tính để thực hiện các hoạt động suy luận, tìm kiếm.
Để làm việc đó, ta phải tích cấu trúc tri thức của con người có những thành phần nào.
Khái niệm (tập C)
Mối quan hệ giữa các khái niệm (tập R)
Các luật suy diễn trong tri thức (Rules)
Cấu trúc mô hình tri thức quan hệ
Rela model và đồ thị tri thức
Biểu diễn các khái niệm, đối tượng trên mô hình thông qua các quan hệ đã được định nghĩa. Đồ thị bên trên còn thiếu trong việc biểu diễn quy tắc suy diễn (rules)
Ứng dụng hệ thống tra cứu kiến thức môn học
Ứng dụng biểu diễn thông tin trên mxh
Làm thế nào đánh giá sự ảnh hưởng của một người trên MXH để phục vụ cho các chiến dịch influencer marketing?
Mô hình người ảnh hưởng
Mô hình biểu diễn thông tin MXH
Biểu diễn quan hệ giữa người dùng
Hệ thống ADVO
Bạn có thể xem chi tiết các kiến thức trong bài viết thông qua video từ buổi chia sẻ:
Bài viết dưới đây được viết lại theo những chia sẻ của Hiếu PC trong buổi Technical Event số thứ #05 về Cyber Security và Product Security được tổ chức vào ngày 19/02. Bạn có thể xem chi tiết các nội dung được chia sẻ thông qua video cuối bài viết.
Bảo mật (Cyber Security) trong quá trình phát triển dự án phần mềm là một trong những chủ đề nhận được khá là nhiều sự quan tâm, đặc biệt là các doanh nghiệp, đặc biệt là các bạn lập trình viên.
Sai lầm khi làm sản phẩm trước, làm bảo mật sau
Thường nhiều người có tâm niệm là cứ phát triển sản phẩm trước, sau đó mới bàn tới chuyện bảo mật. Nhưng khi bị hack rồi thì mới biết hậu quả như thế nào, ảnh hưởng cực kỳ lớn từ việc bị lộ lọt thông tin của khách hàng, uy tín công ty và nguy cơ phá sản, thậm chí dính đến cả pháp luật.
Tất cả do sự thiếu quan tâm tới dữ liệu của khách hàng.
Việc này xảy ra ở rất nhiều nơi, đặc biệt là một số công ty ở VN, chỉ tập trung phát triển sản phẩm mà quên đi vấn đề bảo mật.
Cyber Security là gì?
Cyber Security là gì?
Các tổ chức, doanh nghiệp khi phát triển sản phẩm luôn đứng ở vị thế phòng thủ, tức là vừa phát triển sản phẩm, vừa phải bảo vệ hình ảnh, thương hiệu, cho tới bảo mật dữ liệu cá nhân khách hàng.
Nhưng hacker họ chỉ cần 1 lỗ hổng duy nhất, có thể từ bên trong (những yếu tố về con người) hoặc bên ngoài (tấn công hệ thống máy chủ, hệ thống tên miền, những gì liên quan tới sản phẩm, công nghệ)
Vì vậy việc phòng thủ phải bao quát rất nhiều thứ.
Cho nên an toàn thông tin (cyber security) trở thành dịch vụ thiết yếu của bối cảnh hiện đại.
Cyber Security được hiểu là một hành động nhằm phòng ngựa, ngăn chặn hoặc ngăn cản sự truy cập, sử dụng, chia sẻ, tiết lộ, phát tán, phá hủy hoặc ghi lại những thông tin chưa được sự cho phép của người chủ sở hữu.
Product Security là gì?
Product Security là gì?
Năm 2021, có hơn 5 tỷ dữ liệu cá nhân bị lộ, lọt, bị hack.
Bảo mật sản phẩm (Product security) trong thời đại thông tin là rất quan trọng. Các cuộc tấn công của hacker ngày càng trở nên nguy hiểm. Đồng thời người dùng cũng đang tìm kiếm các sản phẩm có xếp hạng an toàn cao.
Vậy bảo mật sản phẩm là gì?
Bảo mật sản phẩm (product security) là một quá trình tiếp cận rộng rãi và nó có thể thay đổi tùy vào các yếu tố như công nghệ được sử dụng, loại thị trường hoặc khách hàng.
Product Security nên tập trung vào mọi khía cạnh trong vòng đời của sản phẩm để làm cho sản phẩm trở nên an toàn nhất có thể.
Từ khi sản phẩm ra đời cho đến khi sản phẩm rút khỏi thị trường, bạn nên hành động theo cách tiếp cận bảo mật theo từng thiết kế trong từng bước. Điều này liên quan tới việc tập trung vào các mối đe dọa, cách giảm thiểu chúng và phân tích rủi ro tổng thể.
Quy trình này bao gồm các khía cạnh kỹ thuật như:
Đánh giá mã nguồn
Kiểm tra cơ sở hạ tầng
Kiểm tra thâm nhập từ bên ngoài (Pen test)
Kiểm tra tính bảo mật thông tin từ bên trong
Việc giảm thiểu các mối đe dọa trên không gian mạng là rất quan trọng để ra mắt 1 sản phẩm thành công.
Tại sao digital product security lại quan trọng?
Tại sao Digital Product Security lại quan trọng?
Khi hacker tấn công một ứng dụng phần mềm, thường họ sẽ nhắm vào layer 7, là những thông tin dữ liệu. Điều cuối cùng hacker muốn là lấy những trí tuệ, sản phẩm phần mềm, mã nguồn, dữ liệu khách hàng và thông tin mật của công ty có giá trị lớn trên thị trường.
Bảo mật sản phẩm không chỉ đảm bảo sản phẩm của bạn được bảo vệ khỏi bị khai thác bởi hacker. Hiện rất nhiều người dùng quan tâm đến an toàn thông tin và bảo mật dữ liệu cá nhân. Điều này nghĩa là nhu cầu của thị trường đối với các sản phẩm an toàn ngày càng lớn.
Các công ty cần cho khách hàng thấy rằng họ quan tâm sâu sắc vào việc bảo mật dữ liệu của khách hàng. Các sản phẩm an toàn không chỉ ngăn ngừa việc mất tiền do bị vi phạm hay đánh cắp dữ liệu mà còn tăng thị phần hay sự tin tưởng của công ty.
Một khảo sát cho Cisco thực hiện, 32% người trả lời có tâm lý lo ngại vấn đề bảo mật liên quan tới sản phẩm.
Vì vậy, việc phát triển 1 sản phẩm về mặt bảo mật vừa bảo vệ sản phẩm, vừa bảo vệ, giữ chân khách hàng là rất quan trọng.
Security Guideline – Hướng dẫn bảo mật
Hướng dẫn bảo mật – Security Guideline
Information
Phải luôn bảo vệ thông tin và cải thiện sự minh bạch về việc thu thập thông tin, lộ lọt thông tin thế nào và tại sao cần thông tin đó đều phải được chỉ rõ cho khách hàng.
Đó là lý do một công ty hay tập đoàn đưa ra sản phẩm thì đều có những guideline như security guideline, privacy guideline cho khách hàng.
Communication
Thường các công ty nếu chia sẻ việc phát triển sản phẩm với nhau thì phải hoàn toàn được bảo mật và mang tính minh bạch giữa các thành viên trong team phát triển sản phẩm. Để đảm bảo những thông tin này không ảnh hưởng tới quy trình phát triển của sản phẩm.
Có nhiều sản phẩm được phát triển nhưng vô tình để lộ mật khẩu nhạy cảm hoặc API key mà quên xóa đi hoặc vô tình chia sẻ.
Hardware
Phần cứng cần phải được nâng cấp thường xuyên.
Software
Không nên sử dụng phần mềm crack, lậu để phát triển sản phẩm, nhằm tránh các nguy cơ ảnh hưởng tính bảo mật sản phẩm
Phải đảm bảo phần mềm luôn được cập nhật phiên bản mới nhất
Physical security
Nói về độ an toàn trong bản thân tổ chức, như có bảo vệ hay không, có mã vạch, xác nhân Face ID, giới tính nhân viên trước khi vào công ty
Thường xuyên trò chuyện, tìm hiểu, quan sát hành vi nhân viên để tránh tình trạng nhân viên mua bán dữ liệu, sử dụng vào mục đích xấu.
Personal security
Liên quan tới khách hàng như phải luôn educate quyền của user, chỉ rõ những gì họ nên làm, hoặc không nên làm.
Organization security
Theo chuẩn ISO.
Giải pháp thực hiện bảo mật
Để đảm bảo sản phẩm an toàn và thu hút khách hàng quan tâm đến quyền riêng tư. Có một số giải pháp bạn có thể thực hiện theo
Bảo mật ngay từ đầu
Trước khi bắt tay phát triển sản phẩm, hãy tự hỏi và trả lời rằng ‘tôi có thể tạo ra một sản phẩm an toàn hay không?’ ‘làm cách phát triển các cấp độ của các giao thức bảo mật trong suốt vòng đời sản phẩm?’
Phải có một chiến lược bảo mật
Tích hợp các hệ thống bảo mật nhiều lớp với các quy trình xem xét nghiêm ngặt gồm xem xét mã nguồn, quét nội bộ, kiểm tra thâm nhập để tiếp cận toàn diện hệ thống sản phẩm.
Phải có kế hoạch B, C cho bất cứ rủi ro tiềm ẩn nào
Phải luôn phòng bệnh hơn chữa bệnh
Luôn kiểm tra lại bảo mật
Trong quá trình bảo mật và khi đưa sản phẩm ra thị trường.
Thực hiện bảo mật trong mọi bộ phận của sản phẩm như hạ tầng, thiết kế sản phẩm và giao diện người dùng…
Nhân viên chịu trách nhiệm cho 60% các cuộc tấn công an ninh mạng. Yếu tố con người đóng góp rất quan trọng trong vấn đề này.
Nhận thức an toàn thông tin
Mọi người hay nghĩ một hệ thống an toàn thì mình đã an toàn rồi nhưng không phải vậy. Hệ thống an toàn khi mình có đủ nhận thức thì mới làm cho hệ thống an toàn thực sự, mới tận dụng hết các tính năng an toàn của nó.
Cho nên vấn đề ở đây là nhận thức, vừa phải nhận thức an toàn cho người sử dụng, vừa phải nhận thức an toàn thông tin cho khách hàng.
Đưa bảo mật vào nề nếp
Từ khi sản phẩm ra đời, hoàn thành, bảo mật phải được xem xét qua mọi giai đoạn vòng đời của sản phẩm. Điều đó phải ăn sâu vào văn hóa công ty để có kết quả tốt nhất như áp dụng các tiêu chuẩn sản phẩm.
ISO 27001, 27002: Các tiêu chuẩn này cung cấp cấu trúc để triển khai hệ thống, phải thực hiện theo để đảm bảo bảo mật ở cấp độ tổ chức).
ISO 15408: Tiêu chí chung – bộ hướng dẫn và thông số kỹ thuật quốc tế được phát triển để đánh giá sản phẩm, bảo mật thông tin cho mục đích sử dụng của CP. Có thể áp dụng cho các phần cứng, mềm, sủng hoặc liên quan tới thư viện sản phẩm.
Tiêu chuẩn an ninh mang NIST của Mỹ, cung cấp các hướng dẫn giúp tổ chức quản lý và hạn chế các rủi ro an ninh mạng.
Coding Security – Lập trình theo tâm thế bảo mật
Code review – Lập trình theo tâm thế bảo mật
Developer hiện nay không chỉ cần biết về vấn đề lập trình, mà còn phải biết về vấn đề bảo mật như OWASP. Chỉ cần 1 lỗ hổng nguy hiểm thì toàn bộ những gì được phát triển sẽ thất bại. Nên họ cần phải để tâm tới vấn đề lập trình mà còn là vấn đề bảo mật.
Security Officer thường quan tâm nhiều về bảo mật, biết những vấn đề như lỗ hổng bảo mật, khả năng bị tấn công.
2 người này phải phối hợp với nhau chặt chẽ để đưa ra một định hướng cụ thể để đảm bảo vận hành sản phẩm trơn tru.
Coding review sẽ giúp đạt mục tiêu này nhanh hơn như OWASP Top 10.
Infrastructure Hardening
Bảo mật hạ tầng của hệ thống.
Quá trình planning hệ theo chuẩn dưới hình từ Design tới Build, Test và Production.
Cách tiếp cận tổng quan đối với bảo mật
Bảo mật cần phải làm gì, tiên đoán trước
Coding guideline, coding security
Pen test hệ thống, thuê 1 đội hoặc nhân viên an toàn thông tin
Sử dụng phần mềm để rà, quét những lỗ hổng bảo mật trên hệ thống hoặc sử dụng WAF để phòng thủ, bảo vệ khỏi các cuộc tấn công.
Quy trình bảo mật trên thực tế
Penetration testing (Pen Test)
Penetration Test
Sau khi sản phẩm hoàn thiện, đây là phần cuối cùng trước khi đưa sản phẩm ra ngoài. Nó bao gồm bảo mật kỹ lưỡng từ team dev tới team hệ thống quản trị, có thể nhờ tới Pen tester, có thể apply project trên các chương trình bug party (để hacker trên thế giới hack vào hệ thống).
Yếu tố con người chiếm tới 60% trong vấn đề bảo mật: không biết đặt mật khẩu sao cho an toàn, không sử dụng bảo mật 2 bước, quản trị hệ thống không cài firewall cho quản trị để ngăn chặn truy cập từ bên ngoài, dẫn tới lộ lọt thông tin.
Lưu ý đối với Pen test:
Pen test không phải cách hiệu quả nhất để tăng cường bảo mật sản phẩm. Bởi vì bản chất nó không phải là cải tiến về bảo mật mà chỉ là quy trình để xác định vấn đề bảo mật. Còn việc xác định những vấn đề bảo mật, lỗ hổng chưa được biết tới hoặc chưa từng tồn tại sẽ mất rất nhiều thời gian.
Thường chi phí thực hiện Pen test sẽ rất cao, nên một giải pháp rẻ hơn là ngăn chặn lỗ hổng bảo mật ngay từ ban đầu.
Các phần mềm phụ thuộc
Nhiều lập trình viên chỉ cần biết mỗi Java, chỉ cần code, không quan tâm tới các yếu tố xung quanh như hệ điều hành, các dịch vụ đang chạy và thư viện bên thứ 3. Tư duy như vậy sai.
Họ cần phải nắm những vấn đề phụ thuộc để đưa ra các tính năng phù hợp và đưa ra các tiêu chuẩn bảo mật phù hợp.
Hacker chỉ cần 1 trong các layer bị lỗi là có thể vào được hệ thống
Một số Security Tips đơn giản bạn nên áp dụng
1. Luôn cập nhật phần mềm
2. Tránh mở các email đáng ngờ
3. Luôn cập nhật phần cứng
4. Sử dụng các giải pháp chia sẻ tập tin, luôn đặt mật khẩu tập tin để tránh mất
5. Sử dụng phần mềm diệt virus
6. Sử dụng VPN cá nhân hóa việc riêng tư, đảm bảo kết nối được an toàn
7. Đừng lười đặt mật khẩu, các mật khẩu theo nickname, tên người yêu, cá nhân, từ khóa từ điển
8. Tắt bluetooth khi không cần thiết
9. Bật xác thực 2 bước
10. Loại bỏ phần mềm quảng cáo, dẫn dụ vào các trang độc hại
11. Kiểm tra trang web đang truy cập có https
12. Không lưu thông tin quan trọng ở những nơi không an toàn (Zalo, Facebook)
13. Quét virus các thiết bị bên ngoài, tránh sử dụng wifi nơi công cộng
14. Tránh tâm lý cho rằng đủ an toàn trên không gian mạng
15. Đầu tư nâng cấp bảo mật, sao lưu dữ liệu quan trọng vào hệ thống điện toán đám mây, luôn đặt mật khẩu, mã hóa ổ cứng
16. Đào tạo nhân viên, nâng cao tầm nhận thức về an toàn bảo mật
Sau khi Event Graph Development Fundamentals đã được tổ chức thành công, Gambaru sẽ tiếp tục mang đến cho cộng đồng Developer một bất ngờ mới ở số tiếp theo.
Technical Event #05 sẽ là sự tham gia, chia sẻ đến từ idol Hiếu PC, hiện Hiếu đang là một chuyên gia về Cyber Security, nhân vật nổi tiếng suốt thời gian qua khi nhắc đến các vấn đề về bảo mật.
Technical Event #05 Cybersecurity
Nếu bạn cần hiểu thêm về giá trị thông tin, dữ liệu, và bảo mật an toàn thông tin cho sản phẩm của mình hay quan ngại trước tình hình lộ, lọt hay bị hack mất dữ liệu ngày càng gia tăng và gây ra nhiều ảnh hưởng không nhỏ đối với các tổ chức, và người sử dụng nền tảng hay sản phẩm thì đừng bỏ qua buổi chia sẻ ‘cực phẩm’ này nhé.