OpenCBDC Transaction Processor
Loading...
Searching...
No Matches
agentd.cpp
Go to the documentation of this file.
1// Copyright (c) 2021 MIT Digital Currency Initiative,
2// Federal Reserve Bank of Boston
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#include "broker/impl.hpp"
7#include "crypto/sha256.h"
8#include "directory/impl.hpp"
9#include "format.hpp"
10#include "impl.hpp"
13#include "runners/evm/math.hpp"
15#include "runners/evm/util.hpp"
19#include "util.hpp"
21#include "util/rpc/format.hpp"
24
25#include <csignal>
26
27auto main(int argc, char** argv) -> int {
28 auto log = std::make_shared<cbdc::logging::log>(
30
31 auto sha2_impl = SHA256AutoDetect();
32 log->info("using sha2: ", sha2_impl);
33
34 auto cfg = cbdc::parsec::read_config(argc, argv);
35 if(!cfg.has_value()) {
36 log->error("Error parsing options");
37 return 1;
38 }
39
40 log->set_loglevel(cfg->m_loglevel);
41
42 if(cfg->m_agent_endpoints.size() <= cfg->m_component_id) {
43 log->error("No endpoint for component id");
44 return 1;
45 }
46
47 log->info("Connecting to shards...");
48
49 auto shards = std::vector<
50 std::shared_ptr<cbdc::parsec::runtime_locking_shard::interface>>();
51 for(const auto& shard_ep : cfg->m_shard_endpoints) {
52 auto client = std::make_shared<
54 std::vector<cbdc::network::endpoint_t>{shard_ep});
55 if(!client->init()) {
56 log->error("Error connecting to shard");
57 return 1;
58 }
59 shards.emplace_back(client);
60 }
61
62 log->info("Connected to shards, connecting to ticketer...");
63
64 auto ticketer
65 = std::make_shared<cbdc::parsec::ticket_machine::rpc::client>(
66 std::vector<cbdc::network::endpoint_t>{
67 cfg->m_ticket_machine_endpoints});
68 if(!ticketer->init()) {
69 log->error("Error connecting to ticket machine");
70 return 1;
71 }
72
73 auto directory
74 = std::make_shared<cbdc::parsec::directory::impl>(shards.size());
75 auto broker
76 = std::make_shared<cbdc::parsec::broker::impl>(cfg->m_component_id,
77 shards,
78 ticketer,
79 directory,
80 log);
81
82 log->info("Requesting broker recovery...");
83
84 auto recover_success = std::promise<bool>();
85 auto recover_fut = recover_success.get_future();
86 auto success = broker->recover(
88 recover_success.set_value(!res.has_value());
89 });
90 if(!success) {
91 log->error("Error requesting broker recovery");
92 return 1;
93 }
94
95 constexpr auto recover_delay = std::chrono::seconds(60);
96 auto wait_res = recover_fut.wait_for(recover_delay);
97 if(wait_res == std::future_status::timeout) {
98 log->error("Timeout waiting for broker recovery");
99 return 1;
100 }
101 auto recover_res = recover_fut.get();
102 if(!recover_res) {
103 log->error("Error during broker recovery");
104 return 1;
105 }
106
107 if(cfg->m_runner_type == cbdc::parsec::runner_type::evm) {
108 if(cfg->m_component_id == 0) {
109 auto res
111 broker);
112 if(!res) {
113 log->error("Error minting initial accounts");
114 return 1;
115 }
116 } else {
117 log->info("Not seeding, waiting so role 0 can seed");
118 static constexpr auto seeding_time = 10;
119 std::this_thread::sleep_for(std::chrono::seconds(seeding_time));
120 }
121 }
122
123 auto server
124 = std::unique_ptr<cbdc::parsec::agent::rpc::server_interface>();
125
126 if(cfg->m_runner_type == cbdc::parsec::runner_type::lua) {
127 auto rpc_server = std::make_unique<
130 cfg->m_agent_endpoints[cfg->m_component_id]);
131 server = std::make_unique<cbdc::parsec::agent::rpc::server>(
132 std::move(rpc_server),
133 broker,
134 log,
135 cfg.value());
136 } else if(cfg->m_runner_type == cbdc::parsec::runner_type::evm) {
137 auto rpc_server = std::make_unique<cbdc::rpc::json_rpc_http_server>(
138 cfg->m_agent_endpoints[cfg->m_component_id],
139 true);
140 server = std::make_unique<cbdc::parsec::agent::rpc::http_server>(
141 std::move(rpc_server),
142 broker,
143 log,
144 cfg.value());
145 } else {
146 log->error("Unknown runner type");
147 return 1;
148 }
149
150 if(!server->init()) {
151 log->error("Error listening on RPC interface");
152 return 1;
153 }
154
155 static auto running = std::atomic_bool{true};
156
157 std::signal(SIGINT, [](int /* signal */) {
158 running = false;
159 });
160
161 log->info("Agent running");
162
163 while(running) {
164 std::this_thread::sleep_for(std::chrono::seconds(1));
165 }
166
167 log->info("Shutting down...");
168
169 return 0;
170}
auto main(int argc, char **argv) -> int
Definition agentd.cpp:27
std::optional< error_code > recover_return_type
Return type from a recover operation.
Implements an RPC server over a TCP socket.
@ trace
Fine-grained, fully verbose operating information.
interface::exec_return_type response
Agent RPC response type.
exec_request request
Agent RPC request type.
auto mint_initial_accounts(const std::shared_ptr< logging::log > &log, const std::shared_ptr< parsec::broker::interface > &broker) -> bool
Mints a set of initial accounts with funds, bypassing the agent.
@ evm
Ethereum-style transactions using EVM.
@ lua
Transaction semantics defined using Lua.
auto read_config(int argc, char **argv) -> std::optional< config >
Reads the configuration parameters from the program arguments.
Definition util.cpp:100