Blockchain công nghệ của tương lai

Blockchain là gì? Blockchain hoạt động như thế nào? Ưu, nhược điểm của blockchain?


Blockchain(chuỗi khối), tên ban đầu block chain là một cơ sở dữ liệu phân cấp lưu trữ thông tin trong các khối thông tin được liên kết với nhau bằng mã hóa và mở rộng theo thời gian.Mỗi khối thông tin đều chứa thông tin về thời gian khởi tạo và được liên kết tới khối trước đó, kèm một mã thời gian và dữ liệu giao dịch.Blockchain được thiết kế để chống lại việc thay đổi của dữ liệu: Một khi dữ liệu đã được mạng lưới chấp nhận thì sẽ không có cách nào thay đổi được nó.





Blockchain được đảm bảo nhờ cách thiết kế sử dụng hệ thống tính toán phân cấp với khả năng chịu lỗi byzantine cao. Vì vậy sự đồng thuận phân cấp có thể đạt được nhờ Blockchain. Vì vậy Blockchain phù hợp để ghi lại những sự kiện, hồ sơ y tế, xử lý giao dịch, công chứng, danh tính và chứng minh nguồn gốc. Việc này có tiềm năng giúp xóa bỏ các hậu quả lớn khi dữ liệu bị thay đổi trong bối cảnh thương mại toàn cầu.

Blockchain đầu tiên được phát minh và thiết kế bới Satoshi Nakamoto vào năm 2008 và được hiện thực hóa vào năm sau đó như là một phần cốt lõi của Bitcoin, khi công nghệ blockchain đóng vai trò như là một cuốn sổ cái cho tất cả các giao dịch. Qua việc sử dụng mạng lưới ngang hàng và một hệ thống dữ liệu phân cấp, Bitcoin blockchain được quản lý tự động. Việc phát minh ra blockchain cho Bitcoin đã làm cho nó trở thành loại tiền tệ kỹ thuật số đầu tiên giải quyết được vấn đề double spending (chi tiêu gian lận khi 1 lượng tiền được dùng 2 lần). Công nghệ này của Bitcoin đã trở thành nguồn cảm hứng cho một loạt các ứng dụng khác.

Công nghệ blockchain tương đồng với cơ sở dữ liệu, chỉ khác ở việc tương tác với cơ sở dữ liệu. Để hiểu blockchain, cần nắm được năm định nghĩa sau: chuỗi khối (blockchain), cơ chế đồng thuận phân tán (decentralized consensus), tính toán tin cậy (trusted computing), hợp đồng thông minh (smart contracts) và bằng chứng công việc (proof of work). Mô hình tính toán này là nền tảng của việc tạo ra các ứng dụng phân tán.



Cơ chế đồng thuận phi tập trung (hay còn gọi là cơ chế đồng thuận phân quyền) (decentralized consensus)

Cơ chế này ngược lại với mô hình cổ điển về cơ chế đồng thuận tập trung – nghĩa là khi một cơ sở dữ liệu tập trung được dùng để quản lý việc xác thực giao dịch. Một sơ đồ phi tập trung chuyển giao quyền lực và sự tin tưởng cho một mạng lưới ảo phi tập trung và cho phép các nút của mạng lưới đó liên tục lưu trữ các giao dịch trên một khối (block) công cộng, tạo nên một chuỗi (chain) độc nhất: chuỗi khối (blockchain). Mỗi khối kế tiếp chứa một “hash” (một dấu tay độc nhất) của mã trước nó; vì thế, mã hóa (thông qua hàm hash) được sử dụng để bảo đảm tính xác thực của nguồn giao dịch và loại bỏ sự cần thiết phải có một trung gian tập trung. Sự kết hợp của mã hóa và công nghệ blockchain lại đảm bảo rằng sẽ không bao giờ một giao dịch được lưu trữ lại hai lần.




Chuỗi khối (The blockchain) và dịch vụ chuỗi khối

Một chuỗi khối giống như một nơi để lưu trữ dữ liệu bán công cộng trong một không gian chứa hẹp (khối). Bất cứ ai cũng có thể xác nhận việc bạn nhập thông tin vào vì khối chứa có chữ ký của bạn, nhưng chỉ có bạn (hoặc một chương trình) có thể thay đổi được dữ liệu của khối đó vì chỉ có bạn cầm khóa bí mật cho dữ liệu đó.

Vì thế chuỗi khối hoạt động gần giống như một cơ sở dữ liệu, ngoại trừ một phần của thông tin được lưu trữ - header của nó là công khai.

Dữ liệu lưu trữ có thể là một giá trị hoặc một số dư tiền mã hóa. Một chuỗi khối hoạt động như một hệ thống lưu chuyển giá trị thay thế mà không một quyền lực tập trung hay bên thứ ba nào có thể chen vào (vì quá trình mã hóa). Nó được dựa trên quyền công khai/ bí mật, là âm-dương của chuỗi khối: nhìn công khai nhưng kiểm soát bí mật.

Hợp đồng thông minh (smart contracts) và tài sản thông minh

Hợp đồng thông minh là các khối để xây dựng nên các ứng dụng phi tập trung. Một hợp đồng thông minh tương đương với một chương trình nhỏ mà bạn có thể tin tưởng với một đơn vị giá trị và quản lý giá trị đó. Ý tưởng cơ bản đằng sau hợp đồng thông minh là sự quản lý bằng khế ước đối với một giao dịch giữa hai bên liên quan hay nhiều hơn có thể được xác minh theo thứ tự thông qua chuỗi khối, thay vì thông qua một quan tòa tập trung. Sao phải dựa vào một quyền lực tập trung trong khi hai hay nhiều bên tham gia có thể đồng thuận lẫn nhau, và khi họ có thể đưa ra các điều khoản và thực thi sự đồng thuận bằng chương trình và các điều kiện, tiền sẽ được chuyển tự động khi hoàn thành một số dịch vụ.


Tính toán tin cậy (trusted computing)

Khi bạn kết hợp các nền tảng đằng sau chuỗi khối, cơ chế đồng thuận phi tập trung và hợp đồng thông minh, bạn sẽ nhận ra rằng chúng hỗ trợ cho việc truyền bá các nguồn lực và giao dịch trên một mặt phẳng theo một cách ngang hàng, và trong khi làm điều đó, chúng cho phép các máy tính tin tưởng lẫn nhau ở một mức độ sâu.

Vì vai trò của chuỗi khối là người xác nhận giao dịch minh bạch, mỗi khối ngang hàng có thể tiếp tục tin tưởng lẫn nhau tuân theo các quy luật tin tưởng nằm trên công nghệ.

Bằng chứng công việc (Proof of work)


Tại trung tâm của hoạt động chuỗi khối là khái niệm then chốt của “bằng chứng công việc”, một phần tích hợp tầm nhìn của Satoshi Nakamoto cho vai trò của chuỗi khối trong việc xác thực các giao dịch. Nó được biểu hiện là một rào cản lớn ngăn cản người dùng thay đổi dữ liệu trên chuỗi khối mà không sửa lại bằng chứng công việc.

Bằng chứng công việc là khối then chốt xây dựng nên blockchain vì nó không thể “sửa lại” và được bảo vệ thông qua sức mạnh của hàm hash mã hóa.

*****


Blockchain làm việc như thế nào?


Công nghệ blockchain có lẽ là phát minh tốt nhất từ chính Internet. Nó cho phép trao đổi giá trị mà không cần sự tin tưởng hoặc chứng cứ làm tin. Hãy tưởng tượng bạn và tôi đặt cược 50$ cho thời tiết ngày mai ở San Francisco. Tôi đặt cược trời sẽ nắng, bạn cược là mưa. Hôm nay chúng ta có ba tùy chọn để quản lý giao dịch này:
Chúng ta có thể tin tưởng lẫn nhau. Mưa hoặc nắng, người thua sẽ trả 50 đô la cho người chiến thắng. Nếu chúng ta là bạn, đây có thể là một cách hay để đặt cược. Tuy nhiên, dù là bạn bè hay người lạ thì vẫn không thể dễ dàng trả tiền cho người kia.
Chúng ta có thể biến tiền cược thành một hợp đồng. Với một hợp đồng tại chỗ, cả hai bên sẽ dễ phải trả tiền hơn, tuy nhiên, nếu một trong hai người quyết định không trả, người chiến thắng sẽ phải trả thêm tiền để trang trải chi phí pháp lý và bản án có thể mất một thời gian dài. Đặc biệt với một lượng tiền mặt nhỏ, điều này dường như không phải là cách tối ưu để quản lý giao dịch.
Chúng ta có thể nhờ đến một bên thứ ba trung lập. Mỗi người trong chúng ta đưa 50 đô la cho một người thứ ba, cô ấy sẽ đưa tổng số tiền cho người chiến thắng. Nhưng, cô ấy cũng có thể bỏ trốn với tất cả số tiền. Vì vậy, chúng ta sẽ chọn một trong hai lựa chọn đầu tiên: tin tưởng hoặc hợp đồng.

Cả sự tin tưởng và hợp đồng đều không phải là giải pháp tối ưu. Chúng ta không thể tin tưởng vào người lạ và thực thi hợp đồng đòi hỏi thời gian và tiền bạc. Công nghệ blockchain là thú vị vì nó cung cấp cho chúng ta lựa chọn thứ ba, an toàn, nhanh chóng và rẻ tiền.

Blockchain cho phép viết một vài dòng code, chương trình chạy trên blockchain, mà cả hai chúng ta gửi 50 đô la vào đó. Chương trình này sẽ giữ 100 đô la an toàn và kiểm tra thời tiết ngày mai một cách tự động trên nhiều nguồn dữ liệu. Nắng hoặc mưa, nó sẽ tự động chuyển toàn bộ số tiền cho người chiến thắng. Mỗi bên có thể kiểm tra hợp đồng logic, và vì nó đang chạy trên blockchain nên nó không thể thay đổi hoặc ngừng lại. Nỗ lực này có thể là quá cao đối với một giao dịch 50 đô la, nhưng hãy tưởng tượng khi bán nhà hoặc công ty.

Mục tiêu của phần này là để giải thích cách blockchain hoạt động mà không thảo luận về các chi tiết kỹ thuật sâu, nhưng đủ để bạn có một ý tưởng chung về logic và cơ chế cơ bản.

Ứng dụng được biết đến và thảo luận nhiều nhất của công nghệ blockchain chính là Bitcoin. Một loại tiền tệ số có thể được sử dụng để trao đổi sản phẩm và dịch vụ, giống như đồng đô la Mỹ (USD), Euro (EUR), đồng (Việt Nam) và các loại tiền tệ quốc gia khác. Hãy sử dụng ứng dụng đầu tiên của công nghệ blockchain này để tìm hiểu cách hoạt động của nó.

Bitcoin là gì?

Một Bitcoin là một đơn vị tiền tệ kỹ thuật số của Bitcoin, giống như đô la, bản thân nó không có giá trị. Nó có giá trị vì chúng ta đồng ý trao đổi hàng hóa, dịch vụ để đổi lấy một lượng tiền lớn hơn dưới dự kiểm soát của chúng ta và chúng ta tin rằng người khác cũng sẽ làm như vậy.



Để theo dõi lượng Bitcoin mỗi người trong chúng ta sở hữu, blockchain sử dụng một sổ cái - file kỹ thuật số - theo dõi tất cả các giao dịch của Bitcoin.


Tập tin kỹ thuật số của Bitcoin đã được đơn giản hoá

