背景
区块链上的资产几乎是不可追踪的,当然你可以通过追溯历史的方式查询一笔余额可能来自于哪些源头,但你无法区分余额里面的哪一部分与源头有关。例如源头的 100 个 BTC 其中 10 个转给地址 A,A 接收其他来源的 20 个 BTC,然后对外支付 25 个 BTC,剩余 5 个,这时,我们很难判断这 5 个 BTC 和源头 100 个 BTC 的关联度。
不可追踪性是数字资产非常重要的属性,它保障了匿名性和不可审查性,由于链上资产公开了所有交易历史,他们其实并不能完全保障不可追踪性。但并不是所有的业务场景都要求资产不可追踪性,很多场景下我们需要一种可追踪的数字资产用来限制资产的流转符合来源方的意愿。例如,资助方希望自己的提供的资金用在特定领域,因此需要对分发的资金进行追踪或限制;交易所希望自己交易的资金提现后具有一定时间内的可追踪性,以防止黑客利用漏洞挖空交易所。可追踪代币将代币的持有人或应用领域划分出子集,在子集内由管理方进行监管,通过这种方式满足特殊的业务需求。
应用场景
例如 MakerDAO 或其他抵押借贷类 DeFi 服务中,我们可以将用户抵押的 CKB 打上追踪标记,这样用户可以在抵押借贷的同时使用这些 CKB 进行拆分、合并或者部署合约、存储数据。除非用户违约,否则这些 CKB 仍然可以正常使用。此外,交易所可以对自己提现的代币进行限时可追踪处理,例如在 1 小时内,无论提现的代币如何拆分,都可以精确地定位他们,一旦发现这些提现是黑客行为,交易所可以对他们进行回收。
技术实现
Nervos CKB 可以实现代币的可追踪性的原因是 Cell 模型的 lock script 设计。每一个 CKB 链上资产都是由 Cell 来承载的,每个 Cell 都有一个 lock script 来标识所属权。lock script 可以定义用户使用(转账)这个 Cell 的时候需要执行的动作。一个典型的 lock script 是这样写的(伪代码)
if lock_script.recover(signature, hash(m)) == lock_script.pk then
pass Transaction
而通过简单的变化即可将这个 Cell 进行可追踪处理:
find all cells in output that use the same lock script code hash,
make sure that their capacity equals to input cells that use the
same lock script code hash.
&&
if lock_script.recover(signature, hash(m)) == lock_script.pk then
pass Transaction
通过这样的 lock script 设计,可以保证一个类 UTXO 交易输入的带标记代币的数量和输出的带标记代币数量一致。进一步地,我们可以用 lock script 对这些代币的持有人、完全解锁时间等特性进行设置。
结论
可追踪代币将 fungible token 做了扩展,它们隶属于 fungible token,但变成了同类 token 的一个子集。子集内的代币是 fungible 的,但它们与外部的同类 token 又有着区别。这种特殊性质可以让可追踪代币实现标准 fungible token 无法实现的业务功能。