Trang chủ Tạp chí Move là gì ? Tìm hiểu ngôn ngữ lập trình Move với...

Move là gì ? Tìm hiểu ngôn ngữ lập trình Move với Libra Blockchain

Move là một ngôn ngữ lập trình mới được phát triển để cung cấp nền tảng an toàn và có thể lập trình cho Libra Blockchain. Một tài khoản trong Libra Blockchain là nơi chứa số lượng tài nguyên Move và các modules Move tùy ý. Mọi giao dịch được gửi tới Libra Blockchain đều sử dụng tệp lệnh giao dịch được viết bằng Move để mã hóa logic của nó. Kịch bản giao dịch có thể gọi các thủ tục được khai báo bởi một modules để cập nhật trạng thái toàn cầu của blockchain.

Move là gì ? Tìm hiểu ngôn ngữ lập trình Move với Libra Blockchain

Trong phần đầu tiên của hướng dẫn này, mình sẽ giới thiệu cấp cao về các tính năng chính của ngôn ngữ Move:

  1. Move Transaction Scripts cho phép lập trình giao dịch LibraCoin
  2. Move Modules cho phép kết hợp “Hợp đồng thông minh”
  3. Move First-Class Resources

Đối với người tò mò, bài viết kỹ thuật Move chứa nhiều chi tiết hơn về ngôn ngữ lập trình này. Các chương trình Move tùy chỉnh không được hỗ trợ trong bản phát hành testnet ban đầu, nhưng các tính năng này có sẵn để bạn dùng thử tại môi trường thử nghiệm của bạn.

Các tính năng chính của Move

Move Transaction Scripts cho phép lập trinh giao dịch

  • Mỗi giao dịch Libra bao gồm tập lệnh giao dịch Move mã hóa logic mà trình xác thực sẽ thực hiện thay mặt khách hàng (ví dụ: để chuyển Libra từ tài khoản của A sang tài khoản của B).
  • Tập lệnh giao dịch tương tác với  Move Resources được xuất bản trong bộ lưu trữ toàn cầu của Libra Blockchain bằng cách gọi các thủ tục của một hoặc nhiều modules Move .
  • Một tập lệnh giao dịch không được lưu trữ trong trạng thái toàn cầu và nó không thể được gọi bởi các tập lệnh giao dịch khác. Đây là một chương trình sử dụng một lần.
  • Mình sẽ trình bày một số ví dụ về tập lệnh giao dịch trong phần ví dụ bên dưới đây

Viết một kịch bản giao dịch

Như mình đã giải thích bên trên (Move Transaction Scripts) , người dùng viết tập lệnh giao dịch để yêu cầu cập nhật vào bộ lưu trữ toàn cầu của Libra Blockchain. Có hai khối xây dựng quan trọng sẽ xuất hiện trong hầu hết mọi tập lệnh giao dịch: loại LibraAccount.T và LibraCoin.T Resources. LibraAccount là tên của module và T là tên của Resource được module đó khai báo. Đây là một quy ước đặt tên phổ biến trong Move; loại chính của vùng được khai báo bởi một module thường được đặt tên là T.

Khi người dùng “có tài khoản tại địa chỉ 0xff trên Libra Blockchain”, điều mình muốn nói là địa chỉ này 0xff chứa một thể hiện của LibraAccount.T Resource. Mỗi địa chỉ không rỗng có một LibraAccount.T Resource. Tài nguyên này lưu trữ dữ liệu tài khoản, chẳng hạn như số thứ tự, khóa xác thực và số dư. Bất kỳ phần nào của hệ thống Libra muốn tương tác với tài khoản đều phải thực hiện bằng cách đọc dữ liệu từ LibraAccount.T Resource hoặc gọi các thủ tục của LibraAccount module.

Số dư tài khoản là một loại tài nguyên LibraCoin.T. Như mình đã giải thích trong Move Resources , đây là loại Libra coin. Loại này là “first-class citizen” trong ngôn ngữ giống như bất kỳ Move Resources nào khác. LibraCoin.T Resource có thể được lưu trữ trong các biến chương trình, được chuyển qua giữa các thủ tục, v.v.

Mình khuyến khích các bạn quan tâm đến các định nghĩa Move IR của hai tài nguyên chính này trong LibraAccount và LibraCoin modules trong thư mục libra/language/stdlib/modules/

Bây giờ chúng ta hãy xem làm thế nào một lập trình viên có thể tương tác với các modules và tài nguyên này trong một Transaction Scripts

import 0x0.LibraAccount;
import 0x0.LibraCoin;
main(payee: address, amount: u64) {

  let coin: R#LibraCoin.T;

  coin = LibraAccount.withdraw_from_sender(move(amount));

  LibraAccount.deposit(move(payee), move(coin));

  return;
}

Transaction Scipt này có một vấn đề đáng tiếc là nó sẽ thất bại nếu không có tài khoản dưới địa chỉ payee. Mình sẽ khắc phục sự cố này bằng cách sửa đổi tập lệnh để tạo tài khoản cho payee nếu tài khoản chưa tồn tại.