File này không được lưu trữ trên máy chủ tập trung, giống như ngân hàng hay trung tâm dữ liệu. Nó được phân tán trên toàn thế giới thông qua mạng máy tính, vừa lưu trữ dữ liệu, vừa thực hiện tính toán. Mỗi máy tính đại diện cho một nút của mạng blockchain và có một bản sao của file sổ cái.





Nếu David muốn gửi Bitcoin cho Sandra, anh ta sẽ phát một tin nhắn tới mạng nói rằng số lượng Bitcoin trong tài khoản của anh ta sẽ giảm xuống 5 BTC, và số tiền của tài khoản Sandra sẽ tăng lên theo cùng số lượng. Mỗi nút trong mạng sẽ nhận được thông báo và áp dụng giao dịch yêu cầu vào bản sao của sổ cái, do đó cập nhật số dư tài khoản.



Thực tế là sổ cái được duy trì bởi một nhóm các máy tính được kết nối chứ không phải là một thực thể trung lập như ngân hàng:

Trong hệ thống ngân hàng, chúng ta chỉ biết các giao dịch và số dư tài khoản của riêng mình, trên blockchain mọi người có thể thấy mọi giao dịch khác của người khác.
Trong khi bạn có thể tin tưởng vào ngân hàng của mình, mạng Bitcoin sẽ được phân phối và nếu có vấn đề gì đó không có sự trợ giúp để gọi hoặc bất cứ ai để kiện.
Hệ thống blockchain được thiết kế theo cách mà không cần sự tin tưởng, độ an toàn và độ tin cậy thu được thông qua các chức năng toán học đặc biệt và code.

Để có thể thực hiện các giao dịch trên blockchain, bạn cần một ví, một chương trình cho phép bạn lưu trữ và trao đổi Bitcoin. Vì chỉ có bạn mới có thể chi tiêu được Bitcoin của mình, mỗi chiếc ví được bảo vệ bởi một phương pháp mật mã đặc biệt, sử dụng một cặp khóa riêng biệt khác nhau nhưng có kết nối: một khoá riêng tư (private) và công khai (public).

Nếu một thông điệp được mã hoá bằng khóa công khai cụ thể, chỉ chủ nhân của khóa riêng tư đã ghép nối mới có thể giải mã và đọc tin nhắn. Mặt khác, nếu bạn mã hóa tin nhắn bằng khóa cá nhân của bạn, chỉ có thể sử dụng khóa công khai được ghép nối để giải mã nó. Khi David muốn gửi Bitcoin, anh ta cần phát một tin nhắn được mã hóa bằng khoá riêng của ví của anh ta, vì vậy anh ta và chỉ có anh ta mới có thể sử dụng Bitcoin mà anh ta sở hữu, vì David là người duy nhất biết chìa khóa riêng của anh ta cần để mở ví của mình. Mỗi nút trong mạng có thể kiểm tra chéo yêu cầu giao dịch đến từ David bằng cách giải mã thông báo yêu cầu giao dịch với khóa công khai của ví của anh ta.

Khi mã hóa yêu cầu giao dịch với khóa riêng tư của ví của bạn, bạn sẽ tạo ra một chữ ký số được sử dụng bởi các máy tính trong mạng blockchain để kiểm tra lại nguồn và tính xác thực của giao dịch. Chữ ký số là một chuỗi văn bản, là kết quả của việc kết hợp yêu cầu giao dịch và khóa riêng tư của bạn, vì vậy nó không thể được sử dụng cho các giao dịch khác. Nếu bạn thay đổi một ký tự trong thông báo yêu cầu giao dịch, chữ ký số sẽ thay đổi, do đó không kẻ tấn công tiềm ẩn nào có thể thay đổi yêu cầu giao dịch của bạn hoặc thay đổi lượng Bitcoin bạn đang gửi.



Mã hoá giao dịch chữ ký số đơn giản hóa

Để gửi Bitcoin, bạn cần phải chứng minh rằng mình sở hữu khóa riêng của một ví cụ thể, vì cần sử dụng nó để mã hóa thông báo yêu cầu giao dịch. Lưu ý rằng, bạn chỉ phát thông báo sau khi nó đã được mã hóa, nên không bao giờ phải tiết lộ khóa riêng.

Mỗi nút trong blockchain đang giữ một bản sao của sổ cái. Vì vậy, làm thế nào một nút biết số dư tài khoản của bạn là bao nhiêu? Hệ thống blockchain không theo dõi các số dư tài khoản, nó chỉ ghi lại từng giao dịch được yêu cầu. Sổ sách trên thực tế không theo dõi số dư, nó chỉ theo dõi mọi giao dịch được phát đi trong mạng Bitcoin. Để biết số dư trong ví của bạn, bạn cần phải phân tích và xác minh tất cả các giao dịch đã từng diễn ra trên toàn bộ mạng kết nối với ví của mình.



Sổ cái Bitcoin

Xác minh số dư này được thực hiện nhờ liên kết đến các giao dịch trước đó. Để gửi 10 Bitcoin cho John, Mary phải tạo yêu cầu giao dịch bao gồm các liên kết tới các giao dịch đến (số tiền nhận được) trước đó có tổng số dư bằng hoặc vượt quá 10 Bitcoin. Các liên kết này được gọi là đầu vào, các nút trong mạng sẽ xác minh rằng tổng số tiền của các giao dịch này bằng hoặc vượt quá 10 Bitcoin và các đầu vào này chưa được chi tiêu. Trên thực tế, mỗi lần bạn tham chiếu các đầu vào trong một giao dịch được xem là không hợp lệ trong bất kỳ giao dịch nào trong tương lai. Tất cả được thực hiện tự động trong ví của Mary và kiểm tra lại bởi các nút mạng Bitcoin, cô ấy chỉ gửi một giao dịch 10 BTC đến ví của John sử dụng khóa công khai của anh ấy.








Cấu trúc yêu cầu giao dịch Bitcoin

Vậy, làm thế nào hệ thống có thể tin tưởng giao dịch đầu vào và xem xét chúng có giá trị? Nó kiểm tra tất cả các giao dịch trước đó có tương quan với ví bạn sử dụng để gửi Bitcoin thông qua các tham chiếu và đầu vào. Để đơn giản hóa và đẩy nhanh quá trình xác minh, một bản ghi đặc biệt về các giao dịch không được sử dụng sẽ được giữ bởi các nút mạng. Nhờ kiểm tra bảo mật này, bạn không thể tiêu gấp đôi số Bitcoin nhận được.

Tất cả các code để thực hiện giao dịch trên mạng Bitcoin là mã nguồn mở, điều này có nghĩa là bất cứ ai có máy tính xách tay và một kết nối Internet đều có thể thực hiện giao dịch. Tuy nhiên, nếu có một lỗi trong code được sử dụng để phát thông báo yêu cầu giao dịch, Bitcoin liên quan sẽ bị mất vĩnh viễn. Hãy nhớ rằng vì mạng được phân phối, nên không có dịch vụ hỗ trợ khách hàng nào để gọi cũng như bất cứ ai có thể giúp bạn khôi phục lại giao dịch bị mất hoặc mật khẩu ví bạn đã quên. Vì lý do này, nếu bạn quan tâm đến giao dịch trên mạng Bitcoin, bạn nên sử dụng mã nguồn mở và phiên bản chính thức của phần mềm ví Bitcoin (chẳng hạn như Bitcoin Core) và để lưu mật khẩu của ví của bạn hoặc khóa riêng tư vào kho lưu trữ rất an toàn.

Những đặc điểm chính của BlockChain


Một cơ sở dữ liệu phân tán

Hãy tưởng tượng một bảng tính được nhân đôi hàng ngàn lần thông qua mạng lưới máy tính, mạng lưới này được thiết kế để cập nhật thường xuyên bảng tính đó là bạn đã có thể hiểu được cơ bản về blockchain.

Thông tin được tổ chức trên một blockchain tồn tại dưới dạng cơ sở dữ liệu được chia sẻ và hòa hợp liên tục. Đây là cách để sử dụng mạng với những lợi ích rõ ràng. Cơ sở dữ liệu blockchain không được lưu trữ ở duy nhất một vị trí nào, nghĩa là các bản ghi được lưu trữ một cách công khai, dễ kiểm chứng. Không có một phiên bản tập trung nào của cơ sở dữ liệu này tồn tại, nên hacker cũng chẳng có cơ hội nào để tấn công nó. Blockchain được lưu trữ bởi hàng triệu máy tính cùng lúc, dữ liệu của nó có thể truy cập bởi bất cứ ai trên Internet.

Blockchain giống như Google Docs

Cách chia sẻ tài liệu thông thường khi cộng tác là gửi tài liệu Microsoft Word cho một người khác qua email và yêu cầu họ sửa nó. Vấn đề trong trường hợp này là bạn cần phải đợi cho đến khi nhận được một bản sao lưu được gửi trở lại thì mới có thể xem hoặc thực hiện những thay đổi khác, vì đã bị khóa quyền chỉnh sửa cho đến khi người cộng tác của bạn hoàn tất việc chỉnh sửa. Đó là cách cơ sở dữ liệu hiện tại đang hoạt động. Hai chủ sở hữu không thể cùng chỉnh sửa một bản ghi cùng một lúc. Đó là cách các ngân hàng duy trì số dư và số chuyển khoản, họ nhanh chóng khóa quyền truy cập (hoặc giảm số dư) trong khi thực hiện chuyển khoản, rồi sau đó cập nhật tài khoản và mở lại quyền truy cập (hoặc cập nhật lại). Với Google Docs thì khác, cả hai bên đều có quyền truy cập đồng thời vào cùng một tài liệu và phiên bản duy nhất của tài liệu đó luôn hiển thị cho cả hai. Nó giống như sổ cái được chia sẻ, nhưng nó là một tài liệu được chia sẻ. Phần phân tán chỉ hoạt động khi chia sẻ liên quan đến một số người.

Lược dịch từ ý kiến của William Mougayar, cố vấn liên doanh, nhà kinh doanh 4x, nhà tiếp thị, chuyên gia chiến lược và chuyên gia blockchain.




Tính bền vững của blockchain

Công nghệ blockchain giống như Internet vì nó có một sức mạnh được tích hợp sẵn. Bằng cách lưu trữ những khối thông tin giống nhau trên mạng lưới của mình, blockchain không thể:
   Bị kiểm soát bởi bất kỳ một thực thể nào
   Không có điểm thiếu sót, lỗi duy nhất nào.

Bitcoin được phát hành vào năm 2008, kể từ đó, blockchain Bitcoin được vận hành, hoạt động mà không có sự gián đoạn đáng kể nào. Đến này, bất kỳ vấn đề nào liên quan đến Bitcoin là do hack hoặc quản lý kém. Nói cách khác, những vấn đề này đến từ ý định xấu và lỗi của con người, không phải là những sai sót tự thân của Bitcoin.

Internet đã chứng minh được độ bền trong gần 30 năm. Đây là bản ghi theo dõi tốt cho công nghệ blockchain khi nó tiếp tục được phát triển.

Minh bạch và không thể bị phá vỡ

Mạng lưới blockchain tồn tại trong trạng thái của sự thỏa thuận, tự động kiểm tra 10 phút một lần. Một loại hệ sinh thái tự kiểm soát giá trị kỹ thuật số, mạng lưới sẽ điều hòa mọi giao dịch xảy ra trong khoảng 10 phút. Mỗi nhóm giao dịch này được gọi là khối. Hai đặc tính quan trong được rút ra từ đây:
Minh bạch: Dữ liệu được nhúng trong mạng như một khối, công khai.
Nó không bị thể bị hỏng: Khi thay đổi bất kỳ đơn vị thông tin nào trên blockchain có nghĩa là sử dụng một lượng lớn máy tính để ghi đè lên toàn bộ mạng.

