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:
- 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ứcgas
để giao dịch được xử lý nhanh hơn. - 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ọ.
- 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.
- 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 //
và /* */
// 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
}