按照官方文档拿git装,或者直接https://github.com/MystenLabs/sui/releases下预编译二进制

可以拿update-alternatives链接到/usr/local/bin,也方便版本管理

运行本地网络

不过没什么用,合约报错信息基本没有😅

# 不想看log的用 `RUST_LOG="off,sui_node=info" sui-test-validator`
sui-test-validator
# ACCOUNT 换成你自己的地址
curl --location --request POST '<http://127.0.0.1:9123/gas>' \\
--header 'Content-Type: application/json' \\
--data-raw '{
    "FixedAmountRequest": {
        "recipient": "ACCOUNT"
    }
}'

添加/切换网络

sui client new-env --alias local --rpc <http://127.0.0.1:9000>
sui client switch --env local

创建&编译&部署

# 在当前目录创建test文件夹并初始化sui move项目
sui move new test
# 需要先cd到在Move.toml所在目录
sui move build
# 依赖版本不符不用管,加 --skip-dependency-verification
# 如果是Sui包不符,可以试着在Move.toml中将Sui的rev切换到mainnet或者framework/testnet
sui client publish --gas-budget 1000000000

部署或调用后都会有长长的log输出,能在Transaction Effects看到object变化情况,包括新创建的、变化的等,能获取到object ID和type用于进一步查询

Published Objects 就是新部署的合约

调用

例如调用下面这个合约

module test::exp {
    public entry fun initialize<A,B>(capa: MintA<A>, capb: MintB<B>,ctx: &mut TxContext) {
        ...
    }
    public fun attack(coina:Coin<CTF>, vec: vector<u256>)
    ...
}

调用attack,我们需要传入coin对象和一个vec,对于object直接传ID,原生类型就传值即可:

PACKAGE=0x6f9ca8a0994362540e9f8ca80e047a322fb57148e4ddbc47eebdaae8e1b38ff0
COINA=0x0ce2a8e748b3802818304dc7fca940b2dc9db2586c2e5a8705c45aa2281778e5
sui client call --function attack --module exp --package $PACKAGE --args $COINA "[1, 0, 0, 1, 1]" --gas-budget 1000000000

但在调用initialize函数时,可以看到这个函数有泛型参数,故我们需要通过 --type-args 先传递A和B的具体类型(不是传参数类型,而是泛型类型),具体是什么类型,可以在其他call或合约部署log中看object类型,格式都是: PACKAGE_ID::MODULE_NAME::TYPE 例如下方这种

sui client call --function attack --module exp --package $PACKAGE --args $CTFA_MINT $CTFB_MINT --type-args "$PACKAGE::ctfa::CTFA" "$PACKAGE::ctfb::CTFB" --gas-budget 1000000000

查看transaction/object