[Lập trình hướng đối tượng với Java] Ví dụ lớp trừu tượng (abstract class) [290916]

[Lập trình hướng đối tượng với Java] Ví dụ lớp trừu tượng (abstract class) [290916]
Xây dựng các class:
- Class NV (abstract)
 + Thuộc tính: Họ tên, địa chỉ, năm sinh, hệ số lương
 + Phương thức: Khởi tạo, nhập, tính lương (abstract), in thông tin
- Class LapTrinhVien kế thừa NV, bổ sung thêm
 + Thuộc tính: Số năm công tác
 + Phương thức: Tính lương
Trong đó: lương = hệ số lương * LCB + thưởng
(thưởng = 1,5 LCB nếu số năm công tác >10; ngược lại, thưởng = 1,0 LCB)
* Yêu cầu:
Nhập và in ra thông tin 01 nhân viên là lập trình viên
(họ tên, địa chỉ, năm sinh, lương)
------
Xây dựng Project như hình vẽ:


Code Java:

+ class NV

package vidu_loptruutuong_290916;
import java.util.Scanner;
public abstract class NV {
    // thuoc tinh
    final float LCB=1050000;
    String hoTen, diaChi;
    int namSinh;
    float heSoLuong;
 
    // Phuong thuc khoi tao
    public NV(String hoTen, String diaChi, int namSinh, float heSoLuong){
        this.hoTen=hoTen;
        this.diaChi=diaChi;
        this.namSinh=namSinh;
        this.heSoLuong=heSoLuong;
    }
 
    // Phuong thuc nhap thong tin
    public void NhapTT(){
        Scanner inp=new Scanner(System.in);
        System.out.println("\n * Nhap thong tin nhan vien: ");
        System.out.print("\n + Ho ten: ");
        hoTen=inp.nextLine();
        System.out.print("\n + Dia chi: ");
        diaChi=inp.nextLine();
        System.out.print("\n + Nam sinh: ");
        namSinh=inp.nextInt();
        System.out.print("\n + He so luong: ");
        heSoLuong=inp.nextFloat();
    }
 
    // Phuong thuc tinh luong (abstract)
    public abstract float TinhLuong();
 
    // In thong tin
    public void InTT(){
        System.out.print("\n * In thong tin nhan vien: ");
        System.out.print("\n + Ho ten: "+hoTen);
        System.out.print("\n + Dia chi: "+diaChi);
        System.out.print("\n + Nam sinh: "+namSinh);
        System.out.print("\n + He so luong: "+heSoLuong);
        System.out.print("\n + Luong thang: "+TinhLuong());
     
    }
}


+ class LapTrinhVien

package vidu_loptruutuong_290916;
import java.util.Scanner;
public class LapTrinhVien extends NV{
    // thuoc tinh
    int soNamCT;
 
    // phuong thuc khoi tao
    public LapTrinhVien(String hoTen, String diaChi, int namSinh, float heSoLuong,int soNamCT){
        super(hoTen, diaChi, namSinh, heSoLuong);
        this.soNamCT=soNamCT;
    }
 
    // phuong thuc nhap thong tin
    public void NhapTT(){
        super.NhapTT();
        Scanner inp=new Scanner(System.in);
        System.out.print("\n + So nam cont tac: ");
        soNamCT=inp.nextInt();
    }
 
    // phuong thuc tinh luong
    public float TinhLuong(){
        float thuong;
        if(soNamCT>10)
            thuong=(float)1.5*LCB;
        else thuong=LCB;
        return (heSoLuong*LCB+thuong);
    }
}


+ class ViDu_LopTruuTuong_290916

package vidu_loptruutuong_290916;

public class ViDu_LopTruuTuong_290916 {
    public static void main(String[] args) {
        // Khai bao doi tuong Lap trinh vien
        LapTrinhVien bill =new LapTrinhVien("","",1,1,1);
        bill.NhapTT();
        bill.InTT();
    }
 
}

 Lập trình Java - ĐH FPT
----------

[Tự học lập trình Java] Bài 6: Thừa kế (Inheritance) và đa hình (Polymorphism)

1. Thừa kế (inheritance) 

1.1. Lớp kế thừa
     Một lớp con (subclass) có thể kế thừa tất cả những vùng dữ liệu và phương thức của một lớp khác – lớp cha (siêu lớp - superclass). 

   Như vậy việc tạo một lớp mới từ một lớp đã biết sao cho các thành phần (fields và methods) của lớp cũ cũng sẽ thành các thành phần (fields và methods) của lớp mới. Khi đó ta gọi lớp mới là lớp dẫn xuất (derived class) từ lớp cũ (superclass). Có thể lớp cũ cũng là lớp được dẫn xuất từ một lớp nào đấy, nhưng đối với lớp mới vừa tạo thì lớp cũ đó là một lớp siêu lớp trực tiếp (immediate supperclass).

Dùng từ khóa extends để chỉ lớp dẫn xuất.

Ví dụ:
// super class B
class B{
 // …
}
// sub class A
class A extends B
{
 //…
}
1.2. Khái báo phương thức chồng
      Tính kế thừa giúp cho các lớp con nhận được các thuộc tính/phương thức public và protected của lớp cha. Đồng thời cũng có thể thay thế các phương thức của lớp cha bằng cách khai báo chồng. Chẳng hạn phương thức tinhgiaban() áp dụng trong lớp xega sẽ cho kết quả gấp 2.5 lần chi phí sản xuất thay vì gấp 2 chi phí sản xuất giống như trong lớp xemay.

