钱包合约类型
您可能听说过 TON 区块链上不同版本的钱包。但这些版本究竟是什么意思,它们之间有什么区别?
在本文中,我们将探讨 TON 钱包的各种版本和修改。
共同概念
要打破这种紧张关系,我们首先应该明白,钱包并不是 TON 生态系统中的一个特定实体。它们仍然只是由代码和数据组成的智能合约,从这个意义上说,它们与 TON 中的任何其他角色(即智能合约)都是平等的。
与您自己的定制智能合约或其他任何合约一样,钱包可以接收外部和内部信息,发送内部信息和日志,并提供 "获取 "方法。 那么问题来了:它们提供哪些功能,不同版本之间有何不同?
您可以将每个钱包版本视为提供标准外部接口的智能合约实现,允许不同的外部客户端以相同的方式与钱包进行交互。您可以在主 TON monorepo 中找到这些 FunC 和 Fift 语言的实现:
基本钱包
钱包 V1
这是最简单的一种。它只允许您一次发送四笔交易,而且除了您的签名和序列号外不检查任何东西。
钱包源代码:
这个版本甚至没有在常规应用程序中使用,因为它存在一些重大问题:
- 没有从合约中获取序列号和公钥的简单方法。
- 没有
valid_until
检查,因此无法确保交易不会太晚确认。
第一个问题已在 V1R2
和 V1R3
中解决。R
代表 修订
。通常情况下,修订版只是增加获取方法的小更新;你可以在 new-wallet.fif
的更改历史中找到所有这些更新。在下文中,我们将只考虑最新的修订版本。
尽管如此,由于每个后续版本都继承了前一个版本的功能,我们仍应坚持使用它,因为这将有助于我们以后版本的开发。
持久内存布局
- seqno:32 位长序列号。
- public-key: 256 位长公开密钥。
外部信息正文布局
- 数据
- 签名:512 位长 ed25519 签名。
- msg-seqno:32 位长序列号。
- (0-4)模式:最多四个 8 位长整数,定义每条报文的发送模式。
- 最多 4 次引用包含信息的 cell 。
如您所见,钱包的主要功能是提供一种从外部世界与 TON 区块链进行通信的安全方式。seqno
机制可以防止重放攻击,而 Ed25519 签名
则提供了对钱包功能的授权访问。我们将不再详细介绍这些机制,因为它们在外部消息文档页面中有详细描述,并且在接收外部消息的智能合约中非常常见。有效载荷数据由最多 4 个 cell 引用和相应数量的模式组成,它们将直接传输到 send_raw_message(cell msg, int mode) 方法。
请注意,钱包不对通过它发送的内部信息进行任何验证。程序员(即外部客户端)有责任根据 内部信息布局 对数据进行序列化。
退出代码
退出代码 | 说明 |
---|---|
0x21 | 序列号 检查失败,已获得回复保护 |
0x22 | Ed25519签名 检查失败 |
0x0 | 标准成功执行退出代码。 |
Get 方法
- int seqno() 返回当前存储的序列号。
- int get_public_key 返回当前存储的公钥。
钱包 V2
钱包源代码:
该版本引入了 valid_until
参数,用于设置交易的时间限制,以防过迟确认。该版本也没有在 V2R2
中添加的获取公钥的方法。
与前一版本相比,所有不同之处都是由于添加了 valid_until
功能。增加了一个新的退出代码:0x23
,表示 valid_until 检查失败。此外,外部消息体布局中还新增了一个 UNIX-time 字段,用于设置事务的时间限制。所有获取方法保持不变。