亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何通過EOS代碼進行命令注冊和通信機制分析

發布時間:2021-10-27 09:09:37 來源:億速云 閱讀:136 作者:柒染 欄目:數據安全

這期內容當中小編將會給大家帶來有關如何通過EOS代碼進行命令注冊和通信機制分析,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

客戶端是cleos,服務器端是nodeos,通過cleos命令行控制和管理整個EOS鏈,非常重要的機制。
客戶端和服務器端的通信采用RESTful軟件架構風格,服務器端的每個資源對應一個唯一的URL地址,客戶端將URL地址封裝成http請求發送到服務器端,請求對應的資源或者執行相應操作。
如何通過EOS代碼進行命令注冊和通信機制分析
客戶端發送消息流程
以轉賬為例,說明EOS消息處理流程。通過cleos客戶端發起轉賬命令,在main函數中,解析transfer命令,通過create_transfer函數將交易發送者、交易接收者、token數量等信息封裝成mutable_variant_object對象,然后調用send_action函數,將交易信息發送到服務器端打包進區塊鏈。

./cleos transfer sender recipient amount memo

programs/cleos/main.cpp
main()
{

send_actions({create_transfer(sender, recipient, amount, memo)});

}
void send_actions {
        auto result = push_actions( move(actions), extra_kcpu, compression);
        …
}
fc::variant push_actions {
       signed_transaction trx;
trx.actions = std::forward<decltype(actions)>(actions);
return push_transaction(trx, extra_kcpu, compression);
}
fc::variant push_transaction{
    trx.set_reference_block(ref_block_id);
// 發送 ”/V1/chain/push_transaction” URL地址到服務器端
    if (!tx_dont_broadcast) {
         return call(push_txn_func, packed_transaction(trx, compression));
     }
}
fc::variant call{
       try {
              return eosio::client::http::do_http_call( url, path, fc::variant(v) );
        }
}
fc::variant do_http_call {
       // 將請求的URL封裝成http包
       request_stream << “POST ” << path_prefix + path << ” HTTP/1.0\r\n”;
request_stream << “Host: ” << server << “\r\n”;
request_stream << “content-length: ” << postjson.size() << “\r\n”;
request_stream << “Accept: /\r\n”;
request_stream << “Connection: close\r\n\r\n”;
request_stream << postjson;
       // 和服務器建立連接
       do_connect(socket, server, port);
       // 發送http報文,并獲取返回結果
       re = do_txrx(socket, request, status_code);
}

服務器接收消息流程
nodeos服務器先通過http_plugin插件接收客戶端發過來的http請求報文,然后解析出請求的URL地址和數據信息,然后調用對應的回調函數處理,并將結果返回給cleos客戶端。
HTTP消息處理流程
在nodeos的main函數中啟動http_plugin插件,注冊處理http請求的回調函數(handle_http_request),然后監聽socket通信端口,等待建立客戶端遠程連接。
void http_plugin::plugin_startup() {
      // 注冊http請求處理函數
       my->create_server_for_endpoint(my->https_listen_endpoint, my->https_server);
// 監聽socket通信端口
my->https_server.listen(
my->https_listen_endpoint);
// 等待建立客戶端遠程連接
my->https_server.start_accept();  
transport_type::async_accept(&type::handle_accept
// This method will have no effect until the underlying io_service * starts running. It may be called after the io_service is already running.
}
void create_server_for_endpoint{
       ws.set_http_handler([&](connection_hdl hdl) {
handle_http_request<T>(ws.get_con_from_hdl(hdl));
       });
}
         http請求處理函數從http報文中解析出URL地址(resource)、消息內容(body),然后在url_handlers集合中查找URL對應的回調函數,最后通過handler_itr->second調用處理函數。
void handle_http_request {
       …
       auto body = con->get_request_body();
auto resource = con->get_uri()->get_resource();
auto handler_itr = url_handlers.find(resource);
if(handler_itr != url_handlers.end()) {
              handler_itr->second(resource, body, [con](int code, string body) {
                     con->set_body(body);
con->set_status(websocketpp::http::status_code::value(code));
});
       }
       …
}
注冊URL處理函數
url_handlers是一個URL和處理函數的鍵值對map集合,由class http_plugin_impl管理,其它插件模塊通過add_api函數注冊URL回調函數。
plugins/http_plugin/http_plugin.cpp
class http_plugin_impl {
       map<string,url_handler>  url_handlers;

}
void add_api(const api_description& api) {
       for (const auto& call : api)
add_handler(call.first, call.second);
}
void http_plugin::add_handler {
       …
       my->url_handlers.insert(std::make_pair(url,handler);
}
例如,chain_api_plugin插件在啟動函數中注冊了以下URL回調函數,包括查詢區塊信息、處理交易數據:
void chain_api_plugin::plugin_startup() {
       app().get_plugin<http_plugin>().add_api({
CHAIN_RO_CALL(get_info, 200),
CHAIN_RO_CALL(get_block, 200),
              …
     CHAIN_RW_CALL(push_transaction, 202),
CHAIN_RW_CALL(push_transactions, 202)
});
}

上述就是小編為大家分享的如何通過EOS代碼進行命令注冊和通信機制分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

eos
AI

勐海县| 麻江县| 连江县| 阳朔县| 钟山县| 岳西县| 麦盖提县| 张家界市| 淮北市| 富源县| 扎兰屯市| 宜章县| 隆尧县| 龙门县| 彰化县| 利辛县| 华容县| 隆林| 崇文区| 灌南县| 忻城县| 山阳县| 龙井市| 故城县| 南开区| 磐石市| 金乡县| 广汉市| 伽师县| 康乐县| 澄城县| 武宁县| 斗六市| 阳东县| 阿克| 桃源县| 米泉市| 莱西市| 宕昌县| 岳西县| 资溪县|