LapTrinhBlockchain

Chia sẻ kiến thức về Lập Trình Blockchain

Kiến thức Blockchain, Nâng cao Kiến thức

Tìm hiểu Sui Blockchain dưới vai trò của DEV

Tìm hiểu Sui Blockchain dưới vai trò của DEV

Tìm hiểu Sui Blockchain dưới vai trò của DEV

Chia sẻ bài viết
5
(3)

Sui Blockchain là một nhánh từ Diem blockchain gần đây có thông báo gọi vốn lên đến $300M đã gây được nhiều sự chú ý của cộng đồng. Bài viết này mình xin tập trung tìm hiểu Sui Blockchain dưới vai trò của DEV.

Có thể bạn quan tâm: Tìm hiểu Aptos và Sui: Cuộc đua blockchain thế hệ mới

Bắt đầu tìm hiểu và tiếp cận Sui Blockchain

Test các tính năng cơ bản với Sui Client

B1: Cài đặt Wallet

Ban đầu bạn cần cài đặt Wallet theo hướng dẫn: https://docs.sui.io/devnet/explore/wallet-browser
Sau đó claim SUI theo Hướng dẫn claim SUI token từ Testnet => Bạn nhận được 250000 SUI để test. Tiếp đó, tạo thêm ví khác và thử chuyển SUI giữa các ví.

Có vấn đề hơi đáng tiếc là tôi không thể nào quản lý được nhiều địa chỉ trên ví, chắc sắp tới sẽ được nâng cấp để hỗ trợ tính năng này.

B2: Sử dụng Sui Client

Bây giờ chúng ta sẽ cài đặt và sử dụng Sui Client. Bạn nên có một máy riêng để test, mình sử dụng VPS Ubuntu18.04.5 LTS

  • Cài đặt Sui: Bạn làm theo hướng dẫn từ bài viết Install Sui
    • Cài đặt Rust và Cargo (Nếu chưa có):
      curl –proto ‘=https’ –tlsv1.2 -sSf https://sh.rustup.rs | sh
      rustup update stable
    • Cài đặt một số thư viện nếu chưa có:
      apt install cmake libssl-dev libclang-dev git
    • Cài đặt Sui:
      cargo install –locked –git https://github.com/MystenLabs/sui.git –branch “devnet” sui sui-gateway
      => Thời gian build cực lâu, máy mình mất 4h.
  • Khởi tạo genesis: Để khởi tạo bạn sử dụng lệnh sau:
    sui genesis
    Sau khi khởi tạo, bạn sẽ thấy các tệp cấu hình trong thư mục .sui/sui_config, gồm các tệp:
    • ~/.sui/sui_config/network.yaml => Cấu hình mạng
    • ~/.sui/sui_config/sui.keystore => Lưu private key của các tài khoản
    • ~/.sui/sui_config/gateway.yaml => Quản lý tài khoản
    • ~/.sui/sui_config/client.yaml => Cấu hình cho client, chi tiết xem tại: https://docs.sui.io/build/cli-client#client-configuration
  • Chạy sui bằng lệnh sau:
    export RUST_LOG=debug
    sui start

    Sau đó bạn có thể chạy các lệnh Sui Client trên Devnet.

B3: Sử dụng Sui Client trên Local

Mặc định sau khi cài đặt thì Sui Client sẽ trở tới Local với rpc thường là http://127.0.0.1:5001. Do đó, trước khi chạy Sui Client bạn cần phải bật Sui lên hoặc chạy rpc-server bằng lệnh sau:

// Chạy sui
export RUST_LOG=debug
sui start

// Hoặc chạy rpc-server
rpc-server

Sau đó bạn sử dụng các lệnh sui client theo định đạng sau:

sui client <sub-command>
sui client <sub-command> --help 

