Aptos 和 Sui——Move 合约开发有哪些异同
2022-09-22 18:32
Move-China 中文社区
2022-09-22 18:32
Move-China 中文社区
2022-09-22 18:32
订阅此专栏
收藏此文章



简介



本文介绍了从code 和 data 一起  code 和 data 分离 这种智能合约开发范式转移,再通过在 Aptos 和 Sui 上 BTC 跨链镜像资产合约实例, 介绍了 Aptos 和 Sui 合约开发的异同点。





智能合约开发范式转移




哈佛结构和冯·诺依曼结构

学过计算机体系结构的都知道, 哈佛结构和冯·诺依曼结构。


哈佛结构出现的更早, 当时的计算机设计, 程序和数据是俩个截然不同的概念,
数据放在存储器中,而程序作为控制器的一部分。


这种架构灵活性较差, 需要技术员既要懂硬件设计,又要懂程序设计。


冯·诺依曼结构中, 将程序和数据一样看待, 将程序编码为数据,然后与数据一同存放在存储器中。这样计算机就可以调用存储器中的程序来处理数据,程序不再是控制器的一部分了。


这种设计思想导致了硬件和软件的分离, 即硬件设计和程序设计可以分开执行!这就催生了程序员这个职业的诞生。


哈佛结构在嵌入式芯片行业常见 ( 比如 ARM9~ARM11 芯片, 而 ARM7 系列则采用了冯·诺依曼结构 ),而 PC 和服务器芯片基本是冯·诺依曼结构。


可以说, 互联网程序员都是在冯·诺依曼结构下进行程序设计。


简单地, 哈佛结构就是code 和 data 分离, 冯·诺依曼结构就是code 和 data 一起。



区块链虚拟机与智能合约开发


虚拟机执行智能合约始终围绕着这个核心问题:

(1) Where: 合约要处理的数据在哪
  • code 和 data 一起data 处于 code 所在的作用域, code 随时读取 data。
  • code 和 data 分离:将 data 或 data 的位置传给 code, 且 code 只能处理这些给定的数据 ( 无法访问其他数据 )。

而合约开发者更关心:
(2) Who: 谁能访问这些数据
(3) How:如何处理这些数据 ( 业务逻辑 )

简单地, 我们把常见的区块链虚拟机分类:
  • EVMcode 和 data 一起
  • WASMcode 和 data 一起
  • Solana-BPFcode 和 data 分离
  • Aptos-Movecode 和 data 分离
  • Sui-Movecode 和 data 分离

因为不需要关心 data 的存储位置 ( 就像冯·诺依曼结构下, 程序员不需要懂硬件电路一样 ),所以对于互联网程序员来说, 在EVMWASM上编写合约程序更简单。
如果在Solana-BPF,Aptos-Move,Sui-Move上开发智能合约,就需要像硬件工程师关心数据控制器一样去关心 data 的位置:
  • Solana 合约: 调用者需要指定访问 data 的地址及其读写属性。
  • Sui 合约: 与 solana 类似, 调用者需要指定访问 data 的 object-id。
  • Aptos 合约: 更简单, 数据通过 move_to 和 signer 绑定, 又通过将合约部署者和合约绑定,使得合约也可以拥有自己的状态数据, 调用者不再需要自己指定访问 data( 但需要调用者提前注册 data, 完成 move_to 绑定 )。

合约开发难度 solana > sui > aptos



Aptos 和 Sui 智能合约开发对比



在 Aptos 和 Sui 上, 分别实现了 BTC 跨链镜像资产合约
OmniBridge 源码链接
https://github.com/OmniBTC/OmniBridge

相同点: Aptos 和 Sui 使用的是相同的 VM 和智能合约开发语言

不同点:

(1) Aptos 和 Sui 的 VM 库函数 ( 供合约内部调用 ) 不同。
为了防止重复 deposit, 需要一个队列存储已 deposit 的请求bridge-aptos 的 iterable_table 底层用的是 table( 定义在 AptosStdlib)bridge-sui 的 vec_queue 底层用的是vector( 定义在 MoveStdlib)

(2) Aptos 用户合约 package 地址是合约部署者的地址, 而 Sui 则将所有用户合约地址统一到0x0地址下。
bridge::initialize 只能由合约的 owner 调用bridge-aptos 中可以直接用 "@owner"进行对比bridge-sui 中只能在 init 时将 creator 先保存到 Info 中, 调用 initialize 时在取出对比


