在研究官方的示例代码Place中,同时课程中Marco老师也介绍过near的这个特点.
即可以使用标记为view的合约方法,并在方法里面调用changeable方法.关于这个特性我迷惑了很久.
现在有一些想法想要得到指点,我看near的协议介绍有说near协议分为了区块链层和runtime层,区块链层并不会操作账户的存储.所以我有一个猜想:
假设alice调用合约A的a方法,而a方法是view的,a方法中调用了合约B的b方法,而b方法是changeable的.即alice->A.a()->B.b()
在这个过程中,真正的存储发生的时间,或者说区块链层把数据发送给runtime层的时间实际上是调用栈已经执行完B的内容,已经回退到A.a()的栈帧中,并准备退出时,此时才准备将数据传入runtime层,而此时区块链层发现a()方法是一个view方法,所以并没有传入runtime,而是将计算好的数据直接返回.
如果我的猜想是正确的话,那么最开始的问题我就能理解了.在Place的get_account_by_id实现中,这里实际上调用touch的是一个可变对象,所以能够正常执行,当执行完成返回account时,也就是方法get_account_by_id的栈帧即将退出时发现,不能写入存储,所以没有通知runtime层,直接将account数据返回了回去.