内容简介:今天我们推出了一个全新的系列,Hacking the Blockchain!它适用于刚刚开始开发EOSIO的所有开发人员。它也适用于所有EOS Blockchain爱好者,他们不是完全技术性的,但想要搞清楚该技术的工作原理。在每篇文章中,我们将探讨区块链的特定部分。我们从EOS通信模型开始,希望能坚持下去!今天,我们将探索EOS通信模型。我们将深入探讨不同类型的沟通模式和行动。对于dessert,我们将看到如何在我们的代码中使用它,并在我们要开发一个自动化的演示中使用它。
今天我们推出了一个全新的系列,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 weyland
executed 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 contract
eosio::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 weyland1
executed 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区块链的通信模型》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 区块链安全性的洋葱模型
- 不得不聊区块链模型的爱恨情仇
- 区块链联盟链 PlatONE 的权限模型介绍
- 区块链技术+区块链怎么赚钱?
- 区块链技术入门:区块链是什么
- 阿里申请可“行政干预”区块链专利,区块链变味?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JavaScript & jQuery
David Sawyer McFarland / O Reilly / 2011-10-28 / USD 39.99
You don't need programming experience to add interactive and visual effects to your web pages with JavaScript. This Missing Manual shows you how the jQuery library makes JavaScript programming fun, ea......一起来看看 《JavaScript & jQuery》 这本书的介绍吧!
RGB转16进制工具
RGB HEX 互转工具
图片转BASE64编码
在线图片转Base64编码工具