EOS區塊鏈的通信模型

今天我們推出了一個全新的系列,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區塊鏈的通信模型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章