上一篇文章介绍了以太坊5个核心概念:以太坊虚拟机(EVM)、账户(Accounts)、交易(Transactions)、Gas、存储,主存和栈(Storage, Memory and the Stack)。这篇文章将谈谈其他几个核心概念。

指令集(Instruction Set)

EVM的指令集被刻意保持在最小规模,以尽可能避免可能导致共识问题的错误实现。所有的指令都是针对256比特这个基本的数据类型的操作。具备常用的算术,位,逻辑和比较操作。也可以做到条件和无条件跳转。此外,合约可以访问当前区块的相关属性,比如它的编号和时间戳。

消息调用(Message Calls)

合约可以通过消息调用的方式来调用其它合约或者发送以太币到非合约账户。消息调用和交易非常类似,它们都有一个源,一个目标,数据负载,以太币,gas和返回数据。事实上每个交易都可以被认为是一个顶层消息调用,这个消息调用会依次产生更多的消息调用。

一个合约可以决定剩余gas的分配。比如内部消息调用时使用多少gas,或者期望保留多少gas。如果在内部消息调用时发生了out-of-gas异常(或者其他异常),合约将会得到通知,一个错误码被压在栈上。这种情况只是内部消息调用的gas耗尽。在solidity中,这种情况下发起调用的合约默认会触发一个人工异常。这个异常会打印出调用栈。

就像之前说过的,被调用的合约(发起调用的合约也一样)会拥有崭新的主存并能够访问调用的负载。调用负载被存储在一个单独的被称为calldata的区域。调用执行结束后,返回数据将被存放在调用方预先分配好的一块内存中。

调用层数被限制为1024,因此对于更加复杂的操作,我们应该使用循环而不是递归。

代码调用和库(Delegatecall / Callcode and Libraries)

存在一种特殊类型的消息调用,被称为callcode。它跟消息调用几乎完全一样,只是加载自目标地址的代码将在发起调用的合约上下文中运行。

这意味着一个合约可以在运行时从另外一个地址动态加载代码。存储,当前地址和余额都指向发起调用的合约,只有代码是从被调用地址获取的。

这使得Solidity可以实现”库“。可复用的库代码可以应用在一个合约的存储上,可以用来实现复杂的数据结构。

日志(Logs)

在区块层面,可以用一种特殊的可索引的数据结构来存储数据。这个特性被称为日志,Solidity用它来实现事件。合约创建之后就无法访问日志数据,但是这些数据可以从区块链外高效的访问。因为部分日志数据被存储在布隆过滤器(Bloom filter) 中,我们可以高效并且安全的搜索日志,所以那些没有下载整个区块链的网络节点(轻客户端)也可以找到这些日志。

创建(Create)

合约甚至可以通过一个特殊的指令来创建其他合约(不是简单的向零地址发起调用)。创建合约的调用跟普通的消息调用的区别在于,负载数据执行的结果被当作代码,调用者/创建者在栈上得到新合约的地址。

自毁(Selfdestruct)

只有在某个地址上的合约执行自毁操作时,合约代码才会从区块链上移除。合约地址上剩余的以太币会发送给指定的目标,然后其存储和代码被移除。 注意,即使一个合约的代码不包含自毁指令,依然可以通过代码调用(callcode)来执行这个操作。

好了,通过前面的2篇文章,我们了解了以太坊的核心概念,接下来就可以通过编程来深入理解这些概念了。

