move 学习

2025-06-17

1. 区块链基础概念

1. 区块链平台:区块链平台是一个分布式数据库,,它由许多计算机节点组成。这些计算机节点共同维护着一个共享的账本,称为区块链。(比如sui)
2. 智能合约: 运行在区块链平台上的计算机程序,智能合约主要执行3件事:创建资产,管理资产,权限控制
3. move语言:智能合约编程语言,可以类比于c语言这种计算机编程语言

4. 区块链资产(Blockchain  Asset):区块链网络上记录和存储的数字化资产,比如加密货币(比特币),稳定币(加密货币的一种,但和法定货币直接挂钩,如usdt),NFT(数字资产,艺术品),Coin代币(代表各种东西,如公司股票)
5. 区块链账户(Blockchain Account):是在区块链网络中用于存储和管理用户资产和交易记录的数字账户。每个参与特定区块链网络的用户都可以拥有一个或多个区块链账户。(实际上就是公私钥对,公钥做地址,私钥做身份认证)
6. 资产所有权(Ownership):资产所有权是指对资产的占有、使用、收益和处分的权利。
资产所有权可以分为以下几种类型:
独有权:私有权是指个人资产的专有所有权。
共有权:共有权是指两个人或两个人以上共同对资产的所有权。
7. 区块链钱包(Blockchain Wallet):是一种用于存储、管理和交换加密货币的数字钱包。它是在区块链技术基础上开发的工具,允许用户安全地保存其加密货币资产(包括生成区块链账号),并进行交易和管理。
区块链钱包的类型有很多,包括:
热钱包:热钱包是指连接互联网的区块链钱包。热钱包比较方便使用,但安全性较低。
冷钱包:冷钱包是指不连接互联网的区块链钱包。冷钱包比较安全,但使用起来不太方便。
硬件钱包:硬件钱包是一种物理设备,它可以用来存储和管理区块链资产。硬件钱包非常安全,但价格比较昂贵。
8. 区块链浏览器(Blockchain Explorer):一种用于浏览和查询区块链上数据的工具。它提供了一种用户友好的界面,使用户能够浏览区块链上的交易、区块、地址和其他相关信息。

2. 环境搭建

2.1 sui(区块链平台)

sui可以通过brew快速安装。

# 下载安装脚本
git clone --depth=1 https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/install.git brew-install

# 执行安装脚本
./brew-install/install.sh

# 将brew添加到环境变量,路径为/home/your_user/.bashrc
echo >> /home/wsxk/.bashrc
echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/wsxk/.bashrc
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"

# 用brew安装sui
brew install sui

2.2 Sui Wallet(区块链钱包)

其实可配可不配。
Sui的区块链钱包有多种,基本功能是一致的(存储、管理资产),不同的区块链钱包提供了不同的功能。
这里我安装了Sui Wallet(slush)
在chrome浏览器上安装插件即可。
https://chrome.google.com/webstore/detail/opcgpfmipidbgpenhmajoajpbobppdil
安装步骤比较简单,无需多言

2.3 suiscan(区块链浏览器)

区块链浏览器用于查看区块链,这里提供两个区块链浏览器:
https://suiscan.xyz/
https://suivision.xyz/

2.4 faucet(测试网sui)

sui(区块链平台)中有很多张区块链网络,当然作为学习用途,我们肯定不能直接花钱买币。所以为了能白嫖币供我们使用,我们需要连接测试网,俗称水龙头https://faucet.sui.io/
获取sui token的办法https://docs.sui.io/guides/developer/getting-started/get-coins

2.5 VScode move插件

参考https://docs.sui.io/references/ide/move
要想写move语言,ide必不可少:我使用VScode来编写,但是需要安装相应插件,安装步骤如下:

sudo apt-get install curl git-all cmake gcc libssl-dev pkg-config libclang-dev libpq-dev build-essential
sudo snap install rustup --classic
rustup default stable
cargo install --git https://github.com/MystenLabs/sui.git sui-move-lsp

