1. Căn bản về Blockchain

1.1. Blockchain là gì?

Blockchain là một sổ phân tích và không thể thay đổi, ghi lại tất cả các giao dịch xảy ra trên một mạng. Mỗi khối trong chuỗi chứa một số lượng giao dịch được mã hóa, và khi một khối mới được tạo ra, nó được liên kết với khối trước đó, tạo thành một chuỗi liên kết không thể bị thay đổi mà không bị phát hiện.

Điều này đảm bảo tính minh bạch và an toàn cao, vì thông tin không thể bị thay đổi hoặc xóa một cách dễ dàng mà không có sự đồng thuận của mạng, làm cho blockchain trở thành công nghệ nền tảng cho các ứng dụng như tiền điện tử và hợp đồng thông minh.

1.2. Đồng thuận Kaia

Cơ chế đồng thuận: Sử dụng thuật toán Istanbul BFT, một phiên bản cải tiến của PBFT (Practical Byzantine Fault Tolerance) được ưu tiên tối ưu cho mạng blockchain.

Tiêu đề mục:
  • Khả năng xử lý 4.000 giao dịch mỗi giây.
  • Khả năng hoàn thành giao dịch ngay lập tức.
  • Thời gian tạo khối 1 giây.
  • Hỗ trợ hơn 50 nút đồng thuận tham gia vào quá trình.
Loại nút:
  • CN (Consensus Node): Được quản lý bởi CCO (Core Cell Operator) và chịu trách nhiệm tạo ra các khối.
  • PN (Proxy Node): Cung cấp giao diện cho mạng.
  • EN (Endpoint Node): Cung cấp dịch vụ cho người dùng cuối cùng.
Quá trình đồng thuận:

Khi một giao dịch được gửi đến CN (hội đồng) từ PN, VRF (Chức năng ngẫu nhiên có thể xác minh) chức năng được sử dụng để chọn ngẫu nhiên 1 Ủy ban bao gồm 4 CNs. 1 CN sẽ tiếp tục được chọn ngẫu nhiên để tạo ra một khối cùng với quan điểm của 3 CNS khác. Khi một khối được tạo ra, 2/3 số CNS trong hội đồng sẽ phải là ký khối để đạt được sự đồng thuận.

1.3. KLVM

KLVM, viết tắt của Kaia Virtual Machine, là một môi trường máy ảo phi tập trung chạy trên mạng blockchain Kaia. KLVM cho phép việc thực thi các hợp đồng thông minh, là những chương trình tự động thực hiện các giao dịch hoặc các hành động cụ thể dựa trên các điều kiện đã được mã hóa trước. Hợp đồng thông minh được viết bằng các ngôn ngữ lập trình như Solidity, sau đó được biên dịch thành bytecode mà KLVM có thể hiểu và thực thi. KLVM tương thích với EVM của Ethereum nên hỗ trợ hoàn toàn các công cụ phát triển, opcode, và mã nguồn hiện tại.

1.4. Smart contract là gì?

Smart contract là một dạng chương trình máy tính được thiết kế để tự động thực hiện, kiểm soát, hoặc xác nhận các sự kiện và hành động theo các điều khoản đã được lập trình sẵn. Chúng tồn tại và hoạt động trên Kaia, đảm bảo tính minh bạch và bảo mật cao do không thể bị sửa đổi sau khi đã triển khai. Smart contract giúp tự động hóa các quy trình, giảm bớt sự cần thiết của trung gian và giảm thiểu rủi ro lừa đảo hoặc sai sót. Chúng rất linh hoạt và có thể được sử dụng trong nhiều lĩnh vực khác nhau, từ tài chính và bảo hiểm đến quản lý chuỗi cung ứng và bất động sản. Sự phát triển của smart contract đang mở ra một kỷ nguyên mới trong cách thức tương tác và thực hiện các giao dịch kỹ thuật số, mang lại hiệu quả, minh bạch và tự chủ lớn hơn cho người dùng.

1.5. Transaction và cách ký Transaction

Trong mạng lưới Kaia, "transaction" hoặc giao dịch là một hành động được thực hiện bởi người dùng để chuyển KAIA (Kaia) hoặc các token trên Kaia từ địa chỉ này sang địa chỉ khác, hoặc để tương tác với các hợp đồng thông minh (smart contract). Mỗi giao dịch bao gồm các thông tin như địa chỉ nguồn, địa chỉ đích, số lượng tiền được chuyển, gas (phí giao dịch) và dữ liệu tùy chọn nếu giao dịch tương tác với hợp đồng thông minh.

Khi thực hiện giao dịch trên Kaia, việc ký giao dịch bằng ví crypto như Kaikas là bước quan trọng để đảm bảo tính an toàn và bảo mật. Cụ thể, quá trình này diễn ra như sau:

  1. Tạo Giao Dịch: Người dùng nhập các thông tin cần thiết cho giao dịch như địa chỉ nhận, số lượng KAIA hoặc token cần chuyển, và gas. Trong ví dụ như Kaikas, người dùng có thể điều chỉnh mức gas để giao dịch được xử lý nhanh hơn.
  2. Ký Giao Dịch: Sau khi thông tin giao dịch được nhập, ví sẽ tạo ra một giao dịch kỹ thuật số được ký bằng khóa riêng của người dùng. Việc ký giao dịch này chứng minh rằng người dùng có quyền sử dụng địa chỉ từ đó giao dịch được gửi đi mà không cần tiết lộ khóa riêng của họ.
  3. Gửi Giao Dịch: Giao dịch đã ký sau đó sẽ được gửi tới mạng lưới Ethereum thông qua ví như MetaMask. Mạng lưới sẽ xác nhận giao dịch và thực hiện nó, chuyển tiền hoặc tương tác với hợp đồng thông minh như đã yêu cầu.
  4. Xác Nhận Giao Dịch: Cuối cùng, giao dịch sẽ được xác nhận bởi mạng lưới, và thông tin về nó sẽ được ghi lại trên blockchain. Người dùng có thể theo dõi trạng thái của giao dịch thông qua các công cụ trực tuyến như Klaytnscope, Kaiascan.

