Get started

2024年9月21日
Ellen | 不霁何虹

Move

Move 编程语言最初是由 Facebook 的一个工程师团队为 Diem 支付网络创建的。Move 旨在成为一种与平台无关的语言,以支持跨不同区块链的通用库、工具和开发者社区,这些区块链具有截然不同的数据和执行模型。

原则解释
默认安全金融系统的构建确保用户不会丢失资金。Move 设计旨在防止重入攻击、双重支付和算术溢出等错误。类型安全和编译时检查是安全性的重中之重。
运行时验证字节码可以在运行时进行验证,确保没有问题,提供额外的安全性并防止恶意行为者。
形式化验证Aptos 上的 Move 提供规范语言,用于对合约进行形式化验证,证明不变量并有助于代码审计。
简洁性命令和字节码保持简单,便于反编译、运行时验证和代码检查。使用常规编程语言进行区块链开发通常需要忽略语言的大部分内容,以使其适用于智能合约。

Aptos 上的智能合约

Aptos 合约使用 Move 编写,这是一种用于安全、沙盒化和形式化验证编程的下一代语言,适用于多个链。Move 允许开发者编写灵活管理和转移资产的程序,同时提供安全性和防止对这些资产的攻击。

📖 学习 Move

👨‍💻 Move 示例

这是一个 hello_blockchain 的 Move 示例:

module hello_blockchain::message {
    use std::error;
    use std::signer;
    use std::string;
    use aptos_framework::event;

    //:!:>resource
    struct MessageHolder has key {
        message: string::String,
    }
    //<:!:resource

    #[event]
    struct MessageChange has drop, store {
        account: address,
        from_message: string::String,
        to_message: string::String,
    }

    /// There is no message present
    const ENO_MESSAGE: u64 = 0;

    #[view]
    public fun get_message(addr: address): string::String acquires MessageHolder {
        assert!(exists<MessageHolder>(addr), error::not_found(ENO_MESSAGE));
        borrow_global<MessageHolder>(addr).message
    }

    public entry fun set_message(account: signer, message: string::String)
    acquires MessageHolder {
        let account_addr = signer::address_of(&account);
        if (!exists<MessageHolder>(account_addr)) {
            move_to(&account, MessageHolder {
                message,
            })
        } else {
            let old_message_holder = borrow_global_mut<MessageHolder>(account_addr);
            let from_message = old_message_holder.message;
            event::emit(MessageChange {
                account: account_addr,
                from_message,
                to_message: copy message,
            });
            old_message_holder.message = message;
        }
    }

    #[test(account = @0x1)]
    public entry fun sender_can_set_message(account: signer) acquires MessageHolder {
        let addr = signer::address_of(&account);
        aptos_framework::account::create_account_for_test(addr);
        set_message(account, string::utf8(b"Hello, Blockchain"));

        assert!(
            get_message(addr) == string::utf8(b"Hello, Blockchain"),
            ENO_MESSAGE
        );
    }
}

⚒️ 开发者资源

常见问题和讨论

Move IDE 插件

外部资源

一个新的 Move 编译器和语言版本目前正在早期测试中。如果你有兴趣尝试,请查看此页面