智能合约的生命周期

智能合约通常以高级语言编写,例如Solidity。但为了运行,必须将它们编译为EVM中运行的低级字节码(请参见 [evm])。一旦编译完成,它们就会随着转移到特殊的合约创建地址的交易被部署到以太坊区块链中。每个合约都由以太坊地址标识,该地址源于作为发起账户和随机数的函数的合约创建交易。合约的以太坊地址可以在交易中用作接收者,可将资金发送到合约或调用合约的某个功能。

重要的是,如果合约只有被交易调用时才会运行。以太坊的所有智能合约均由EOA发起的交易执行。合约可以调用另一个合约,其中又可以调用另一个合约,等等。但是这种执行链中的第一个合约必须始终由EOA的交易调用。合约永远不会“自行”运行,或“在后台运行”。在交易触发执行,直接或间接地作为合约调用链的一部分之前,合约在区块链上实际上是“休眠”的。

交易是 原子性的 atomic,无论他们调用多少合约或这些合约在被调用时执行的是什么。交易完全执行,仅在交易成功终止时记录全局状态(合约,帐户等)的任何更改。成功终止意味着程序执行时没有错误并且达到执行结束。如果交易由于错误而失败,则其所有效果(状态变化)都会“回滚”,就好像交易从未运行一样。失败的交易仍存储在区块链中,并从原始账户扣除gas成本,但对合约或账户状态没有其他影响。

合约的代码不能更改。然而合约可以被“删除”,从区块链上删除代码和它的内部状态(变量)。要删除合约,你需要执行称为 SELFDESTRUCT(以前称为 SUICIDE )的EVM操作码,该操作码将区块链中的合约移除。该操作花费“负的gas”,从而激励储存状态的释放。以这种方式删除合约不会删除合约的交易历史(过去),因为区块链本身是不可变的。但它确实会从所有未来的区块中移除合约状态。