Các sub-command gồm:

  • active-address: Hiển thị địa chỉ mặc định đang sử dụng.
  • addresses: Hiển thị tất cả các địa chỉ đang quản lý bởi client.
  • new-address: Tạo một địa chỉ mới. Ví dụ:
    sui client new-address ed25519
  • env: Hiển thị môi trường
  • create-example-nft: Tạo Example NFT
  • object: Hiển thị thông tin đối tượng tài khoản. Ví dụ:
    sui client object –id 0x8961fed043eb39818b52c2267238c4d57920bc59
  • objects: Hiển thị thông tin các đối tượng.
  • gas: Hiển thị thông tin tài sản
  • help: Xem chi tiết sử dụng
  • transfer: Chuyển đối tượng tới địa chỉ khác. Mỗi đối tượng (object) sẽ tương ứng với tài sản nào đó.
    sui client transfer –to 0x591947e11ba67a3cb8ebb8fbd448f9875449ac99 –object-id 0x9546959c2edad6d7aee8f5e9e0f7d5ea242ded49 –json –gas-budget 50000
  • transfer-sui: Chuyển SUI. Nếu có amount sẽ chuyển đúng lượng này, nếu không sẽ chuyển toàn bộ SUI.
    sui client transfer-sui –json –to 0x591947e11ba67a3cb8ebb8fbd448f9875449ac99 –sui-coin-object-id 0x9c7d82aa61c3afe2ae2b9300859704e1bd7d6301 –gas-budget 500 –amount 8000
  • sync: Đồng bộ trạng thái
  • merge-coin: Gộp 2 tài khoản vào nhau, tài sản sản chuyển hết sang tài khoản Primary.
    sui client merge-coin –json –primary-coin 0x9c7d82aa61c3afe2ae2b9300859704e1bd7d6301 –coin-to-merge 0xe338fe0e07aa3dd5252510fd7d7092e93e33929d –gas-budget 500
  • split-coin: Chia tài sản sang nhiều tài khoản khác. Ví dụ sau chia đều tài sản thành 3 tài khoản (Thêm 2 tài khoản mới):
    sui client split-coin –json –coin-id 0x9c7d82aa61c3afe2ae2b9300859704e1bd7d6301 –gas-budget 800 –count 3
  • publish: Xuất bản mô đun MOVE
  • call: Gọi hàm trong MOVE
  • switch: Chuyển active-address và network. Lệnh sau chuyển sang Devnet, tạo tài khoản mới:
    sui client switch –gateway https://gateway.devnet.sui.io:443

B4: Sử dụng Sui Client trên môi trường Devnet

Môi trường Devnet này do dự án đã tạo sẵn với rpc là https://gateway.devnet.sui.io:443, chú ý rằng nó khác với môi trường Local trên máy bạn. Vì thế khi chạy môi trường Devnet bạn không cần phải bật Sui như bước trước.

Đầu tiên bạn cần chuyển sang môi trường Devnet bằng lệnh sau:

sui client switch --gateway https://gateway.devnet.sui.io:443 

Sau đó chúng ta dùng Sui Client để tạo địa chỉ mới và thực hiện các lệnh như sau:

// Tạo địa chỉ mới trên Devnet
sui client new-address ed25519
=> Sau lệnh này ta được 1 địa chỉ, của mình là 0xbf19cb4743353564922b0a4bc0292e6f7d3294a7

// Chuyển sang sử dụng ví mới vừa tạo
sui client switch --address 0xbf19cb4743353564922b0a4bc0292e6f7d3294a7
<Sau đó lấy SUI cho ví này từ faucet hoặc chuyển từ ví khác sang>

// Tạo thử NFT
sui client create-example-nft
sui client gas
=> Sau đó bạn thử kiểm tra lại dữ liệu từ Explorer: https://explorer.devnet.sui.io/addresses/0xbf19cb4743353564922b0a4bc0292e6f7d3294a7>

// Thử các lệnh merge và split
sui client merge-coin --primary-coin 0x9754754e206dc5b99b5cc706dc68dd06b5a038d6 --coin-to-merge 0x9c3d3c192759de2884cf46393bec429efa5fab2c --gas-budget 500
sui client split-coin --coin-id 0xdae069210a765c85aed63bcccdf61256607de0e8 --gas-budget 800 --count 3

