Các nhà phát triển phải hiểu rằng việc gửi các thông báo XCM không chính xác có thể dẫn đến việc mất tiền. Do đó, điều cần thiết là phải kiểm tra các tính năng XCM trên TestNet trước khi chuyển sang môi trường sản xuất.
Các định nghĩa chung về XCM
- XCM – viết tắt của thông điệp đồng thuận chéo, nó là một cách chung để các hệ thống đồng thuận giao tiếp với nhau
- VMP – là viết tắt của việc truyền thông điệp theo chiều dọc, nó cho phép các parachain trao đổi thông điệp với relay chain (chuỗi chuyển tiếp). UMP (truyền bản tin hướng lên) cho phép các parachain gửi tin nhắn đến relay chain của chúng, trong khi DMP (truyền tin nhắn đi xuống) cho phép relay chain truyền tin nhắn xuống một trong các parachain của chúng
- XCMP – là viết tắt của truyền thông điệp đồng thuận chéo, nó cho phép các parachain trao đổi thông điệp với các parachain khác trên cùng một relay chain
- HRMP – là viết tắt của việc truyền thông điệp được định tuyến chuyển tiếp theo chiều ngang, một giao thức khoảng cách dừng trong khi triển khai XCMP đầy đủ được khởi chạy. Giao diện tương tự như XCMP, nhưng thông báo được lưu trữ trên relay chain
- Multilocation (Đa vị trí) – một cách để chỉ định một điểm trong toàn bộ relay chain / hệ sinh thái parachain từ một điểm gốc nhất định, tương đối hoặc tuyệt đối. Ví dụ: nó có thể được sử dụng để chỉ định một parachain cụ thể, tài sản, tài khoản hoặc thậm chí một pallet bên trong parachain. Theo thuật ngữ chung, một multilocation được xác định với một parents (bố mẹ) và interior (nội thất). Parents đề cập đến số lượng “bước nhảy” vào một blockchain Parent mà bạn cần thực hiện từ một nguồn gốc nhất định. Interior, đề cập đến số lượng lĩnh vực bạn cần để xác định điểm mục tiêu. Ví dụ: để nhắm mục tiêu một parachain có ID 1000 từ một parachain khác, multilocation sẽ là {“parents”: 1, “interior”: {“X1”: [{“Parachain”: 1000}]}}
Giao diện Pallet X-Tokens
Pallet X-Tokens cung cấp các hàm ngoại vi (các chức năng) sau:
- transfer (currencyId, amount, dest, destWeight) – chuyển một loại tiền tệ, được xác định là token gốc (tự bảo lưu) hoặc với ID tài sản
- transferMultiasset (asset, dest, destWeight) – chuyển một tài sản có thể thay thế, được xác định bởi multilocation của nó
- transferMultiassetWithFee(asset, fee, dest, destWeight) – chuyển một tài sản có thể thay thế được, nhưng nó cho phép người gửi trả phí bằng một tài sản khác. Cả hai đều được xác định bởi multilocation của chúng
- transferMultiassets (assets, feeItem, dest, destWeight) – chuyển một số tài sản có thể thay thế, chỉ định tài sản nào được sử dụng làm phí. Mỗi nội dung được xác định bởi multilocation
- transferMulticurrencies (currencies, feeItem, dest, destWeight) – chuyển các thời hạn khác nhau, chỉ định cái nào được dùng làm phí. Mỗi đơn vị tiền tệ được xác định là token gốc (tự bảo lưu) hoặc với ID tài sản
- transferWithFee (currencyId, amount, fee, dest, destWeight) – chuyển một loại tiền tệ, nhưng nó cho phép người gửi thanh toán phí bằng một tài sản khác. Cả hai đều được xác định bởi multilocation của chúng
Trường hợp các yếu tố đầu vào cần được cung cấp có thể được xác định là:
- currencyId/currencies – ID / ID của currency/currencies được gửi qua XCM. Các thời gian chạy khác nhau có các cách khác nhau để xác định ID. Trong trường hợp của các mạng lưới dựa trên Moonbeam, SelfReserve đề cập đến token gốc và OtherReserve đề cập đến tài sản
- amount – số lượng các token sẽ được gửi qua XCM
- dest – một multilocation để xác định địa chỉ đích cho các token được gửi qua XCM. Nó hỗ trợ các định dạng địa chỉ khác nhau như địa chỉ 20 hoặc 32 byte (Ethereum hoặc Substrate)
- destWeight – lượng thời gian thực thi tối đa mà bạn muốn cung cấp trong chain đích để thực thi thông báo XCM đang được gửi. Nếu không cung cấp đủ trọng lượng, việc thực hiện XCM sẽ không thành công và tiền có thể bị khóa trong tài khoản chính phủ hoặc một pallet đặc biệt. Điều quan trọng là phải đặt chính xác trọng lượng đích để tránh thực thi XCM không thành công
- asset/assets – một multilocation để xác định asset/assets được gửi qua XCM. Mỗi parachain có một cách khác nhau để tham chiếu assets. Ví dụ: các mạng lưới dựa trên Moonbeam tham chiếu các token gốc của họ với chỉ số số dư pallet
- fee – một multilocation để xác định tài sản được sử dụng để thanh toán cho việc thực hiện XCM trong chain mục tiêu
- feeItem – một chỉ mục để xác định vị trí asset của một mảng assets đang được gửi, được sử dụng để thanh toán cho việc thực thi XCM trong chain mục tiêu. Ví dụ: nếu chỉ có một asset đang được gửi, thì feeItem sẽ là 0
Phương pháp đọc duy nhất mà pallet cung cấp là palletVersion, cung cấp phiên bản của pallet X-Tokens đang được sử dụng.
Xây dựng XCM với Pallet X-Tokens
Hướng dẫn này bao gồm quá trình xây dựng XCM bằng cách sử dụng pallet X-Tokens, cụ thể hơn là với các chức năng transferMultiasset. Tuy nhiên, hai trường hợp này có thể được ngoại suy cho các hàm khác, đặc biệt là khi đã quen thuộc với multilocations.
Ghi chú
Mỗi parachain có thể cho phép / cấm các phương pháp cụ thể từ một pallet. Do đó, các nhà phát triển phải đảm bảo sử dụng các phương pháp được phép. Ngược lại, giao dịch sẽ không thành công với lỗi tương tự như system.CallFiltered.
Kiểm tra điều kiện tiên quyết
Để có thể gửi ngoại vi trong Ứng dụng Polkadot.js, bạn cần có tài khoản và có sẵn quỹ trong đó.
Ngoài ra, bạn sẽ cần phải có một số các token xcUNIT cho hướng dẫn này, đó là đại diện XC-20 của token relay chain Alphanet UNIT. Bạn có thể có được một số bằng cách swapping lấy token DEV (token gốc của Moonbase Alpha) trên Moonbeam-Swap, một bản sao Uniswap-V2 demo trên Moonbase Alpha.
Để kiểm tra số dư xcUNIT của mình, bạn có thể thêm XC-20 vào MetaMask bằng địa chỉ: 0xFfFFfFff1FcaCBd218EDc0EbA20Fc2308C778080
Chức năng chuyển X-Tokens
Trong ví dụ này, bạn sẽ xây dựng một XCM message để chuyển xcUNIT từ Moonbase Alpha trở lại relay chain của nó thông qua chức năng chuyển của pallet X-Tokens.
Nếu bạn đã kiểm tra các điều kiện tiên quyết, hãy truy cập trang bên ngoài của Polkadot JS Apps và đặt các tùy chọn sau:
- Chọn tài khoản mà bạn muốn gửi XCM
- Chọn pallet xTokens
- Chọn chuyển bên ngoài
- Đặt ID tiền tệ thành OtherReserve. Điều này là do bạn không chuyển các token DEV (SelfReserve)
- Nhập ID tài sản. Đối với ví dụ này, xcUNIT có id tài sản là 42259045809535163221576417993425387648. Bạn có thể kiểm tra tất cả các ID tài sản có sẵn trong phần địa chỉ XC-20
- Đặt số lượng token để gửi. Đối với ví dụ này, bạn đang gửi 1 xcUNIT, nhưng bạn phải tính đến 12 số thập phân của xcUNIT. Để biết token XC-20 có bao nhiêu số thập phân, bạn có thể kiểm tra siêu dữ liệu của nó
- Để xác định multilocation đích XCM, bạn phải nhắm mục tiêu một tài khoản trong relay chain từ Moonbase Alpha làm điểm gốc. Do đó, hãy đặt các thông số sau:
- Đặt trọng lượng đích thành 1000000000. Lưu ý rằng trên Moonbase Alpha, mỗi lệnh XCM có giá khoảng 100000000 đơn vị trọng lượng. Một transfer bao gồm 4 lệnh XCM, vì vậy trọng lượng đích là 400000000 là đủ
- Nhấp vào nút Submit Transaction (Gửi giao dịch) và ký giao dịch
Ghi chú
Dữ liệu được mã hóa cho bên ngoài được định cấu hình ở trên là 0x1e00018080778c30c20fa2ebc0ed18d2cbca1f0010a5d4e8000000000000000000000101010100c4db7bcb733e117c0b34ac8ebc0ed18d2cbca1f0010a5d4e8000000000000000000000101010100c4db7bcb733e117c0b34ebc0ed18d2cbca1f0010a5d4e8000000000. Nó cũng bao gồm một người nhận cụ thể mà bạn sẽ cần thay đổi.
Khi giao dịch được xử lý, TargetAccount lẽ ra phải nhận được số tiền đã chuyển trừ đi một khoản phí nhỏ được khấu trừ để thực hiện XCM trên chain đích. Trên Ứng dụng Polkadot.js, có thể kiểm tra các sự kiện và ngoại vi có liên quan trong Moonbase Alpha và relay chain.
Chức năng chuyển MultiAsset của X-Tokens
Trong ví dụ này, bạn sẽ xây dựng một thông báo XCM để chuyển xcUNIT từ Moonbase Alpha trở lại relay chain của nó bằng cách sử dụng chức năng transferMultiasset của pallet X-Tokens.
Nếu bạn đã kiểm tra các điều kiện tiên quyết, hãy truy cập trang bên ngoài của Polkadot JS Apps và đặt các tùy chọn sau:
- Chọn tài khoản mà bạn muốn gửi XCM
- Chọn pallet xTokens
- Chọn transferMultiasset bên ngoài
- Để xác định tài sản multilocation XCM, bạn phải nhắm mục tiêu UNIT trong relay chain từ Moonbase Alpha làm điểm gốc. Mỗi chain nhìn nhận tài sản riêng của mình một cách khác nhau. Do đó, bạn sẽ phải đặt một multilocation tài sản khác nhau cho mỗi điểm đến. Đối với ví dụ này, token relay chain có thể được định nghĩa là
- Đặt loại nội dung là Fungible
- Đặt số lượng token để gửi. Đối với ví dụ này, bạn đang gửi 1 xcUNIT, nhưng bạn phải tính đến 12 số thập phân
- Để xác định đa định vị đích XCM, bạn phải nhắm mục tiêu một tài khoản trong relay chain từ Moonbase Alpha làm điểm gốc. Do đó, hãy đặt các thông số sau:
- Đặt trọng lượng đích thành 1000000000. Lưu ý rằng trên Moonbase Alpha, mỗi lệnh XCM có giá khoảng 100000000 đơn vị trọng lượng. Một transferMultiasset bao gồm 4 lệnh XCM, vì vậy trọng lượng đích là 400000000 là đủ
- Nhấp vào nút Submit Transaction (Gửi giao dịch) và ký giao dịch
Ghi chú
Dữ liệu cuộc gọi được mã hóa cho ngoại vi được định cấu hình ở trên là 0x1e010100010000070010a5d4e80101010100c4db7bcb733e117c0b34ac96354b10d47e84a006b9e7e66a229d174e8ff2a06300ca9a3b00000000. Nó cũng bao gồm một người nhận cụ thể mà bạn sẽ cần thay đổi.
Khi giao dịch được xử lý, TargetAccount lẽ ra phải nhận được số tiền đã chuyển trừ đi một khoản phí nhỏ được khấu trừ để thực hiện XCM trên chain đích. Trên Ứng dụng Polkadot.js, bạn có thể kiểm tra các sự kiện và ngoại vi có liên quan trong Moonbase Alpha và relay chain.
X-Tokens Precompile
Hợp đồng tiền biên dịch X-Tokens cho phép các nhà phát triển truy cập các tính năng chuyển token XCM thông qua API Ethereum của các mạng lưới dựa trên Moonbeam. Giống như các hợp đồng tiền biên dịch khác, tiền biên dịch X-Tokens được đặt tại các địa chỉ: 0x0000000000000000000000000000000000000804
Giao diện Solidity X-Tokens
Xtokens.sol là một giao diện mà qua đó các nhà phát triển có thể tương tác với pallet X-Tokens bằng cách sử dụng API Ethereum.
Giao diện bao gồm các chức năng sau:
- transfer (address currency_address, uint256 amount, Multilocation memory destination, uint64 weight) – hàm đại diện cho phương thức transfer được mô tả trong ví dụ trước. Tuy nhiên, thay vì sử dụng ID đơn vị tiền tệ, bạn cần cung cấp địa chỉ XC-20. Multilocation được xây dựng theo một cách cụ thể được mô tả trong phần sau
- transfer_multiasset (Tài sản bộ nhớ Multilocation , số lượng uint256, đích của bộ nhớ Multilocation, trọng lượng uint64) – hàm đại diện cho phương thức transferMultiasset được mô tả trong ví dụ trước. Cả hai multilocations đều được xây dựng theo một cách cụ thể được mô tả trong phần sau
Xây dựng Đa phân bổ Multilocation
Trong giao diện biên dịch trước X-Tokens, cấu trúc Multilocation được định nghĩa như sau:
struct Multilocation {
uint8 parents;
bytes [] interior;
}
Lưu ý rằng mỗi multilocation có một phần tử parents, trong trường hợp này được xác định bởi một uint8 và một mảng các byte. Parents tham khảo xem bạn phải thực hiện bao nhiêu “bước nhảy” theo chiều hướng lên nếu đi qua relay chain. Là một uint8, các giá trị bình thường bạn sẽ thấy là:
Mảng byte (byte []) xác định phần bên trong và nội dung của nó trong multilocation. Kích thước của mảng xác định giá trị interior như sau:
Giả sử mảng byte chứa dữ liệu. Byte đầu tiên của mỗi phần tử (2 số thập lục phân) tương ứng với bộ chọn của trường XN đó. Ví dụ:
Tiếp theo, tùy thuộc vào bộ chọn và kiểu dữ liệu của nó, các byte sau tương ứng với dữ liệu thực tế đang được cung cấp. Lưu ý rằng đối với AccountId32, AccountIndex64 và AccountKey20, trường mạng trong ví dụ Ứng dụng Polkadot.js được thêm vào ở cuối. Ví dụ:
Ghi chú
Dữ liệu interior thường cần được bao quanh các dấu ngoặc kép. Ngược lại, bạn có thể gặp lỗi giá trị tuple không hợp lệ.
Đoạn code sau đi qua một số ví dụ về cấu trúc Multilocation, vì chúng sẽ cần được đưa vào các hàm biên dịch trước X-Tokens:
Nguồn: Moonbeam Network
Moonbeam Network Community
Website | Twitter | TwitterVN | Telegram | TelegramVN