import 0x0.LibraAccount;
import 0x0.LibraCoin;

main(payee: address, amount: u64) {

  let coin: R#LibraCoin.T;
  let account_exists: bool;

  coin = LibraAccount.withdraw_from_sender(move(amount));

  account_exists = LibraAccount.exists(copy(payee));

  if (!move(account_exists)) {

    create_account(copy(payee));
  }

  LibraAccount.deposit(move(payee), move(coin));

  return;
}

Chúng ta hãy xem xét một ví dụ phức tạp hơn. Trong ví dụ này, mình sẽ sử dụng tập lệnh Transaction để thanh toán cho nhiều người nhận thay vì chỉ một.

import 0x0.LibraAccount;
import 0x0.LibraCoin;

main(payee1: address, amount1: u64, payee2: address, amount2: u64) {

  let coin1: R#LibraCoin.T;
  let coin2: R#LibraCoin.T;
  let total: u64;

  total = move(amount1) + copy(amount2);
  coin1 = LibraAccount.withdraw_from_sender(move(total));

  coin2 = LibraCoin.withdraw(&mut coin1, move(amount2));

  // Perform the payments
  LibraAccount.deposit(move(payee1), move(coin1));

  LibraAccount.deposit(move(payee2), move(coin2));

  return;
}

Để hiểu rõ hơn về các Transaction Script được Libra Blockchain hỗ trợ trong phiên bản testnet đầu tiên, các bạn có thể tham khảo tại thư mục này trong Libra Core libra/language/stdlib/transaction_scripts.

Viết Modules

Bây giờ mình sẽ viết một module Move của riêng mình thay vì chỉ sử dụng lại các modules hiện của LibraAccount và LibraCoin modules.

Đặt một ví dụ sau: Người dùng số 1 sẽ tạo một tài khoản tại địa chỉ a tại một thời điểm nào đó trong tương lai. Người dùng số 2 muốn “dành” một số tiền cho Người dùng số 1 để anh ta có thể kéo chúng vào tài khoản của mình sau khi nó được tạo. Nhưng Người dùng số 2 cũng muốn có thể lấy lại tiền cho mình nếu Người dùng số 1 không bao giờ tạo tài khoản.

Để giải quyết vấn đề này cho Người dùng số 2, mình sẽ viết một module EarmarkedLibraCoin:

  • Khai báo một loại tài nguyên mới EarmarkedLibraCoin.T bao bọc Libra coin và địa chỉ người nhận.
  • Cho phép Người dùng số 2 tạo một loại như vậy và xuất bản nó trong tài khoản của mình ( create procedure).
  • Cho phép Người dùng số 1 yêu cầu tài nguyên ( claim_for_recipientprocedure).
  • Cho phép bất cứ ai có EarmarkedLibraCoin.T có thể phá hủy nó  ( unwrapprocedure).
module EarmarkedLibraCoin {
  import 0x0.LibraCoin;

  resource T {
    coin: R#LibraCoin.T,
    recipient: address
  }

  public create(coin: R#LibraCoin.T, recipient: address) {
    let t: R#Self.T;

    t = T {
      coin: move(coin),
      recipient: move(recipient),
    };

    move_to_sender(move(t));
    return;
  }


  public claim_for_recipient(earmarked_coin_address: address): R#Self.T {
    let t: R#Self.T;
    let t_ref: &R#Self.T;
    let sender: address;

    t = move_from(move(earmarked_coin_address));

    t_ref = &t;

    sender = get_txn_sender();

    assert(*(&move(t_ref).recipient) == move(sender), 99);

    return move(t);
  }

  public claim_for_creator(): R#Self.T {
    let t: R#Self.T;
    let coin: R#LibraCoin.T;
    let recipient: address;
    let sender: address;

    sender = get_txn_sender();

    t = move_from(move(sender));

    return move(t);
  }

  public unwrap(t: R#Self.T): R#LibraCoin.T {
    let coin: R#LibraCoin.T;
    let recipient: address;

    T { coin, recipient } = move(t);

    return move(coin);
  }

}

Người dùng số 2 có thể tạo ra một số Libra Coin dành cho Người dùng số 1 bằng cách tạo ra một Transaction Script đó gọi create trên địa chỉ của Người dùng số 1 và LibraCoin.T mà Người dùng số 2 sở hữu. Khi a đã được tạo, Người dùng số 1 có thể yêu cầu tiền bằng cách gửi giao dịch từ a . Điều này gọi claim_for_recipient, chuyển kết quả đến unwrap và lưu trữ trả lại LibraCoin bất cứ nơi nào anh ta muốn. Nếu Người dùng số 1 mất quá nhiều thời gian để tạo một tài khoản theo a và Người dùng số 2 muốn đòi lại tiền của mình, Người dùng số 2 có thể làm như vậy bằng cách sử dụng claim_for_creator theo sau unwrap.

