Aptos由前facebook员工开发的一条新公链(权益证明),实现了高吞吐量,而且由move语言构建的智能合约具有高安全性。Aptos 使用 BFT 共识以及 Move 编程语言,目标是建立最安全和最具可扩展性的 Layer 1 区块链。Aptos 正在其共识协议 Aptos BFT 的第四次迭代上运行,声称这是迄今为止最低延迟和最先进的迭代。将共识与执行分开,并极大缩短了交易执行时间,优化了身份验证和数据结构。Aptos 的技术特点之一是使用并行交易执行,从而达到高可扩展性。目前大部分的区块链使用串行的交易执行方式,即交易是一笔接一笔地纳入区块中的,必须等待上一笔交易完成,才能进行下一笔交易。这样做的好处是会更容易进行交易状态的确认,但可扩展性会受限。而并行执行,则是指一次性可以同时执行多笔交易,一般会对当前状态进行快照,然后把多笔交易同时处理。这样做显然提高了交易吞吐量,但难点的是如何让不同的交易之间互不影响。目前 Aptos 称其测试网有 2 万多个节点,每秒交易处理量(TPS)达到 1 万,其终极目标是每秒 10 万笔。不过是否能达到这一目标,网络是否能稳定运行不宕机,这些实际的情况还需要等主网上线后再观察。
Move编程语言的创建是为了作为 Aptos 的愿景的安全、可编程的基础,即创建一个赋予大众权力的金融基础设施。考虑到这一点,Move 旨在解决当前区块链语言的主要痛点。因此,Aptos 提出的解决方案可以概括为四个关键目标:一流的资源、灵活性、安全性和可验证性。Move 的主要特点是能够定义自定义资源类型,从统计上确保资源只能在程序存储位置之间移动,而不能克隆或删除。此实现通过有效防止上述漏洞等问题显着提高了安全性。然后资源由移动模块管理,类似于智能合约,因为它们控制对创建、更新和删除已声明资源的规则进行编码的过程。Move 模块相对于智能合约的好处是它们强制执行数据抽象,这意味着资源在其声明模块内部是透明的,在其外部是不透明的。此外,在表达性规范语言的帮助下,Move 证明者可以正式验证 Move 模块的特征,并且足够高效,可用于持续集成测试。
上面简单介绍了aptos和move的特性以及优势,接下来通过部署,调用实际操作的方式更加深入的认识一下aptos和move,并对照现在相对成熟的evm和solidity,探讨一下move的安全性和相关问题。
在尝试部署和调用前,先大致了解aptos的一些体系。首先是账户体系,账户代表aptos区块链上可以发送交易的资源,和其它区块链一样,账户都对应一个地址,这个地址是一个32字节的值,具体如下图:
每个账户都存储一个身份验证密钥。此身份验证密钥能够轮换与账户关联的私钥,而无需更改账户,在轮换期间,身份验证密钥会根据新生成的公私钥对进行更新。可以使用aptos init生成一个账户。
可以看到public_key和private_key。身份验证密钥根据public_key生成,具体方式是:auth_key = sha3-256(pubkey_A | 0x00), 其中 | 表示连接。 0x00 是一个 1 字节的签名方案标识符,其中 0x00 表示单签名。 auth_key 的前 16 个字节是“认证密钥前缀”。 auth_key 的最后 16 个字节是账户地址。任何创建账户的交易都需要账户地址和认证密钥前缀,但与现有账户交互的交易只需要地址。
以上是单签名者,还有一个多重签名模式。个人理解多重签名模式类似常见的多签合约。
按上述内容的理解,身份验证密钥可以替换一个账户的公私钥,所以相当于一个地址的最高owner,所以身份验证密钥可以被设计为多个签名:
-
1. 生成密钥对:生成 N 个 ed25519 公钥 p_1, ..., p_n。
-
2. 派生一个 32 字节的身份验证密钥:计算 auth_key = sha3-256(p_1 | … | p_n | K | 0x01)。如上所述派生地址和身份验证密钥前缀。 K 表示验证交易所需的 K-of-N。 0x01 是一个 1 字节的签名方案标识符,其中 0x01 表示多重签名。
Move
Aptos的每个交易都包含一个Move交易脚本,该脚本对验证器代表客户端执行的逻辑进行编码。交易脚本通过调用一个或多个move模块,与区块链全局存储中的move资源进行交互。Move模块就好比是智能合约,定义了更新区块链的一些规则,模块必须和一个账号绑定,也就是一个地址。交易脚本可以说是一个tx,它可以是一个单一的交易,也可以多个模块调用的一个复杂的交易。这个交易脚本并不存储在链上,调用对象也只能是模块,交易脚本只能使用一次。下面尝试部署一个aptos模块(合约)。
如何在aptos上部署一个合约
环境安装,首先在github上下个aptos客户端
wget https://github.com/aptos-labs/aptos-core/releases/tag/aptos-cli-v0.3.1a
然后进行解压
unzip aptos-cli-0.2.3-Ubuntu-x86_64.zip
解压出来之后是一个可执行文件,现在配置一下环境变量
vim~/.bashrc
exportPATH=$PATH:/root/aptos/cli
soure~/.bashrc
在终端执行一下
然后创建个文件夹
aptos init
生成了一个账户,账户信息保存在config.yaml文件中。
用默认配置即可,大致目录 :
|.aptos|
|config.yaml
|Move.toml
|sources|
|modules
|tests
这段代码大致意思就是一个set的操作。首先定义了一个MessageHolder结构体,一个函数set_message。set_message 是一个script函数,允许被交易直接调用,调用它之后函数会确认账户是否有MessageHolder 资源,没有的话就创建一个并把信息写入,有的话就覆盖掉。还有一个get,用来读。
上面的test是我们的一个测试用例。
上述做完之后,开始尝试编译测试:
发现编译通过,然后部署上链。
以下是返回的上链信息。可以放到aptos explorer上看。
去浏览器搜索对应hash,能看到合约的函数接口。
一个完整的上链流程就是这样。然后尝试调用一下新部署的合约,也就是模块。需要构建一个交易脚本。
先运行一下这个命令,会创建一个文件夹。
然后进入文件夹,
会启动一个web界面,端口默认3000。
其实就是引入了一个rpc节点,启了一个前端页面。打开f12,先连一下钱包。
然后尝试调用一下set_message函数。
可在浏览器上看到调用结果。
Move安全性初步认识
1. 溢出问题
这个问题属于常见问题,u8,u16这些表示数据类型,拿u8举例,无符号整型,所以范围是[0,255]。当遇见下图写法:
这种情况就会产生溢出问题,不过move在编译的时候就会把这种情况抛出。
和solidity一样,针对四则运算,编译的时候都会抛出,如果位运算不会,这个地方需要注意,不能过度依赖编译检查。
2. 拒绝服务
当外部参数可控,并且类型是一个不定长数组,因为上链都需要消耗gas,这种情况下会发生拒绝服务,要仔细对参数和遍历操作进行检查。
-
3. 函数权限
对于一些函数调用的权限要仔细划分,因为一些关键函数会涉及到治理,严重的会影响到资金安全,针对这种函数调用针对调用者要进行鉴权。
-
4. 重入漏洞
在以太坊中,当对一个合约地址进行转账但没有调用的时候会进入到目标合约地址的fallback函数,从而失去对代码的控制权。
针对move,这个addr就相当于一个modules,当在用到任何外部模块的时候都必须先导入和声明,这有效防止了重入。
总结
Aptos目前还是一个相对崭新的领域,此次也是对aptos的初步探索。Move的语言设计初衷就是从安全角度出发,Move 的主要特点是能够自定义资源类型,资源永远不能被复制或者被隐式丢弃,只能在程序的存储位置间移动,这也大量避免了一些rug事件。对于move的底层vm,后续再进行进一步分析。
Numen 导航
Numen 官网
https://www.numencyber.com/
GitHub
https://github.com/NumenCyber
https://twitter.com/@numencyber
Medium
https://medium.com/@numencyberlabs
https://www.linkedin.com/company/numencyber/
原文始发于微信公众号(Numen Cyber Labs):Aptos初步学习
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论