Ví dụ:
public class xega extends xemay
{
public xega()
{ ... }

public xega(String s_nhasx, String s_model, f_chiphisx, int i_thoigiansx);
{
  this.nhasx = s_nhasx;
  this.model = s_model;
  this.chiphisx = f_chiphisx;
  this.thoigiansx = i_thoigiansx;
  this.so = 0;
}

public float tinhgiaban()
{
   return 2.5 * chiphisx;
 }
}

Java cung cấp 3 tiền tố/từ khóa để hỗ trợ tính kế thừa của lớp:
- public: lớp có thể truy cập từ các gói, chương trình khác.
- final: Lớp hằng, lớp không thể tạo dẫn xuất (không thể có con), hay đôi khi người ta gọi là lớp “vô sinh”.
- abstract: Lớp trừu tượng (không có khai báo các thành phần và các phương thức trong lớp trừu tượng). Lớp dẫn xuất sẽ khai báo, cài đặt cụ thể các thuộc tính, phương thức của lớp trừu tượng.

Chú ý: Trong Java không cho phép đa kế thừa, nghĩa là 1 lớp con chỉ kế thừa duy nhất từ 1 lớp cha (khác với C++), ngược lại 1 lớp cha có thể cho phép nhiều lớp con kế thừa.

2. Đa hình (polymorphism)
   Tính đa hình cho phép cài đặt các lớp dẫn xuất khác nhau từ một lớp nguồn. Một đối tượng có thể có nhiều kiểu khác nhau gọi là tính đa hình.

Ví dụ:
class A_Object
{
  //…
  void method_1()
  {
   //…
  }
}

class B_Object extends A_Object
{
   //…
   void method_1()
  {
    //…
  }
}

class C
{
  public static void main(String[] args)
  {
     // Tạo một mảng 2 phần tử kiểu A
     A_Object arr_Object = new A_Object[2];
     B_Object var_1 = new B_Object();
    // Phần tử đầu tiên của mảng arr_Object[0]tham
    // chiếu đến 1 đối tượng kiểu B_Object dẫnxuất
    // từ A_Object
   arr_Object[0] = var_1;
   A_Object var_2;
   for (int i=0; i<2; i++) {
     var_2 = arr_Object[i];
     var_2.method_1();
  }
 }
}

Vòng lặp for trong đoạn chương trình trên:
- Với i = 0 thì biến var_2 có kiểu là B_Object, và lệnh var_2.method_1() sẽ gọi thực hiện phương thức method_1 của lớp B_Object.
- Với i = 1 thì biến var_2 có kiểu là A_Object, và lệnh var_2.method_1() sẽ gọi thực hiện phương thức method_1 của lớp A_Object.

Trong ví dụ trên đối tượng var_2 có thể nhận kiểu A_Object hay B_Object. Hay nói các khác, một biến đối tượng kiểu A_Object như var_2 trong ví dụ trên có thể tham chiếu đến bất kỳ đối tượng nào của bất kỳ lớp con nào của lớp A_Object (ví dụ var_2 có thể tham chiếu đến đối tượng var_1, var_1 là đối tượng của lớp B_Object dẫn xuất từ lớp A_Object). Ngược lại

một biến của lớp con không thể tham chiếu đến bất kỳ đối tượng nào của lớp cha.

3. Phương thức từu tượng và lớp trừu tượng
   Lớp trừu tượng (abtract class) là lớp không có khai báo các thuộc tính thành phần và các phương thức. Các lớp dẫn xuất của nó sẽ khai báo thuộc tính, cài đặt cụ thể các phương thức của lớp trừu tượng.

  Phương thức trừu tượng (abstract method) là phương thức không có nội dung, chỉ được khai báo trong lớp trừu tượng.

Ví dụ:
abstract class A
{
   abstract void method_1(); // phương thức trừu tượng
 }
public class B extends A
{
   public void method_1()
  {
     // cài đặt chi tiết cho phương thức method_1
     // trong lớp con B.
     //…
   }
}

public class C extends A
{
public void method_1()
 {
    // cài đặt chi tiết cho phương thức method_1
    // trong lớp con C.
    //…
  }
}

Lưu ý: Các phương thức được khai báo dùng các tiền tố private và static thì không được khai báo là trừu tượng abstract. Tiền tố private thì không thể truy xuất từ các lớp dẫn xuất, còn tiền tố static thì chỉ dùng riêng cho lớp khai báo mà thôi.

4. Giao diện (interface)
 4.1.Khái niệm interface
     Như chúng ta đã biết một lớp trong java chỉ có một siêu lớp trực tiếp hay một cha duy nhất (đơn thừa kế). Để tránh đi tính phức tạp của đa thừa kế (multi-inheritance) trong lập trình hướng đối tượng, Java thay thế bằng giao tiếp (interface). Một lớp có thể có nhiều giao tiếp (interface) với các lớp khác để thừa hưởng thêm vùng dữ liệu và phương thức của các giao tiếp này.

4.2.Khai báo interface
    Interface được khai báo như một lớp. Nhưng các thuộc tính của interface là các hằng (khai báo dùng từ khóa final) và các phương thức của giao tiếp là trừu tượng (mặc dù không có từ khóa abstract).

   Trong các lớp có cài đặt các interface ta phải tiến hành cài đặt cụ thể các phương thức này.

Ví dụ:
 public interface sanpham
{
    static final String nhasx = “Honda VN”;
    static final String dienthoai = “08-8123456”;
    public int gia(String s_model);
 }
// khai báo 1 lớp có cài đặt interface
public class xemay implements sanpham
{
     // cài đặt lại phương thức của giao diện trong lớp
     public int gia(String s_model)
     {
        if (s_model.equals(“2005”))
           return (2000);
        else
     return (1500);
}
public String chobietnhasx()
{
    return (nhasx);
 }
}

Có một vấn đề khác với lớp là một giao diện (interface) không chỉ có một giao diện cha trực tiếp mà có thể dẫn xuất cùng lúc nhiều giao diện khác (hay có nhiều giao diện cha). Khi đó nó sẽ kế thừa tất cả các giá trị hằng và các phương thức của các giao diện cha. Các giao diện cha được liệt kê thành chuỗi và cách nhau bởi dấu phẩy “,”. Khai báo như sau:

public interface InterfaceName extends interface1, interface2, interface3
{
  //…

5. Lớp nội
   Lớp nội là lớp được khai báo bên trong 1 lớp khác. Lớp nội thể hiện tính đóng gói cao và có thể truy xuất trực tiếp biến của lớp cha.

Ví dụ:
public class A
{
   //…
    int <field_1>
    static class B
   {
      //…
      int <field_2>
     public B(int par_1)
     {
       field_2 = par_1 + field_1;
     }
   }
 }

Trong ví dụ trên thì chương trình dịch sẽ tạo ra hai lớp với hai files khác nhau: A.class và B.class

6. Lớp vô sinh
     Lớp không thể có lớp dẫn xuất từ nó (không có lớp con) gọi là lớp “vô sinh”, hay nói cách khác không thể kế thừa được từ một lớp “vô sinh”. Lớp “vô sinh” dùng để hạn chế, ngăn ngừa các lớp khác dẫn xuất từ nó.

     Để khai báo một lớp là lớp “vô sinh”, chúng ta dùng từ khóa final class. Tất cả các phương thức của lớp vô sinh đều vô sinh, nhưng các thuộc tính của lớp vô sinh thì có thể không vô sinh.

Ví dụ:
public final class A
{
    public final int x;
    private int y;
    public final void method_1()
    {
       //…
    }
public final void method_2()
  {
    //…
   }
 

[Tự học lập trình Java] Bài 5: Lớp (class) và đối tượng (object) trong Java

1. Đối tượng và lớp
1.1. Lớp (class)
a. Khái niệm
    Chúng ta có thể xem lớp như một khuôn mẫu (template) của đối tượng (Object). Trong đó bao gồm dữ liệu của đối tượng (fields hay properties) và các phương thức(methods) tác động lên thành phần dữ liệu đó gọi là các phương thức của lớp. Các đối tượng được xây dựng bởi các lớp nên được gọi là các thể hiện của lớp (class instance).

b. Khai báo/định nghĩa lớp
 [access rights(tiền tố)] class <ClassName>
 {
      <kiểu dữ liệu> <field_1>;
      <kiểu dữ liệu> <field_2>;
     constructor
     method_1
     method_2
     ...
}

Trong đó:
  - class: là từ khóa của java
  - ClassName: là tên chúng ta đặt cho lớp
  - field_1, field_2: các thuộc tính, các biến, hay các thành phần dữ liệu của lớp.
  - constructor: là sự xây dựng, khởi tạo đối tượng lớp.
  - method_1, method_2: là các phương thức/hàm thể hiện các thao tác xử lý, tác động lên các thành phần dữ liệu của lớp.
  - access rights: Quyền truy xuất (public, private, protected)

Ví dụ: Khái báo lớp SinhVien

public class SinhVien{
  // khai báo các phương thức và thuộc tính
  …
}

1.2. Đối tượng (object)
  Đối tượng là sự cụ thể hóa của lớp. Đối tượng được khai báo tường mình bằng từ khóa new theo cú pháp:

