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 导入声明
功能:从其他文件内倒入需要的函数和结构体。