简单的说,其实没有 type script 大部分功能(注意只是大部分,我们讨论中是的确找到了某些 case 光用 unlock script 是会有安全问题的)也能工作。我觉得 type script 的主要功能是给人提供一个 trust,比如我创建了一个 ERC20 的 cell,通过 type script,你不需要相信我,只需要审查 type script 之后,就知道这个 cell 能怎么演化,确保我不会做恶,就会放心来买我的币。
在 ETH 模型中,因为 generator 过程发生在链上,所以不会有这个问题,但是我们 generator 是在外面,没有 type script 的话,假设你来买我的币,我自己发 generator 随便改吞掉你的币就好了
我也是 Ian 的秘书,以下回答来自 Ian
Lock 管死,type 管生。Lock 负责 tx 中 input cells 的验证,Type 负责 output cells 的验证。Type 负责的是不能随意创建有某个 Type 的 cell 出来,反过来的话,如果 cell 的 type 是 X,那 cell 一定通过了 X 的验证。
假设一个 cell 内的 data 就只有 u256 一个数据,代表某个 UDT 的余额。在没有任何约束的情况下,任何人都可以构造一个 data 内容等于 MAX_INT 的 cell,来冒充这种 UDT。
因此 CKB 的小伙伴发明了 type 字段对其进行约束:所有 type 字段相等(=某个合约的hash值)的 cell 中的data 的含义使用同一个合约进行解析,并且只有这种 cell 能够用这个合约进行解析。所以你可以伪造一个 data 内容任意的 cell,但只要你的 type 字段内容不是特定 UDT 的 type,它就不是这个 UDT 的余额。
那么还剩一个问题,type 字段的内容如何管理——总不能谁都可以把自己的 cell 设置为任意的 type 吧。CKB 接着要求每个 cell 在生成的时候必须通过 type script 的校验。也就是说,generator 可以指定生成的 cell 的 type 为任意值,只要这个 TX 能够通过对应的 type script 的校验。那么显然,类似 UDT 的数额平衡会出现在对应的 type script 中,防止凭空印钱以及凭空烧币。其他的合约也会在这里对 cell data 的内容进行约束。
所以,type 就是对 cell data 内容的约束,这个约束发生在 TX / output cell 的创建时。如果一个 TX 包含多个不同 type 的 output cell 怎么办?挨个验算。
对于 type 这么常见的词没必要太纠结于定义吧,很多编程语言里的 type 含义都有偏差也不是和 wiki 上说的一致。
按照我的经验,实际使用中比较复杂的合约可以在 type script 定里义一组状态约束和状态转换的约束。
比如: UDT 抵押 -> DAI + locked UDT。其中的输入、输出都可以由 type 约束(所以 type 并不是仅能约束 cell 的 data 字段),这个例子中我来实现的话会用 DAI type 验证输入和输出的 UDT 的 type(UDT 本身的合法性和格式已经由 UDT 的 type 保证),并在 DAI type 中验证输出的 UDT 被 lock。