Tổng quan
Như ở bài viết trước, chúng ta đã tìm hiểu chi tiết về ngôn ngữ lập trình Cadence của Flow Blockchain, lấy cảm hứng từ các ngôn ngữ lập trình đa năng hiện đại phổ biến như Swift, Kotlin và Rust. Việc sử dụng các loại tài nguyên của nó phù hợp với Move, ngôn ngữ lập trình được phát triển bởi nhóm Diem, và các blockchain thế hệ mới như Aptos, SUI,…
Trong bài viết ngày hôm nay, hãy cùng GFI khởi chạy hợp đồng thông minh đầu tiên nhé!
Transaction và Script
Transaction là một giao dịch hay lệnh gọi hàm có trả phí, mỗi transaction sẽ thay đổi dữ liệu trên Blockchain. Cách tính phí Transaction sẽ tùy thuộc vào Blockchain bạn đang sử dụng cũng như độ khó của giao dịch. Ví dụ trên mạng lưới Ethereum hay các blockchain EVM, sẽ có cách tính gas như sau:
- Gas Fee = Gas Limit * Gas Price per Unit
- Gas Limit là lượng gas người dùng sẵn sàng trả cho các hoạt động giao dịch thực hiện chức năng trên blockchain. Dự theo Ethereum Yellow Paper, Gas Limit thấp nhất trên Ethereum sẽ là 21000 (Cứ thực hiện một giao dịch mức tối thiểu là 21000).
- Gas Price per Unit là số tiền tính bằng đồng coin gốc của blockchain đó khi người dùng sẵn sàng chi cho mỗi đơn vị Gas (Gwei). Theo dõi Gwei tại đây.
- Ví dụ thực hiện một transaction trên Ethereum rẻ nhất với mức Gwei là 50
- Gas Fee = 21000 * 50 Gwei
- Phí giao dịch bằng 1,050,000 Gwei = ~0,00105 ETH.
Đối với một số Blockchain khác như Flow, NEAR sẽ có những cách tính khác, giá thành cũng sẽ rẻ hơn rất nhiều so với Ethereum.
Script được sử dụng để XEM dữ liệu trên Blockchain, chúng không thay đổi dữ liệu trên Blockchain và Script không tốn bất kỳ khoản phí nào.
Đây là quy trình làm việc trong điều kiện bình thường:
- Nhà phát triển sẽ “triển khai” Hợp đồng thông minh trên Blockchain.
- User chạy “Transaction” có trả phí để gọi một số chức năng trong Hợp đồng thông minh.
- Hợp đồng thông minh thay đổi dữ liệu.
- Front-end đọc thông tin trên Blockchain thông qua “Script” và kể quả về người dùng có thể xem sự thay đổi đó.
Mainnet và Testnet
TestNet là nơi mà các nhà phát triển kiểm tra các ứng dụng của họ trước khi phát hành ra Mainnet. Đây là nơi tìm ra các sai sót trong ứng dụng của bạn trước khi thực sự phát hành ra cộng đồng sử dụng. Dưới đây là một số lưu ý:
- Mọi thứ đều là giả lập
- Không sử dụng tiền thật
- Giao dịch tốn phí mạng testnet (không dùng tiền thật)
- Một cách hiệu quả để các nhà phát triển kiểm tra các hợp đồng và ứng dụng thông minh của họ trước khi phát hành ra cộng đồng
- Không xảy ra thiệt hại khi có lỗi xảy ra
MainNet là nơi mà mọi thứ đều là thật. Khi bạn phát hành ứng dụng của mình ra công chúng, bạn đưa nó lên MainNet. Trên MainNet, mọi thứ đều hoạt động trực tiếp, mọi phí đều là thật, sẽ có rủi ro và bạn phải đảm bảo mọi thứ hoạt động chính xác. Tương tự cũng có một số lưu ý:
- Mọi thứ đều là thật
- Giao dịch tốn phí và bằng tiền thật
- Chỉ khi nào ứng dụng của bạn đã hoàn toàn sẵn sàng, bạn mới đưa nó lên MainNet để cộng đồng tương tác.
- Xảy ra thiệt hại nếu gặp lỗi bảo mật
Flow Developer Playground
Flow Playground bao gồm trình chỉnh sửa và trình giả lập trong trình duyệt để thử nghiệm với mạng Flow. Sử dụng Flow Playground, bạn có thể viết các hợp đồng thông minh Cadence, triển khai chúng vào Blockchain mô phỏng Flow và gửi giao dịch.
Flow Playground phải tương thích với bất kỳ trình duyệt web tiêu chuẩn nào, nhưng chúng tôi khuyên bạn nên sử dụng Google Chrome với nó vì cho đến nay, nó đã được thử nghiệm và tối ưu hóa chỉ cho trình duyệt Chrome.
Accounts và Contracts
Phần Accounts ở bên trái màn hình là nơi liệt kê và chọn các tài khoản đang hoạt động, ví dụ: ‘0x01’. Một Account có thể có một hợp đồng thông minh được triển khai. Bạn có thể nhấp vào tab tài khoản để xem hợp đồng được liên kết với tài khoản đó trong trình chỉnh sửa chính.
Khi bạn code Cadence trong trình chỉnh sửa Account có chứa hợp đồng, bạn có thể nhấp vào nút triển khai ở trên cùng bên phải màn hình để triển khai hợp đồng đó cho tài khoản hiện được chọn.
Sau vài giây, bạn sẽ thấy một thông báo trong bảng điều khiển xác nhận rằng hợp đồng đã được triển khai. Bạn cũng sẽ thấy tên của hợp đồng hiển thị trong tab dành cho Account đó, cho biết tài khoản hiện đã triển khai hợp đồng đó.
Bạn cũng có thể chọn các giao dịch và tập lệnh từ menu lựa chọn bên trái và gửi chúng để tương tác với các hợp đồng thông minh đã triển khai của mình, sẽ được đề cập trong hướng dẫn Hello World.
Địa chỉ là gì?
Địa chỉ là thứ trông giống như 0x và sau đó là một loạt các số và chữ cái ngẫu nhiên. Đây là một địa chỉ mẫu trên Flow: 0xe5a8b7f23e8b548f. Trên Flow Playground, bạn sẽ thấy các địa chỉ ngắn hơn nhiều như 0x01. Đó chỉ là để làm cho mọi thứ đơn giản hơn.
Nhưng những gì thực sự LÀ một địa chỉ? Bạn có thể nghĩ mỗi địa chỉ như một người dùng. Khi tôi muốn làm gì đó trên blockchain, tôi cần phải có một tài khoản. Mỗi tài khoản có một địa chỉ được liên kết với nó. Vì vậy, khi bạn thấy một cái gì đó như 0xe5a8b7f23e8b548f, đó thực sự chỉ là tài khoản của một người mà họ sử dụng để lưu trữ dữ liệu, gửi giao dịch, v.v.
Hợp đồng thông minh chạy ở đâu?
Hợp đồng thông minh là tài khoản được triển khai (deployed). Như đã đề cập ở trên, các tài khoản do người dùng sở hữu và mọi tài khoản đều có một địa chỉ được liên kết với nó luôn bắt đầu bằng 0x.
Trong trường hợp này, vì chúng ta đang ở trên Flow Playground nên nó đã tự động cấp cho người dùng 5 tài khoản, cụ thể là 0x01, 0x02, v.v. Do đó, Hợp đồng thông minh chạy tại một địa chỉ. Vì vậy, khi chúng ta triển khai một hợp đồng có tên “Hello World” cho tài khoản 0x01, đó là cách chúng ta xác định nó. Nếu muốn tương tác, chúng ta sẽ phải biết cả tên của hợp đồng và địa chỉ.
Hello, World!
Trong trường hợp này, chúng ta sẽ triển khai Hợp đồng thông minh của mình cho tài khoản 0x01. Điều này có nghĩa là tài khoản 0x01 là chủ sở hữu của Hợp đồng thông minh này. Trong đời thực, bạn sẽ triển khai Hợp đồng thông minh cho tài khoản của mình, nhưng vì đây là thế giới giả lập, chúng tôi có thể chọn bất kỳ tài khoản nào chúng tôi muốn, vì vậy chúng tôi đã chọn 0x01.
pub contract HelloWorld { init() { } }
Phần pub contract [contract name]
sẽ LUÔN là nội dung bạn nhập khi tạo hợp đồng mới. Bạn có thể điền tên hợp đồng với bất cứ thứ gì bạn muốn gọi là hợp đồng của mình.
Hàm init() là một hàm mà mọi hợp đồng đều PHẢI có. Nó được gọi khi Hợp đồng được triển khai lần đầu, trong thực tế, chỉ xảy ra 1 lần. Vì vậy, chúng tôi có thể khởi tạo một số nội dung trong đó khi chúng ta muốn.
Đây là Hợp đồng thông minh đầu tiên của bạn, mặc dù nó không làm gì cả ; (Hãy làm cho nó lưu trữ một biến Hello Wỏld để chúng ta có thể lưu trữ một số dữ liệu trong hợp đồng này.)
pub contract HelloWorld { pub let loichao: String init() { self.loichao = "Hello, World!" } }
Trong Cadence, khi bạn khai báo một biến, bạn tuân theo định dạng sau:
[access modifier] [var/let] [variable name]: [type]
Sử dụng ví dụ ở trên …
- access modifier (quyền truy cập) là
pub
, có nghĩa là bất kỳ ai cũng có thể đọc biến này. Trong tương lai, chúng ta sẽ thấy nhiều quyền truy cập khác. let
có nghĩa là biến (var) này là một hằng số (constant). Nếu bạn đã biết các ngôn ngữ lập trình khác, một hằng số có nghĩa là một khi chúng ta đặt biến này bằng một thứ gì đó, thì chúng ta không thể thay đổi nó. Mặt khác, var có nghĩa là chúng ta có thể thay đổi nó.- Tên biến là
loichao
- Loại biến là
String
. Điều này có nghĩa là chúng ta có thể đặt những ký tự như “Xin chào”, “Tôi yêu GFI”, “Flow Blockchain là số 1”.
Tiếp theo, chúng ta đặt self.loichao = "Hello, World!"
bên trong hàm init()
. Luôn nhớ rằng, chắc năng init()
được gọi khi hợp đồng lần đầu được triển khai (deployed), điều này chỉ xảy ra một lần. self
là từ khóa có nghĩa là “biến nằm trên một lớp”. Trong trường hợp này, self.loichao
đề cập tới biến loichao
mà chúng ta đã khai báo ngay phía trên, được gán với “Hello, World!”
Để triển khai hợp đồng này, hãy nhấp vào nút “Deploy” màu xanh lục. Trang của bạn sẽ trông như thế này:
LƯU Ý: Nếu bạn gặp lỗi, trước tiên hãy tải lại trang. Nếu bạn vẫn thấy các lỗi như: “Lỗi GraphQL”, hãy thử chuyển trình duyệt của bạn sang Google Chrome.
Tuyệt vời!!! Bạn đã triển khai Hợp đồng thông minh đầu tiên của mình.
Đọc dữ liệu từ Blockchain
Hãy đảm bảo rằng biến loichao
của bạn thực sự được đặt thành “Hello, World!”. Hãy nhớ rằng, chúng ta có thể xem dữ liệu từ Blockchain bằng Script.
Ở phía bên trái, bên dưới “Script Templates”, nhấp vào tab có nội dung “Script” và xóa mọi thứ bên trong đó. Tiếp theo, viết đoạn mã sau:
import HelloWorld from 0x01 pub fun main(): String { return HelloWorld.loichao }
Đoạn Script này sẽ trả về giá trị của loichao, đó là “Hello, World!” Để làm được điều đó, hãy xem những gì chúng ta đã làm:
- Đầu tiên, chúng ta đã nhập Hợp đồng thông minh của mình bằng
import HelloWorld from 0x01
. Trong Cadence, bạn nhập hợp đồng bằng cách nhập [tên hợp đồng] từ [địa chỉ của hợp đồng đó]. Bởi vì chúng tôi đã triển khai HelloWorld thành 0x01 như trên - Tiếp theo, chúng ta viết chức năng. Trong Cadence, bạn viết một hàm bằng cách thực hiện
[access modifier] fun [function name](): [return type] { ... }
. Trong trường hợp này, chúng ta sử dụngpub
choaccess modifier
, tên hàm làmain
và trả giá trị về làString
. - Sau đó, chúng ta đã truy cập biến
loichao
từ hợp đồng bằng cách sử dụngHelloWorld.loichao
.
Khi bạn click vào “Execute” ở phía bên phải, bạn sẽ thấy dưới phần terminal hiển thị “Hello, World!”
Tổng kết
Hãy nhớ rằng Hợp đồng thông minh vừa là chương trình vừa là quyển sách có quy tắc (rulebooks). Chúng cho phép chúng ta làm một số việc nhất định, không hơn không kém. Trong ví dụ này, Hợp đồng thông minh của chúng ta cho phép khởi tạo lời chào và đọc lời chào.
Lưu ý rằng nó KHÔNG cho phép chúng ta thay đổi lời chào thành một lời khác. Nếu chúng ta muốn thêm chức năng đó, chúng tôi sẽ phải làm điều đó trước khi triển khai hợp đồng.
Đây là lý do tại sao điều quan trọng là với tư cách là nhà phát triển Hợp đồng thông minh, bạn triển khai tất cả chức năng mà bạn muốn người dùng có trước khi triển khai hợp đồng. Bởi vì sau khi bạn triển khai, bạn không thể làm gì được. (Tất nhiên, trên Flow Playground vì là giả lập nên có thể triển khai lại hợp đồng. Nhưng một khi đã mainnet, bạn không thể làm điều này.)