08.智能合约
智能合约¶
以太坊有两种不同类型的账户:
- 外部所有账户(EOAs):EOAs由以太坊以外的软件(如钱包应用程序)控制。
- 合约账户:合约帐户由在以太坊虚拟机(EVM)内运行的软件控制。智能合约控制合约账户
两种类型的帐户都通过以太坊地址标识。
什么是智能合约?¶
智能合约只是计算机程序。
-
不可变的:一旦部署,智能合约的代码不能改变。
-
确定性的:智能合约的结果对于运行它的每个人来说都是一样的,包括调用它们的交易的上下文,以及执行时以太坊区块链的状态。
- EVM上下文:智能合约以非常有限的执行上下文运行。他们可以访问自己的状态,调用它们的交易的上下文以及有关最新块的一些信息。
- 去中心化的世界计算机:EVM在每个以太坊节点上作为本地实例运行,但由于EVM的所有实例都在相同的初始状态下运行并产生相同的最终状态,因此整个系统作为单台世界计算机运行
测试智能合约¶
测试框架¶
- Truffle Test
- Embark Framework Testing
- DApp
- Populus
智能合约的生命周期¶
智能合约通常以高级语言编写,例如Solidity。但为了运行,必须将它们编译为EVM中运行的低级字节码(请参见 [evm])。一旦编译完成,它们就会随着转移到特殊的合约创建地址的交易被部署到以太坊区块链中。每个合约都由以太坊地址标识,该地址源于作为发起账户和随机数的函数的合约创建交易。合约的以太坊地址可以在交易中用作接收者,可将资金发送到合约或调用合约的某个功能。
在交易触发执行,直接或间接地作为合约调用链的一部分之前,合约在区块链上实际上是“休眠”的。
交易是 原子性的 atomic,无论他们调用多少合约或这些合约在被调用时执行的是什么。交易完全执行,仅在交易成功终止时记录全局状态(合约,帐户等)的任何更改。
合约的代码不能更改。然而合约可以被“删除”,从区块链上删除代码和它的内部状态(变量)。
Gas 的考虑¶
Gas在 [gas] 一节中有更详细的描述,在智能合约编程中是一个非常重要的考虑因素。gas是限制以太坊允许交易消耗的最大计算量的资源。如果在计算过程中超过了gas限制,则会发生以下一系列事件:
- 引发“out of gas”异常。
- 函数执行前的合约状态被恢复。
- 全部gas作为交易费用交给矿工,不予退还。
由于gas由创建该交易的用户支付,因此不鼓励用户调用gas成本高的函数。因此,程序员最大限度地减少合约函数的gas成本。为此,在构建智能合约时建议采用某些做法,以尽量减少函数调用的gas成本。
- 避免动态大小的数组
- 避免调用其他合约
- 估算gas成本