   ClassName objectName = new ClassName();

Ví dụ: Khái báo đối tượng sinh vien A (A là một sinh viên cụ thể thuộc lớp SinhVien)
          SinhVien A=new SinhVien( );

2. Biến lớp và phương thức lớp
2.1. Thuộc tính - biến lớp (attribute)
   Vùng dữ liệu (fields) hay thuộc tính (properties) của lớp được khai báo bên trong lớp như sau:

class <ClassName>
 {
   // khai báo những thuộc tính của lớp
  <tiền tố> <kiểu dữ liệu> < thuộc tính>;
  //…
 }

Để xác định quyền truy xuất của các đối tượng khác đối với vùng dữ liệu của lớp người ta thường dùng 3 tiền tố sau:
- public: có thể truy xuất từ tất cả các đối tượng khác
- private: một lớp không thể truy xuất vùng private của 1 lớp khác.
- protected: vùng protected của 1 lớp chỉ cho phép bản thân lớp đó và những lớp dẫn xuất từ lớp đó truy cập đến.

Ví dụ: khai báo lớp xemay

public class xemay
{
  public String nhasx;
  public String model;
  private float chiphisx;
  protected int thoigiansx;
  // so luong so cua xe may: 3, 4 so
  protected int so;
  // sobanhxe là biến tĩnh có giá trị là 2 trong tất cả
  // các thể hiện tạo ra từ lớp xemay
  public static int sobanhxe = 2;
}

Chú giải:
  - Thuộc tính “nhasx”, “model”có thể được truy cập đến từ tất cả các đối tượng khác.
  - Thuộc tính “chiphisx” chỉ có thể truy cập được từ các đối tượng có kiểu “xemay”
  - Thuộc tính “thoigiansx”, so có thể truy cập được từ các đối tượng có kiểu “xemay” và các đối tượng của các lớp con dẫn xuất từ lớp “xemay”

Lưu ý: Thông thường để an toàn cho vùng dữ liệu của các đối tượng người ta tránh dùng tiền tố public, mà thường chọn tiền tố private để ngăn cản quyền truy cập đến vùng dữ liệu của một lớp từ các phương thức bên ngoài lớp đó.

2.2. Phương thức (method)
    Hàm hay phương thức (method) trong Java là khối lệnh thực hiện các chức năng, các hành vi xử lý của lớp lên vùng dữ liệu.

a. Khai báo phương thức:

<Tiền tố> <kiểu trả về> <Tên phương thức> (<danh sách đối số>)
{
  <khối lệnh>;
  [return];
}

Để xác định quyền truy xuất của các đối tượng khác đối với các phương thức của lớp người ta thường dùng các tiền tố sau:

- public: phương thức có thể truy cập được từ bên ngoài lớp khai báo.
- protected: có thể truy cập được từ lớp khai báo và những lớp dẫn xuất từ nó.
- private: chỉ được truy cập bên trong bản thân lớp khai báo.
- static: phương thức lớp dùng chung cho tất cả các thể hiện của lớp, có nghĩa là phương thức đó có thể được thực hiện kể cả khi không có đối tượng của lớp chứa phương thức đó.
- final: phương thức có tiền tố này không được khai báo chồng ớ các lớp dẫn xuất.
- abstract: phương thức không cần cài đặt (không có phần source code), sẽ được hiện thực trong các lớp dẫn xuất từ lớp này.
- synchoronized: dùng để ngăn các tác động của các đối tượng khác lên đối tượng đang xét trong khi đang đồng bộ hóa. Dùng trong lập trình miltithreads.

<kiểu trả về>: có thể là kiểu void, kiểu cơ sở hay một lớp.
<Tên phương thức>: đặt theo qui ước giống tên biến.
<danh sách thông số>: có thể rỗng

Lưu ý:
Thông thường trong một lớp các phương thức nên được khai báo dùng từ khóa public, khác với vùng dữ liệu thường là dùng tiền tố private vì mục đích an toàn. Những biến nằm trong một phương thức của lớp là các biến cục bộ (local) và nên được khởia tạo sau khi khai báo.

Ví dụ:
public class xemay
{
  public String nhasx;
  public String model;
  private float chiphisx;
  protected int thoigiansx;
  // so luong so cua xe may: 3, 4 so
  protected int so;
  // là biến tĩnh có giá trị là 2 trong tất cả
  // các thể hiện tạo ra từ lớp xemay
  public static int sobanhxe = 2;
  public float tinhgiaban()
  {
    return 1.5 * chiphisx;
  }
}

b. Khởi tạo một đối tượng (Constructor)
     Contructor thật ra là một loại phương thức đặc biệt của lớp. Constructor dùng gọi tự động khi khởi tạo một thể hiện của lớp, có thể dùng để khởi gán những giá trị măc định. Các constructor không có giá trị trả về, và có thể có tham số hoặc không có tham số. Constructor phải có cùng tên với lớp và được gọi đến dùng từ khóa new.

    Nếu một lớp không có constructor thì java sẽ cung cấp cho lớp một constructor mặc định (default constructor). Những thuộc tính, biến của lớp sẽ được khởi tạo bởi các giá trị mặc định (số: thường là giá trị 0, kiểu luận lý là giá trị false, kiểu đối tượng giá trị null, …)

    Lưu ý: thông thường để an toàn, dễ kiểm soát và làm chủ mã nguồn chương trình chúng ta nên khai báo một constructor cho lớp.

Ví dụ:
public class xemay
{
   //…
   public xemay()
 }

public xemay(String s_nhasx, String s_model, f_chiphisx, int i_thoigiansx, int i_so);
 {
   nhasx = s_nhasx;
   model = s_model;
   chiphisx = f_chiphisx;
   thoigiansx = i_thoigiansx;
   so = i_so;
   // hoặc
   // this.nhasx = s_nhasx;
   // this.model = s_model;
   // this.chiphisx = f_chiphisx;
   // this.thoigiansx = i_thoigiansx;
   // this.so = i_so;
}

}

c. Biến this
    Biến this là một biến ẩn tồn tại trong tất cả các lớp trong ngông ngữ java. Một class trong Java luôn tồn tại một biến this, biến this được sử dụng trong khi chạy và tham khảo đến bản thân lớp chứa nó.

Ví dụ:
<tiền tố> class A
{
   <tiền tố> int <field_1>;
   <tiền tố> String <field_2>;
   // Contructor của lớp A
  public A(int par_1, String par_2)
  {
   this.field_1 = par_1;
   this.field_2 = par_2;
  }

<tiền tố> <kiểu trả về> <method_1>()
{
  // …
}

<tiền tố> <kiểu trả về> <method_2>()
 {
   this.method_1()
   // …
  }
}

d. Khai báo chồng phương thức (overloading method)
    Việc khai báo trong một lớp nhiều phương thức có cùng tên nhưng khác tham số (khác kiểu dữ liệu, khác số lượng tham số) gọi là khai báo chồng phương thức (overloading method).

Ví dụ:
 public class xemay
 {
   // khai báo fields…
   public float tinhgiaban()
   return 2 * chiphisx;
 }

public float tinhgiaban(float huehong)
{
   return (2 * chiphisx + huehong);
 }
}