B5: Sử dụng Sui Console

Trong Sui Console bạn chạy sub-command như trên Sui Client, nhưng bạn chỉ cần nhập sub-command mà không cần phải đánh thêm sui client, giúp bạn giảm thiểu công sức phải nhập sui client rất nhiều lần. Vào Sui Console bằng 1 trong 2 lệnh sau:

sui console
sui console --config </path/to/client/config/file
>

Sau đó đánh các lệnh bình thường như:

switch --gateway https://gateway.devnet.sui.io:443
switch --address 0xbf19cb4743353564922b0a4bc0292e6f7d3294a7
gas

Chạy một Sui Fullnode

Fullnode trên Sui là một node trên mạng lưới Sui với chế độ chỉ đọc trạng thái của mạng, làm nhiệm vụ xác thực tính toàn vẹn của mạng. Không giống như các Validator node, Fullnode không thể ký.

Trong quá trình build sẽ có nhiều lỗi phát sinh liên quan đến môi trường và thư viện, có thể mỗi người có lỗi khác nhau do môi trường khác nhau, vì thế bạn phải sử dụng kỹ năng Google cả mình. Có một số lỗi mình gặp phải thì mình có list trong mục Một số lỗi liên quan khi build Sui, bạn có thể tham khảo.

Quá trình builld có thể mất vài giờ tùy theo từng tốc độ máy, vì nó phải build khoảng 1622 thư viện khác nhau. Hiện tại mình dùng máy Laptop cá nhân chạy thử thấy rất chậm, cấu hình máy:

  • Intel Core i5, M460, 2.53GHz, 4 threads
  • RAM 4G
  • HDD 512G

Chạy một Sui Fullnode bằng cách build trực tiếp từ source code của dự án

Theo cách này cũng khá phức tạp, chi tiết hướng dẫn bạn xem tại bài viết hướng dẫn của đội dự án: Run a Sui Fullnode hoặc SUI Network – complete guide to run a Node & Validator. Bài này mình đơn giản hóa bằng cách lệnh cài đặt.

* B1: Cài đặt các thư viện cần thiết

sudo -i
apt-get update && apt-get install -y --no-install-recommends tzdata git ca-certificates curl build-essential libssl-dev pkg-config libclang-dev cmake

* B2: Tạo Fork từ Sui repository

Bạn vào Sui repository trên Github, kích vào nút Fork ở góc trên cùng bên phải của màn hình, tài khoản github của mình là laptrinhbockchain nên link sau fork là: https://github.com/laptrinhbockchain/sui.git. Sau đó thực hiện lệnh sau để sao chép bản fork bạn vừa tạo về client bằng lệnh sau:

git clone https://github.com/laptrinhbockchain/sui.git

* B3: Sau đó tiếp tục thực hiện sync và checkout nhánh devnet

cd sui
git remote add upstream https://github.com/MystenLabs/sui
git fetch upstream
git checkout --track upstream/devnet

* B4: Tạo tệp cấu hình và tải trạng thái ban đầu mới nhất (lastest genesis state) cho Devnet

cp crates/sui-config/data/fullnode-template.yaml fullnode.yaml
curl -fLJO https://github.com/MystenLabs/sui-genesis/raw/main/devnet/genesis.blob

Bạn có thể thay đổi cấu hình trong tệp fullnode.yaml, trong đó hai cấu hình chính:

  • db-path: “/path/to/suidb” => Mặc định ./suidb (Cùng thư mục hiện tại với tệp fullnode.yaml)
  • genesis-file-location: “/path/to/genesis.blob” => Mặc định ở thư mục hiện tại cùng thư mục với fullnode.yaml.

* B5: Build và chạy một Sui Fullnode

Bạn build và chạy bằng lệnh sau:

cargo run --release --bin sui-node -- --config-path fullnode.yaml