Về lý thuyết, điều này có thể xảy ra. Trong thực tế, nó không xảy ra. Ví dụ, việc kiểm soát hệ thống để chiếm lấy Bitcoin sẽ khiến giá trị của nó bị hủy hoại.

Một mạng lưới các nút

Một mạng lưới các nút tính toán tạo thành blockchain. Nút ở đây là máy tính được kết nối với mạng blockchain, sử dụng client để thực hiện nhiệm vụ xác nhận và chuyển tiếp các giao dịch. Nút sẽ nhận được một bản sao của blockchain, được tải tự động khi tham gia mạng lưới blockchain.

Các nút này cùng nhau tạo ra một mạng lưới cấp 2 mạnh mẽ, một góc nhìn hoàn toàn khác về cách mà Internet có thể hoạt động. Mỗi nút là một "quản trị viên" của mạng blockchain và tự động tham gia vào mạng, động lực cho việc tham gia này chính là cơ hội giành được Bitcoin.

Nút còn được gọi là đào Bitcoin, nhưng thuật ngữ này có chút nhầm lẫn. Trong thực tế, mỗi người đang cạnh tranh để giành Bitcoin bằng cách giải quyết những câu đố. Bitcoin là "lẽ sống" của blockchain ngay từ khi nó được hình thành. Bitcoin mới chỉ được công nhận như một phần rất nhỏ trong số những tiềm năng của công nghệ blockchain.

Có khoảng 700 loại tiền kỹ thuật số tương tự như Bitcoin, ngoài ra còn có rất nhiều những biến thể của khái niệm blockchain ban đầu hiện đang hoạt động hoặc đang được phát triển.

Ý tưởng về phân quyền

Theo thiết kế, blockchain là một công nghệ được phân quyền. Bất cứ điều gì xảy ra trên đó đều là chức năng của mạng. Một số gợi ý quan trọng bắt nguồn từ điều này. Nhờ tạo ra cách mới để xác nhận giao dịch mà những khía cạnh của thương mại truyền thống có thể trở nên không cần thiết. Ví dụ như những giao dịch trên thị trường chứng khoán có thể thực hiện cùng lúc trên blockchain, hoặc có thể lưu trữ tài liệu giống như sổ đỏ, hoàn toàn công khai. Và sự phân quyền đã trở thành hiện thực.

Mạng máy tính toàn cầu sử dụng công nghệ blockchain để cùng quản lý cơ sở dữ liệu, ghi lại các giao dịch của Bitcoin. Tức là, Bitcoin được quản lý bởi mạng của nó và không một ai là trung tâm cả. Phân quyền có nghĩa là mạng lưới hoạt động dựa trên cơ sở người dùng hay P2P. Các hình thức hợp tác tập thể có thể thực hiện chỉ mới bắt đầu được nghiên cứu.

Tăng cường bảo mật

Nhờ lưu trữ dữ liệu trên mạng của mình, blockchain loại bỏ những rủi ro đi kèm với dữ liệu được tổ chức tập trung. Mạng của nó không có những điểm dễ bị tổn thương. Trong khi đó, vấn đề bảo mật trên Internet thì ngày càng trở nên phức tạp. Chúng ta đều dựa vào hệ thống username/password để bảo vệ danh tính và tài sản của mình trên mạng, nhưng hệ thống này vẫn có nhiều khả năng bị phá vỡ. Phương pháp bảo mật của blockchain sử dụng công nghệ mã hóa với cặp khóa public/private. Khóa public (một chuỗi dài các số ngẫu nhiên) là địa chỉ của người dùng trên blockchain. Bitcoin gửi qua mạng sẽ được ghi nhận thuộc về địa chỉ đó. Khóa private giống như mật khẩu, cho phép chủ sở hữu truy cập vào Bitcoin hoặc các tài sản kỹ thuật số khác. Lưu trữ dữ liệu trên blockchain và nó sẽ không bị hư hỏng. Điều này là sự thật, mặc dù bảo vệ tài sản kỹ thuật số của bạn sẽ yêu cầu bảo mật khóa private bằng cách in ra, tạo ví kỹ thuật số để đựng giống như ví đựng tiền giấy.

Blockchain có thể dùng ở đâu?

Danh sách này được lấy từ bài viết "What is Blockchain Technology? A Step-by-Step Guide For Beginners" trên blockgeeks.com, mình đã lược bớt một số vì quá dài và khó hiểu, dưới đây là những gì còn lại:

Hợp đồng thông minh

Các sổ cái được phân chia cho phép mã hóa các hợp đồng đơn giản, sẽ được thực thi khi những điều kiện nhất định được thỏa mãn. Ethereum là một dự án blockchain mã nguồn mở, được xây dựng đặc biệt để đáp ứng yêu cầu này. Tuy nhiên, trong giai đoạn đầu phát triển, Ethereum có tiềm năng để tận dụng lợi thế của blockchain trên một quy mô lớn hơn như thế rất nhiều.

Ở cấp độ phát triển hiện tại của công nghệ, hợp đồng thông minh có thể được lập trình để thực hiện những chức năng đơn giản. Ví dụ, một giao dịch phát sinh có thể được thanh toán khi công cụ tài chính đáp ứng một số tiêu chuẩn, với việc sử dụng công nghệ blockchain và Bitcoin cho phép thanh toán tự động, không cần sự tham gia của con người hay bên trung gian làm chứng.

Kinh tế chia sẻ

Với những công ty như Uber, AirBnBm nền kinh tế chia sẻ đã chứng minh được những thành công ban đầu. Tuy nhiên, ở thời điểm hiện tại, người dùng muốn thuê dịch vụ chia sẻ xe phải dựa vào một trung gian là Uber. Bằng cách cho phép thanh toán ngang hàng, blockchain mở ra một cánh cửa mới để tạo sự tương tác trực tiếp giữa các bên, kết quả sẽ dẫn tới kinh tế chia sẻ được thực sự phân quyền.

Ví dụ, OpenBazaar sử dụng blockchain để tạo eBay ngang hàng. Tải ứng dụng về máy tính, bạn có thể giao dịch với nhà cung cấp OpenBazaar mà không phải trả lệ phí giao dịch. Phong cách "không có quy tắc" của giao thức nghĩa là danh tiếng cá nhân trong tương tác kinh doanh còn quan trọng hơn cả bản thân tương tác đó trên eBay. 

Mở rộng thị trường gọi vốn

Các sáng kiến thu hút vốn đầu tư như Kickstarter và Gofundme đang "dọn đường" cho nền kinh tế ngang hàng mới nổi này. Những trang web kể trên đã cho thấy mọi người muốn có tiếng nói trực tiếp trong việc phát triển sản phẩm. Blockchain đưa công việc này lên một cấp độ mới nhờ có khả năng tạo ra nguồn vốn mạo hiểm nhiều hơn cho các startup.

Năm 2016, đã có một minh chứng cho điều này. DAO (Decentralized Autonomous Organization), dựa trên Ethereum, đã gây vốn được 200 triệu USD chỉ trong vòng 2 tháng. Những người tham gia mua DAO được vote trên một hợp đồng thông minh về đầu tư mạo hiểm (quyền vote dựa trên số DAO họ đang nắm giữ). Số tiền mà dự án thu được đã chứng minh, dự án được đưa ra không cần thẩm định rủi ro. Như vậy, có thể thấy rằng, blockchain có tiềm năng để mở ra một mô hình mới cho hợp tác kinh tế.



Quản trị

Bằng cách tạo ra những kết quả minh bạch và có thể truy cập công khai, công nghệ cơ sở dữ liệu phân tán có thể mang lại sự minh bạch đầy đủ cho cuộc bầu cử hay bất cứ hình thức thăm dò nào khác. Những hợp đồng thông minh dựa trên Ethereum sẽ giúp tự động hóa toàn bộ quá trình.

Ứng dụng như Boardroom, cho phép tổ chức ra quyết định trên blockchain, nhờ đó giúp quá trình quản trị công ty trở nên minh bạch, kiểm chứng được tài sản số, sự công bằng hay những thông tin nội bộ.

Kiểm tra chuỗi cung ứng

Người tiêu dùng ngày càng muốn biết rằng có bao nhiêu phần trăm sự thật trong những tuyên bố về tiêu chuẩn sản phẩm của các công ty. Blockchain cung cấp cách thức xác nhận dễ dàng rằng những sản phẩm chúng ta mua là chính hãng. Tính minh bạch đi kèm với dấu thời gian dựa trên blockchain của ngày tháng, vị trí - ví dụ, trên viên kim cương, sẽ tương ứng với số sản phẩm.

Ở Anh có thể kiểm tra nguồn gốc xuất xứ của những mặt hàng tiêu dùng thông qua chuỗi cung ứng. Sử dụng blockchain Ethereum, dự án thí điểm kiểm tra chất lượng đảm bảo rằng cá được bán trong các nhà hàng Sushi của Nhật đã được các nhà cung cấp cá ở Indonesia khai thác đúng cách. 

Lưu trữ file

Việc lưu trữ phân quyền trên Internet mang lại những lợi ích rõ rệt. Phân phối dữ liệu trong toàn mạng giúp bảo về các file không bị tấn công hoặc bị mất.

Inter Planetary File System (IPFS) giúp dễ dàng khái niệm hóa cách thức một trang web phân tán có thể hoạt động. Tương tự như cách bittorrent di chuyển dữ liệu trên Internet, IPFS sẽ loại bỏ nhu cầu về các mối quan hệ giữa máy chủ, máy khách. Một mạng Internet được tạo thành từ những trang web phân tán hoàn toàn có khả năng tăng tốc độ truyền file và thời gian stream. Sự cải tiến này không chỉ thuận tiện mà còn là một nâng cấp cần thiết cho những hệ thống phân phối nội dung trên web hiện đang quá tải.

Dự đoán thị trường

Sự chính xác của một sự kiện sẽ cao hơn khi có càng nhiều dự đoán về xác suất của sự kiện đó, điều này đã được chứng minh. Những sai lệch chưa được khảo sát có thể dẫn đến những phán đoán sai lầm. Việc lấy ý kiến trung bình từ những dự đoán sẽ giúp triệt tiêu bớt những sai lệch đó. Đã có những ứng dụng đầu tiên áp dụng blockchain trong việc dự đoán thị trường. Ví dụ như Augur, ứng dụng dự đoán thị trường còn đang trong giai đoạn phát triển. Nó đưa ra lời đề nghị chia sẻ về kết quả của các sự kiện trong thế giới thực. Người tham gia có thể kiếm tiền bằng cách mua vào những dự đoán chính xác. Càng nhiều cổ phiếu được mua vào theo dự đoán đúng, số tiền nhận được càng cao. Với một khoản đầu tư nhỏ (ít hơn 1$), bất kỳ ai cũng có thể đặt câu hỏi, tạo một thị trường dựa trên kết quả dự đoán và thu được một nửa tổng số phí giao dịch mà thị trường tạo ra.

Bảo vệ quyền sở hữu trí tuệ

Như bạn đã biết, thông tin kỹ thuật số có thể bị sao chép vô hạn và phân phối rộng rãi nhờ Internet. Điều này đã giúp người dùng web trên toàn cầu có một mỏ vàng nội dung miễn phí. Tuy nhiên, chủ sở hữu bản quyền thì không may mắn như vậy, họ mất quyền kiểm soát sở hữu trí tuệ và số tiền lẽ ra phải thuộc về họ từ quyền đó. Hợp đồng thông minh có thể bảo vệ bản quyền và tự động hóa việc bán các tác phẩm trực tuyến, loại bỏ nguy cơ sao chép, phân phối lại.