e. Đặc điểm hướng đối tượng trong java
    Hỗ trợ những nguyên tắc cơ bản của lập trình hướng đối tượng, tất cả các ngôn ngữ lập trình kể cả java đều có ba đặc điểm chung: tính đóng gói (encapsulation), tính đa hình (polymorphism), và tính kế thừa (inheritance).

3. Phương thức finalize()
    Trong java không có kiểu dữ liệu con trỏ như trong C, người lập trình không cần phải quá bận tâm về việc cấp phát và giải phóng vùng nhớ, sẽ có một trình dọn dẹp hệ thống đảm trách việc này. Trình dọn dẹp hệ thống sẽ dọn dẹp vùng nhớ cấp phát cho các đối tượng trước khi hủy một đối tượng.

    Phương thức finalize() là một phương thức đặc biệt được cài đặt sẵn cho các lớp. Trình dọn dẹp hệ thống sẽ gọi phương thức này trước khi hủy một đối tượng. Vì vậy việc cài đặt một số thao tác giải phóng, dọn dẹp vùng nhớ đã cấp phát cho các đối tượng dữ liệu trong phương thức finalize() sẽ giúp cho người lập trình chủ động kiểm soát tốt quá trình hủy đối tượng thay vị giao cho trình dọn dẹp hệ thống tự động. Đồng thời việc cài đặt trong phương thức finalize() sẽ giúp cho bộ nhớ được giải phóng tốt hơn, góp phần cải tiến tốc độ chương trình.

Ví dụ:
class A
 {
   // Khai báo các thuộc tính
   public void method_1()
  {
     //…
   }
   protected void finalize()
  {
    // Có thể dùng để đóng tất cả các kết nối
    // vào cơ sở dữ liệu trước khi hủy đối tượng.
    //…
   }
}

4.Gói (packages)
   Việc đóng gói các lớp lại tạo thành một thư viện dùng chung gọi là package. Một package có thể chứa một hay nhiều lớp bên trong, đồng thời cũng có thể chứa một package khác bên trong.

   Để khai báo một lớp thuộc một gói nào đấy ta phải dùng từ khóa package. Dòng khai báo gói phải là dòng đầu tiên trong tập tin khai báo lớp. Các tập tin khai báo lớp trong cùng một gói phải được lưu trong cùng một thư mục.

Lưu ý: Việc khai báo import tất cả các lớp trong gói sẽ làm tốn bộ nhớ. Thông thường chúng ta chỉ nên import những lớp cần dùng trong chương trình.

Ví dụ:
package phuongtiengiaothong;
class xemay
{
  // …
 }

class xega extends xemay
{
   //…
}

Khi đó muốn sử dụng lớp xemay vào chương trình ta sẽ khai báo như sau:

import phuongtiengiaothong.xemay;

5. Đóng gói (encapsulation)
     Cơ chế đóng gói trong lập trình hướng đối tượng giúp cho các đối tượng dấu đi một phần các chi tiết cài đặt, cũng như phần dữ liệu cục bộ của nó, và chỉ công bố ra ngoài những gì cần công bố để trao đổi với các đối tượng khác. Hay chúng ta có thể nói đối tượng là một thành tố hỗ trợ tính đóng gói.

    Đơn vị đóng gói cơ bản của ngôn ngữ java là class. Một class định nghĩa hình thức của một đối tượng. Một class định rõ những thành phần dữ liệu và các đoạn mã cài đặt các thao tác xử lý trên các đối tượng dữ liệu đó. Java dùng class để xây dựng những đối tượng. Những đối tượng là những thể hiện (instances) của một class.

    Một lớp bao gồm thành phần dữ liệu và thành phần xử lý. Thành phần dữ liệu của một lớp thường bao gồm các biến thành viên và các biến thể hiện của lớp. Thành phần xử lý là các thao tác trên các thành phần dữ liệu, thường trong java người gọi là phương thức. Phương thức là một thuật ngữ hướng đối tượng trong java, trong C/C++ người ta thường dùng thuật ngữ là hàm.

Xem thêm các ví dụ về Class và Object tại đây

 Lập trình Java - ĐH FPT

--------------------------------------------------- 
Đoc thêm các bài khác

Bài 1: Chương trình JAVA đầu tiên
Bài 2: Các kiểu dữ liệu và toán tử trong
Bài 3: Các cấu trúc điều khiển trong Java
Bài 4 : Mảng và chuỗi trong Java
Bài 5: Lớp (class) và đối tượng (object) trong Java
Bài 6:Thừa kế (Inheritance) và đa hình (Polymorphism)
Ví dụ lập trình giao diện đồ họa với Java (GUI)
Ví dụ lập trình kết nối dữ liệu với Java (JDBC)
Ví dụ về lập trình Android 

[Tự học lập trình Java] Bài 4: Mảng và chuỗi trong Java

1. Mảng 1 chiều

1.1. Khai báo và tạo mảng
  Mảng được dùng để lưu trữ các khoản mục (items) cùng kiểu dữ liệu liền kề nhau trong bộ nhớ. Mỗi lần ta khai báo kích thước của một mảng, nó sẽ không thể thay đổi. Dữ liệu trên mảng có thể là kiểu dữ liệu nguyên thuỷ hoặc đối tượng. Cũng như các biến, ta có thể gán các giá trị vào mảng tại các phần tử được tạo ra trong mảng. Nếu không, Java sẽ gán giá trị mặc định vào tất cả các phần tử của mảng, giá trị mặc định phụ thuộc vào kiểu dữ liệu. Ví dụ : nếu kiểu dữ liệu là nguyên (int) thì giá trị mặc định ban đầu sẽ là 0.


