
合约包含规则和保存的数据
智能合约可以理解为部署在特定地址上的程序及其状态。代码规定可以执行哪些操作,状态保存操作后的结果。一个教学用计数器可以提供增加次数和读取次数两个入口,前者改变保存的数据,后者用于查看已有结果。
这个例子帮助区分界面与合约:页面上的按钮负责组织调用,最终允许什么变化取决于程序规则。即使页面写着增加一次,仍需要查看它实际连接的地址和调用内容,才能判断按钮对应的究竟是哪一个程序。
执行需要相同的上下文
以太坊虚拟机按规定执行字节码,把既有状态和交易输入转换为新的状态。确定性要求相同上下文下得到一致结果,所以节点能够复核执行。这里的上下文很重要:在不同区块读取状态,结果可能本来就不相同。
阅读一次调用时,可以依次记录起始状态、输入参数和输出变化。比如原计数是七,输入是增加二,得到九。这个纸面推演不是对真实合约的验证,却能训练读者把程序的前置条件与结果连接起来,发现解释中省略了哪一步。
计算资源也属于执行条件
执行并非无限使用网络资源。Gas 用来计量计算工作,交易设置可消耗的上限;复杂操作通常需要更多计算。资源计量与按执行收取费用,也用于约束无限循环或大量无意义操作。Gas 数量与每单位价格需要分开理解。
入门练习可以先阅读代码或调用公开的查询接口,再讨论会改变状态的交易。查询结果与正式执行不是同一种记录,也不能用一次模拟代替之后所有情形的保证。学习时把读、算、写标在不同步骤上,便能看清应用的基本工作路径。