Mycelia sử dụng blockchain để tạo một hệ thống phân phối nhạc ngang hàng. Được sáng lập bởi ca sĩ kiêm nhạc sĩ người Anh, Imogen Heap, Mycelia cho phép nhạc sĩ bán bài hát trực tiếp cho khán giả cũng như những mẫu giấy phép cho người sản xuất và chia lợi nhuận cho nhạc sĩ, ca sĩ, tất cả những chức năng này được thực hiện tự động hóa bằng những hợp đồng thông minh. 

Internet of Things (IoT)

Nếu chưa biết về Internet of Things, bạn đọc tại đây nhé (Internet of Things - IoT hay Mạng lưới vạn vật kết nối là gì?). Hiểu nôm na, IoT là việc quản lý mạng lưới kiểm soát của một số loại thiết bị điện tử, ví dụ như nhiệt độ không khí trong nhà kho. Hợp đồng thông minh có thể tự động hóa việc quản lý hệ thống này từ xa. Một sự kết hợp của phần mềm, cảm biến và mạng sẽ tạo điều kiện trao đổi dữ liệu giữa các đối tượng và cơ chế vận hành. Kết quả làm tăng hiệu quả làm việc của hệ thống và cắt giảm chi phí theo dõi.

Các nhà sản xuất lớn nhất trong lĩnh vực sản xuất, công nghệ và viễn thông đều đang tranh giành ngôi vị thống trị của IoT. Hãy nghĩ đến Samsung, IBM, AT&T. Việc mở rộng cơ sở hạ tầng hiện có được kiểm soát bởi con người bằng ứng dụng IoT sẽ thực hiện nhiệm vụ từ dự đoán các bộ phận cơ khí đến thống kê dữ liệu và quản lý hệ thống tự động trên quy mô lớn. 

Quản lý danh tính

Nhu cầu xác thực danh tính trên web ngày càng trở nên bức thiết, nhất là đối với những giao dịch tài chính trực tuyến. Những giải pháp hiện có để phục vụ nhu cầu này chưa thực sự hoàn hảo. Với blockchain, chúng ta sẽ có những phương pháp nâng cao để chứng minh mình là ai, cùng với khả năng số hóa tài liệu cá nhân. Như trên đã nói, trong nền kinh tế chia sẻ hay các giao dịch kinh doanh, một danh tính tốt là vô cùng quan trọng.

Phát triển các tiêu chuẩn nhận diện kỹ thuật số là một quá trình rất phức tạp. Bên cạnh các thách thức về kỹ thuật, một giải pháp nhận diện trực tuyến phổ quát đòi hỏi sự hợp tác giữa các cá nhân và chính phủ. Thêm vào đó là cần phải điều hướng hệ thống pháp luật ở các quốc gia khác nhau và vấn đề trở nên khó khăn theo cấp số nhân. Thương mại điện tử trên Internet hiện tại dựa trên chứng nhận SSL (khóa màu xanh lá cây nhỏ trên trình duyệt) cho những giao dịch bảo mật trên web. Nếu blockchain được áp dụng thì mọi việc sẽ trở nên dễ dàng hơn rất nhiều.

AML và KYC

Blockchain có tiềm năng mạnh mẽ trong vấn đề Anti-money laundering (AML) - chống rửa tiền và know your customer (KYC) - biết khách hàng của bạn. Hiện tại, các tổ chức tài chính phải thực hiện quy trình nhiều bước, đòi hỏi nhiều lao động để tìm kiếm khách hàng mới. Chi phí cho KYC có thể giảm xuống thông qua việc xác minh khách hàng đồng thời nâng cao hiệu quả giám sát và phân tích.

Polycoin, một startup có AML và KYC, liên quan đến việc phân tích các giao dịch. Những giao dịch được xác định là đáng ngờ được chuyển tiếp tới các bộ phận liên quan. Tradle, một startup khác đang phát triển ứng dụng có tên Trust in Motion (TiM). Được mô tả như "Instagram cho KYC", TiM cho phép khách hàng chụp ảnh nhanh các tài liệu chính (hộ chiếu, hóa đơn điện nước, v.v...). Sau khi được ngân hàng xác minh, dữ liệu này sẽ được lưu trữ như mật mã trên blockchain.

Giao dịch chứng khoán

Khả năng của blockchain trong thị trường chứng khoán đang được kiểm tra mạnh mẽ. Khi thực hiện ngang hàng, xác nhận giao dịch trở nên gần như tức thời. Nhờ vậy, những khâu trung gian như kiểm toán viên, người lưu ký,... có thể được loại bỏ.
Hệ thống lưới vi mô lân cận (Neighbourhood Microgrid)

Công nghệ blockchain cho phép mua và bán năng lượng tái tạo, được tạo ra bởi các lưới vi mô lân cận. Khi các tấm pin mặt trời làm cho năng lượng dư thừa, những hợp đồng thông minh dựa trên Ethereum sẽ tự động phân phối lại nó. 

Những bất lợi khi sử dụng Blockchain

Blockchain không phải là một phép màu hay toàn là những điều quyến rũ, nó cũng có những trở ngại nhất định mà trong tương lai gần chúng ta cần phải khắc phục. Những quảng cáo hoặc lời thổi phồng xung quanh blockchain có thể khiến nhiều người mù quáng, không nhận ra sự thật rất rõ ràng rằng, blockchain tồn tại những bất lợi khi sử dụng khiến các ngành công nghiệp phải tìm cách giảm thiểu nó trước khi có thể áp dụng trên quy mô lớn.

Rất tốn điện

Vì mỗi blockchain đã sao chép chính mình đến mọi nút trên blockchain nên đã tạo ra một số lượng lớn những sự dư thừa. Mỗi lần giao dịch Bitcoin được thực hiện, nó được xác nhận nhiều lần vì có nhiều nút trên mạng. Quy trình này sử dụng rất nhiều điện. Các blockchain tư nhân có thể không bị ảnh hưởng nhiều vì họ có thể giới hạn các blockchain đến một số ít máy tính. Tuy nhiên, nếu là ngân hàng, phải xử lý hàng nghìn giao dịch mỗi phút trên toàn cầu, thì đây sẽ là vấn đề lớn.

Tốn không gian lưu trữ

Ngay bây giờ, để vận hành một nút trên blockchain Bitcoin, bạn phải tải xuống 60GB dữ liệu. Sẽ như thế nào nếu dữ liệu là 1 Terabyte? Nếu thị trường Bitcoin phát triển mạnh, sẽ có nhiều blockchain với dung lượng hàng Terabyte xuất hiện trong thực tế. Khi đó, chỉ có các trang trại máy chủ và những người thực sự quan tâm đến việc thương mại hóa tiền kỹ thuật số quy mô lớn, mới có thể vận hành toàn bộ các nút. Điều này sẽ tạo ra một mạng lưới tập trung, vốn được coi là một sự phân quyền kỳ lạ.

Tính không thể bị phá vỡ cũng có nhược điểm của nó

Giả sử bạn có một chiếc ví trên mạng, bạn bị mất chìa khóa chứng thực để mở ví đó. Không có liên kết để reset mật khẩu, không có hotline hỗ trợ. Bạn mất toàn bộ số tiền trong ví. Không có sự thu hồi. Bạn mất trắng.

Nếu biết cách xử lý dữ liệu một cách có trách nhiệm, bạn sẽ không gặp phải điều giả sử ở trên. Tiền của bạn vẫn sẽ ở trong túi của bạn, và tất nhiên, bạn có toàn quyền kiểm soát nó. Nhưng quyền lực luôn đi đôi với trách nhiệm, điều mà không phải ai cũng hiểu được. Những người như thế chính là nguyên nhân khiến cho 1/4 số Bitcoin trên trái đất biến mất mãi mãi.

Nếu bạn đặt một thứ gì đó lên blockchain, bạn phải thật chắc chắn là mình sẽ không hối hận. Vì giao dịch một khi được thực hiện sẽ không thể đảo ngược, hay làm lại. Nó sẽ ở trên blockchain mãi mãi, theo đúng nghĩa đen luôn.

Blockchain và Internet

Ngày nay chúng ta có thể phân chia thời đại công nghệ hiện đại thành hai giai đoạn đặc biệt: Trước Internet và sau Internet, đây là cách mà World Wide Web bị phá vỡ. Sự bùng nổ Internet đã làm thay đổi cách chúng ta thực hiện những giao dịch, liên lạc, chia sẻ thông tin, quảng bá kinh doanh, giải trí, nghiên cứu,...

Bạn sẽ nghĩ rằng tất cả mọi thứ chúng ta đang làm bây giờ gần như là phải kết nối Internet. Vâng, nhiều chuyên gia thích suy nghĩ rằng công nghệ blockchain có tiềm năng để tạo ra một cuộc cách mạng giống như Internet đã từng.

Dưới đây là một số khía cạnh của blockchain mà rất giống với Internet vào những năm trước 2000:
Các chuyên gia đồng ý và hướng chúng ta chú ý đến blockchain, rằng nó có tiềm năng để thay đổi hầu hết mọi thứ.
Những công ty lớn đang đầu tư vào blockchain và thử nghiệm nó cho những trường hợp sử dụng khác nhau, với những phản hồi rất tích cực về khả năng sử dụng của nó.
Người ta đầu tư vào hầu hết các dự án liên quan đến blockchain. Ví dụ, Bioptix, một công ty niêm yết trên NASDAQ đã đổi tên thành Riot Blockchain và ngay lập tức giá cổ phiếu đã tăng lên 20%. Ở Anh, một công ty đầu tư đã đổi tên từ On-line Plc thành On-line Blockchain và giá cổ phiếu của nó đã có lúc nhảy lên đến 394%.
Không có cơ sở hạ tầng blockchain ở cấp độ toàn cầu hay quốc tế, nhưng sự thu hút và số lượng người lao vào thí điểm thì rất lớn.
Mọi người không thực sự hiểu nó là gì, nhưng họ chắc chắn nó có thể thay đổi cuộc sống của chúng ta.

Liệu lịch sử có lặp lại?


Một số chuyên gia đã đưa ra danh sách dài những điểm tương đồng giữa hai thời đại và hai hiện tượng, một số chuyên gia lại cảnh báo rằng blockchain có thể sẽ có kết cục giống như bong bóng dot com vào năm 1999, sau đó mới đạt đến thời điểm chín muồi khi nó được chấp nhận rộng rãi. Điều này có nghĩa rằng, blockchain tạo điều kiện cho những tài sản bị định giá quá cao, có thể gây ra sự điều chỉnh thị trường trong tương lai, làm ảnh hưởng đến nhiều công ty và toàn bộ ngành.

Chúng ta không biết trước tương lai sẽ như thế nào, nhưng bất chấp sự thay đổi, khủng hoảng từ năm 1999, Internet đã không biến mất, nó vẫn tiếp tục con đường của mình bằng cách định hình toàn bộ ngành công nghiệp. Điều tương tự rất có thể cũng sẽ xảy ra với công nghệ blockchain.

Blockchain thực sự có thể biến đổi thị trường, vì chúng ta có thể kiểm soát được mọi giao dịch, hợp đồng hoặc bất kỳ sự di chuyển nào trong mạng. Chúng ta có thể làm cho các giao dịch và quy trình P2P trở nên minh bạch, được bảo mật với sự trợ giúp của mật mã, có dấu thời gian và dễ theo dõi. Điều này khác với Internet ngày nay, nơi các trung gian đóng vai trò quan trọng. Các công ty như Facebook, Google, chính phủ, ngân hàng, công ty công nghệ cao đều là những trung gian ảnh hưởng đến thông tin và quy trình trong mạng Internet. Blockchain loại bỏ những trung gian như vậy vì lợi ích của tất cả mọi người.