Mảng có thể được khai báo bằng 3 cách :


Cách khai báo
Mô tả
Cú pháp
Ví dụ
Chỉ đơn thuần khai báo
Chỉ đơn thuần khai báo mảng
Datatype  identifier[]
char ch[ ];
//khai báo mảng ký tự có tên ch
Khai báo và tạo mảng
Khai báo và cấp phát bộ nhớ cho các phần tử mảng sử dụng toán tử  “new”
Datatype  identifier[]
= new datatype [size ]
char ch[] = new
char [10 ];
//Khai báo một mảng ch và lưu trữ 10 ký tự
Khai báo, kiến tạo và khởi tạo
Khai báo mảng, cấp phát bộ nhớ cho nó và gán các giá trị ban đầu cho các phần tử của mảng
Datatype  identifier[]
= {value1,value2…};
char ch []
= {‘A’,’B’,’C’,’D’ };
//khai báo mảng ch và lưu 4 chữ cái kiểu  ký tự

Để xác định tên và số phần tử của mảng ta cần xem xét các phần tử mảng.Số phần tử bắt đầu với 0 cho phần tử đầu,1 cho phần tử thứ hai và cứ tiếp như vậy.

1.2. Sắp xếp mảng
     Sử dụng các thuật toán sắp xếp như: Thuật toán đổi chỗ trực tiếp, thuật toán nổi bọt, thuật toán chèn trực tiếp, thuật toán vun đống, …
    Ứng dụng các thuật toán trên để sắp xếp dãy số (mảng số) theo chiều tăng dần, hoặc giảm dần với dãy số nhập vào từ bàn phím.

1.3. Mảng đối tượng

   Tương tự như mảng dữ liệu thông thường. Chúng ta có thể khai báo các mảng đối tượng từ các lớp đã được định nghĩa.

Ví dụ:
 // khai bao lớp
class A{
   // khai báo thuộc tính
   // phương thức
   …
}
// khai báo mảng đối tượng m có kích thước là 10.
A[] m=new A[10];

//Để sử dụng được mảng m ta phải khởi tạo từng đối tượng là thành phần của mảng //(thường sử dụng cấu trúc lặp).

1.4. Mảng đa chiều.
    Các mảng đa chiều trong Java được coi như là các mảng đối tượng chứa các tham chiếu đến các mảng khác
   Số chiều được quy định bởi số cặp ngoặc vuông [].

Ví dụ:
  - Bộ khởi tạo mảng cho mảng hai chiều:
   int[][] mac1 = { { 1, 2, 3, }, { 4, 5, 6, } };
  - Một mảng động được tạo ra.
   int[][] mac2 = new int[n][m];
  - Một mảng với các véc-tơ có kích thước khác nhau. Mảng phụ w xác định độ dài của các véc-tơ này.

Ví dụ:
  public class MultiArr {
   public static void main(String[] arg) {
     int w[] = { 2, 3, 4 };
     int n = 3;
     int[][] m3 = new int[n][]; // sizes of the rows are set dynamically
     for(int i = 0; i < m3.length; i++) {
       m3[i] = new int[w[i]];
       for (int j = 0; j < m3[i].length; j++)
          m3[i][j] = i + j;
      }
     for (int i = 0; i < m3.length; i++) {
       System.out.println("Size of the " + i + "-th row " + m3[i].length);
       String out = " ";
       for(int j = 0; j < m3[i].length; j++) out += " " + m3[i][j];
           System.out.println(out);
     }
  }
}

Kết quả:
 Size of the 0-th row 2
  0 1
Size of the 1-th row 3
  1 2 3
Size of the 2-th row 4
  2 3 4 5


2. Chuỗi (string)
   Chuỗi là tập các kí tự đứng liền nhau được giới hạn trong dấu ngoặc kép như: "hello word", "laptrinhmaytinh.net",...

2.1. Khai báo và khởi tạo Java cung cấp các kiểu khai báo và khởi tạo string như sau:
 - Khai báo một xâu rỗng
 Ví dụ: String str1=new String( ); //khởi tạo str1 là một xâu trống

- Khai báo và khởi tạo một xâu bằng một chuỗi cho trước.
Ví dụ: String str2=new String(“Hello word”); //khởi tạo str2 bằng “Hello word”

- Khai báo và khởi tạo một xâu bằng một mảng kí tự cho trước.
Ví dụ: char ch[ ]={‘a’,’b’,’c’,’d’,’e’}; String str3=new String[ch];

Kết quả str3 là xâu “abcde”· Khai báo và khởi tạo một xâu bằng cách chọn một vài kí tự trong một mảng kí tự cho trước.

Ví dụ: char ch[ ]={‘a’,’b’,’c’,’d’,’e’};
           String str4=new String[ch,0,2];

Kết quả str4 là xâu ab, vì khởi tạo này sẽ khởi tạo xâu str4 là lấy 2 kí tự từ vị trí thứ 0.

2.2. Thao tác nối chuỗi (cộng 2 chuỗi)
- Cộng 2 chuỗi bằng dấu cộng (+)
Ví dụ: String str1=new String(“Hello word” );
           System.out.printf(“toi muon noi ”+str1);

Kết quả của đoạn mã trên sẽ in ra dong chữ: “toi muon noi Hello word”

