这篇“EOSIO区块链的通信模型是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“EOSIO区块链的通信模型是什么”文章吧。
每个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秒后看到的那样,执行延时交易。
以上就是关于“EOSIO区块链的通信模型是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。