***

Thực trạng tại Viêt Nam


Ở Việt Nam cũng đang có những bước tiếp cận đầu tiên đối với công nghệ blockchain. Trao đổi với ICTnews xung quanh câu chuyên xây dựng Chính phủ điện tử, chính quyền điện tử tại Việt Nam hồi tháng 12/2017 vừa qua, ông Nguyễn Thế Trung, Tổng giám đốc Công ty DTT cho biết DTT đang ứng dụng các công nghệ như big data hay blockchain từ đó hiểu và bám sát tiến trình phát triển năng lực điều hành chính quyền tại các địa phương, các ngành.

Blockchain được DTT ứng dụng để chứng thực các giao dịch của chính quyền, đặc biệt trong lĩnh vực y tế, hồ sơ điện tử. "Tầm nhìn của chúng tôi là công dân không phải nộp lại hồ sơ đã nộp một lần trên toàn lãnh thổ Việt Nam. Và ứng dụng blockchain vô cùng thích hợp để hiện thực hóa tầm nhìn này" - ông Nguyễn Thế Trung chia sẻ.

Một trường hợp khác là ngày 12/1/2018 mới đây, Tập đoàn CNTT HI-TEK Hoa Kỳ tổ chức khai trương hệ thống website du lịch One-Stop-Shopping trên toàn cầu thông qua các cổng travel.vn, hotels.vn, vietnamesevisa.com và website dành cho hội viên tại prebook.com. Ở đó HI-TEK đã áp dụng các công nghệ blockchain để xây dựng thành công công cụ đặt phòng, vé máy bay trực tuyến có khả năng kết nối với hơn 800.000 khách sạn, cung cấp 150.000 chuyến bay trên toàn thế giới và công cụ xin visa trực tuyến vào Việt nam với mức giá ưu đãi nhất tại thời điểm thực tại các hệ thống website công khai www.travel.vn và www.hotels.vn.