Chú ý: Java có khả năng tự chuyển bất cứ dữ liệu kiểu số nào khi cộng vào String.

Ví dụ: int n=100;
           Float m=100.123;
           System.out.printf(“so nguyen la ”+n+”so thuc la “+m);

     Kết quả sẽ in ra chuỗi số: “so nguyen la 100 so thuc la 100.123”có nghĩa là java sẽ chuyển n và m thành kiểu string rồi sau đó sẽ nối vào chuỗi phía trước.
     Khi cộng chuỗi bằng dấu cộng ,kết quả sẽ đưa ra bằng cách nỗi 2 chuỗi vào vị trí cuối cùng của chuỗi đầu tiên. Cách nối chuỗi này thường được sử dụng khi in ra màn hình hoặc chuyển kiểu dữ liệu số sang string.

- Nối 2 chuỗi bằng phương thức concat( )
   Khác với việc nối chuỗi bằng dấu cộng là nối 2 chuỗi tại vị trí cuối cùng của chuỗi đầu tiên.thay vào đó phương thức này sẽ trả về một chuỗi mới.

Ví dụ: String str1,str2,str3;
           str1=”"Welcome”";
           str2=”"laptrinhmaytinh.net";
           str3=str1.concat(str2);

 Kết quả là str3 sẽ bằng “Welcome laptrinhmaytinh.net

2.3. Các hàm xử lí với chuỗi trong java
- substring
 Ví dụ: String str1=new String( “Ha noi” );
            String str2=str1.substring(0,2);

Kết quả là str2 bằng “Ha có nghĩa là phương thức substring sẽ lấy 2 kí tự trong xâu str1 bắt đầu từ kí tự thứ 0.

- length trả về độ dài chuỗi
Ví dụ: String str1=new String(“”Ha Noi””);
          int n=str1.length( );

Kết quả là n=6 nghĩa là phương thức length( ) sẽ trả về độ dài xâu kí tự

- charAt
Ví dụ: String str1=new String(“”dantri.vn””);
           char ch=str1.charAt(3);
Kết quả là ch=’'n'’ nghĩa là phương thức charAt( 3) sẽ trả về kí tự thứ 3 tính từ vị trí thứ 0 trong xâu str1

- equals: phương thức này so sánh 2 chuỗi.kết quả trả về có kiểu Boolean
Ví dụ: String str1=new String(“”hello””);
           String str2=new String(“”ITOP””);
           boolean k=str1.equals(str2);

Kết quả trả về là k=false nghĩa là phương thức equals sẽ so sánh từng kí tự trong 2 chuỗi.

Chú ý là trong Java có phân biệt kiểu chữ hoa và chữ thường như:”iTop”#”ITOP”

- compareTo:
So sánh 2 chuỗi lần lượt thứ tự từng kí tự của 2 chuỗi nghĩa là: int
Ví dụ:
a=str1.compareTo(str2);
a=0 nếu s2=s1
a>0 nếu s2>s1
a<0 nếu s2<s1

Ví dụ: String str1=new String(“kc”);
           String str2=new String(“kavcb”);
           int a=str1.compareTo(str2);\\ kết quả là a>0 vì “kc”>”kavcb”

- toCharArray
Là phương thức đổi chuỗi thành mảng kí tự.

Ví dụ: String str1==new String(“itop.vn”);
           char [ ] ch=str1.toCharArray( ); //

//kết quả là mảng ch={‘i’,’t’,’o’,’p’,’.’,’v’,’n’}

- indexOf
Ví dụ:
        String str1=new String( “laptrinhmaytinh.net”);
        String str2=new String("lap");
        String str3=new String("may");
        int n=str1.indexOf(str2);
        int m=str1.indexOf(str3);
        //kết quả là n=0 và m=8 nghĩa là phương thức này sẽ trả về vị trí của chuỗi str2 và str3 trong chuỗi str1, nếu không tìm thấy sẽ trả về giá trị -1

- startsWith( )
Trả về giá trị kiểu Boolean

Ví dụ: String str1=”hoc.itop.vn”;
           String str2=”hoc”;
           boolean k=str1.startsWith(str2);

Kết quả là k=true nghĩa là phương thức này sẽ kiểm tra xem chuỗi một có bắt đầu bằng chuỗi 2 hay không

- endsWith( )
   Cũng như hàm startsWith( ) kết quả trả về là kiểu boolean.
Ví dụ: String str1=”"laptrinhmaytinh.net";
           String str2=”"vn"”;
           boolean k=str1.endsWith(str2);
           // Kết quả là k=false nghĩa là hàm này sẽ kiểm tra xem chuỗi str1 có kết thúc là chuỗi str2 hay không.

- copyValueOf( )
Phương thức này trả về một chuỗi được rút ra từ một mảng kí tự.

Ví dụ: char ch[ ]={‘a’,’b’,’c’,’d’,’e’};
           String str1=String.copyValueOf(2,2);
           //Kết quả là str1=”cd” nghĩa là xâu str1 được rút ra từ mảng ch bằng cách lấy 2 phần tử của mảng và lấy từ vị trí thứ 2.

- toUpperCase( )
 Phương thức này sẽ trả về chữ hoa của chuỗi

Ví dụ: String str1=”"hello”";
           String str2=str1.toUpperCase( );
           //Kết quả là str2 = "”HELLO”";

- toLowerCase( )
   Phương thức này sẽ trả về chữ thường của chuỗi

