EOS區塊鏈的通訊模型
今天我們推出了一個全新的系列,Hacking the Blockchain!它適用於剛剛開始開發EOSIO的所有開發人員。它也適用於所有EOS Blockchain愛好者,他們不是完全技術性的,但想要搞清楚該技術的工作原理。
在每篇文章中,我們將探討區塊鏈的特定部分。我們從EOS通訊模型開始,希望能堅持下去!
今天,我們將探索EOS通訊模型。我們將深入探討不同型別的溝通模式和行動。對於dessert,我們將看到如何在我們的程式碼中使用它,並在我們要開發一個自動化的演示中使用它。
但首先,讓我們從EOS智慧合約的內容開始。這將奠定基礎。
EOS 智慧合約
每個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毫秒,則整個交易將失敗。
機器人工廠
我們要做個機器人。你可以在我們的 ofollow,noindex">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: 9874a8a5f516ca540c44cafd8b9b371c856fe7958be1fc6268641cc7ab67fdaf136 bytes6000 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: 5f45b48877aac9d03172616a2443b7a9079ee9f74a124a0976d2fcf0b756e985176 bytes2722 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秒後看到的那樣,執行延時交易。
總結一下它們是EOS中的兩種通訊模型:內聯和延時。內聯通訊期間使用的操作稱為內聯操作,在延時通訊中使用時稱為延時操作。
======================================================================
分享一些以太坊、EOS、比特幣等區塊鏈相關的互動式線上程式設計實戰教程:
- EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
- java以太坊開發教程,主要是針對java和android程式員進行區塊鏈以太坊開發的web3j詳解。
- python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
- php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
- 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
- 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
- C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
- java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
- php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
- tendermint區塊鏈開發詳解 ,本課程適合希望使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI介面、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操程式碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。
匯智網原創翻譯,轉載請標明出處。這裡是原文 EOS區塊鏈的通訊模型