Lệnh này bao gồm cả lệnh build và lệnh chạy, quá trình build rất lâu có thể mất vài tiếng, Trong quá trình build có thể gặp một số lỗi phát sinh, bạn có thể xem các fix như phần: Một số lỗi liên quan khi build Sui.

Sau khi build xong, sẽ chạy luôn, bạn nhìn như ảnh dưới, đây mới là giai đoạn đầu, ứng dụng cần đồng bộ dữ liệu tới điểm “lastest checkpoint“, thời gian này khá lâu tùy tốc độ máy:

Log từ Fullnode Sui khi bắt đầu chạy lần đầu tiên
Log từ Fullnode Sui khi bắt đầu chạy lần đầu tiên

Bạn chú ý dữ liệu devnet là dữ liệu có thể bị reset nhé, chỉ có dữ liệu trên Testnet là không bị reset.

Lần sau chạy bạn chỉ cần sử dụng lệnh:

target/release/sui-node --config-path fullnode.yaml

Không hiểu sao tới bước này rùi nhung không thấy mở port 9000 cho RPC, nên quyết định tìm cách khác để cài đặt. Sau đó tôi tiếp tục thử theo cách bên dưới.

Chạy một Sui Fullnode với lệnh đơn giản hơn

Mình đã tìm bài viết Hướng dẫn chạy node Sui và cơ hội nhận Retroactive, với lệnh đơn giản hơn và chạy dưới dạng service nên khá tiện. Chi tiết bạn xem trực tiếp trong bài viết. Phần dưới mô tả lại các bước mình thực hiện:

* B1: Cài đặt tmux

Vì quá trình cài đặt lâu nên mình thường sử dụng tmux để mở screen mới cho việc cài đặt.

// Cài đặt tmux nếu chua có
sudo apt install tmux

// Mở screen mới
tmux

* B2: Build và chạy Sui Fullnode

Chạy lệnh sau để build sui:

wget -O sui.sh https://api.ondex.app/sui.sh && chmod +x sui.sh && ./sui.sh

Nếu gặp lỗi, bạn xử lý xong lỗi thì chạy lại bằng lệnh:

./sui.sh

Sau khi build thành công Sui Fullnode tự động chạy:

Sui Fullnode tự động chạy sau lệnh build
Sui Fullnode tự động chạy sau lệnh build

* B3: Các lệnh kiểm tra

// Kiểm tra node
curl -s -X POST http://127.0.0.1:9000 -H 'Content-Type: application/json' -d '{ "jsonrpc":"2.0", "method":"rpc.discover","id":1}' | jq .result.info

// Kiểm tra logs
journalctl -u suid -f -o cat

// Khởi động lại node
sudo systemctl restart suid

// Dừng node
sudo systemctl stop suid

// Xóa node
sudo systemctl stop suid
sudo systemctl disable suid
rm -rf ~/sui /var/sui/
rm /etc/systemd/system/suid.service

Sau khi kiểm tra xong thấy port 9000 vẫn không được mở. Theo dự đoán cho máy quá yếu, không đồng bộ kịp dữ liệu do đó nó không mở port 9000. Tôi quyết định remove Sui Fullnode, để sử dụng máy tìm hiểu phần khác.

Chạy một Sui Fullnode cho Testnet

Bạn chạy Sui Fullnode cho Testnet thì bạn mới được nhận phần thưởng, để chạy Fullnode cho testnet bạn phải đăng ký tại link: Sui Validator Registration Open. Phải đăng ký trước ngày 2022-08-15, hiện đã đóng rùi.

Triển khai trò chơi TicTacToe trên Sui

Chi tiết xem hướng dẫn: End-to-End Tutorial to Set Up and Play TicTacToe on Sui

<Đang cập nhật…>

Viết Smart Contract với Sui Move

Đầu tiên chúng ta viết một “Sui Move Package” theo hướng dẫn: Write Smart Contracts with Sui Move

<Đang cập nhật>

xxxxx https://docs.sui.io/build/devnet#advanced-testing