Trước đó blockchain cũng là một trong các công nghệ mà FPT và Viện Nghiên cứu Daiwa (Daiwa Institute of Research - DIR, thành viên của Daiwa Security, Công ty Chứng khoán lớn thứ hai Nhật Bản ký kết thỏa thuận hợp tác chiến lược trong việc nghiên cứu, phát triển các giải pháp công nghệ mới. Theo đó, dựa trên thế mạnh riêng, hai bên sẽ cùng hợp tác nghiên cứu, phát triển và cung cấp các giải pháp, dịch vụ có giá trị gia tăng cao dựa trên 4 công nghệ gồm trí tuệ nhân tạo (AI), tự động hóa quy trình dựa trên trí tuệ nhân tạo (RPA), nhận diện hình ảnh và dữ liệu theo thời gian thực, và blockchain.

Tất nhiên một số hạn chế của blockchain cũng được điểm qua trong Hội thảo "Tiềm năng ứng dụng của Blockchain" trong khuôn khổ Ngày hội Khởi nghiệp đổi mới sáng tạo Việt Nam 2017 (TechFest 2017) ngày 15/11/2017. Anh Kendrick Nguyễn, Đồng sáng lập Republic nhận định dù tính bảo mật được đề cao nhưng blockchain vẫn có khả năng mắc lỗi nếu hơn một nửa số máy tính đầu mối (các nút) phục vụ mạng lưới "nói dối".

Hay như ông Long Vương, CEO Tomocoin.io bổ sung thêm thì hạn chế của blockchain còn là về tốc độ. Như với giao dịch của bitcoin hiện tại, chỉ có thể tiến hành đồng thời 7 giao dịch mỗi giây, giá mỗi giao dịch là khoảng 0,2 USD, một giao dịch chỉ chứa được 80 byte dữ liệu...

Dù vậy blockchain vẫn đang được đánh giá là có những đặc tính để trở thành nền tảng công nghệ tương lai của Internet.

Tham khảo: quantrimang, wikimedia


#



Tailieucntt.org đồng hành cùng bạn

[Đồ họa trong C\C++] Sử dụng các hàm đồ họa thông dụng trong C\C++ [C\C++]

Đồ hoạ trong C\C++

Tất cả các hàm dùng trong chế độ đồ họa của C\C++ đều được khai trong thư viện <graphics.h>
Chế độ màn hình văn bản (console) đen trắng hay có màu thông thường thì đều được biểu diễn 25 dòng 80 cột.


Chế độ đồ hoạ màn hình được chia thành các điểm ảnh (pixel), bằng cách in từng điểm ảnh ta có thể vẽ hình bất kỳ. Màn hình VGA thông thường ở độ phân giải cao có 480 hàng và 640 cột điểm ảnh. Góc trên bên trái màn hình có toạ độ là (x,y)=(0,0), góc dưới bên phải màn hình có toạ độ là (x,y)=(639,479), trục x hướng sang phải, trục y hướng xuống dưới.


Để chạy đồ hoạ ta cần có tệp Egavga.bgi (tệp điều kiển màn hình VGA), các tệp Goth.chr, litt.chr , sans.chr , trip.chr (chứa các font chữ).
Trong màn hình hiển đồ luôn có một con trỏ vẽ, đó là nơi điểm ảnh được in ra nếu dùng lệnh putpixel, con trỏ vẽ không hiện lên màn hình như trong chế độ văn bản.

Thông thường chúng ta sử dụng đồ hoạ ở chế độ 16 màu.

Các bước thực hiện:
1. Khởi động chế độ đồ hoạ.

* Khởi động chế độ đồ hoạ ta cần một số hàm sau :

- Hàm void initgraph(int *graphdriver, int *graphmode, char *s) dùng để khởi động chế độ đồ hoạ, trong đó s là đường dẫn tới tệp egavga.bgi, nếu s=””(rỗng) thì máy tự tìm tệp egavga.bgi trên thư mục chủ. 
Giá trị của graphdriver và graphmode được xác định trong bảng sau:
  + Nếu graphdriver=VGA (hay 9) thì giá trị của graphmode có thể là VGALO (hay 0) ứng với độ phân giải màn hình 640 x200 điểm ảnh, graphdriver=VGAHI (hay 2) ứng với độ phân giải 640 x 480 điểm ảnh.
  + Nếu graphdriver=DETECT (hay 0) thì trương trình tự tìm kiểu màn hình đang dùng và gán cho graphdriver, tự động xác định chế độ đồ hoạ có độ phân giải cao nhất gán cho graphmode.

- Hàm int graphresult(void) cho mã lỗi khi khởi động đồ hoạ hay dùng các hàm đồ hoạ. hàm cho giá trị bằng 0 tức là không có lỗi, cho giá trị khác không (mã lỗi) thì có lỗi.

- Hàm char *grapherrormsg(int k) cho lời giải thích bằng tiếng anh của lỗi đồ hoạ, có mã lỗi là k.

- Hàm void closegraph(void) dùng để đóng chế độ đồ hoạ.

* Cấu trúc chung của một chương trình đồ hoạ:
- Khởi động hệ thống đồ hoạ.
- Xác định màu nền (màu màn hình), màu nét vẽ, màu tô và kiểu tô (mẫu tô).
- Vẽ,tô màu các hình mà ta mong muốn.
- Các thao tác đồ hoạ khác như cho hiện chữ....
- Đóng hệ thống đồ hoạ trở về mode văn bản.

Vi dụ: Khởi động đồ hoạ nếu thành công thì vẽ một hình chữ nhật , ngược lại thông báo mã lỗi và tên lỗi bằng tiếng anh.

[Code Turbo C\C++]
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{
   int gd=0,gm=0, maloi; // gd : graphdriver, gm: graphmode,
   initgraph(&gd,&gm,"C:/TC/BGI"); // khoi dong do hoa
if ( (maloi=graphresult()) != 0)
{
  printf("khong the khoi dong do hoa \n");
  printf("ma loi : %d \n",maloi);
  printf("nguyen nhan loi : %s",grapherrormsg(maloi));
  printf("\n an phim bat ky de thoat");
  getch();
  exit(1);
}
bar(1,1,100,100);
getch();
closegraph();
}

* Để thuận tiện cho việc lập trình đồ hoạ C\C++ cung cấp một số hàm thường dùng trong đồ hoạ như sau:

- Hàm int getmaxx(void) : cho toạ độ màn hình x lớn nhất của kiểu màn hình đang dùng.
- Hàm int getmaxy(void) : cho toạ độ màn hình y lớn nhất của kiểu màn hình đang dùng.
- Hàm int getmaxcolor(void): cho giá trị màu lớn nhất đang dùng.
- Hàm void setbkcolor(int color) : đặt màu nền, màu nền ngầm định ngay sau khi khởi động đồ hoạ sẽ là màu đen BLACK (0).
- Hàm int getbkcolor(void) : lấy màu nền hiện tại.
- Hàm void setcolor(int color ) : đặt màu nét vẽ. Màu ngầm định ngay khi khởi động là WHITE (15).
- Hàm int getcolor(void) : lấy màu vẽ hiện tại.
- Hàm void cleardevice(void) : xoá toàn bộ màn hình đồ hoạ (chức năng tương tự clrscr() trong chế độ mode văn bản).
- Hàm void restorecrtmode (void) : khôi phục lại chế độ màn hình như trước khi khởi động đồ hoạ.
- Hàm int getgraphmode(void) : lấy kiểu màn hình đồ hoạ hiện tại.
- Hàm void setgraphmode(int mode) : lựa chọn kiểu đồ hoạ khác với kiểu ngầm định đặt bởi initgraph, xoá màn hình.
- Hàm moveto(int x,int y) : di chuyển con trỏ vẽ tới toạ độ (x,y) trên màn hình.
- Hàm int getx(void) : cho toạ độ x của con trỏ vẽ hiện tại.
- Hàm int gety(void) : cho toạ độ y của con trỏ vẽ hiện tại.

Ví dụ: Đặt màu nền, màu vẽ, rồi lưu lại giá trị của màu nền, màu vẽ, lấy toạ độ max của kiểu màn hình đang dùng sau đó đóng đồ hoạ và in giá trị này.

[Code Turbo C\C++]
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{
  int driver=0, mode = 0, maloi; /* driver để chế độ DETECT tự phát hiện kiểu màn hình đang dùng. */
 initgraph(&driver,&mode,"C:/TC/BGI"); /* khởi động đồ hoạ với tệp egavga.bgi ở thư mục            c:\tc\bgi. Nếu đặt là “” (xâu rỗng) thì tự tìm tệp này ở thư mục chứa tệp .c hay .cpp của chương trình */
if ( (maloi=graphresult()) !=0 ) // nếu không khởi động được đồ hoạ thì báo lỗi
{
   printf("khong the khoi dong do hoa \n");
   printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
   getch();
   exit(1);
}
setbkcolor(WHITE); // đặt màu nền là màu trắng ,có thể là setbkcolor(15)
setcolor(RED); // đặt màu vẽ là màu đỏ, có thể đặt setcolor (4);
line(10,10,100,100); // vẽ một đường thẳng
getch(); // tạm dừng màn hình đợi ấn phím bất kỳ
int bk=getbkcolor() , cl=getcolor(); // lưu giá trị màu nền và màu vẽ
int x=getmaxx(), y=getmaxy(); // lưu toạ độ lớn nhất của kiểu màn hình đang sử dụng
closegraph();
printf("getbkcolor = %d getcolor= %d",bk,cl);
printf("\ngetmaxx = %d getmaxy= %d",x,y);
getch();
}

2. Các hàm dùng vẽ điểm, đường và miền.
- Hàm void putpixel(int x, int y, int color) : tô điểm có toạ độ(x,y) trên màn hình theo màu color.
- Hàm int getpixel(int x, int y) : trả về màu của điểm ảnh tại vị trí có toạ độ (x,y).

Ví dụ: Vẽ bầu trời sao, dừng màn hình lấy giá trị màu tại điểm ảnh có toạ độ (100,100)

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{
  int driver=0, mode = 0, maloi;
  initgraph(&driver,&mode,"C:/TC/BGI");
  if ( (maloi=graphresult()) !=0 )
  {
     printf("khong the khoi dong do hoa \n");
     printf("ma loi : &d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
     getch();
     exit(1);
  }
  randomize(); // khởi tạo hàm radom (cho số ngẫu nhiên)
  int i=0;
  while (i<200)
  {
    putpixel(random(639), random(476), WHITE); /* random(639) tức là cho số ngẫu nhiên trong khoảng 0->639, vẽ một điểm có toạ độ x,y cho ngẫu nhiên với màu trắng */
    i++;
  }
  getch();
  int mau=getpixel(100,100); /* lấy màu của điểm ảnh trên màn hình tại vị trí có toạ độ (100,100) */
  closegraph();
  printf(“mau cua diem anh tai vi tri co toa do (100,100) la : %d”,mau);
  getch();
}

- Hàm void line(int x1,int y1,int x2,int y2) : vẽ đường thằng nối 2 điểm có toạ độ (x1,y1) và (x2,y2), sau khi vẽ xong con trỏ vẽ quay về vị trí cũ (không thay đổi vị trí)

- Hàm void lineto(int x,int y) : vẽ đường thẳng từ vị trí con trỏ vẽ hiện tại đến điểm có toạ độ (x,y),vẽ xong con trỏ tới điểm có toạ độ (x,y).

- Hàm void linerel(int dx, int dy) : vẽ đường thẳng từ vị trí con trỏ vẽ hiện tại (giả sử con trỏ vẽ hiện tại có toạ độ (x,y) ) đến điểm có toạ độ (x+dx , y+dy), vẽ xong con trỏ tới điểm mới.

- Hàm void setlinestyle(int kiểu, int mẫu, int độ_lớn) : quy định dạng, mẫu và độ lớn của nét vẽ
 + Kiểu có giá trị từ 0 đến 4 :
 + Độ_lớn xác định độ lớn của đường vẽ nó có hai giá trị : NORM_WIDTH (1) nét bình thường, THICK_WIDTH (2) nét vẽ to.
 + Mẫu sử dụng khi kiểu = 4 để tạo mẫu của đường vẽ theo ý người lập trình. 

Ví dụ: int mau=0x1111 ; setlinestyle(4,mau,1); line(1,0,100,100); giá trị của mau ở hệ 16 là 0x1111, hay trong hệ nhị phân là 0001 0001 0001 0001 (ứng với các bit 0 thì điểm ảnh không sáng, ứng với các bit 1 thì điểm ảnh sáng).

Với mẫu ở trên ta được một đường thằng gồm các chấm cách nhau liên tiếp 3px.
Nếu kiểu <4 thì mẫu phải bằng 0
Ví dụ: Mô phỏng vẽ đường thằng với mẫu tự tạo như ở trên, và mẫu mặc định.
[Code Turbo C\C++]

#include <conio.h>
#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{
   int kieu=4, mau=0x1111, do_lon=1;
   int gd=0,gm=0,maloi;
   initgraph(&gd,&gm,"C:/TC/BGI");
   if ( (maloi=graphresult() ) != 0)
  {
     printf("ma loi : %d \nnguyen nhan loi : %s",maloi,grapherrormsg(maloi));
     getch();
     exit(1);
   }
   setlinestyle(3,0,1); // vẽ với mẫu có sẵn
   lineto(100,100);
   setlinestyle(kieu,mau,do_lon); // vẽ với mẫu tự tạo
   line(0,110, 200,200);
   setlinestyle(0,0,1); // vẽ đường thẳng với mẫu có sẵn
   linerel(300,200);
   getch();
   closegraph();
}

Một số hàm sau đây dùng để vẽ một số hình học quen thuộc với góc vẽ được xác định bởi gd và gc tức góc đầu đến góc cuối. Được quay theo chiều ngược chiều kim đồng hồ

- Hàm void arc(int x, int y, int gd, int gc, int r) : vẽ một cung tròn với tâm có toạ độ (x,y) , bán kính r, từ góc đầu tiên là gr đến góc cuối là gc (góc tính bằng độ). Màu của nét vẽ do hàm setcolor() đặt;

- Hàm void circle(int x, int y, int r) : vẽ đường tròn với tâm có toạ độ (x,y), bán kính r.

- Hàm ellipse(int x, int y, int gd, int gc, int rx, int ry) : vẽ một cũng ellipse với tâm là (x,y) từ góc đầu gd đến góc cuối gc, bán kính trục x là rx, bán kính trục y là ry.

- Hàm void rectangle(int x1, int y1, int x2, int y2) : vẽ một đường chữ nhật có đỉnh trên bên trái là (x1,y1) đỉnh dưới bên phải là (x2,y2).

- Hàm void setfillstyle(int mẫu, int màu) : đặt mẫu tô và màu tô cho các hình đặc và miền đóng.  +Màu có giá trị từ 0 đến 15 (xem lại ở bảng màu). 
 + Mẫu có giá trị từ 0 đến 12 được cho ở bảng dưới. Với mẫu có giá trị 12 thì tự thiết kế mẫu tô theo 8byte

- Hàm void pieslice(int x, int y, int gd, int gc, int r) : vẽ và tô màu một hình quạt có tâm là (x,y), bá kính r, từ góc đầu gd đến góc cuối gc.

- Hàm void sector(int x, int y, int gd, int gc, int rx, int ry) : vẽ và tô màu một mảnh ellipse có tâm là (x,y), từ góc đầu đến gd, đến góc cuối gc, có bán kính trục x là rx, bán kính trục y là ry.

- Hàm fillellipse(int x, int y, int rx, int ry) : hàm vẽ và tô màu một elip có tâm (x,y) và bán kính hai trục là rx, ry.

- Hàm void bar(int x1, int y1, int x2, int y2) vẽ và tô màu một hình chữ nhật.

- Hàm void bar3d(int x1, int y1, int x2, int y2, int depth, int top) : vẽ một khối hộp chữ nhật, màu vẽ xác định bởi hàm setcolor. Mặt trước có toạ độ góc trên trái là (x1,y1) góc dưới phải là (x2,y2), được tô màu bởi hàm setfillstyle. Chiều sâu của khối hộp là depth điểm. Nếu top =0 (TOPOFF) thì hộp không có lắp.

Ví dụ: minh hoạ sử dụng các hàm trên.

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{
  int driver=0, mode = 0, maloi;
  initgraph(&driver,&mode,"C:/TC/BGI");
  if ( (maloi=graphresult()) !=0 )
  {
    printf("khong the khoi dong do hoa \n");
    printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
    getch();
    exit(1);
}
setcolor(WHITE); // đặt màu cho nét vẽ là màu trắng
arc(320,240,45,135,100); //vẽ một cung tròn với góc từ 450 đến 1350
getch(); // tạm dừng màn hình
cleardevice(); // xoá màn hình đồ hoạ
ellipse(320,240,0,360,150,110); /* vẽ một cung elip với góc vẽ từ 00 đến 3600 (vẽ một elip) */
getch();
cleardevice();
circle(320,240,160); // vẽ đường tròn
getch();
cleardevice();
rectangle(140,60,500,420); // vẽ đường chữ nhật
getch();
cleardevice();
setfillstyle(1,YELLOW); // đặt mẫu tô và màu tô cho những hàm có phần tô miền
pieslice(320,240,45,300,200); /*vẽ và tô màu một hình quạt với màu và mẫu tô được xác định bởi setfillstyle */
getch();
cleardevice();
for (int i=0; i<12; i++) // tô miền đóng với 12 mẫu tô khác nhau
{
   setfillstyle(i,getmaxcolor()); // kiểu tô dược thay lần lượt giá trị từ 0 -> 11
   sector(320,240,45,250,300,200); // vẽ và tô màu một mảnh elip
   getch();
}
cleardevice();
setfillstyle(1,LIGHTMAGENTA);
bar(20,260,300,460); // vẽ và tô màu một hình chữ nhật
bar3d(340,120,520,360,50,1); vẽ và tô màu một hình hộp
getch();
closegraph();
}

- Hàm void drawpoly(int n, int a[]) : vẽ đường gấp khúc qua n điểm
(x1, y1), (x2,y2), ... , (xn,yn). Trong đó a={x1,y1,x2,y2,....xn,yn}. Nếu điểm cuối cùng trùng với điểm đầu ta được đường gấp khúc khép kín.

- Hàm void fillpoly(int n, int a[]) vẽ và tô màu một đa giác có n đỉnh
(x1,y1), ( x2,y2) , ... , (xn,yn). Trong đó a={x1,y1,x2,y2,....xn,yn}.

- Hàm floodfill(int x, int y, int màu_biên) : tô màu một miền kín trên màn hình được bao quanh bởi một đường có màu là màu_biên, (x,y) là một điểm tuỳ ý ở bên trong miền kín. Màu tô và mẫu tô xác định bởi hàm setfillstyle. Nếu (x,y) nằm ngoài miền kín thì vùng ngoài miền kín được tô. Nếu trên màn hình không có miền kín như đã chỉ thì cả màn hình được tô màu.

Ví dụ: vẽ đường gấp khúc , đường gấp khúc khép kín và sử dụng floodfill để tô kín miền kín vừa vẽ, sử dụng fillpoly để vẽ và tô đa giác với 12 mẫu tô khác nhau.

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{
  int driver=0, mode = 0, maloi;
  initgraph(&driver,&mode,"C:/TC/BGI");
  if ( (maloi=graphresult()) !=0 )
 {
   printf("khong the khoi dong do hoa \n");
   printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
   getch();
   exit(1);
}
int p1[10]={20,240,620,20,490,460,320,440,70,240};
int p2[8]={20,240,620,20,590,460,320,240};
int p3[10]={20,240,620,20,490,460,320,440,20,240};
setcolor(5); // đặt màu vẽ là 5
drawpoly(5,p1); // vẽ một đường gấp khúc
getch();
cleardevice();
setfillstyle(1,BLUE); // đặt kiểu tô và màu tô
drawpoly(5,p3); // vẽ đường gấp khúc kín
floodfill(22,240,5); // tô kín đường gấp khúc kín vẽ ở trên
getch();
cleardevice();
setcolor(LIGHTCYAN); // đặt lại màu vẽ mới

for(int i=0; i< 12; i++)
{ setfillstyle(i, 3); //đặt lần lượt 12 kiểu tô khác nhau
   fillpoly(4,p2); /*vẽ và tô kín đa giác với kiểu tô và màu tô được xác định bởi setfillstyle */
   getch();
}
closegraph();
}

3. Cửa sổ trong chế độ đồ hoạ.

Thông thường khi khởi động chế độ đồ hoạ với màn hình VGA ta được độ phân giải 640x480, đó gọi là cửa sổ đồ hoạ gốc được tạo đầu tiên. C\C++ cung cấp thêm một số hàm để tạo thêm các cửa số con khác nằm trong cửa số chính này và cửa số con được ưu tiên hơn cửa sổ chính.


Cửa sổ chính 1, còn các cửa sổ con nằm ở trong 

Để xác định một cửa sổ ta sử dụng 2 hàm sau:
- Hàm void setviewport(int x1, int y1, int x2, int y2, int clip) : tạo một cửa sổ có góc trên bên trái(x1,y1), góc dưới bên phải là (x2,y2). Nếu clip =1 thì không cho phép vẽ ra ngoài cửa sổ. Nếu clip =0 thì cho phép vẽ ra ngoài cửa sổ (ta thường dùng để lập hệ toạ độ âm dương của toán học trên màn hình). Sau khi vẽ cửa số con trỏ ở toạ độ (0,0) của cửa số hiện hành. Sau khi khởi động đồ hoạ cửa sổ ngầm định là (0,0,639,479,clip).

- Hàm void clearviewport(void) : xoá tất cả những gì có trong cửa sổ.


#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{ int driver=0, mode = 0, maloi;
initgraph(&driver,&mode,"C:/TC/BGI");
if ( (maloi=graphresult()) !=0 )
{
printf("khong the khoi dong do hoa \n");
printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
getch();
exit(1);
}
setbkcolor(WHITE); // đặt màu nền cho cửa sổ mặc định
setviewport(50,50,200,200,1); // tạo một cửa sổ mới
setfillstyle(1,BLUE); // đặt kiểu và màu tô
floodfill(51,51,WHITE); // tô kín cửa sổ mới
setcolor(RED); // đặt màu vẽ mới
line(100,100,350,100); // vẽ đường nằm ngang trên cửa sổ mới
getch();
clearviewport(); // xoá toàn bộ những gì có trong cửa sổ hiện hành
line(100,100,350,300); // vẽ một đường thẳng khác trên cửa sổ hiện hành
getch();
closegraph();
}


