Bài viết
Chia sẻ kiến thức của bạn.

Nắm vững các khái niệm ngôn ngữ Move - Khóa học #2
Trong khiKhóa học #1 tôi đã thực hiện trước đây đã giới thiệu cho bạn những điều cơ bản về việc viết hợp đồng thông minh trong Move và xây dựng DApps đơn giản trên blockchain Sui, khóa học này tập trung vào việc đào sâu hiểu biết của bạn về chính ngôn ngữ Move**- từ hệ thống loại mạnh mẽ của nó đến các mẫu nâng cao như generic, sự kiện, mô-đun và cơ chế kiểm soát truy cập.
Vào cuối khóa học này, bạn sẽ có thể:
- Viết mã Move mô-đun, có thể tái sử dụng và an toàn
- Sử dụng thuốc generic, khả năng và loại tài nguyên một cách hiệu quả
- Thực hiện kiểm soát truy cập chi tiết bằng cách sử dụng các khả năng
- Phát ra và nghe các sự kiện để tích hợp ngoài chuỗi
- Làm việc với các cấu trúc dữ liệu phức tạp như bảng và vectơ
- Hiểu cách Move khác với các ngôn ngữ hợp đồng thông minh khác như Solidity
Hãy đi sâu vào trung tâm của ngôn ngữ Move!
Bước 1: Hiểu các tính năng ngôn ngữ cốt lõi của Move
Move được thiết kế với sự an toàn và rõ ràng trong tâm trí. Hãy khám phá một số tính năng quan trọng nhất làm cho Move trở nên độc đáo như một ngôn ngữ hợp đồng thông minh.
1.1 Lập trình định hướng tài nguyên (Đã xem xét lại)
Cốt lõi của Move là khái niệmtài liệu, là những loại đặc biệt không thể sao chép hoặc xóa trừ khi được phép rõ ràng. Điều này thực thi việc xử lý an toàn các tài sản kỹ thuật số như mã thông báo hoặc NFT.
module examples::token {
use sui::object::{Self, UID};
struct MyToken has key, store {
id: UID,
value: u64,
}
public fun mint(ctx: &mut TxContext): MyToken {
MyToken {
id: object::new(ctx),
value: 100,
}
}
}
Trong ví dụ này:
MyToken
- key
là mộttài lượngvì nó có khả năng.
- Nó có thể được lưu trữ (
store
) và được xác định duy nhất bởi nóid
. - Nó không thể được sao chép hoặc loại bỏ trừ khi được chỉ định.
Điều này đảm bảo rằng mỗi phiên MyToken
bản được sở hữu và quản lý duy nhất, ngăn chặn sự sao chép hoặc xóa vô tình.
1.2 Hệ thống khả năng
Mỗi loại trong Move đều có một tập hợp cáckínhxác định những thao tác mà nó hỗ trợ:
Khả năng | Ý nghĩa |
---|---|
copy | Có thể được nhân đôi |
drop | Có thể bị loại bỏ mà không bị phá hủy |
store | Có thể được lưu trữ trong kho lưu trữ toàn cầu |
key | Có thể được sử dụng như một cấu trúc với một trường ID (tức là một đối tượng) |
Ví dụ:
struct Example has copy, drop { value: u64 }
Hiểu được những khả năng này là điều cần thiết để thiết kế các hợp đồng thông minh an toàn và có thể dự đoán được.
Tại sao khả năng quan trọng
Khả năng thực thi các quy tắc nghiêm ngặt tại thời điểm biên dịch. Ví dụ:
- Một cấu trúc chỉ có
key
vàstore
không thể sao chép hoặc bỏ đi. - Bạn không thể trả về một cấu trúc không thể thả từ một hàm trừ khi nó được lưu trữ hoặc chuyển.
Điều này ngăn chặn các lỗi như chi tiêu gấp đôi hoặc mất token vô tình.
1.3 Thông số chung và loại
Move hỗ trợ các loại chung, cho phép các nhà phát triển viết mã linh hoạt và có thể tái sử dụng.
module examples::storage {
use sui::object::{Self, UID};
struct Box<phantom T> has key {
id: UID,
content: T,
}
public fun new_box<T>(ctx: &mut TxContext, content: T): Box<T> {
Box {
id: object::new(ctx),
content,
}
}
}
Đây <T>
là mộttham số kiểu, giúp làm Box
việc với bất kỳ loại nào trong khi vẫn an toàn và hiệu quả.
Lưu ý: Từ
phantom
khóa chỉ ra rằng điều đóT
không ảnh hưởng đến biểu diễn thời gian chạy của cấu trúc - hữu ích cho mô hình hóa trừu tượng.
Bước 2: Phát triển mô-đun và quản lý gói
Khi các dự án Move của bạn ngày càng phức tạp, việc tổ chức mã của bạn trở nên quan trọng.
2.1 Tạo và xuất bản gói di chuyển
Gói di chuyểnchứa một hoặc nhiều mô-đun và xác định các phụ thuộc. Đó là đơn vị triển khai và quản lý phiên bản trong Move.
Cấu trúc thư mục:
sources/
place.move
user.move
Move.toml
Move.toml
Xác định các phụ thuộc trong:
[dependencies]
Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework" }
MyLibrary = { local = "../my-library" }
Bạn có thể xuất bản các gói lên mạng Sui và sử dụng lại chúng trên nhiều DApp.
2.2 Tái sử dụng các mô-đun hiện có
coin``transfer``tx_context
Sui Frameworkcung cấp các mô-đun đã được thử nghiệm trong trận chiến như,, và. Luôn luôn kiểm tra những gì có sẵn trước khi viết logic tùy chỉnh.
Ví dụ: để chuyển một đối tượng:
use sui::transfer;
public entry fun send_place(place: Place, recipient: address) {
transfer::public_transfer(place, recipient);
}
Sử dụng các thư viện tiêu chuẩn đảm bảo an toàn hơn, phát triển nhanh hơn và khả năng tương tác tốt hơn.
Bước 3: Sự kiện và giao tiếp ngoài chuỗi
Để xây dựng các ứng dụng trong thế giới thực, hợp đồng Move của bạn cần giao tiếp với các hệ thống ngoài chuỗi như frontend hoặc trình lập chỉ mục.
3.1 Sự kiện phát ra
Move cho phép phát rasự kiệncó thể được lập chỉ mục bởi các dịch vụ bên ngoài.
use sui::event;
struct PlaceCreated has drop {
name: String,
}
public fun emit_place_created(name: String) {
event::emit(PlaceCreated { name });
}
Sự kiện này sẽ xuất hiện trên blockchain và có thể được chọn bởi các nhà thám hiểm hoặc các công cụ lập chỉ mục.
3.2 Lắng nghe sự kiện
Sử dụng các công cụ nhưSuiet Explorer,Subsquidhoặc API Sui JSON-RPC để lắng nghe các sự kiện phát ra và phản ứng tương ứng trong ứng dụng của bạn.
Trong JavaScript/TypeScript:
import { JsonRpcProvider } from '@mysten/sui.js';
const provider = new JsonRpcProvider('https://fullnode.devnet.sui.io');
const events = await provider.getEvents({
MoveEventType: '0x...::example::PlaceCreated'
});
Bước 4: Kiểm soát truy cập và các mẫu bảo mật
Bảo mật là tối quan trọng khi xử lý các hợp đồng thông minh. Move cung cấp một số công cụ để thực hiện kiểm soát truy cập mạnh mẽ.
4.1 Mô hình sở hữu đối tượng
Sui thực thi quyền sở hữu ở cấp giao thức. Chỉ chủ sở hữu của một đối tượng mới có thể đột biến hoặc chuyển nó.
public entry fun update_name(sweet_place: &mut SweetPlace, new_name: String) {
sweet_place.name = new_name;
}
Chỉ chủ sở hữu hiện tại mới có thể gọi hàm này.
4.2 Mẫu khả năng
Để có quyền chi tiết hơn, hãy sử dụngmẫu khả năng- tạo các đối tượng đặc biệt cấp quyền truy cập hạn chế vào một số chức năng nhất định.
struct AdminCap has key { id: UID }
public entry fun grant_admin_cap(ctx: &mut TxContext) {
let cap = AdminCap { id: object::new(ctx) };
transfer::public_transfer(cap, tx_context::sender(ctx));
}
public entry fun restricted_action(_: &AdminCap) {
// perform admin action
}
Bây giờ chỉ những người dùng nắm giữ mới AdminCap
có thể thực thirestricted_action
.
Mô hình này được sử dụng rộng rãi trong DeFi và DAO để ủy quyền một cách an toàn.
Bước 5: Làm việc với cấu trúc dữ liệu phức tạp
Move hỗ trợ các kiểu dữ liệu có cấu trúc cho phép các nhà phát triển mô hình hóa logic và các mối quan hệ phức tạp.
5.1 Vectơ
Vectơ được sử dụng để lưu trữ các bộ sưu tập có thứ tự của các mặt hàng cùng loại.
let names = vector[String::utf8(b"Alice"), String::utf8(b"Bob")];
Chúng hữu ích để lưu trữ danh sách NFT, vai trò người dùng hoặc siêu dữ liệu động.
Ví dụ sử dụng:
vector::push_back(&mut names, String::utf8(b"Charlie"));
5.2 Bảng (thông qua Thư viện Tiêu chuẩn Sui)
Mặc dù Move không hỗ trợ bản đồ hoặc bảng băm, Sui cung cấp Table
loại trong thư viện tiêu chuẩn của nó.
use sui::table::{Self, Table};
struct Registry has key {
id: UID,
entries: Table<u64, String>,
}
public fun add_entry(registry: &mut Registry, key: u64, value: String) {
table::add(&mut registry.entries, key, value);
}
Sử dụng các bảng để quản lý các bộ dữ liệu lớn một cách hiệu quả.
Bước 6: Kiểm tra và gỡ lỗi hợp đồng của bạn
Kiểm tra đảm bảo mã Move của bạn hoạt động như mong đợi trong các điều kiện khác nhau.
6.1 Kiểm tra đơn vị khi di chuyển
Viết các bài kiểm tra đơn vị trực tiếp trong các mô-đun Move của bạn bằng cách sử dụng khung thử nghiệm.
#[test]
public fun test_create_sweet_place() {
let ctx = tx_context::dummy();
create_sweet_place(&mut ctx, String::utf8(b"My House"));
}
Chạy thử nghiệm với:
sui move test
6.2 Sử dụng Sui Explorer
Sau khi triển khai hợp đồng của bạn, hãy sử dụng Sui Explorer để kiểm tra giao dịch, xem trạng thái đối tượng và gỡ lỗi các vấn đề.
Bước 7: Các ứng dụng trong thế giới thực của các khái niệm di chuyển nâng cao
Bây giờ bạn đã hiểu các tính năng ngôn ngữ cốt lõi, hãy khám phá cách chúng áp dụng cho các kịch bản trong thế giới thực.
7.1 Nền tảng đúc NFT
Tạo một nền tảng cho phép người dùng đúc các NFT được hỗ trợ bởi tài nguyên Move, tận dụng các mô hình quyền sở hữu và tài nguyên.
7.2 Hệ thống bỏ phiếu DAO
Triển khai một tổ chức tự trị phi tập trung (DAO) sử dụng Move để bỏ phiếu, đề xuất và quản trị, sử dụng các sự kiện và khả năng cho các hành động an toàn.
7.3 Hoán đổi mã thông báo và AMM
Xây dựng một sàn giao dịch phi tập trung (DEX) bằng cách sử dụng các mô-đun Move để đại diện cho các nhóm thanh khoản và hoán đổi mã thông báo, sử dụng chung và bảng để quản lý trạng thái hiệu quả.
- Sui
- Architecture
- Move
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Kiếm phần của bạn từ 1000 Sui
Tích lũy điểm danh tiếng và nhận phần thưởng khi giúp cộng đồng Sui phát triển.
- Tại sao BCS yêu cầu thứ tự trường chính xác để khử chuỗi khi cấu trúc Move có các trường được đặt tên?53
- Nhiều lỗi xác minh nguồn” trong các ấn phẩm về mô-đun Sui Move - Giải quyết lỗi tự động42
- Giao dịch Sui thất bại: Đối tượng được dành riêng cho giao dịch khác24
- Làm thế nào để các ràng buộc về khả năng tương tác với các trường động trong các bộ sưu tập không đồng nhất?04