Quá trình này không chỉ giúp đảm bảo giao dịch được thực hiện một cách an toàn mà còn giúp ngăn chặn việc giả mạo hoặc thay đổi giao dịch một cách không phép, nhờ vào sự minh bạch và không thể thay đổi của blockchain.

2. Bố cục của một file Solidity

2.1. SPDX License Identifier

Tất cả Solidity contract nên có khai báo license ở dòng đầu tiên

// SPDX-License-Identifier: MIT

Danh sách giấy phép từ kho SPDX: https://spdx.org/licenses/

2.2. Pragmas

pragma là keyword dùng để khai báo phiên bản compiler của Solidity. pragma chỉ áp dụng cho file local hiện tại nên bạn phải thêm pragma vào tất cả file trong thư mục dự án.

// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

Có thể dùng dấu ^ hoặc toán tử so sánh <, <=, >, >= chung với khai báo compiler

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20; // use compiler version 0.8.20 and above
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0; // use compiler version bigger or equal to 0.4.22 and less than 0.9.0

2.3. Import những file nguồn khác

Import toàn bộ file

import "FileName"

Gán tên cho tất cả

import * as symbolName from "FileName";

Name import

Name import nghĩa là bạn sẽ chỉ định tên của import object từ file khác. Lý do bạn nên dùng phương án này là nó giúp code bạn rõ ràng hơn.

import {ContractOne as alias, ContractTwo} from "FileName";

2.4. Comment

Để comment thì bạn có thể dùng ///* */

// comment for 1 line.

/*
Comment for
multiple lines
*/

Ngoài ra còn có NatSpec comment bằng /// hoặc /** **/

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;

/// @author The Project Team
/// @title A simple storage example
contract SimpleStorage {
    uint storedData;

    /// Store `x`.
    /// @param x the new value to store
    /// @dev stores the number in the state variable `storedData`
    function set(uint x) public {
        storedData = x;
    }

    /// Return the stored value.
    /// @dev retrieves the value of the state variable `storedData`
    /// @return the stored value
    function get() public view returns (uint) {
        return storedData;
    }
}

3. Bố cục của một Contract

3.1. State variables

State variable là những biến được khai báo ở đầu contract, ngoài scope của những local variable được khai báo trong function.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;

contract SimpleStorage {
    uint storedData; // State variable
    // ...
}

3.2. Functions

Function là những hàm được khai báo để thực hiện những phép tính, thay đổi giá trị của biến, v.v... Một function mẫu có ở bên dưới.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.1 <0.9.0;

contract SimpleAuction {
    function bid() public payable { // Function
        // ...
    }
}

// Helper function defined outside of a contract
function helper(uint x) pure returns (uint) {
    return x * 2;
}

3.3. Function modifiers

Function modifier là những khai báo cho function để tạo ra những điều kiệu chạy các action của function đó.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.22 <0.9.0;

contract Purchase {
    address public seller;

    modifier onlySeller() { // Modifier
        require(
            msg.sender == seller,
            "Only seller can call this."
        );
        _;
    }

    function abort() public view onlySeller { // Modifier usage
        // ...
    }
}

3.4. Event

event is a feature for recording smart contract activities. event is often used in building interactive UI with smart contracts.event là một tính năng phục vụ cho việc ghi chú lại những hoạt động của smart contract.event hay được sử dụng trong việc xây dựng UI tương tác với smart contract.

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.22;

event HighestBidIncreased(address bidder, uint amount); // Event

contract SimpleAuction {
    function bid() public payable {
        // ...
        emit HighestBidIncreased(msg.sender, msg.value); // Triggering event
    }
}

3.5. Errors

error được sử dụng để thông báo cho người dùng tại sao hành động thất bại và error có chi phí gas thấp hơn trả về string.

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;

/// Not enough funds for transfer. Requested `requested`,
/// but only `available` available.
error NotEnoughFunds(uint requested, uint available);

contract Token {
    mapping(address => uint) balances;
    function transfer(address to, uint amount) public {
        uint balance = balances[msg.sender];
        if (balance < amount)
            revert NotEnoughFunds(amount, balance);
        balances[msg.sender] -= amount;
        balances[to] += amount;
        // ...
    }
}

3.6. Struct types

struct được sử dụng để khai báo một type của object.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;

contract Ballot {
    struct Voter { // Struct
        uint weight;
        bool voted;
        address delegate;
        uint vote;
    }
}

3.7. Enum types

enum được sử dụng để khai báo 1 type mà các giá trị là constant.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;

contract Purchase {
    enum State { Created, Locked, Inactive } // Enum
}