Yêu cầu thay đổi thông số clip từ 1 sang 0 để thấy rõ việc tạo cửa sổ mới và khi vẽ trên cửa sổ.

- Hàm void getviewsettings( struct viewporttype *p) : lấy thông tin về cửa sổ hiện hành, kiểu viewporttype được định nghĩa trong thư viện graphics như sau:

Struct viewporttype {
   Int left; int top; int right; int bottom; int clip;
} ;

Ví dụ: lấy và in thông tin về cửa sổ hiện tại


#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{ int driver=0, mode = 0, maloi;
initgraph(&driver,&mode,"C:/TC/BGI");
if ( (maloi=graphresult()) !=0 )
{
printf("khong the khoi dong do hoa \n");
printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
getch();
exit(1);
}
struct viewporttype p1,p2;
getviewsettings(&p1); // lấy thông tin về cửa sổ mặc định khi khởi động đồ hoạ
setviewport(10,10,300,200,0); // tạo mới một cửa sổ
getviewsettings(&p2); // lấy thông tin của cửa sổ vừa tạo mới
closegraph();
printf("thong tin cua man hinh khi bat dau khoi dong do hoa\n");
printf("(%d,%d) la goc tren ben trai cua so \n",p1.left,p1.top);
printf("(%d,%d) la goc duoi ben phai cua so\n",p1.right,p1.bottom);
printf("thong so clip la %d",p1.clip);
printf("\n\n thong tin cua so moi duoc tao ra \n");
printf("(%d,%d) la goc tren ben trai cua so \n",p2.left,p2.top);
printf("(%d,%d) la goc duoi ben phai cua so\n",p2.right,p2.bottom);
printf("thong so clip la %d",p2.clip);
getch();
}

4. Viết chữ trong đồ hoạ.
Để viết chữ trong chế độ đồ hoạ thì trước tiên ta phải chọn font chữ, cỡ chữ, hướng in, căn chỉnh chiều dọc hay ngang đối với điểm in.

- Hàm void settextstyle(int phông, int hướng, int cỡ) : hàm thiết đặt font chữ, hướng in, cỡ chữ.
 + Tham số phông quy định font chữ, các giá trị sau:
 + Tham số hướng quy định hướng in, nhận các giá trị
HORIZ_DIR (0) : in ngang (giá trị ngầm định).
VERT_DIR (1) : in dọc.
 + Tham số cỡ quy định cỡ chữ, có giá trị từ 1 đến 10 (to nhất).

- Hàm void settextjustify(int ngang, int dọc) : quy định nơi hiển thị văn bản của outtextxy theo quan hệ với toạ độ (x,y), của outtext theo quan hệ với vị trí hiện tại của con trỏ (giả sử (x,y)).
 + Tham số ngang có giá trị
 + Tham số dọc có các giá trị
 Hàm outtextxy(int x, int y, char *s) : in xâu s theo vị trí (x,y).

Ví dụ: settextstyle(0,0,3) ; settextjustify(1,1) ; outtext (230,230, “Bac Ninh Que Toi”);

- Hàm void outtext(char *s) : in xâu s theo vị trí hiện tại của con trỏ vẽ.
- Hàm int texthight(char *s) : trả về chiều cao theo pixel của xâu s.
- Hàm int textwidth(char *s) : trả về bề rộng của xâu s.
- Hàm sprintf(char *s, char *xâu_điều_khiển, danh_sách_các_biến); làm việc giống hàm printf nhưng không in ra màn hình mà cho kết quả vào xâu s. Hàm này được khai trong thư viện stdio.h
Ví dụ int n=5; char s[200];
Sprintf(s,“bien n co gia tri la %d”,n);
Sau khi thực hiện lệnh trên xâu s được kết quả là “bien n co gia tri la 5”

Ví dụ minh hoạ in chữ ra màn hình

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{ int driver=0, mode = 0, maloi;
initgraph(&driver,&mode,"C:/TC/BGI");
if ( (maloi=graphresult()) !=0 )
{
printf("khong the khoi dong do hoa \n");
printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
getch();
exit(1);
}
setcolor(GREEN);
for (int i=0; i<=4; i++ )
{settextstyle(i,0,1); // đặt font chữ thay đổi từ 0 đến 4, hướng in là ngang cỡ 1
outtextxy(100,230,"Nguyen Ba Cuong - Cong Nghe Phan Mem"); /* in xâu tại vị trí bắt đầu là (100,230) */
getch();
cleardevice();
}
settextstyle(3,1,1); // thay đổi font và hướng in (hướng dọc)
outtext("Nguyen Ba Cuong - Cong Nghe Phan Mem"); // in tại vị trí con trỏ vẽ hiện hành
getch();
closegraph();
}

5. Tạo hình ảnh chuyển động.

- Hàm unsigned imagesize(int x1,int y1, int x2, int y2) cho số byte cần thiết để lưu ảnh trong phạm vi hình chữ nhật (x1,y1,x2,y2).

- Hàm void getimage(int x1, int y1, int x2, int y2, void *p): chép các điểm ảnh trong vùng chữ nhật (x1,y1,x2,y2) vào vùng nhớ do con trỏ p trỏ tới (vùng nhớ này và con trỏ p cho bởi hàm malloc, độ lớn vùng nhớ cho bởi hàm imagesize).

- Hàm void putimage(int x, int y, void *p, int kiểu_chép): chép ảnh tử vùng nhớ do con trỏ p trỏ tới ra màn hình sao cho góc trên trái vùng ảnh có toạ độ (x,y). Giá trị của kiểu chép được cho trong bảng sau :

a. Tạo ảnh chuyển động không có màn hình nền

B1- Tạo ảnh bằng màu vẽ.
B2- xoá ảnh bằng màu nền.
B3- tạo lại ảnh bằng màu vẽ tại vị trí mới.

Ví dụ : cho quả bóng chuyển động ngang trên màn hình, hết chiều ngang màn hình bóng quay lại.


#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
void bong(int x, int y, int r, int mau)
{ setcolor(mau);
setfillstyle(1,mau);
pieslice(x,y,0,360,r);
}
void main()
{ int driver=0, mode = 0, maloi;
initgraph(&driver,&mode,"C:/TC/BGI");
if ( (maloi=graphresult()) !=0 )
{
printf("khong the khoi dong do hoa \n");
printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
getch();
exit(1);
}
setbkcolor(CYAN);
int x=30,y=100;
do
{
if (x>=640-30) x=50;
bong(x,y,30,CYAN);
x+=4;
bong(x,y,30,RED);
delay(200); // tạm dừng 200 mili giây (hàm này trong thư viện dos.h)
}while (!kbhit()); // lặp vô hạn tới khi ấn một phím bất kỳ thì dừng
getch();
closegraph();
}

b. Tạo ảnh chuyển động mà không xoá màn hình nền.

Vẽ ảnh trong vùng chữ nhật (x1,y1,x2,y2), dùng hàm imagesize tính số byte càn thiết để lưu ảnh trong vùng chữ nhật vừa vẽ (giả sử là n byte), dùng hàm malloc để cấp phát vùng nhớ n byte và cho con trỏ p trỏ và vùng nhớ này, dùng hàm getimage chép ảnh từ vùng chữ nhật vào vùng nhớ p, xoá màn hình, tạo màn hình nền, dùng lệnh putimage với kiểu chép XOR_PUT để in ảnh lưu trong P ra màn hình với toạ đọ góc trên bên trái là(x,y),tạm dừng chương trình một lát, dùng putimage với kiểu chép XOR_PUT in lại ảnh lưu trong P ra màn hình cũng tại (x,y) để xoá ảnh cũ (vì 1 xor 1 cho 0), thay đổi các thành phần của toạ độ (x,y) in ảnh tai toạ độ mới...

Ví dụ: Vẽ quả bóng màu đỏ và nhớ vào vùng nhớ p, xoá màn hình, vẽ bầu trời sao, cho quả bóng chuyển động ngẫu nhiên trên màn hình đến khi ấn một phím bất kỳ.

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
void bong(int x, int y, int r, int mau)
{
  setcolor(mau);
  setfillstyle(1,mau);
  pieslice(x,y,0,360,r);
}
void main()
{
int driver=0, mode = 0, maloi;
initgraph(&driver,&mode,"C:/TC/BGI");
if ( (maloi=graphresult()) !=0 )
{
  printf("khong the khoi dong do hoa \n");
  printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
  getch();
  exit(1);
}
setcolor(RED);
setfillstyle(1,RED);
pieslice(50,50,0,360,50);
char *p;
int n= imagesize(0,0,100,100);
p=(char *)malloc(n);
getimage(0,0,100,100,p);
getch();
cleardevice();
randomize();
for (int i=0;i<=300; i++)
{
  int k=random(16);
  setcolor(k);
  setfillstyle(1,k);
  pieslice(random(640), random(480), 0,360,2);
}
int x=random(640-100), y=random(480-100),x1,y1;
do{
  putimage(x,y,p,1); /* in bóng màu đỏ với phép XOR (vẽ bóng trên màn hình chỗ nào đã có màu lần trước thì màu đó được in đè lên bóng do ta sử dụng xor); */
  delay(100); // tạm dừng
  putimage(x,y,p,1); /* in với phép XOR một lần nữa (xoá bóng vừa in trên màn hình do bóng lần trước in là màu đỏ lại in lại màu đỏ nhưng theo phép xor thì 1 XOR 1 =0 tức là 2 màu đỏ đè lên nhau sẽ ra màu nền cũ trước đó) */
  do{ /* mục đích của vòng do while này nhằm không cho quả bóng hiển thị ngoài vùng màn hình (0,0,540,340) và tạo giá trị toạ độ ngẫu nhiên mới cho bóng */
  x1 =x+random(50) -25;
  y1 =y+random(50) -25;
 } while ( (x1<0) || ( x1> (639-100) ) || (y1<0) || (y1>(439-100) ) ) ;

x=x1;
y=y1;
}while(!kbhit()) ;
getch();
closegraph();
}
Tham khảo vietsource.net

