北京大学肖臻老师《区块链技术与应用》公开课笔记

以太坊智能合约,对应肖老师视频:click here
全系列笔记请见:click here
智能合约是以太坊的精髓所在,也是其与比特币系统最大区别之处。因此,其内容非常多,为了便于阅读和编写,这里将智能合约篇内容进行了分解。
ETH智能合约篇2请见:click here
ETH智能合约篇3请见:请等待更新,目前点击无效
About Me:点击进入我的Personal Page

简介

智能合约:运行在区块链系统上的一段代码,代码逻辑定义了合约内容。
智能合约的账户保存了合约当前的运行状态:

  • balance:当前余额
  • nonce:交易次数
  • code:合约代码
  • storage:存储,数据结构为一棵MPT

智能合约编写代码为Solidity,其语法与JavaScript很接近。
下图显示了智能合约的代码结构。

账户调用

外部账户调用合约账户

合约账户调用合约账户

合约账户之间也可以进行调用。其调用方式如下:

  • 直接调用


错误处理:直接调用的方式,一方产生异常会导致另一方也进行回滚操作。

  • address调用

    错误处理:address.call()的方法,如果调用过程中被调用合约产生异常,会导致call()返回false,但发起调用的函数不会抛出异常,而是继续执行。
  • 代理调用

    和call()调用基本一致,区别在于其并不会切入被调用合约的上下文中。

关于Payable :
如下,成员函数中的第一个函数,有一个payable修饰。原因是以太坊中规定,如果一个函数可以接收外部转账,则必须标记为payable。该例中背景为拍卖,bid()为出价,因此需要payable进行标记;withdraw()为其他未拍卖到的人将锁定在智能合约中的钱取出的函数,其不涉及转账,因此不需要payable进行标记。

fallback()函数


该函数主要是防止A向B转账,但没有在data域中说明要调用哪个函数或说明的要调用函数不存在,此时调用fallback()函数。
只有合约账户才有代码,因此这些只和合约账户有关。如果没有fallback(),在发生之前的情况后,就会直接抛出异常。
另:转账金额和汽油费是不同的。汽油费是为了让矿工打包该交易,而转账金额是单纯为了转账,其可以为0,但汽油费必须给。

智能合约创建与运行

实际上并不是想转账,而是想要创建智能合约。EVM设计思想类似于JAVA中的JVM,便于跨平台增强可移植性。EVM中寻址空间256位,而目前个人机主流位32位和64位,与之存在较大差距。

汽油费

以太坊中功能很充足,提供图灵完备的平台,从而使得以太坊相对于比特币可以实现很多功能,但这也导致一些问题,例如当一个全节点收到一个对智能合约调用怎么知晓其是否会导致死循环。
事实上,无法预知其是否会导致死循环,实际上,该问题是一个停机问题,而停机问题不可解。因此,以太坊引入汽油费机制将该问题扔给了发起交易的账户。
以太坊规定,执行合约中指令需要收取汽油费,并且由发起交易的人进行支付。

当一个全节点收到一个对智能合约的调用,先按照最大汽油费收取,从其账户一次性扣除,再根据实际执行情况,多退少补(汽油费不够会引发回滚,而非简单的补齐)。

以太坊中存在gaslimit,通过收取汽油费保障系统中不会存在对资源消耗特别大的调用。但与比特币不同,比特币直接通过限制区块大小1MB保障对网络资源压力不会过大,这1MB大小是固定的,无法修改。而以太坊中,每个矿工都可以以前一个区块中gaslimt为基数,进行上调或下调1/1024,从而,通过绝大多数区块不断上下调整,保证得到一个较为理想化的gaslimt值(感觉这里有些类似于众包机制)。最终整个系统的gaslimt就是所有矿工希望的平均值。

为什么要引入汽油费?
在比特币系统中,交易是比较简单的,仅仅是转账操作,也就是说可以通过交易的字节数衡量出交易所需要消耗的资源多少。但以太坊中引入了智能合约,而智能合约逻辑很复杂,其字节数与消耗资源数并无关联。存在某些交易,从字节数来看很小,但其实际消耗资源很大(例如调用其他合约等),因此要根据交易的具体操作收费,所有引入了汽油费这一概念。
在block header中包含了gaslimit,其并非将所有交易的消耗汽油费相加,而是该区块中所有交易能够消耗的资源的上限。

错误处理

以太坊中交易具有原子性,要么全执行,要么全不执行,不会只执行一部分(包含智能合约)。
需要注意的是,在执行过程中产生错误导致回滚,已经消耗掉的汽油费是不会退回的。从而有效防止了恶意节点对全节点进行恶意调用。


嵌套调用是否发生回滚,取决于调用方式。
一个合约向一个合约账户直接转账,因为fallback函数的存在,仍有可能会引发嵌套调用。