Các bạn có thể đã nhận thấy rằng mã trong module này là bất khả tri đối với cấu trúc bên trong của LibraCoin.T. Nó có thể dễ dàng được viết bằng lập trình chung (ví dụ, resource T { coin: AnyResource, ... }).

Bài viết đến đây là kết thúc. Hy vọng qua bài viết này, sẽ giúp cho các bạn hiểu rõ hơn về Libra Coin cũng như ngôn ngữ lập trình Move.

Chúc các bạn thành công.

Tạp Chí Bitcoin | Sirquy

 

MỚI CẬP NHẬT

Singapore dẫn đầu cuộc đua toàn cầu về blockchain và tiền điện tử

Singapore, Hồng Kông dẫn đầu cuộc cách mạng blockchain, không phải Hoa Kỳ

Một báo cáo mới đây xếp hạng Singapore là quốc gia đi đầu trong lĩnh vực blockchain và tiền điện tử. Nghiên cứu này...

SEC phạt Jump Trading 123 triệu đô la vì bê bối TerraUSD và hành...

Ủy ban Chứng khoán và Giao dịch Hoa Kỳ (SEC) đã quyết định phạt 123 triệu đô la đối với Tai Mo Shan Limited,...

Cá voi crypto đã mua gì trong tuần thứ ba của tháng 12/ 2024?

Cá voi crypto đang mua gì? Đây là câu hỏi được nhiều nhà đầu tư quan tâm, đặc biệt trong bối cảnh giá các...
Các nhà phân tích cho biết Ether ETF sẽ tăng mạnh vào năm 2025

Dòng vốn chảy vào Ethereum ETF dự kiến sẽ tăng mạnh vào năm 2025

Dòng vốn ròng vào các quỹ hoán đổi danh mục (ETF) của Ether đang gia tăng và được dự đoán sẽ vượt qua các...

Các công ty crypto đóng góp hơn 8 triệu đô la cho lễ nhậm...

Ripple đã cam kết tài trợ 5 triệu đô la XRP để hỗ trợ lễ nhậm chức của Tổng thống đắc cử Donald Trump...

Ủy viên SEC dự báo cải tiến sớm cho các quỹ ETF Crypto dưới...

Các điều chỉnh liên quan đến quỹ ETF Crypto, bao gồm việc cho phép đổi quỹ bằng tài sản thực và staking cho các...

Coinbase tin mã hóa tài sản và DeFi sẽ là xu hướng chính trong...

Báo cáo triển vọng thị trường mới nhất của Coinbase cho năm 2025 chỉ ra ba xu hướng chủ đạo là sự phát triển của...

Cathie Wood dự đoán Bitcoin sẽ vượt ngưỡng 1 triệu đô la vào cuối...

Giám đốc điều hành của Ark Invest, Cathie Wood, một lần nữa khẳng định triển vọng lạc quan của bà về Bitcoin, dự đoán...
bitcoin

Michael Saylor công bố khuôn khổ Bitcoin và tiền điện tử cho chính phủ...

Nhà sáng lập MicroStrategy, Michael Saylor, đã công bố một khuôn khổ toàn diện nhằm tích hợp tài sản kỹ thuật số vào hệ...

OpenSea hé lộ việc ra mắt token gốc OCEAN từ tài khoản X mới

OpenSea vừa hé lộ khả năng ra mắt token mới thông qua một bài đăng bí ẩn trên tài khoản mạng xã hội mới...

78% hodler Litecoin (LTC) từ chối bán – Đây là lý do

Theo dữ liệu từ nền tảng phân tích IntoTheBlock, 78% các địa chỉ Litecoin (LTC) đã nắm giữ đồng tiền này trong hơn một...

Bitcoin đã điều chỉnh ‘gần xong’ khi lỗ thực tế vượt trung bình tuần

Biểu đồ hàng ngày của Bitcoin đã xuất hiện ba cây nến đỏ liên tiếp lần đầu tiên kể từ tuần đầu tiên của...

Testnet slashing của EigenLayer chính thức đi vào hoạt động

Testnet slashing (cắt giảm) của giao thức restaking EigenLayer đã chính thức đi vào hoạt động vào ngày 20 tháng 12, với việc ra...

Giá Coin hôm nay 21/12: Bitcoin phục hồi về trên $97.000 sau đợt bán...

Bitcoin phục hồi về trên $97.000 sau khi thị trường đối mặt với áp lực bán mạnh kéo giá về dưới $93.000. Chứng khoán Mỹ Chỉ...

Tether hé lộ sẽ ra mắt nền tảng AI vào Q1 2025, đầu tư...

Tether, nhà phát hành stablecoin lớn nhất thế giới, dự kiến ​​sẽ kết thúc năm 2024 với hơn 10 tỷ đô la lợi nhuận...
ngay-21-12-phan-tich

Phân tích kỹ thuật ngày 21 tháng 12: BTC, ETH, XRP, SOL, BNB, DOGE,...

Bitcoin (BTC) đã kéo dài đợt điều chỉnh giảm trong ba ngày liên tiếp, nhưng mức giá thấp hơn đã thu hút lực mua...