Ví dụ: String str1=”"Hello”";
           String str2=str1.toLowerCase( );
           //Kết quả là str2="”hello"”;

- Chuyển kiểu dữ liệu từ String sang số các phương thức chuyển kiểu dữ liệu từ String sang số nằm trong gói thư viện java.lang ta có bảng các phương thức như sau:


Ví dụ: String str1=new String(“124”);
           int n=Integer.parseInt(str1);
           //Kết quả là n=124

3. Ví dụ minh hoạ

Ví dụ 1:
- Yêu cầu: Viết chương trình nhập ký tự từ bàn phím
- Code:

import java.io.*;
/* gói này cung cấp thự viện xuất nhập hệ thống thông qua những luồng dữ //liệu và hệ thống file.*/
class InputChar
{
  public static void main(String args[])
  {
    char ch = ' ';
    try
   {
     ch = (char) System.in.read();
   }
   catch(Exception e)
  {
    System.out.println("Nhập lỗi!");
   }
   System.out.println("Ky tu vua nhap:" + ch);
  }
 }


Kết quả:
a
Ky tu vua nhap:a


Ví dụ 2: Nhập dữ liệu số

import java.io.*;
 class inputNum
 {
  public static void main(String[] args)
  {
    int n=0;
    try
    {
     BufferedReader in = new BufferedReader(new InputStreamReader(
     System.in));
     String s;
    s = in.readLine();
    n = Integer.parseInt(s);
  }
  catch(Exception e)
  {
   System.out.println(“Nhập dữ liệu bị lỗi !”);
  }
  System.out.println(“Bạn vừa nhập số:” + n);
 }
}

Ví dụ 3: Nhập và xuất giá trị các phần tử của một mảng các số nguyên.

class ArrayDemo
{
  public static void main(String args[])
  {
   int arrInt[] = new int[10];
   int i;
   for(i = 0; i < 10; i = i+1)
      arrInt[i] = i;
   for(i = 0; i < 10; i = i+1)
      System.out.println("This is arrInt[" + i + "]: " + arrInt[i]);
   }
 }

Ví dụ 4: Tìm phần tử có giá trị nhỏ nhất (Min) và lớn nhất (Max) trong một mảng.

//class tìm max, min - cách 1
public class MinMax
{
  public static void main(String args[])
  {
    int nums[] = new int[10];
    int min, max; nums[0] = 99; nums[1] = -10;
    nums[2] = 100123; nums[3] = 18; nums[4] = -978;
    nums[5] = 5623; nums[6] = 463;
    nums[7] = -9; nums[8] = 287;
    nums[9] = 49; min = max = nums[0];
    for(int i=1; i < 10; i++)
    {
      if(nums[i] < min) min = nums[i];
      if(nums[i] > max) max = nums[i];
     }
    System.out.println("min and max: " + min + " " + max);
  }
}

// class tìm max, min - cách 2
public class MinMax2
{
public static void main(String args[])
{
   int nums[] = { 99, -10, 100123, 18, -978, 5623, 463, -9, 287, 49 };
   int min, max;
   min = max = nums[0];
   for(int i=1; i < 10; i++)
   {
      if(nums[i] < min) min = nums[i];
      if(nums[i] > max) max = nums[i];
   }
   System.out.println("Min and max: " + min + " " + max);
 }
}

Ví dụ 5: Sắp xếp mảng dùng phương pháp sắp xếp nổi bọt (Bubble Sort)

public class BubbleSort
 {
  public static void main(String args[])
 {
   int nums[] = { 99, -10, 100123, 18, -978, 5623, 463, -9, 287, 49 };
   int a, b, t;
   int size;
   size = 10; // number of elements to sort
   // display original array
   System.out.print("Original array is:");
   for(int i=0; i < size; i++)
      System.out.print(" " + nums[i]);
   System.out.println();
   // This is the Bubble sort.
   for(a=1; a < size; a++)
       for(b=size-1; b >= a; b--)
        {
             if(nums[b-1] > nums[b])
               { // if ou of order
                  // exchange elements
                  t = nums[b-1];
                  nums[b-1] = nums[b];
                  nums[b] = t;
                 }
          }
// display sorted array
 System.out.print("Sorted array is:");
 for(int i=0; i < size; i++)
    System.out.print(" " + nums[i]);
  System.out.println();
 }
}

Ví dụ 6: Nhập và xuất giá trị của các phần tử trong một mảng hai chiều.

public class TwoD_Arr
{
   public static void main(String args[])
   {
      int t, i;
      int table[][] = new int[3][4];
      for(t=0; t < 3; ++t)
      {
           for(i=0; i < 4; ++i)
           {
              table[t][i] = (t*4)+i+1;
              System.out.print(table[t][i] + " ");
            }
            System.out.println();
        }
  }
}

// Xem thêm ví dụ về mảng tại đây 

 Lập trình Java - ĐH FPT

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

Đọc thêm các bài khác:

Bài 1: Chương trình JAVA đầu tiên
Bài 2: Các kiểu dữ liệu và toán tử trong
Bài 3: Các cấu trúc điều khiển trong Java
Bài 4 : Mảng và chuỗi trong Java
Bài 5: Lớp (class) và đối tượng (object) trong Java
Bài 6:Thừa kế (Inheritance) và đa hình (Polymorphism)
Ví dụ lập trình giao diện đồ họa với Java (GUI)
Ví dụ lập trình kết nối dữ liệu với Java (JDBC)
Ví dụ về lập trình Android 

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

Danh mục bài viết