(3) Aptos 用户需要自己定义调用 initialize 等函数完成合约的初始化, 而 Sui 用户只需要自己定义 init 函数 ( 不能传自定义参数 ), 合约部署的时候完成初始化。

admin 和 controller 只能被初始化一次bridge-aptos 中的 initialize 做了存在性检查, 确保 admin 和 controller 只被初始化一次bridge-sui 中的init先初始化一个object, 在调用 initialize 完成最后的初始化


(4) Aptos resource 不能直接转移到 receiver 地址, 而 Sui object 可以直接转移到 receiver 地址。

XBTC 的 transferbridge-aptos 需要先 xbtc::register, 再 xbtc::transferbridge-sui 只需一步 xbtc::split_and_transfer


(5) Aptos 中的 fungible tokens 不需要merge操作, 而 Sui 则提供了merge,以便将很多小额 objects 合并为 1 个 object。

XBTC 的 transferbridge-sui xbtc::join 和 xbtc::join_vec


(6) Aptos 合约内通过 move_to 将 resource 和 signer 绑定, 而 Sui 合约内禁用 move_to。

bridge-sui xbtc::init 调用 move_to, 编译时报如下错误ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some( "Access to Move global storage is not allowed. Found in function init: [MoveTo(StructDefinitionIndex(1))]" ) }

(7) Aptos 中可以使用public(script), 而 Sui 则废弃了public(script)。
bridge-sui 中使用`public(script)`, 编译时报如下错误'public(script)' is deprecated in favor of the 'entry' modifier. Replace with 'public entry'

(8) Aptos 地址是 32 字节, 而 Sui 地址是 20 字节。
bridge-aptos admin example: 0xa24881e004fdbc5550932bb2879129351c21432f21f32d94bf11603bebd9f5c0bridge-sui admin example: 0xdea83a5c27ef936cd9efd3bc596696e1d101d647
(9) Aptos 合约支持升级, 而 Sui 合约目前不支持升级。

bridge-aptos upgrade-policy`arbitrary`, `compatible`, `immutable` 对应 0120 不做任何检查,强制替换 code,1 做兼容性检查 ( 同样的public 函数,不能改变已有 Resource 的内存布局 )2 禁止升级每次 publish 的时候会比较链上的 policy 和此次 publish 的 policy( 默认是1),只有此次的 policy 小于链上的 policy 时才允许合约升级

(10) 在 move 合约调用请求与合约接口之间这一层的处理不同。

比如 Aptos 的合约参数只能是基本类型, 而 Sui 则可以是自定义结构 ( 调用传参时传 object-id) 且最后一个参数只能是 TxContext。

比如 Aptos 的 signer 绑定了 resource, 因此合约可以通过 signer 访问相应的 data, 而 Sui 只能通过调用者传递的 object-id 访问相应的 data。

比如 Aptos 合约在做自定义访问控制时更容易, 而 Sui 合约的访问控制可能会在不同的 object 中, 这就要求开发者主动关联这些 objects, 很容易产生合约安全漏洞。
bridge-sui bridge::deposit 函数签名及函数调用public entry fun deposit( account: &signer, receiver: address, amount: u64, memo: String,) acquires Infoaptos move run \ --private-key=$PRIVATE \ --url=http://127.0.0.1:8080 \ --function-id=0xa24881e004fdbc5550932bb2879129351c21432f21f32d94bf11603bebd9f5c0::bridge::deposit \ --args address:0xa24881e004fdbc5550932bb2879129351c21432f21f32d94bf11603bebd9f5c0 u64:10000000 string:"test" \bridge-sui bridge::deposit 函数签名及函数调用public entry fun deposit( info: &mut Info, xbtc_cap: &mut TreasuryCap<XBTC>, receiver: address, amount: u64, memo: vector<u8>, ctx: &mut TxContext)sui client call --gas-budget 10000 \ --package 0xc087a76e0495c395db814587688930b7fd808cad \ --module "bridge" \ --function "deposit" \ --args 0xe57396fb7f2c09ffb0fec0af7e175d106dc18253 \ 0x5c3d9503d9963c0887b13e6b1cca4c9ca341d39d \ 0xdea83a5c27ef936cd9efd3bc596696e1d101d647 \ 100000 \ "test"



Space 预告











MoveChina:
https://move-china.com/



【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

Move-China 中文社区
数据请求中
查看更多

推荐专栏

数据请求中
在 App 打开