读写数据

智能合约可以将数据写入两个地方,即以太坊的全球状态查找树或以太坊的链数据。虽然存储,读取和修改数据的成本很高,但这些存储操作是大多数智能合约的必要组成部分。

全局状态

给定智能合约中的状态变量存储在以太坊的全局状态查找树中,给定的智能合约只能存储,读取和修改与该合约地址相关的数据(即智能合约无法读取或写入其他智能合约)。

Log

如前所述,智能合约也可以通过日志事件写入以太坊的链数据。虽然Vyper最初使用 __log__ 语法来声明这些事件,但已经进行了更新,使Vyper的事件声明更符合Solidity的原始语法。例如,Vyper声明的一个名为MyLog的事件最初是 MyLog: __log__({arg1: indexed(bytes[3])}),Vyper的语法现在变为 MyLog: event({arg1: indexed(bytes[3])})。需要注意的是,在Vyper中执行日志事件仍然是如下 log.MyLog("123")

虽然智能合约可以写入以太坊的链数据(通过日志事件),但智能合约无法读取他们创建的链上日志事件。尽管如此,通过日志事件写入以太坊的链数据的一个好处是,可以在公共链上由轻客户端发现和读取日志。例如,挖到的块中的logsBloom值可以指示是否存在日志事件。一旦建立,就可以通过日志路径获取 logs → data inside a given transaction receipt。