在序列7的最后,我们抛出了一个问题:既然Message Call会改变WorldState,它又是调用过程中的1个临时对象,你没有在区块链里面持久化它,那怎么做到有据可查?
Message Call是被智能合约发起的,和上面这个问题类似的一个问题就是:既然Message Call是被智能合约发起,如果智能合约可以自动被触发,比如智能合约内部有个Timer,周期性的调用其他智能合约,改变WorldState,那情况不是更糟糕???
答案是智能合约不能自动触发!也就是说:智能合约不能自动的、周期性的,或者在未来某个时间点,自动触发,调用自己,或者调用别的智能合约!!!
所有的智能合约的执行,都是由外部的EOA通过发送Transaction触发的!
外部的EOA发送Transaction,给智能合约1;
智能合约1发送Message Call,给智能合约2;
智能合约2发送Message Call,给智能合约3。。
所有这从Transaction到Message Call的整个调用链,都算做在这个Transaction内部执行的!
而Transaction是被记录到区块链的,Transaction有据可查,也就保证了Message Call不可能随意调用,随意改变WorldState的状态。
智能合约平台的本质
用1个图来表示,就是下面这样:整个以太坊的智能合约平台,就是1个巨大的状态机。
这个状态机的输入就1笔笔的Transaction,每1笔Transaction都会导致状态机发生1次状态迁移。所有的Transaction,就相当于日志流水,持久化在区块链上面。根据Transaction 0 开始,可以计算出状态机的状态。
而合约的执行,合约之间的Message Call的调用,只是这个状态机的内部执行过程;它们导致的状态机的变化,最终都会算到这个输入的Transaction头上!!
一句话:所有的状态变化,最终都归结到1笔笔的Transaction。
Alarm Clock Contract
但上面的模型,也有个问题。如果智能合约想实现类似Timer的功能,周期性的调用其他智能合约,但没有Transaction的触发,就做不了这个事情。
为了解决这个问题,有人提出了Alarm Clock Contract。有兴趣的可以去下面的官网看一下它是怎么解决这个问题的,此处不再展开叙述。
http://docs.ethereum-alarm-clock.com/en/latest/introduction.html#what-problem-does-this-solve
领取专属 10元无门槛券
私享最新 技术干货