以太坊智能合约的生命周期

"A smart contract is a computer program executed in a secure environment that directly controls digital assets."git

-- Vitalik Buteringithub

做为以太坊的标志性技术, 网络上已经有很是多的文章对智能合约进行了介绍。今天Cindy将主要带领你们经历一场以太坊上智能合约的生命周期之旅, 一块儿经历合约存储、建立、部署、执行、升级与销毁的过程。数据库

一块儿出发吧!网络

第一站:合约存储

1

-以太坊上两种帐户类型:a) 我的帐户 b)合约帐户-区块链

首先,以太坊智能合约有两种类型的帐户:外部我的帐户和合约帐户。这两种类型帐户的功能和特色都不同。测试

其次,合约在部署时, 就会建立一个合约帐户, 合约代码的可执行字节码(Bytecode)保存在合约帐户(CA)中。具体来讲就是存在帐户 codehash 指向的存储区域;codeHash 是代码的 hash 值,建立后不可更改。3d

再次, 数据主要存储在帐户 storageRoot 指向的存储区域;storageRoot 对应合约存储结构的MPT树根节点hash值,经过它可以在数据库中检索到合约的变量信息。code

最后, 全部的基础存储目前都基于 leveldb, 一种 kv 数据库。blog

第二站:合约建立

这里咱们用用户 A 的例子作说明。生命周期

2

  1. 用户 A 使用 solidity 等语言建立一份合约代码
  2. A 在 IDE/钱包/其余客户端,按必定的格式(from,data,value,Gas,GasPrice....)填写 data,而后确认(即发起一次transaction)
  3. 客户端会填补 account nonce(tx计数器)、compile solidity、签名 等操做,并将 to 字段置零(表明合约建立)。
  4. 该 tx 广播到网络上,B 节点收到该 tx。
  5. B 节点检查 tx 是否有效、格式是否正确,验证交易签名是否合法。若是符合要求,计算可能的最大交易费用,肯定发送者的地址,并在本地的区块链上查看发送者的余额,若是帐户余额不足以支付最大的交易费用,则返回错误。
  6. 对于符合要求的交易请求,B 将其放在交易存储池中,并向其余节点转发(好比转发给了C)。C 收到交易请求的节点重复用户 B 的处理过程。

第三站:合约部署

咱们加入矿工B和C。

3

 

-部署与挖矿过程-

  1. B 和 C 各自从本地的交易存储池中拿到一批 TX,而后打包进行 hash 计算(挖矿)。

  2. 假设 B 挖矿成功(得到了记帐权),B 会根据 A 提供的交易费用和合约代码,建立合约帐户,并在帐户空间中部署合约。合约帐户地址在建立合约的 tx 确认后返回给 A

  3. B 打包好的区块(包含 A 建立的智能合约)发送至对等节点,并在全网传播。

  4. C 接收到该区块,验证区块,若是区块经过验证:
    a. C 从内存池中删除 A 建立的智能合约交易请求
    b. C 将区块连接到本地最长链上(同步区块)
    c. C 将 A 的智能合约部署在本地区块链中。

4

 

-区块验证过程-

第四站:合约执行

5

 

-合约执行过程-

  1. 用户 A 按照必定格式在网络中发起一个 tx 请求;该请求被网络中节点 B 收到: i. 若是符合要求,计算可能的最大交易费用(最大交易费用=Gas Limit×GasPrice),肯定发送方的地址,并在本地的区块链上从发送方帐户中减去相应费用 ii. 若是帐户余额不足,则返回错误,这条交易被直接丢弃。
  2. B 同步到此交易,检查交易是否有效、格式是否正确。
  3. 符合要求的交易请求,用户 B 将其放在交易存储池中,并向其余节点转发. 其余节点执行和B一样的操做过程.
  4. B 挖矿成功。 a. 对于转帐交易,B 将该交易和其余交易一块儿打包到区块。 b. 对于合约调用交易,B 将该交易和其余交易一块儿打包到区块中,并在本地的 EVM 上运行合约代码: i. 若是代码并未结束而 Gas 已经用完,那么因代码运行而改变的状态回滚到代码运行以前,可是已经支付的交易费用不可收回,交易费用由B得到。 ii. 若是代码运行结束 Gas 还有剩余,那么B只会得到消耗 的Gas×GasPrice 做为手续费,不会收取剩余 Gas 对应的手续费。 c. B 将包含 A 交易请求的区块传播到对等节点,在网络中广播。
  5. C 节点收到该区块后: a. 验证区块(用户A的交易的合法性也被再次验证) i. 验证经过,C 将内存池中 A 的交易请求删掉,同时将B的区块添加到本地的区块链中 ii. 验证不经过,C 丢弃该区块。 b. 执行区块中的智能合约交易 i. C 在本地的 EVM 上运行该智能合约,并与 B 的执行结果互相验证。
  6. 网络上其余矿工节点重复 C 的执行过程:经过 EVM 在本地计算机上运行智能合约,做为他们参与挖矿进程的一部分,而后得出一个结果并进行验证。 a. 理论上,若是没有人恶意操做,每一个计算机代码运行的结果都是相同的,由于它们运行着提供了相同信息的相同合约代码。

6

第五站:合约升级

  1. 部署在以太坊区块链上的代码是不可改变的,即没法从新部署一个新的合约到相同的地址上。(编者注:其实是能够改变的。但须要)
  2. 智能合约升级较为困难,务必须要一次性将合约写"完美"(测试/验证要求极高)。
  3. hacking 办法: a. 部署一个拥有调用转发功能的智能合约 b. 将收到的调用转发到另一个包含逻辑功能的合约地址 c. 当进行合约升级时,只须要部署一个新的合约并修改转发的目标地址,以指向新的合约。

第六站:合约销毁

合约发起者能够调用 selfdestruct() 方法便可销毁合约。举例:

7


参考材料:

相关文章
相关标签/搜索