1. 合约消息

合约之间通过调用或发送消息的方式进行交互 。当一个合约接收到一条消息时,它可以回复一些数据,这样消息的原发送者就能立即使用 。采用这种方法,发送一条消息就像调用一次函数。

  • 一个智能合约能够给其他智能合约发送消息( Messages ) 。
  • 消息是永远不会序列化的虚拟对象 ,仅存于以太坊执行环境,可以认为就是函数调用。
  • 合约可以通过消息调用的方式来调用其他合约 ,或者发送以太币到非合约账户 。
  • 消息除了是由合约产生而不是外部账户产生外 ,基本等同交易。消息触发接收合约账户运行其代码 。 因此,合约之间的关系与外部账户之间的关系基本类同。
  • 当一个正在执行的合约执行call或者delegatecall操作命令时,就产生一条消息。

一个消息包含如下内容。
( 1 )消息的发送者(隐含) 。
( 2 )消息的接收者。
( 3) Value域 : 向智能合约地址转账的数量(单位为wei ) 。
( 4 )可选数据域 : 给智能合约的实际输入参数。
( 5 ) Startgas值 : 消息触发代码执行所产生的最大燃料值。
( 6 ) 返回数据

“事实上每笔交易都可以被认为是一个顶层的消息调用,这个消息调用会依次产生更多 的消息调用 。”

2. 调用原理

2.1 触发条件

1). 默认条件下 ,以太坊执行环境是无状态的 。如没有外部触发 ,以太坊网络的状态不会发生变化 ,所有账户状态都是一样的 。
2). 任何用户通过外部账户发送一个交易将触发一个动作 ,从而使以太坊处于活动状态。
3). 如果交易的目标是另外一个EOA外部用户账户 ,交易除了 “虚拟币 ” 互换外也不能做其他任何事情。 如果交易的目标是一个智能合约,合约一旦被触发 ,它就可以自动运行合约代码 。

2.2 调用原理

1). 当合约调用时,虚拟机为被调用的合约创建一块全新的内存区域,以及能够访问调用的Payload (由被称为“ calldata " 的独立区域所提供的数据)。

2). 当调用执行结束后,返回数据将被存储在调用者预先分配好的一块内存中 。调用层数被限制为 1024 ,因此对于更加复杂的操作,我们应该使用循环而不是递归 。

3). 合约代码能够读、写其自身的内部存储(一个匹配32字节密钥与32字节数值的数据库),读出所接收消息的存储数据,向另一个合约发送消息,反过来触发其执行。 账户存储则是与合约账户绑定的持久化存储,在合约 B 的代码执行过程中,可以对 B 的账户存储进行读写操作。

4).一旦合约执行停止 , 由合约停止发出的消息触发的所有子代码也将停止(在一个确定性同步顺序环境中,父函数下一步操作执行之前 , 所有调用的子函数必须先执行完成),执行环境中止, 直到由下一次交易唤醒。

一个合约可以决定剩余 gas 的分配 。比如在内部消息调用时使用多少 gas,或者期望保留 多少 gas 。 如果在内部消息调用时发生了费用不足( out-of-gas )异常(或者其他异常),合约将会得到通知(异常会“冒泡”到合约的调用核)

