EOSIO区块链的通信模型

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

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

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

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

EOS 智能合约

eos_smart_contracts

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

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

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

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

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

我们来看看下图:

inline_action_diagram

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

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

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

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

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

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

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

deferred_action_diagram

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

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

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

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

交易与操作

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

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

deferred_action_diagram

交易可以包含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秒后看到的那样,执行延时交易。

deferred_action_diagram

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

分享一个EOS区块链相关的交互式在线编程实战教程:

EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。

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

转载于:https://my.oschina.net/u/2472105/blog/2966654

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值