随后在VSCODE插件发布市场里搜索mysten.move并安装即可
安装完成后,在terminal执行命令sui move new hello_move,并抄抄代码:

module hello_move::hello ;

use std::ascii::{String, string};
use sui::object::{Self, UID};
use sui::transfer::transfer;
use sui::tx_context::{TxContext, sender};

public struct Hello has key {
    id: UID,
    say: String
}

fun init(ctx: &mut TxContext) {
    let hello_move = Hello {
        id: object::new(ctx),
        say: string(b"move"),
    };
    transfer(hello_move, sender(ctx));
}

2.6 发布项目

使用/home/wsxk/.sui/sui_config/client.yaml文件配置区块链
配置完成后,它会自动生成新的地址和私钥。
接下来使用sui client faucet命令获取sui tokens
接着使用sui client gas查看结果:
接着再运行一次sui client publish

发布成功后,可以到区块链浏览器上查看详情:
其中,Transaction Effects中的Digest字段的值,可以让我们在区块链浏览器中找到我们发布事件

2.7 cli调用函数的方法

sui client publish //发布上链
sui client call --package package_id --module module_name --function func_name --args .... 
//如果参数中需要用到地址,需要记住参数的object id

2.8 本地调试

上节讲的是将所写代码发布到测试网testnet然后尝试调用某个公开的function,在实际编写move代码时,为了能够更有效的查看代码结果,发布在testnet上还是不方便。
目前比较好用的还是单元测试,在项目的代码中添加:

#[test]
public fun test_a_greater_than_b() {
  debug::print(&string::utf8(b"test start!"));
}

然后terminal中执行sui move test即可

3. Move语言基本概念

其实只要了解Move语言中比较关键的部分,其余部分和诸如c语言等编程语言是类似的。

3.1 package、module

package是指同一个合约地址包含的全部代码的集合,由很多模块组成,比如一个项目sui move new hello_move
module就是package中的其中一个模块,比如hello_move项目中的hello_move.move文件

3.2 方法的访问权限控制

方法是module中的函数,类比与c的函数
跟c语言不同的是,方法前面可以添加关键字来确定这个方法的访问权限,即这个方法能被谁调用
一般访问权限控制由如下几种模式:

1. fun call():                 表示只有module内可见,只能在module内被调用
2. public(package) fun call(): 表示只对当前package内可见,可以在package内被调用
3. public fun call():          表示对任意package可见,其他package都可以调用
4. entry fun call():           表示能被链下其他事务调用(即dapp(RPC)调用,能够被我们手动调用)
5. public entry fun call():    表示任意package,链下其他事务都能调用。

3.3 object和资产和资产所有权

objectstruct演变而来:

//寻常struct
public struct NAME {
    FIELD1: TYPE1,
    FIELD2: TYPE2,
    ...
}

//object,加个 has key,且结构体的第一个成员变量一定是UID类型,就会变成object(对象),move中这种object就代表一个资产。
public  struct ColorObject has key {
        id: UID,
        red: u8,
        green: u8,
        blue: u8,
}

资产是有所有权的(你也不想你的钱也是别人的钱吧)
move语言中,所有权分为独享所有权和共享所有权,有如下表现形式:

1. 对于只有key属性的独享所有权对象,要进行所有权转移,需要使用transfer方法
2. 对于有key+store属性的独享所有权对象,要进行所有权转移,需要使用public_transfer方法
3. 对于只有key的共享所有权对象,在使用时必须进行share_object方法来设置对象
4. 对于有key+store的共享所有权对象,在使用时必须进行public_share_object来设置对象

需要注意的是,函数在使用这些所有权对象时,访问权限会发生转移:

fun f(consume: T, write: &mut T, read: &T)
T: transfer, delete, write, read  //这种场景下相当于访问权限从父函数传递到了f函数,父函数之后不能再使用,除非f函数又将T返回
&mut T: write, read //父函数还是拥有先前权限
&T: read//父函数还是拥有先前权限

函数的访问权限和对象所有权是有区别的,需要注意。

4. Move语言常见漏洞