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

-- Vitalik Buterin

作为以太坊的标志性技术, 网络上已经有非常多的文章对智能合约进行了介绍。今天Cindy将主要带领大家经历一场以太坊上智能合约的生命周期之旅, 一起经历合约存储、创建、部署、执行、升级与销毁的过程。

一起出发吧!

第一站:合约存储

-以太坊上两种账户类型:a) 个人账户 b)合约账户-

首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。

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

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

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

第二站:合约创建

这里我们用用户 A 的例子做说明。

  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。

-部署与挖矿过程-

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

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

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

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

-区块验证过程-

第四站:合约执行

-合约执行过程-

  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. 理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码。

第五站:合约升级

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

第六站:合约销毁

合约发起者可以调用 selfdestruct() 方法即可销毁合约。举例:


参考材料:

  • https://blog.ethereum.org/2016/06/02/go-ethereums-jit-evm/
  • https://github.com/ethereum/go-ethereum/blob/master/core/vm/evm.go
  • 以太坊技术详解与实战. 闫莺;郑凯;郭众鑫 编著 出版日期:2018年06月

以太坊智能合约的生命周期相关推荐

  1. 以太坊智能合约生命周期(Ethereum smart contracts lifecycle)

    合约对象初始化 上一节中我们提到Solidity编写合约和面向对象编程语言非常相似,我们可以通过构造函数(constructor)来初始化合约对象.构造函数就是方法名和合约名字相同的函数,创建合约时会 ...

  2. 浅谈以太坊智能合约的设计模式与升级方法

    浅谈以太坊智能合约的设计模式与升级方法 1. 最佳实践 2. 实用设计案例 2.1 控制器合约与数据合约: 1->1 2.2 控制器合约与数据合约: 1->N 2.3 控制器合约与数据合约 ...

  3. (转) 如何通过以太坊智能合约来进行众筹(ICO)

    写在前面 本文所讲的代币是使用以太坊智能合约创建,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 众筹 先简单说下众筹的概念:一般是这样的,我一个非常好的想法,但 ...

  4. 如何通过以太坊智能合约来进行众筹(ICO)

    最新内容会更新在主站深入浅出区块链社区 原文链接:如何通过以太坊智能合约来进行众筹(ICO) 前面我们有两遍文章写了如何发行代币,今天我们讲一下如何使用代币来公开募资,即编写一个募资合约. 写在前面 ...

  5. 以太坊智能合约开发-《精通以太坊智能合约开发》学习总结实践

    文章目录 一.初探以太访智能合约 1. remix小demo 2. 写智能合约用的编程语言 二.以太坊核心概念 1. 交易/事务( Transaction ) 2. 区块 3. 共识协议:工作量证明( ...

  6. 以太坊智能合约Demo

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战demo示例快速入门,用demo例 ...

  7. 区块链兼容以太坊智能合约

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 引言 随着区块链技术以及应用的普及,越来越多的区块链出现在大众视野中.由于区块链技术的开源特性,任何公司和个人都可以方便 ...

  8. 以太坊智能合约开发第二篇:理解以太坊相关概念

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 很多人都说比特币是区块链1.0,以太坊是区块链2.0.在以太坊平台上,可以开发各种各样的去中心化应用,这些应用构成了以太 ...

  9. 使用Remix编译和部署以太坊智能合约

    链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 使用Remix编译和部署以太坊智能合约 Remix 是一个开源的 Solidity 智能合约开发环境,提供基本的 ...

最新文章

  1. 万字长文,理解Elasticsearch和面试总结
  2. java二分法查找法算法_算法二:二分法查找(java语言)
  3. html 表格行排序,用客户端HTML表格排序对行进行分组
  4. 常用IE浏览器的兼容处理(方法一)
  5. 一些常见的HTTP的请求状态码
  6. Python3 hex() 函数
  7. 3_python基础—运算符 1
  8. Java - 泛型 ( Generic )
  9. 阿里云天池实验室【Python入门系列】用Pandas揭秘美国选民的总统喜好
  10. 某公司的雇员分为以下若干类: Employee:这是所有员工总的父类.属性:员工的姓名,员工的生日月份。 方法:getSalary(intmonth)
  11. 从零实现一个简单卷积神经网络
  12. 阿里云国际版建立云端数据库操作流程
  13. 多旋翼油门量与升力关系
  14. 利用snowfall.jquery.js实现爱心满屏飞
  15. 青少年机器人编程大赛用什么语言
  16. python机器学习初探
  17. Windows2008R2操作系统日志清理
  18. 小学计算机基础知识题目,小学信息技术基础知识复习题(清华版第三册)
  19. 电竞新时代 华硕电竞路由新品发布品鉴会成功举办
  20. 4.9-11 ebook 小问题,自摘记,书城首页开发完毕。

热门文章

  1. ImportError: cannot import name ‘SAVE_STATE_WARNING‘ from ‘torch.optim.lr_scheduler‘ (/home/jsj/anac
  2. 【锟斤拷�⊠是怎样炼成的】——两分钟帮你彻底弄懂计算机的编码原理
  3. 本地存储玩家信息数据——单机、网络游戏必备
  4. java 凸包算法_Melkman凸包算法的Java实现
  5. 7类非京籍人员子女可按北京户口就近入学
  6. android studio添加繁体,Android (Android studio3.0.1)一篇可以实现app多语言的转换(简单操作)的教程-Go语言中文社区...
  7. 程序员数学基础【五、math库常用函数】(Python版本)
  8. 商城小程序系统,商城源码
  9. 怎么该软件创建桌面快捷方式
  10. 苍狼与斯巴达终归消失