热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《区块链学习笔记》ETH智能合约(上)

ETH-智能合约北京大学肖臻老师《区块链技术与应用》公开课笔记什么是智能合约?1.智能合约是运行在区块链上的一段代码,代码的逻辑定义了合约的内容。2.智能合约的账户保存了合约当前的

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

什么是智能合约?

1.智能合约是运行在区块链上的一段代码,代码的逻辑定义了合约的内容。
2.智能合约的账户保存了合约当前的运行状态。有以下几方面:

  1. balance:当前余额
  2. nonce:交易次数
  3. code:合约代码
  4. storage:存储,数据结构是一棵MPT(状态树)

*solidity是智能合约最常用的语言,语法上与Javascript近似。

《区块链学习笔记》ETH-智能合约(上)

外部账户如何调用智能合约?

创建一个交易,接收地址为要调用的那个智能合约的地址,data域填写要调用的函数及其参数的编码值。

《区块链学习笔记》ETH-智能合约(上)
其中TXDATA为调用的函数。

一个合约如何调用另一个合约中的函数?

  1. 直接调用
    《区块链学习笔记》ETH-智能合约(上)

  2. 使用address类型的call()函数
    《区块链学习笔记》ETH-智能合约(上)

  3. 代理调用delegatecall()
    《区块链学习笔记》ETH-智能合约(上)

  4. fallback()函数
    《区块链学习笔记》ETH-智能合约(上)
    转账金额可以为0,汽油费不可以为0,否则没有矿工打包这个交易。

智能合约的创建和运行

《区块链学习笔记》ETH-智能合约(上)

汽油费(gas fee)

《区块链学习笔记》ETH-智能合约(上)
汽油费会在执行合约时一次性扣除。汽油费如果扣多了会退回多余的,如果少了交易会被回滚,但已经消耗的汽油费不会退回。这样处理的原因是防止恶意用户发起DOS攻击,浪费算力,造成以太坊处理交易能力下降。
*Denial of Service (DoS)是分布式拒绝服务攻击软件,DDoS攻击可以分为带宽消耗型和资源消耗型。

错误处理

智能合约要么执行全部内容,要么都不执行,不会执行一部分。
《区块链学习笔记》ETH-智能合约(上)

嵌套调用

《区块链学习笔记》ETH-智能合约(上)

Block Header

《区块链学习笔记》ETH-智能合约(上)
这里的GasLimit是指这个区块所有交易能消耗的Gas值上限。设置这个值的原因是为了防止一个区块里交易太多。后一个块可以选择上调或下调1/1024的GasLimit值。

**问题1:**假设某个全节点要打包一些交易到一个区块里,交易里有一些是对智能合约的调用,那么这些全节点是把智能合约执行完成后再去挖矿呢?还是先挖矿,获得记账权后再执行智能合约呢?
**答:**先执行智能合约再去挖矿,通过执行交易实现状态同步。各个全节点执行完智能合约后会在本地的数据库将对应的Gas fee减去。
**问题2:**会不会有矿工因为得不到Gas fee就不去验证交易?
**答:**不会。若不去验证,会危及到区块链的安全。若跳过验证,就无法继续挖矿。因为挖矿要执行所有交易得到hash值,然后更新状态树。
**问题3:**若执行智能合约过程中出现了错误,要不要发不到区块链上去?
**答:**要,因为要发布后形成共识,矿工才能得到Gas fee。

Receipt数据结构

每个交易完成之后形成一个收据,如图是交易的内容。
《区块链学习笔记》ETH-智能合约(上)


推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
author-avatar
谢谢巷议
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有