01.初识

本章目录

  • 1️⃣ 区块链基础
  • 2️⃣ Hello World
  • 3️⃣ 合约代码中的三种注释
  • 4️⃣ 合约结构介绍

1️⃣ 区块链基础

Move 是运行在区块链上开发智能合约的语言,我们不需要关心所在区块链底层逻辑,我们只有学会使用 Move 进行智能合约的编码。简单了解以下的区块链概念:

  • 事务
  • 交易
  • 地址
  • 区块
  • 存储/内存/栈

1.事务

事务意味着你想做的事情,要么一点没做,要么全部完成。具有原子性,不存在修改一半的情况。

比如从 A 地址向 B 地址转账 100 元,那么数据库里 A 减 100 元,B 加 100 元。如果因为某些原因导致 A 已经减了 100 元,但是 B 加 100 元中间出现了异常。因为事务的原子性,发生失败后 A/B 地址都不会发生任何修改。这种场景在合约中经常发生,会经常看到 out of gas 异常,这是因为 gas 被耗尽。此时合约中做的所有修改都会被回滚。

gas:合约的手续费;是作为用户为当前交易支付的手续费,每一笔交易都会收取 gas 费,目的是限制交易需要做的工作量,需要做的事情越多,所花费的 gas 也就越多;gas 会按照特定规则进行逐渐消耗,如果执行完成后还有剩余,gas 会在当前交易内原路返回到交易发起者的地址中。

2.交易

交易可以看作一个地址发送到另外一个地址的消息,可能包含一个二进制数据和Token。

  • 如果目标地址含有代码,则此代码会被执行,并以 payload 作为入参。
  • 如果目标地址是零地址,此交易将创建一个新合约。
    • 这时候用来创建合约的 payload 会被转为 Move 字节码执行,执行的输出作为合约代码永久存在区块链上。
    • 所以如果创建一个合约,并不需要向链上发送实际的合约代码,只需发送能够产生合约代码的代码就可以。

区块链中的交易遵守事务的特性。交易总是由发送人(创建交易的地址)进行签名。区块链底层会确保只有持有该地址密钥才能发起交易。正因为这个特性,所以才能为区块链上特定状态的修改增加保护机制。

比如在合约中指定某一个方法只有"管理员"账号可以用,我们只需要验证调用者是否为管理员地址就可以了,至于地址权限的保护事情并不需要关心,只要是该账号发起的交易,就认为是管理员在操作。安全方面我们需要考虑的是,如果某一个地址被盗了怎么样,通常这些是业务逻辑决定,比如多签钱包的业务。

3.地址

地址很多时候也被称为账户

  • 外部地址:由公钥-私钥对控制
    • 常用的助记词,keystore 文件等只是方便用户储存,底层还是会转成私钥。
    • 一般是钱包应用创建的地址。公钥就是0xABC的这种Token收款地址,私钥可能是助记词生成,可能是 keystore 文件生成,也可能是用户直接保存的。
  • 合约地址:由地址一起存储的代码控制。

无论外部地址,还是合约地址,对于 EVM 来说,都是一样的。每个地址都有一个键值对形式的持久化存储。其中 key 和 value 都是 256 位,我们称为存储。此外每个地址都会有一个以太币的余额,合约地址也是如此;余额会因为发送包含以太币的交易而改变。

2️⃣ Hello World

Move 合约类似于Rust编程语言。后面会逐步展开介绍,国际惯例,使用当前语言的 Hello World 作为第一个例子。

1.例子代码

module ch01::hello {
    use sui::tx_context::{TxContext, sender};
    use sui::transfer;
    use std::string;
    use std::string::String;

    public struct HelloMove has key,store{
        hello:String
    }

    fun init(ctx:&mut TxContext){
        let hello  = string::utf8(b"Hello Move");
        transfer::public_transfer(HelloMove{hello},sender(ctx));
    }

}


2.Hello World 例子分析

3️⃣ 合约代码中的两种注释

Move 支持 2 种注释方式;

  • 单行注释
  • 块注释

重要提示 截止目前move 目前不支持中文注释,只支持英文注释

1.单行注释

格式: // Single-line comments

// this is a hello world
    // Single-line comments
    let hello  = string::utf8(b"Hello Move");

如上,// 后面的内容都会被编译器忽略,为了可读性,一般会在//后面加一个空格。

2.块注释

格式如下,在 /**/ 之间的内容,都被编译器忽略

    /*
     Multiline comments
    */

为了可读性,一般块注释的行首都加 * 和空格,如下

    /**
     * This is a block comment
     * This is a block comment
     */

⓵ 变量

合约内的 hello 叫做变量。关于变量的更多信息,会在后续文章说明

⓶ 函数

函数是代码的可执行单元,是一组逻辑的集合。关于变量的更多信息,会在后续 [函数]那一章详细介绍

4.use 导入声明

功能:从其他文件内倒入需要的函数和结构体。

⓵ 导入方式