Một số lỗi liên quan khi build Sui

[SUI] Invalid Url: Port number is missing in the URL

Khi tôi chuyển sang devnet bằng lệnh sau (Chú ý là tôi không để port vì nghĩ rằng https mặc định là 443 rùi):

sui client switch --gateway https://gateway.devnet.sui.io

Nhưng sau lệnh này thì tôi không thể sử dụng được “sui client” nữa, vì đánh lệnh nào nó cũng báo lỗi:

Networking or low-level protocol error: Invalid Url: Port number is missing in the URL

Tôi cũng không thể switch lại bằng lệnh:

sui client switch --gateway https://gateway.devnet.sui.io:443

Trường hợp này bạn phải sửa lại trong tệp cấu hình “~/.sui/sui_config/client.yaml“.

Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)

Trong quá trình build bạn có thể gặp lỗi:

  CMAKE_PREFIX_PATH = None
  CMAKE_x86_64-unknown-linux-gnu = None
  CMAKE_x86_64_unknown_linux_gnu = None
  HOST_CMAKE = None
  CMAKE = None
  running: "cmake" "/home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/prost-build-0.10.4/third-party/protobuf/cmake" "-D                 protobuf_BUILD_TESTS=OFF" "-DCMAKE_INSTALL_PREFIX=/home/ubuntu/temp/sui/sui/target/release/build/prost-build-0100d66b4d8ebcad/out"                  "-DCMAKE_C_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64" "-DCMAKE_C_COMPILER=/usr/bin/cc" "-DCMAKE_CXX_FLAGS= -ffunction-sec                 tions -fdata-sections -fPIC -m64" "-DCMAKE_CXX_COMPILER=/usr/bin/c++" "-DCMAKE_ASM_FLAGS= -ffunction-sections -fdata-sections -fPIC -                 m64" "-DCMAKE_ASM_COMPILER=/usr/bin/cc" "-DCMAKE_BUILD_TYPE=Debug"
  --
  -- 3.19.4.0
  -- Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)

Lỗi này do thiếu thư viện zlib, bạn cần cài đặt bằng lệnh sau:

sudo apt install zlib1g-dev

Unknown argument –parallel

Sui có sử dụng thư viện protobuf, đây là thư viện được sử dụng rất nhiều bởi hệ thống lớn, dùng để đóng gói dữ liệu cần trao đổi qua mạng, hoặc qua các ứng dụng. Khi build đến thư viện này có khi bạn gặp lỗi:

  CMAKE = None
  running: "cmake" "/home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/prost-build-0.10.4/third-party/protobuf/cmake" "-D                 protobuf_BUILD_TESTS=OFF" "-DCMAKE_INSTALL_PREFIX=/home/ubuntu/temp/sui/sui/target/release/build/prost-build-0100d66b4d8ebcad/out"                  "-DCMAKE_C_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64" "-DCMAKE_C_COMPILER=/usr/bin/cc" "-DCMAKE_CXX_FLAGS= -ffunction-sec                 tions -fdata-sections -fPIC -m64" "-DCMAKE_CXX_COMPILER=/usr/bin/c++" "-DCMAKE_ASM_FLAGS= -ffunction-sections -fdata-sections -fPIC -                 m64" "-DCMAKE_ASM_COMPILER=/usr/bin/cc" "-DCMAKE_BUILD_TYPE=Debug"
  --
  -- 3.19.4.0
  -- Configuring done
  -- Generating done
  -- Build files have been written to: /home/ubuntu/temp/sui/sui/target/release/build/prost-build-0100d66b4d8ebcad/out/build
  running: "cmake" "--build" "." "--target" "install" "--config" "Debug" "--parallel" "4"

  --- stderr
  Unknown argument --parallel
  Unknown argument 4

Lỗi này do CMake phiên bản hiện tại (v3.10) không hỗ trợ tham số này, bạn phải thực hiện remove đi và cài lại phiên bản CMake mới nhất bằng lệnh:

sudo apt remove cmake
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | sudo apt-key add -
sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main'
sudo apt-get update
sudo apt install cmake
sudo apt install cmake-curses-gui

Sau khi cài xong được phiên bản CMake v3.24.1

fatal error: ‘stdarg.h’ file not found

Khi build librocksdb-sys có thể gặp lỗi sau:

   Compiling librocksdb-sys v0.8.0+7.4.4
error: failed to run custom build command for `librocksdb-sys v0.8.0+7.4.4`

Caused by:
  process didn't exit successfully: `/home/ubuntu/temp/sui/sui/target/release/build/librocksdb-sys-b43d11d459ea3912/build-script-build` (exit status: 101)
  --- stderr
  rocksdb/include/rocksdb/c.h:65:10: fatal error: 'stdarg.h' file not found
  thread 'main' panicked at 'unable to generate rocksdb bindings: ClangDiagnostic("rocksdb/include/rocksdb/c.h:65:10: fatal error: 'stdarg.h' file not found\n")', /home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/librocksdb-sys-0.8.0+7.4.4/build.rs:43:10
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
warning: build failed, waiting for other jobs to finish...

Chúng ta dùng lệnh sau để tìm xem tệp stdarg.h có không?

locate stdarg.h
/usr/include/c++/7/tr1/stdarg.h
/usr/lib/gcc/x86_64-linux-gnu/7/include/cross-stdarg.h
/usr/lib/gcc/x86_64-linux-gnu/7/include/stdarg.h
/usr/lib/llvm-6.0/lib/clang/6.0.0/include/stdarg.h

Như vậy có file header này trong thư mục “/usr/lib/gcc/x86_64-linux-gnu/7/include“, ta chạy lệnh sau trước để báo cho GCC biết tìm tệp header ở các thư mục trên:

export C_INCLUDE_PATH="/usr/lib/gcc/x86_64-linux-gnu/7/include"

Nhận xét và đánh giá

Đây là những nhận xét mang tính cá nhân, các bạn chỉ xem để tham khảo.

  • Có tài liệu khá đầu đủ Sui Document, ngay trong trang chủ tài liệu bạn đã biết thứ tự mình cần làm gì, làm từng bước như thế nào.
  • Sử dụng qua thấy các quản lý tài sản trên Sui khác với trên Ethereum. Trên Sui quản lý theo các object, trong một ví có nhiều tài sản, mỗi tài sản giả sử SUI thì có nhiều object, mỗi object này như là tờ tiền SUI với mệnh giá tương ứng. Bạn có thể tách 1 tờ tiền thành nhiều tờ có mệnh giá nhỏ hơn, hoặc gộp chúng lại thành tờ tiền có mệnh giá lớn hơn => Chính cách quản lý này giúp xử lý song song các giao dịch.
  • Phí GAS tính theo SUI khá cao từ 50 SUI đến 1000 SUI: Nếu với mức GAS như thế này thì khả năng cao tổng cung của SUI sẽ rất lớn.
    • Transfer: 61 SUI
    • Tạo NFT: 840 SUI
    • Merge hai object: 447 SUI (Gộp 2 tờ tiền)
    • Phân tách object: 568 SUI (Tách tờ tiền ra nhiều tờ mệnh giá nhỏ hơn)
  • Không thấy nói gì đến decimals như các coin/token trên Ethereum.

Tham gia và nhận phần thưởng khuyến khích trên Sui Blockchain

Sui cũng có chương trình phần thưởng khi tham gia trong giai đoạn Testnet, các bạn nên tìm hiểu: Announcing Sui Incentivized Testnet. Phải đăng ký mới được, và hiện tại đã đóng đăng ký.

Tham khảo:

Bài viết này có hữu ích với bạn?

Kích vào một biểu tượng ngôi sao để đánh giá bài viết!

Xếp hạng trung bình 5 / 5. Số phiếu: 3

Bài viết chưa có đánh giá! Hãy là người đầu tiên đánh giá bài viết này.

Trả lời

Giao diện bởi Anders Norén