----------



Cùng bạn tự học CNTT - tailieucntt.org

[Tự học lập trình C/C++] Bài 3: Nhập / Xuất trong C/C++

---------------------------------
* TÓM TẮT LÝ THUYẾT
---------------------------------

  1. In dữ liệu ra màn hình: 
 
  cout<<data1<<data1<<...;
 
     Trong đó:     
      - data là biến, biểu thức, xâu ký tự,...     
      - Mỗi khối dữ liệu cách nhau bởi <<
       
  2. Nhập dữ liệu vào từ bàn phím: 

  cin>>var1>>var2>>...;
 
  Trong đó:  
  - var là các biến cần nhập từ bàn phím.  
  - Mỗi biến cách nhau bởi >>
      
---------------------------------
** VÍ DỤ
---------------------------------

Ví dụ 1: 

+ Yêu cầu:  Nhập vào 2 số nguyên a, b. Tính tổng, hiệu, tích, thương 2 số đó.

+ Code:

#include <iostream>
#include <conio.h>

using namespace std;

int main() {

    int a,b;
    // nhap 2 so
    cout<<"\n Nhap 2 so: ";
    cout<<"\n a= ";
    cin>>a;
    cout<<"\n b= ";
    cin>>b;
 
    // Tinh tong, hieu, tich, thuong
    int tong,hieu,tich;
    tong=a+b;
    hieu=a-b;
    tich=a*b;
    float thuong=(float)a/b;
 
    // in ket qua
    cout<<"\n Tong: "<<tong;
    cout<<"\n Hieu: "<<hieu;
    cout<<"\n Tich: "<<tich;
    cout<<"\n Thuong: "<<thuong;
 
   return 0;
}


------------

Ví dụ 2: 

+ Yêu cầu:  Nhập vào 3 cạnh tam giác, tính chu vi, diên tích tam giác đó.

+ Code:


#include <iostream>
#include <conio.h>
#include <math.h>

using namespace std;

int main() {
    float a,b,c;
    // nhap 3 canh tam giac
    cout<<"\n Nhap 3 canh: ";
    cout<<"\n a= ";
    cin>>a;
    cout<<"\n b= ";
    cin>>b;
    cout<<"\n b= ";
    cin>>b;
 
 
    // Tinh chu vi tam giac
    float cv,dt;
    cv=a+b+c;
    float p=cv/2;
    dt=sqrt(p*(p-a)*(p-b)*(p-c));
 
   // in ket qua
    cout<<"\n Chu vi: "<<cv;
    cout<<"\n Dien tich: "<<dt;
 
   return 0;
}

------------

Ví dụ 3: 

+ Yêu cầu: Tính điểm cho sinh viên:

 - Nhập vào điểm: điểm toán rời rạc (3 tín chỉ); điểm lập trình (4 tín chỉ); điểm cơ sở dữ liệu (3 tín chỉ)
 - Tính điểm tổng kết.
 - In kết quả.

 + Code:

#include <iostream>
#include <conio.h>

using namespace std;

int main() {
    float dTRR,dLT,dCSDL;
    // nhap nhap diem    
    cout<<"\n Nhap diem: ";
    cout<<"\n Diem toan roi rac: ";
    cin>>dTRR;
    cout<<"\n Diem lap trinh: ";
    cin>>dLT;
    cout<<"\n Diem co so du lieu: ";
    cin>>dCSDL;
    // Tinh diem
    float dTK;
    dTK=(dTRR*3+dLT*4+dCSDL*3)/10;
    // in ket qua
    cout<<"\n Diem tong ket: "<<dTK;
 
   return 0;
}

------------------------
Xem bài khác:

[Java] Bài toán quản lý tiền lương cho Nhân viên [Kế thừa trong Lập trình hướng đối tượng]

Ví dụ về kế thừa trong lập trình hướng đối tượng
Bài toán quản lý tiền lương: Viết project Java theo mô hình kế thừa sau



Trong đó:
+ Nhân viên Văn phòng (NVVP)
    lương = hệ số lương * LCB + phụ cấp
    (phụ cấp = 1*LCB nếu số năm công tác <10; phụ cấp = 1.2*LCB nếu số năm công tác >=10)

+ Nhân viên Kinh doanh (NVKD)
   lương = LCB + thưởng
  (thưởng = doanh thu * phần trăm hoa hồng)

+ Công nhân (CN)
   lương = hệ số lương * LCB + thưởng
   (thưởng = 1*LCB nếu sản lường <1000; thưởng = 1.5*LCB nếu sản lượng >=1000)

[Code Java]

 /* ********** Class NV ****************/
  * http://lap-trinh-may-tinh.blogspot.com/
 */
package quanlyluongnv181113;

public class NV {
    String maNV,ht,dvct;
    int ns,sonct;
    final float LCB=1050000;
 
    // khoi tao
    public NV(String maNV,String ht, String dvct, int ns, int sonct){
        this.maNV=maNV;
        this.ht=ht;
        this.dvct=dvct;
        this.ns=ns;
        this.sonct=sonct;
    }
    // In thong tin
    void InTT(){
        System.out.print(" ******************** ");
        System.out.print("\n IN THONG TIN NHAN VIEN  ");
        System.out.print("\n - Ma nhan vien: "+maNV);
        System.out.print("\n - Ho ten: "+ht);
        System.out.print("\n - Don vi cong tac: "+dvct);
        System.out.print("\n - Nam sinh: "+ns);
        System.out.print("\n - So nam cong tac: "+sonct);
    }  
}

/*********  Class NVVP*****************/
/*
 * http://lap-trinh-may-tinh.blogspot.com/
 */
package quanlyluongnv181113;


public class NVVP extends NV{
    float hsl; // he so luong  
    // khoi tao
    public NVVP(String maNV,String ht, String dvct, int ns, int sonct,float hsl){
        super(maNV,ht,dvct,ns,sonct);
        this.hsl=hsl;
    }
    // tinh luong
    float TinhLuong(){
        float luong,pc;
        if (sonct>=10)
            pc=1.2f*LCB;
        else
            pc=LCB;
        luong= hsl*LCB+pc;
        return luong;
    }
    // in thong tin
    void InTT(){
        super.InTT();
        System.out.print("\n - Luong: "+TinhLuong());
    }
}

/********  Class NVKD *****************/
/*
 * http://lap-trinh-may-tinh.blogspot.com/
 */
package quanlyluongnv181113;


public class NVKD extends NV {
    float dthu; // doanh thu
    float pthh; // phan tram hoa hong
    // khoi tao
    public NVKD(String maNV,String ht, String dvct, int ns, int sonct,float dthu,float pthh){
        super(maNV,ht,dvct,ns,sonct);
        this.dthu=dthu;
        this.pthh=pthh;
    }
    // tinh luong
    float TinhLuong(){
        float luong;
        luong= LCB+dthu*pthh;
        return luong;
    }
    // in thong tin
    void InTT(){
        super.InTT();
        System.out.print("\n - Luong: "+TinhLuong());
    }
}

/*********  Class CN *******************/
/*
 * http://lap-trinh-may-tinh.blogspot.com/
 */
package quanlyluongnv181113;

public class CN extends NV{
        float hsl; // he so luong
        int sanLuong;// san luong
    // khoi tao
    public CN(String maNV,String ht, String dvct, int ns, int sonct,float hsl,int sanLuong){
        super(maNV,ht,dvct,ns,sonct);
        this.hsl=hsl;
        this.sanLuong=sanLuong;
    }
    // tinh luong
    float TinhLuong(){
        float luong,thuong;
        if (sanLuong>=1000)
            thuong=1.5f*LCB;
        else
            thuong=LCB;
        luong= hsl*LCB+thuong;
        return luong;
    }
    // in thong tin
    void InTT(){
        super.InTT();
        System.out.print("\n - Luong: "+TinhLuong());
    }
}

/*********  Class (main) ****************/
/*
 * http://lap-trinh-may-tinh.blogspot.com/
 */
package quanlyluongnv181113;
import java.util.Scanner;

public class QuanLyLuongNV181113 {
    public static void main(String[] args) {
     
           String maNV,ht,dvct;
           int ns,sonct,sanLuong;
           float hsl,pthh,dthu;
         
           Scanner in1=new Scanner(System.in);
           Scanner in2=new Scanner(System.in);
         
         try{
           // Nhap thong tin cho Nhan vien VP
           System.out.print("\n ********************* ");
           System.out.print("\n NHAP THONG TIN NHAN VIEN VAN PHONG");
           System.out.print("\n + Ma Nhan vien: ");
           maNV=in1.nextLine();
           System.out.print("\n + Ho ten: ");
           ht=in1.nextLine();
           System.out.print("\n + Don vi cong tac: ");
           dvct=in1.nextLine();
           System.out.print("\n + Nam sinh: ");
           ns=in2.nextInt();
           System.out.print("\n + So nam congt tac: ");
           sonct=in2.nextInt();
           System.out.print("\n + He so luong: ");
           hsl=in2.nextFloat();
         
           NVVP t=new NVVP(maNV,ht,dvct,ns,sonct,hsl);
           t.InTT();
           }
           catch(Exception e){
               System.out.print("\n Xay ra loi khi nhap du lieu! Loi "+e.toString());
           }
         
            // Nhap thong tin cho Nhan vien kinh doanh
        try{
           System.out.print("\n ********************* ");
           System.out.print("\n NHAP THONG TIN NHAN VIEN KINH DOANH");
           System.out.print("\n + Ma Nhan vien: ");
           maNV=in1.nextLine();
           System.out.print("\n + Ho ten: ");
           ht=in1.nextLine();
           System.out.print("\n + Don vi cong tac: ");
           dvct=in1.nextLine();
           System.out.print("\n + Nam sinh: ");
           ns=in2.nextInt();
           System.out.print("\n + So nam congt tac: ");
           sonct=in2.nextInt();
           System.out.print("\n + Doanh thu: ");
           dthu=in2.nextInt();
           System.out.print("\n + Phan tram (%) hoa hong: ");
           pthh=in2.nextInt();
         
           NVKD t1=new NVKD(maNV,ht,dvct,ns,sonct,dthu,pthh);
           t1.InTT();
           }
           catch(Exception e){
               System.out.print("\n Xay ra loi khi nhap du lieu! Loi "+e.toString());
           }
         
             // Nhap thong tin cho Cong Nhan
         try{
           System.out.print("\n ********************* ");
           System.out.print("\n NHAP THONG TIN CONG NHAN");
           System.out.print("\n + Ma Nhan vien: ");
           maNV=in1.nextLine();
           System.out.print("\n + Ho ten: ");
           ht=in1.nextLine();
           System.out.print("\n + Don vi cong tac: ");
           dvct=in1.nextLine();
           System.out.print("\n + Nam sinh: ");
           ns=in2.nextInt();
           System.out.print("\n + So nam congt tac: ");
           sonct=in2.nextInt();
           System.out.print("\n + He so luong: ");
           hsl=in2.nextFloat();
           System.out.print("\n + San luong: ");
           sanLuong=in2.nextInt();
         
           CN t3=new CN(maNV,ht,dvct,ns,sonct,hsl,sanLuong);
           t3.InTT();
         }
           catch(Exception e){
               System.out.print("\n Xay ra loi khi nhap du lieu! Loi "+e.toString());
           }
         
     
    }
}



----------


Cùng bạn tự học CNTT - tailieucntt.org

Ads Links