您好,登錄后才能下訂單哦!
這篇“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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。