北京大学肖臻老师《区块链技术与应用》公开课笔记25——ETH智能合约篇1相关推荐

  1. 北京大学肖臻老师《区块链技术与应用》公开课笔记26——ETH智能合约篇2

    北京大学肖臻老师<区块链技术与应用>公开课笔记 以太坊智能合约,对应肖老师视频:click here 全系列笔记请见:click here 智能合约是以太坊的精髓所在,也是其与比特币系统最 ...

  2. 肖臻老师区块链公开课笔记

    前段时间,区块链大火,出现了很多种基于区块链技术的政务应用.之前通过零散的网页信息和讲座,自我感觉理解了block chain原理,当看到各种区块链技术广泛应用时,自己以技术理解,反而对之不屑.当然, ...

  3. 《区块链技术与应用》学习笔记10——ETH数据结构

    在以太坊中,有三棵树的说法,分别是状态数.收据树和交易树. 一.引入 我们要实现从账户地址到账户状态的映射.在以太坊中,账户地址为160位,表示为40个16进制数.状态包含了余额(alance).交易 ...

  4. 北京大学肖臻老师《区块链技术与应用》公开课笔记8——BTC挖矿篇

    北京大学肖臻老师<区块链技术与应用>公开课笔记 比特币挖矿篇,对应肖老师视频:click here 全系列笔记请见:全系列笔记请见:click here About Me:点击进入我的Pe ...

  5. 北京大学肖臻老师《区块链技术与应用》公开课笔记23——ETH挖矿难度调整篇

    北京大学肖臻老师<区块链技术与应用>公开课笔记 以太坊挖矿难度调整,对应肖老师视频:click here 全系列笔记请见:click here About Me:点击进入我的Persona ...

  6. 北京大学肖臻老师《区块链技术与应用》公开课笔记:以太坊原理(一):以太坊概述、账户、状态树、交易树和收据树

    1.ETH-以太坊概述 比特币和以太坊是两种最主要的加密货币,比特币被称为区块链1.0,以太坊被称为区块链2.0 以太坊在系统设计上针对比特币运行过程中出现的问题进行了改进,比如: 出块时间,比特币的 ...

  7. 北京大学肖臻老师《区块链技术与应用》公开课笔记17——ETH数据结构篇1(状态树1)

    北京大学肖臻老师<区块链技术与应用>公开课笔记 以太坊数据结构篇1--状态树1,对应肖老师视频:click here 全系列笔记请见:click here 以太坊数据结构篇1--状态树2请 ...

  8. 北京大学肖臻老师《区块链技术与应用》公开课笔记:以太坊(四):The DAO、反思、美链、总结

    10.ETH-The DAO 1).The DAO 比特币实现了去中心化的货币,以太坊实现了去中心化的合约,有人想既然去中心化这么好,为什么不把所有的东西都改成去中心化呢?有人提出口号:let's d ...

  9. 北京大学肖臻老师《区块链技术与应用》公开课笔记15——ETH概述篇

    北京大学肖臻老师<区块链技术与应用>公开课笔记 以太坊概述篇,对应肖老师视频:click here 全系列笔记请见:click here About Me:点击进入我的Personal P ...

最新文章

  1. python123第k序元素查找_Python实现折半查找并用matplotlib实现动态过程可视化
  2. Visual Studio UML Activity Diagram(1)
  3. c++ uint8_t* to std::string
  4. 生日小助手的问答帮助——随时更新,长期有效……
  5. STM32F4 HAL库开发 -- 复用功能外设
  6. Apache Mahout 0.9、10.1、11. CardinalityException: Required cardinality 60 but got 29
  7. tensorflow从入门到放弃(一)
  8. VTK:图像归一化用法实战
  9. [图解]小白都能看懂的FASTER R-CNN – 原理和实现细节
  10. Nova计算节点安装配置
  11. python发送邮件脚本_python-发邮件脚本
  12. 玩转git-flow工作流-分支解析
  13. 朴素贝叶斯实现分类_关于朴素贝叶斯分类及其实现的简短教程
  14. redis——持久化
  15. React学习资料+css进阶资料总结
  16. 【ios】如何成为一名ios开发
  17. 在asp中使用js的encodeURIComponent方法
  18. mysql里有sqlfront_使用SQL-Front启动MySQL8.0报错
  19. 前端酷炫效果参考_2020年大前端发展趋势
  20. Unity3d import package 无标准资源包

热门文章

  1. 拉格朗日插值python实现
  2. 深圳8年软件测试工程师,终于在深圳买房安家了
  3. npm打包 打包顺带打包成压缩文件
  4. 《淘宝店铺设计装修一册通》一2.2 图片处理功能
  5. 述职答辩提问环节一般可以问些什么_论文答辩一般会问什么问题?
  6. 静态函数库,共享函数库以及动态链接库
  7. 基于android的车辆违章停放执法移动APP-计算机毕业设计
  8. Winegrape数据集下载
  9. 《遇见未知的自己》读后感
  10. libiec61850学习2(动态获取模型)