溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

EOSIO區(qū)塊鏈的通信模型是什么

發(fā)布時(shí)間:2022-01-15 14:28:14 來源:億速云 閱讀:141 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇“EOSIO區(qū)塊鏈的通信模型是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“EOSIO區(qū)塊鏈的通信模型是什么”文章吧。

EOS 智能合約

EOSIO區(qū)塊鏈的通信模型是什么

每個(gè)EOS智能合約都有一組操作和類型。action表示單個(gè)操作。你可以將其視為JavaScript中的函數(shù)或C#中的方法。type定義合約中使用的所需內(nèi)容和結(jié)構(gòu)。大多數(shù)時(shí)候我們將它們用于我們的表。

EOSIO中的合約可以相互通信。它是通過基于消息的通信架構(gòu)實(shí)現(xiàn)的。

EOS通信模型就是他們溝通的方式。通信模型有兩種類型:Inline Communication Model(內(nèi)聯(lián)通信模型)和Deferred Communication Model(延時(shí)通信模型)。

內(nèi)聯(lián)操作(內(nèi)聯(lián)通信模型)

內(nèi)聯(lián)操作是內(nèi)聯(lián)通信模型的一部分。如果你了解它們,就能理解內(nèi)聯(lián)通信。

我們來看看下圖:

EOSIO區(qū)塊鏈的通信模型是什么

用戶從智能合約A執(zhí)行操作(Action #1)。當(dāng)操作開始執(zhí)行時(shí),它會(huì)觸發(fā)另外兩個(gè)操作:來自智能合約B的操作Action #1.1來自智能合約C的操作Action #1.2。一切都在當(dāng)前交易中完成。

在當(dāng)前交易中執(zhí)行并與其完成相關(guān)的操作,稱為inline action內(nèi)聯(lián)操作

重要的是要記住內(nèi)聯(lián)操作是作為調(diào)用操作的一部分執(zhí)行的。因此,它們與原始交易的范圍和權(quán)限相同。這是他們將被執(zhí)行的保證。如果其中一個(gè)操作失敗,則整個(gè)交易將失敗。

所以,你應(yīng)該已經(jīng)知道內(nèi)聯(lián)通信是什么意思了吧。

請(qǐng)求將執(zhí)行操作作為調(diào)用操作的一部分是inline communication內(nèi)聯(lián)通信的示例。  

延時(shí)操作(延時(shí)通信模式)

第二種類型是延時(shí)通信模型。表示模型的延時(shí)操作非常有趣,因?yàn)樗鼈儾辉谕唤灰字袌?zhí)行。我們來看看下圖:

EOSIO區(qū)塊鏈的通信模型是什么

我們有相同的交易工作流程。這里唯一的區(qū)別是從智能合約C執(zhí)行的第二個(gè)操作不是內(nèi)聯(lián)而是延時(shí)。延時(shí)操作計(jì)劃在將來運(yùn)行。

根據(jù)生產(chǎn)者的判斷,延時(shí)的操作最好可以安排在稍后的時(shí)間運(yùn)行。無法保證延期操作將執(zhí)行。

即使它們不屬于同一交易,它們也具有發(fā)送它們的合約的權(quán)限。

所以基本上,延時(shí)通信在概念上采用發(fā)送給對(duì)等交易的操作通知的形式。  

交易與操作

在繼續(xù)演示之前,讓我們檢查一些有趣的東西。

在EOSIO中,交易和操作之間存在差異。操作表示單個(gè)操作,而交易是一個(gè)或多個(gè)操作的集合。

EOSIO區(qū)塊鏈的通信模型是什么

交易可以包含N個(gè)操作。但是,每個(gè)交易必須在30ms或更短的時(shí)間內(nèi)執(zhí)行。如果交易包含多個(gè)操作,并且這些操作的總和大于30毫秒,則整個(gè)交易將失敗。

機(jī)器人工廠

我們要做個(gè)機(jī)器人。你可以在我們的GitHub中找到包含所有智能合約和代碼的項(xiàng)目。

作為一家創(chuàng)造未來的機(jī)器人公司,我們希望一切都是完美的。新建新的機(jī)器人時(shí),應(yīng)發(fā)送出售信息,并在終端上打印相關(guān)信息。為了實(shí)現(xiàn)這三個(gè)操作,我們將使用內(nèi)聯(lián)操作。

看一下下面的代碼片段。

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();
    }

首先,我們開始創(chuàng)建一個(gè)新的機(jī)器人。操作完成后,它將出現(xiàn)第一個(gè)內(nèi)聯(lián)操作。我們讓發(fā)送機(jī)器人一個(gè)出售信息,所以我們要求RobotMarketplace智能合約的forsale。

請(qǐng)注意,當(dāng)我們要求智能合約A從智能合約B執(zhí)行操作時(shí),應(yīng)首先添加適當(dāng)?shù)臋?quán)限。我們將在下一部分介紹,目前,請(qǐng)務(wù)必遵循README.md中的指南。

第一個(gè)內(nèi)聯(lián)操作完成后,第二個(gè)內(nèi)聯(lián)操作就會(huì)完成。這次我們從Messenger智能合約中請(qǐng)求printmessage。 同樣應(yīng)該添加適當(dāng)?shù)臋?quán)限。

在這兩種情況下,當(dāng)我們通過終端執(zhí)行創(chuàng)建操作時(shí),我們已收到操作已完成(或失敗)的通知。

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操作從內(nèi)聯(lián)更改為延時(shí)。為此,我們需要使用EOSIO的transaction.hpp標(biāo)頭。

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); 
    }

要?jiǎng)?chuàng)建延時(shí)交易,我們首先從類型交易聲明一個(gè)變量tx。然后我們?cè)谄洳僮骷现刑砑右粋€(gè)新操作。我們可以選擇設(shè)置延時(shí)。如果它為0,則延時(shí)交易將在調(diào)用之后立即進(jìn)行。

設(shè)置完所有后,我們只需調(diào)用send方法即可。

但是,不保證將執(zhí)行延時(shí)交易。此外,我們不會(huì)像在內(nèi)聯(lián)操作中那樣收到有關(guān)其成功或失敗的任何通知。

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秒后看到的那樣,執(zhí)行延時(shí)交易。

EOSIO區(qū)塊鏈的通信模型是什么

以上就是關(guān)于“EOSIO區(qū)塊鏈的通信模型是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI