Tổng quan

Flow Blockchain là một nền tảng blockchain được thiết kế để hỗ trợ các ứng dụng phi tập trung (dApp) có tính năng mạnh mẽ, trải nghiệm người dùng tốt và khả năng mở rộng cao. Để đạt được mục tiêu này, Flow sử dụng một ngôn ngữ lập trình gọi là Cadence, được thiết kế đặc biệt cho việc xây dựng các ứng dụng trên blockchain.

Trong Flow Blockchain, Resource là một khái niệm quan trọng giúp đảm bảo tính riêng tư, an toàn và bảo mật cho người dùng. Resource là một loại đối tượng Cadence mà các nhà phát triển sử dụng để mô tả các tài sản, quyền lợi và quyền sở hữu trong các ứng dụng của họ.

Chi tiết về ngôn ngữ Cadence

Một số tính năng nổi bật của Resource trong Flow:

  1. Resource là các đối tượng duy nhất: Mỗi Resource đều có một thực thể duy nhất trong hệ thống. Điều này đảm bảo tính toàn vẹn và độc nhất của tài sản, ngăn chặn việc sao chép hoặc tạo ra các bản sao không mong muốn.
  2. Resource có thể chuyển đổi: Chủ sở hữu của Resource có thể chuyển quyền sở hữu sang người khác thông qua việc giao dịch. Điều này cho phép các tài sản được trao đổi, mua bán hoặc chuyển nhượng giữa các bên.
  3. Resource được bảo vệ bởi quyền truy cập: Flow đảm bảo rằng chỉ chủ sở hữu có quyền truy cập và thao tác với Resource của họ. Điều này giúp ngăn chặn việc truy cập trái phép, giữ cho tài sản an toàn.
  4. Resource có thể được lưu trữ: Người dùng có thể lưu trữ Resource trong các tài khoản Flow của họ thông qua các kho lưu trữ (Storage) và kết nối (Link) riêng biệt. Điều này giúp theo dõi và quản lý tài sản một cách dễ dàng và an toàn.
Flow Resource
Flow Resource

Ví dụ về Resource

pub contract SimpleToken {
    pub resource Token {
        pub var balance: UFix64

        init(balance: UFix64) {
            self.balance = balance
        }

        pub fun transfer(to: &AnyResource{Receiver}, amount: UFix64) {
            self.balance = self.balance - amount
            to.deposit(amount: amount)
        }
    }

    pub resource Receiver {
        pub fun deposit(amount: UFix64) {
            let receiver = getAccount(self.owner).getCapability(/public/TokenReceiver).borrow<&SimpleToken.Token>()!
            receiver.balance = receiver.balance + amount
        }
    }

    pub fun createToken(balance: UFix64): @Token {
        return <-create Token(balance: balance)
    }
}

Đoạn code trên là một smart contract đơn giản cho một loại token được gọi là SimpleToken.

Trong đó, có hai loại resource được định nghĩa là Token và Receiver. Resource Token đại diện cho một lượng tiền mà người dùng có thể sở hữu và chuyển đổi, còn Resource Receiver đại diện cho một tài khoản nhận tiền.

Trong resource Token, có một hàm transfer được định nghĩa để chuyển tiền từ tài khoản này sang tài khoản khác. Khi được gọi, hàm này sẽ giảm số dư tài khoản gọi nó (self.balance) theo số tiền được chuyển đi (amount), sau đó gửi số tiền đó tới tài khoản nhận (to.deposit(amount: amount)).

Trong resource Receiver, có một hàm deposit để nhận tiền từ tài khoản khác. Khi được gọi, hàm này sẽ lấy tài khoản thuộc tính của đối tượng (getAccount(self.owner).getCapability(/public/TokenReceiver)) và thực hiện việc ghi nhận số tiền được gửi vào tài khoản này (receiver.balance = receiver.balance + amount).

Cuối cùng, có một hàm createToken được định nghĩa để tạo ra một đối tượng Token mới với số dư được cung cấp và trả về đối tượng Token đó.

Resource vs Structs

Trong Cadence, các struct đơn giản chỉ là các bộ chứa dữ liệu. Bạn có thể sao chép chúng, ghi đè chúng và tạo chúng bất cứ lúc nào. Tất cả những điều này hoàn toàn không đúng đối với resource. Dưới đây là một số sự thật quan trọng định nghĩa resource:

  • Chúng không thể được sao chép
  • Chúng không thể bị mất (hoặc bị ghi đè)
  • Chúng không thể được tạo bất cứ lúc nào bạn muốn
  • Bạn phải rất rõ ràng về cách xử lý một resource (ví dụ: di chuyển chúng)
  • Resources khó xử lý hơn rất nhiều

Hãy xem một số đoạn code dưới đây để hiểu về resources:

pub contract Test {

    pub resource Greeting {
        pub let message: String
        init() {
            self.message = "Hello, Mars!"
        }
    }

    pub fun createGreeting(): @Greeting {
        let myGreeting <- create Greeting()
        return <- myGreeting
    }
}

Ở đây có rất nhiều điều quan trọng đang xảy ra, vì vậy chúng ta hãy xem chúng theo từng bước:

  1. Chúng ta khởi tạo một kiểu resource có tên là Greeting chứa một trường dữ liệu là message. Bạn đã biết điều này.
  2. Chúng ta định nghĩa một hàm có tên là createGreeting trả về một resource Greeting. Lưu ý rằng trong Cadence, các resource sử dụng ký hiệu @ trước kiểu dữ liệu để đánh dấu “đây là một resource”.
  3. Chúng ta tạo một kiểu Greeting mới với từ khóa create và gán nó cho myGreeting bằng toán tử “<-” “move”. Trong Cadence, bạn không thể đơn giản sử dụng dấu “=” để đưa một resource vào đâu đó. BẠN PHẢI sử dụng toán tử “<-” “move” để di chuyển resource một cách rõ ràng.
  4. Chúng ta trả về Greeting mới bằng cách di chuyển resource một lần nữa đến giá trị trả về.

Điều này rất tuyệt, nhưng nếu chúng ta muốn hủy một resource thì sao? Chúng ta có thể làm điều đó khá dễ dàng:

pub contract Test {

    pub resource Greeting {
        pub let message: String
        init() {
            self.message = "Hello, Mars!"
        }
    }

    pub fun makeAndDestroy() {
        let myGreeting <- create Greeting()
        destroy myGreeting 
    }
}

Vậy tại sao điều này lại hữu ích? Liệu điều này có phải là điều rất rắc rối không? Thực sự điều này rất hữu ích. Hãy tưởng tượng chúng ta muốn tặng cho ai đó một NFT trị giá hàng tỷ đô la. Chúng ta có muốn đảm bảo rằng chúng ta sẽ không mất NFT đó? Thật sự chắc chắn? Chúng ta có thể làm điều này trong Cadence vì nó rất rất rất khó để mất Resource của chúng ta trừ khi chúng ta ĐƯỢC LÀM VIỆC LÀ HỦY nó. Điều này phù hợp với chủ đề chung trong Cadence: Cadence làm cho việc làm sai của nhà phát triển rất khó. Điều này là tốt.

Sau đây là một tóm tắt về sự khác biệt giữa chúng:

  • Structs là các bộ chứa dữ liệu. Chỉ vậy thôi.
  • Resources là các bộ chứa dữ liệu cực kỳ an toàn, khó mất, không thể sao chép, được theo dõi chặt chẽ và không thể bị mất.

Cộng đồng hệ sinh thái Flow Việt Nam