今天我们推出了一个全新的系列,Hacking the Blockchain!它适用于刚刚开始开发EOSIO的所有开发人员。它也适用于所有EOS Blockchain爱好者,他们不是完全技术性的,但想要搞清楚该技术的工作原理。

在每篇文章中,我们将探讨区块链的特定部分。我们从EOS通信模型开始,希望能坚持下去!

今天,我们将探索EOS通信模型。我们将深入探讨不同类型的沟通模式和行动。对于dessert,我们将看到如何在我们的代码中使用它,并在我们要开发一个自动化的演示中使用它。

但首先,让我们从EOS智能合约的内容开始。这将奠定基础。

EOS 智能合约

每个EOS智能合约都有一组操作和类型。action表示单个操作。你可以将其视为JavaScript中的函数或C#中的方法。type定义合约中使用的所需内容和结构。大多数时候我们将它们用于我们的表。

EOSIO中的合约可以相互通信。它是通过基于消息的通信架构实现的。

EOS通信模型就是他们沟通的方式。通信模型有两种类型:Inline Communication Model(内联通信模型)和Deferred Communication Model(延时通信模型)。

内联操作(内联通信模型)

内联操作是内联通信模型的一部分。如果你了解它们,就能理解内联通信。

我们来看看下图:

用户从智能合约A执行操作(Action #1)。当操作开始执行时,它会触发另外两个操作:来自智能合约B的操作Action #1.1来自智能合约C的操作Action #1.2。一切都在当前交易中完成。

在当前交易中执行并与其完成相关的操作,称为inline action内联操作

重要的是要记住内联操作是作为调用操作的一部分执行的。因此,它们与原始交易的范围和权限相同。这是他们将被执行的保证。如果其中一个操作失败,则整个交易将失败。

所以,你应该已经知道内联通信是什么意思了吧。

请求将执行操作作为调用操作的一部分是inline communication内联通信的示例。

延时操作(延时通信模式)

第二种类型是延时通信模型。表示模型的延时操作非常有趣,因为它们不在同一交易中执行。我们来看看下图:

我们有相同的交易工作流程。这里唯一的区别是从智能合约C执行的第二个操作不是内联而是延时。延时操作计划在将来运行。

根据生产者的判断,延时的操作最好可以安排在稍后的时间运行。无法保证延期操作将执行。

即使它们不属于同一交易,它们也具有发送它们的合约的权限。

所以基本上,延时通信在概念上采用发送给对等交易的操作通知的形式。

交易与操作

在继续演示之前,让我们检查一些有趣的东西。

在EOSIO中,交易和操作之间存在差异。操作表示单个操作,而交易是一个或多个操作的集合。

交易可以包含N个操作。但是,每个交易必须在30ms或更短的时间内执行。如果交易包含多个操作,并且这些操作的总和大于30毫秒,则整个交易将失败。

机器人工厂

我们要做个机器人。你可以在我们的GitHub中找到包含所有智能合约和代码的项目。

作为一家创造未来的机器人公司,我们希望一切都是完美的。新建新的机器人时,应发送出售信息,并在终端上打印相关信息。为了实现这三个操作,我们将使用内联操作。

看一下下面的代码片段。

void RobotFactory::create(account_name account, robot newRobot) {robotIndex robots(_self, _self);auto iterator = robots.find(newRobot.series_number);eosio_assert(iterator == robots.end(), "Robot with this series number already exists");robots.emplace(account, [&](auto& robot) {robot.series_number = newRobot.series_number;robot.model = newRobot.model;robot.operating_system = newRobot.operating_system;robot.profession = newRobot.profession;robot.owner = name{account}.to_string();robot.manufactured = now();});// Execute INLINE ACTION from another contract// action({permission_level}, {contract_deployer}, {contract_action}, {data_to_pass}).send();action(permission_level(account, N(active)), N(market), N(forsale), make_tuple(account, newRobot.series_number, newRobot.model, newRobot.manufactured)).send();// Execute INLINE ACTION from another contract// action({permission_level}, {contract_deployer}, {contract_action}, {data_to_pass}).send();action(permission_level(account, N(active)), N(messenger), N(printmessage), make_tuple(newRobot.model)).send();}

首先,我们开始创建一个新的机器人。操作完成后,它将出现第一个内联操作。我们让发送机器人一个出售信息,所以我们要求RobotMarketplace智能合约的forsale

请注意,当我们要求智能合约A从智能合约B执行操作时,应首先添加适当的权限。我们将在下一部分介绍,目前,请务必遵循README.md中的指南。

第一个内联操作完成后,第二个内联操作就会完成。这次我们从Messenger智能合约中请求printmessage。 同样应该添加适当的权限。

在这两种情况下,当我们通过终端执行创建操作时,我们已收到操作已完成(或失败)的通知。

cleos push action weyland create '{"account":"weyland","newRobot":{"series_number":14441992,"model":"A330","operating_system":"DX42","profession":"engineer","owner":"","manufactured":0}}' -p weylandexecuted transaction: 9874a8a5f516ca540c44cafd8b9b371c856fe7958be1fc6268641cc7ab67fdaf  136 bytes  6000 us
#      weyland <= weyland::create             {"account":"weyland","newRobot":{"series_number":14441992,"model":"A330","operating_system":"DX42",...
#        market <= market::forsale              {"account":"weyland","robotForSale":{"series_number":14441992,"model":"A330","manufactured":0}}
#     messenger <= messenger::printmessage      {"message":"A330"}
>>  ==== For sale | Robot model: A330

让我们将printmessage操作从内联更改为延时。为此,我们需要使用EOSIO的transaction.hpp标头。

void RobotFactory::create(account_name account, robot newRobot) {robotIndex robots(_self, _self);auto iterator = robots.find(newRobot.series_number);eosio_assert(iterator == robots.end(), "Robot with this series number already exists");robots.emplace(account, [&](auto& robot) {robot.series_number = newRobot.series_number;robot.model = newRobot.model;robot.operating_system = newRobot.operating_system;robot.profession = newRobot.profession;robot.owner = name{account}.to_string();robot.manufactured = now();});// Execute inline action from another contract// action({permission_level}, {contract_deployer}, {contract_action}, {data_to_pass}).send();action(permission_level(account, N(active)), N(market), N(forsale), make_tuple(account, newRobot.series_number, newRobot.model, newRobot.manufactured)).send();// Execute DEFERRED ACTION from another contracteosio::transaction tx;tx.actions.emplace_back(permission_level{account, N(active)}, N(messenger), N(printmessage), make_tuple(newRobot.model));tx.delay_sec = 12;tx.send(N(newRobot.model), account); }

要创建延时交易,我们首先从类型交易声明一个变量tx。然后我们在其操作集合中添加一个新操作。我们可以选择设置延时。如果它为0,则延时交易将在调用之后立即进行。

设置完所有后,我们只需调用send方法即可。

但是,不保证将执行延时交易。此外,我们不会像在内联操作中那样收到有关其成功或失败的任何通知。

cleos push action weyland1 create '{"account":"weyland1","newRobot":{"series_number":14441993,"model":"A330","operating_system":"DX42","profession":"engineer","owner":"","manufactured":0}}' -p weyland1executed transaction: 5f45b48877aac9d03172616a2443b7a9079ee9f74a124a0976d2fcf0b756e985  176 bytes  2722 us
#      weyland1 <= weyland1::create             {"account":"weyland1","newRobot":{"series_number":14441993,"model":"A330","operating_system":"DX42",...
#        market <= market::forsale              {"account":"weyland1","robotForSale":{"series_number":14441993,"model":"A330","manufactured":0}}# No notification for printmessage action

正如你在12秒后看到的那样,执行延时交易。

总结一下它们是EOS中的两种通信模型:内联和延时。内联通信期间使用的操作称为内联操作,在延时通信中使用时称为延时操作。

======================================================================

分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:

  • EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。

汇智网原创翻译,转载请标明出处。这里是原文EOS区块链的通信模型

EOS区块链的通信模型相关推荐

  1. 理解eos区块链的eosio.token合约

    2019独角兽企业重金招聘Python工程师标准>>> 我必须承认,学习eosio一直没有闲庭信步的感觉,我可以看到为什么很多人说它有一个陡峭的学习曲线.随着eosio软件继续经历大 ...

  2. 【刘文彬】 Controller:EOS区块链核心控制器

    原文链接:醒者呆的博客园,www.cnblogs.com/Evsward/p/c- Controller是EOS区块链的核心控制器,其功能丰富.责任重大. 关键字:EOS,区块链,controller ...

  3. EOS区块链技术开发(二)智能合约

    强烈建议直接去看EOSIO官网上的教程:https://developers.eos.io/ 不要看我的??博文了,以下博文就是我当时随便写写的,现在也没有什么时间详细修改.如果有问题可以提问. 注: ...

  4. EOS区块链技术开发(一)环境搭建

    强烈建议直接去看EOSIO官网上的教程:https://developers.eos.io/ 不要看我的??博文了,以下博文就是我当时随便写写的,现在也没有什么时间详细修改.如果有问题可以提问. 注: ...

  5. 介绍一个用于EOS区块链的RPC API接口的PHP开发包SDK

    作为我们Block Producer对社区利益的承诺的一部分,我们希望专注于构建有助于提高EOS平台采用率的工具/应用程序.与大多数大型应用程序一样,当你只有少量或过时的文档并且缺乏工具来帮助你进行入 ...

  6. 第一次开发EOS区块链的经验总结

    在处理项目时,用Java Connector for EOS区块链编写: 创建钱包 创建帐户 创建交易 创建签名交易 在帐户之间转移代币 我遇到了各种和运行本地EOS节点需要遵循的基本步骤.这个小指南 ...

  7. eos区块链 java客户端_分享一个网友第一次开发EOS区块链总结的经验

    在处理项目时,用Java Connector for EOS区块链编写: 创建钱包 创建帐户 创建交易 创建签名交易 在帐户之间转移代币 我遇到了各种和运行本地EOS节点需要遵循的基本步骤.这个小指南 ...

  8. eos区块链 java客户端_在EOS区块链上使用EOSJS和scatter开发dApp

    由于我一直在深入研究EOS dApp的开发,我看了不少好文章.在这里,我汇总了下做一些研究后得到的所有知识.在本文中,我将解释如何使用EOSJS和scatter.我假设你对智能合约以及如何在EOS区块 ...

  9. EOS区块链一周要闻回顾(2.24-3.01)

    盘点 EOS 区块链上周大事要闻,一文速览 EOSIO 动态.BM 上周 "剧透".BB 最赞推文.Voice 消息以及 DAPP 进展. EOSIO 动态 近期,Coinbase ...

最新文章

  1. 初识sparklyr—电影数据分析
  2. CentOS下MySQL的彻底卸载
  3. face recognition[翻译][深度人脸识别:综述]
  4. 王道计算机考研 数据结构 课后编程习题代码(绪论、线性表)
  5. c++ 取两个链表的交集_使用C ++程序查找两个链表的交集
  6. 无法获取未定义或 null 引用的属性“title”_JDK中四种对象引用类型
  7. ipython 更好的交互环境
  8. 纪念宾得4000万象素的120数码相机645D推出两周年
  9. Informatic 体系结构
  10. 电子电路基础 (12)——功率放大电路原理分析
  11. 建设智慧城市和智慧园区的必要性和趋势是什么?
  12. 【火影之卡卡西动漫主题】
  13. Typora丢失文件数据找回
  14. 高效的vim配置及其插件管理
  15. C# 导入EXCEL 报错外部表不是预期的格式错误
  16. puppy linux中文设置,使用puppyLinux心得
  17. 最新语音识别词错误率WER汇总
  18. CNN卷积神经网络 ILSVRC-2012
  19. 足球分析大小球开发成量化交易软件
  20. 如何解决安装好的google浏览器打不开网页的问题?

热门文章

  1. IDEA 黄色警告 found duplicated code in this file finds duplicated code
  2. python networkx 导入CSV文件画关系网络图
  3. OJ每日一练——乘方计算
  4. Java的字面量和符号引用
  5. showdialog 尝试读取或写入受保护的内存_超频内存比超频CPU收益更大!影驰HOF OC Lab皑钻DDR4-4400评测...
  6. Turtle库绘画实例
  7. DA03 – Schemas导论
  8. Vue中watch监听路由的使用场景
  9. java中osend_Java中OIO与NIO的简单区别
  10. regopenkeyexfailed什么意思_外置网卡驱动安装出现RegOpenKeyEx Failed,怎么回事?