可扩展合约(Scalable contracts)
区别于ETH,在 TON 中,确实有一个非常具体的关于合约可扩展性的保证。TON 保证它可以按单个合约的粒度进行扩展。
因此在TON中,一个合约上的操作不会对另一个合约上的操作造成瓶颈,TON 还会将合约之间的所有信息路径处理好。
所以有一些常见的操作,在这里会有所变化,对于来自传统系统开发、大型网络数据库或以太坊的开发者们来说,有一个常见的操作,他们将合约设计成一个单体应用程序,拥有自己的可变长度存储变量。
例如,在以太坊中,token是以银行账目ledger的形式实现的,意味着一个智能合约包含着账户信息的列表。如果有一百万个用户,这个列表就会有一百万行。每个用户都有一个条目,说明该用户的地址是什么。他们的余额是多少。设计这样的合约非常简单直接。你可以直接进行原子交易,从一个余额中扣除,然后添加到另一个余额中。设计和了解系统如何运行都非常简单。但是,这种模式在 TON 中无法扩展,因为你要把这么长的清单放在一个合约中,马上就会遇到问题.
- 首先,你在合同中存储的所有这些数据的租金成本(RENT)将逐步增长。
- 其次,每当用户出现并希望对该合约进行操作时,因为合约中的越来越大量的数据, 他们将不得不支付越来越大的交易费用。
所以在设计合约时,有一些ground rule需要注意,尤其是正确设计多用户和大规模应用程序的时候:
- 避免使用长度可变的数据/变量。
- 如果必须要有一个列表,那么至少要让它简短并有边界,比如静态定义的。
- 如果必须要有一个动态增长的列表,那么至少要确保该合约为单个用户所有,并且他们拥有控制其存储的专有权,譬如 TON DNS 项目中的记录。
用一个简单的想象来理解,可以将TON的区块当作数组。在 TON 中制作大型的数据列表或字典,实现可扩展的方法就是将区块链本身用作数组。
举一些简单的例子
可以想象这样一个系统,它有多个相互连接的合约,每个用户都在处理自己的合约,而不必将整个列表存储都在某一个合约或app的核心部分。
Token
最好的例子就是在 TON 生态系统中设计的Token代币。在以太坊和许多非区块链应用中,代币是作为账户的简单分类账本实体来实现的。程序控制着一个账户列表,列表中的每个item实际上就是参与者的地址及其余额。这个模式非常简单,但在区块链环境下无法扩展,合约必须随着用户数量的增加而不断增长,而且每个用户的交互成本也会越来越高。
在 TON 中,Token是作为不同的合约实现的。每个用户一个合约,外加一个单独的矿工合约(minter contract),为创建新的代币单位提供接口。
个人用户的余额分布在 Jetton 钱包中。这些 Jetton 钱包的工作是为每个用户保存Token余额。每当用户想把Token从一个账户转到另一个账户时,他们首先会向自己的钱包发送一条外部信息,然后这个钱包会解开这条外部信息,并通过内部信息向该用户的 Jetton 钱包发送 "请把钱发送到某个地址"。然后,Jetton 钱包将其余额减去对应的金额,并将消息发送给代码完全相同但所有者不同的兄弟合约,消息中会写道:"请将余额增加相同的金额。“
这样做的好处就是,一个地方的两个 Jeton 钱包之间的操作不会干扰另一个地方的另外两个 Jeton 钱包的操作,而且它们可以分散在不同的分块链中,不会造成任何交通瓶颈。
🍞 这里使用 DNA-check消息验证法,因为Jetton的代码是相同的。
多签合约
多签名合约的概念在 TON 中得到了进一步不一样的体现,在 TON 中,多方共识是通过对用户发起的请求进行Token化代币化,从而实行共同授权的。
用户不会直接处理信息,而是会收到封装了其要求和投票权力的独特Token。这些暂时的特殊Token归用户所有,这种方式简化了投票跟踪,防止了恶意行为破坏合约。
诚实节点收集临时Token上的投票,而vote tokens一旦达到阈值,多重签名合约就会在验证request的真实性后直接执行操作。这种代币化的流程很简单,并且关注重点放在了系统的临时状态,而不是单个合约。
订阅付费
自Jetton钱包第 4 版起,就可以创建用于订阅付费的插件了。
这个插件功能性很强,而且由于用户可以控制插件列表,因此扩展性相对较好。但也有一些可能出现的问题需要着重注意。
如果一个用户订阅了很多服务,lets say订阅了100个付费服务,那对于他的钱包而言,存储的这些订阅地址会带来较高的rent租金费用和gas cost。
如果这些特定的插件地址上的不同代码是同一种付费订阅的执行代码,那么如果它们共享代码,不论拥有多少订阅插件都可以做到只有一条付费插件。钱包只需要和付费插件合约的代码做相互验证,就可以进行转账。
这么做的好处是成本从自己的钱包记录若干插件地址转移到了订阅服务提供者头上,因为他们会从和用户钱包交互的订阅合约中提取token,而这个成本会在他们提token的时候扣除。