以太坊知识教程------智能合约(2)调用相关推荐

  1. 以太坊知识教程------智能合约(2)调用 delegatecall call send

    1. 函数调用call(-) <address>.call(-) 可以接受任何长度.任何类型的参数,每个参数将被填充到 32 字节并拼接在一起 . 但有一种例外情况,当第一个参数的长度恰好 ...

  2. 以太坊知识教程------智能合约(1)基本概念

    1.智能合约的定义 智能合约是一段 EVM 可执行的代码 智能合约的信息都被附在"交易"中,以交易的形式发布到网络中 合约发布之后用户会得到一个合约地址,相当于合约对象的指针 当网 ...

  3. 以太坊知识教程------智能合约(3)函数修饰符

    1. solidity的五个关键字修饰符 操作 定义 public 用来修饰公开的函数 /变量,表明该函数/变量既可以在合约外部访问,也可以在合约内部访问 . private 私有函数和变量,只有当前 ...

  4. 以太坊知识教程------智能合约的5种设计模式

    1.自毁合约 合约自毁模式用于终止一个合约,这意味着将从区块链上永久删除这个合约. 一旦被销毁,就不可能调用合约的功能,也不会在账本中记录交易. eg. 贷款合约,它应当在贷款还清后自动销毁:另一个案 ...

  5. 基于以太坊网络的智能合约开发、部署和测试(入门)

    为什么80%的码农都做不了架构师?>>>    基本概念: 以太坊是一个开放的.公开的区块链平台,允许用户构建自己的去中心化应用在上面运行 Solidity是一种语法类似JavaSc ...

  6. 以太坊可更新智能合约研究与开发综述

    原文地址:https://ethfans.org/posts/ethereum-upgradeable-smart-contract-strategies 这篇文章是对以太坊可更新智能合约领域里的研究 ...

  7. 以太坊—开放的智能合约完整解决方案

    什么是以太坊(Ethereum)? 通俗的讲,以太坊是一种新的法律.传统的合同合约依据法律订立,执行.违约处理依赖律师.法院:以太坊解决了这一系列问题,合约通过程序订立.执行,人工无法干预,所以几乎可 ...

  8. 元宇宙应用开发实例——以太坊里的智能合约和Decentraland里的3D前端交互组件

    目录 1. 元宇宙核心技术 2. 元宇宙实例及应用实例 3. 以太坊里的智能合约开发 3.1. World Wide Web的访问能力 3.2. 初始化以太坊钱包 3.3. 开发4方合约 3.4. 手 ...

  9. 区块链入门文章二《以太坊:下一代智能合约和去中心化应用平台》

    以太坊:下一代智能合约和去中心化应用平台 以太坊基金会 著 李志阔(网名:面神护法) 赵海涛 焦锋 译 中本聪2009年发明的比特币经常被视作货币和通货领域内一次激进的发展,这种激进首先表现为一种没有 ...

最新文章

  1. 输入3个数a,b,c,要求按由小到大的顺序输出
  2. lvs和keepalives
  3. 架构漫谈读后感之软件架构师如何工作
  4. mysql5.5.3下载_MySQL5.5.5M3发布-下载_MySQL
  5. python代码调试快捷键_6. Pycharm的传参、快捷键、执行代码、调试模式
  6. FCN-加载训练与测试数据
  7. matlab多种分配方案_基于MATLAB的水资源优化分配问题动态规划解法
  8. java holder_java.sql.SQLException: connection holder is null
  9. 设计模式-17-迭代器
  10. rabbitmq添加自启动 centos7环境
  11. python爬虫步骤-Python爬虫怎么入门-初级篇
  12. x86汇编之任务切换
  13. 拉普拉斯时域卷积定理_拉普拉斯变换卷积积分状态方程.ppt
  14. 用Word2003助你轻松阅读文档(转)
  15. 计算机网络多项式的定义,多项式
  16. DCOM Access Denied 禁止访问的解决方法
  17. bedtools2安装报错:fatal error: zlib.h
  18. “独裁”的张小龙和他的微信帝国诞生记
  19. 何以解忧,唯有暴富,手把手教你打造财富方程式
  20. 换发型软件有哪些?试试这些软件吧

热门文章

  1. log4j2配置文件log4j2.xml详解
  2. 计算机基础及ms office应用,全国计算机等级考试一级计算机基础及MS Office应用模拟练习系统...
  3. 2020年 | 云计算发展的5大趋势
  4. 我的心得:数据中心运维管理(一)
  5. 无头虚拟化服务器,VBoxHeadless - 使用VirtualBox 4.0在无头Ubuntu 10.10服务器上运行虚拟机...
  6. DayDayUp:教你一招如何在道客巴巴免费下载自己被侵权的文章
  7. 成功解决Exception “unhandled ImportError“cannot import name ‘imread‘ from ‘scipy.misc‘
  8. ML之xgboost :xgboost.plot_importance()函数的解读
  9. Python:numpy库中的一些函数简介、使用方法之详细攻略
  10. 成功解决 python 不是内部或外部命令,也不是可运行的程序或批处理文件