什么是李嘉图合约?
简单来讲,是用人们可以阅读的语言,用类似合同的方式,描述智能合约里每个接口的意图。例如EOS里eosio.token是发币合约,其中transfer这个action是用来转账的,它有4个参数:
- from,转出账户
- to,接收转账的账户
- quantity,转账数量
- memo,备注
它的李嘉图合约是:
## Transfer Terms & Conditions
I, {{from}}, certify the following to be true to the best of my knowledge:
1. I certify that {{quantity}} is not the proceeds of fraudulent or violent activities.
2. I certify that, to the best of my knowledge, {{to}} is not supporting initiation of violence against others.
3. I have disclosed any contractual terms & conditions with respect to {{quantity}} to {{to}}.
I understand that funds transfers are not reversible after the {{transaction.delay}} seconds or other delay as configured by {{from}}'s permissions.
If this action fails to be irreversibly confirmed after receiving goods or services from '{{to}}', I agree to either return the goods or services or resend {{quantity}} in a timely manner.
可以看到它清楚的描述了这个action的意图是什么,执行这个action就代表调用者同意这个条款。
虽然阅读李嘉图合约不能代替阅读其源码,但这至少让使用者有机会了解自己执行合约会有什么后果。而且可以作为事后有纠纷时,处理时的依据。
可惜的是,当前EOS上的大部分合约都没有李嘉图合约,这么好的东西没有利用起来,让人有点心疼。
除了作为类似法律声明外,能不能利用李嘉图合约干点别的有意义的事呢?我有个想法:
EOS上的合约可升级,是人们质疑其可信任度时经常提到的。虽然我认为这是个优点,EOS实际提供了可升级、很难升级和不可升级几种策略(见https://zhuanlan.zhihu.com/p/66367223里合约可升级部分),但实际项目方设为不可升级的非常少。毕竟可能出现漏洞需要修补嘛。如何能协调修补漏洞和消除合约可升级之间的矛盾呢?我想李嘉图合约是个可以考虑的选项。可以考虑在EOS系统上做如下设计:
- 合约中每个action都要求有(有效)李嘉图合约,没有李嘉图合约就不允许部署
- 当合约升级时,李嘉图合约不允许改动,有改动就升级失败
- 若有合约的李嘉图合约与其实际内容明显不符,该账户被冻结(这一点主动审查不可能做到,最多有被举报时审查)
这样可以做到当合约升级时,每个action的意图不能发生变化,从而不允许项目方通过升级合约改变action的行为从而损害用户的利益。
但是这只能是法理上的限制,基本上只能出问题后事后追溯时,对于链外的裁决提供一些链上证据而已,无法真正阻挡有意图的项目方作恶。