以太坊核心概念(二)相关推荐

  1. 以太坊源码解读(1)以太坊核心概念

    一.定义 以太坊是一个开源的带有智能合约功能的公共区块链平台. 特点: 1.支持智能合约,以太坊不是给用户一系列预先设定好的操作,而是充分允许用户按照自己的意愿创建复杂的逻辑操作: 2.以太坊同时还构 ...

  2. 区块链学堂(4):以太坊基本概念及工具Geth、Browser-solidity、Mist

    在我研究以太坊技术的过程中,由于相关资料较少,因此走了较多的弯路.所以这里我们不会先介绍Solidity的语法结构,而会在接下来的第一阶段,从实战出发,陆续向大家介绍Geth.Browser-soli ...

  3. 以太坊解析之二——POA共识过程与一些可能的修改方案

    以太坊解析之二--POA共识过程 原始版本创建于2021-05-27 文章目录 以太坊解析之二--POA共识过程 前言 一.工作流程 详细解析 二.详细过程 1.启动 2.同步 3.总结 4.一些其他 ...

  4. 以太坊核心研究员Hsiao-Wei Wang:关于以太坊2.0的答疑解惑!

    2019年6月29日,由CSDN.灵钛科技主办,区块链大本营.Unitimes.ETHPLANET.以太坊爱好者社区.火星财经协办的"2019第二届以太坊技术及应用大会"在北京·长 ...

  5. 以太坊核心开发者计划为2.0制定“最小化合并”方案

    3月12日消息,以太坊核心开发者Mikhail Kalinin在以太坊2.0技术规范中发表关于将以太坊1.0合并至2.0的讨论稿(WIP),他和DannyRyan在最近的一次以太坊2.0会议中讨论了该 ...

  6. Ethereum Core Devs Meeting #83以太坊核心开发者会议纪要

    会议:以太坊核心开发者会议 #83 会议日期: 2020年3月20日,星期五 会议时长:2小时 会议视频链接: https://www.youtube.com/watch?v=vDGj660uZE0 ...

  7. 直播 | 对话V神 以太坊核心研究者:ETH2.0 蓄势待发,我们应该如何参与?

    关注我们 获取最新活动信息 蓄力数月,"以太坊之夏2020" 线上夏令营终于要正式开幕了!就在本周四(7月9日)晚上九点,首场公开线上活动 -- "乘风破浪ETH2.0& ...

  8. V神玩起freestyle! 5位以太坊核心大咖在悉尼的演讲精华全在这了!| 直击EDCON

    作者 | Aholiab 出品 | CSDN.灵钛科技 4月11日,以太坊开源技术社区最受关注的系列峰会EDCON 2019,在悉尼的国际会议中心(ICC)召开.EDCON是由以太坊社区成员灵钛科技发 ...

  9. 直播 | 对话V神 以太坊核心开发者:乘风破浪的ETH 2.0将至,我们应该如何参与?

    [以太坊之夏]首场活动正式开始报名!足不出户,和以太坊大佬"云漫谈",掌握最新行业进展 蓄力数月,"以太坊之夏2020" 线上夏令营终于要正式开幕了!就在本周四 ...

最新文章

  1. Ubuntu 16.04中安装VMware Tools
  2. Android ProgressBar 加载中界面实现(loading 动画) 实现菊花的效果
  3. delphi webbrowser 对象不支持_【Python 秘籍】排序不支持原生比较的对象
  4. 里面怎么使用import引用_谈谈模块化的 require 和 import
  5. 微信开发本地调试工具(模拟微信客户端)
  6. mysql读写分离 同步_MySQL数据库的同步配置+MySql读写分离
  7. 产能过剩时代,为什么说“送比卖更赚钱”
  8. 项目如何开始:怎样和客户一起搞定需求
  9. Word邮件合并技巧四则
  10. [CSDN] 微软雅黑可能导致的博客侵权问题
  11. 蓝桥web模拟赛:时间管理大师
  12. 前端 vue + element + vux
  13. 信创云领未来,华云数据打造科技强国新基座
  14. ipencil 无法与iPad配对
  15. Unity Json 编写及读取
  16. input验证邮箱 css,jquery验证邮箱格式并显示提交按钮
  17. 影响百度竞价点击量的7大原因
  18. 【学习笔记】Linux 系统编程入门
  19. AP2402 爆闪 高亮 底亮 LED驱动 芯片
  20. 姐妹会四级任务+故事线

热门文章

  1. 如何计算平均学分绩点(GPA)
  2. 教你去除开机root字样(酷派大神F2、酷派高通平台手机)
  3. HTML5播放视频autoplay不起作用-HTML5视频不自动播放
  4. 【微服务】DSL查询文档
  5. 各种排序的动图.gif
  6. 验证码ocrking接口
  7. DCDC开关电源控制器设计过程(补偿网络设计)
  8. BWA MEM比对人类参考基因组详解
  9. OTB数据集中的标签含义及对应的视频序列
  10. 紧耦合超宽带广角偶极子阵列天线设计