27auto main(
int argc,
char** argv) ->
int {
28 auto log = std::make_shared<cbdc::logging::log>(
31 auto sha2_impl = SHA256AutoDetect();
32 log->info(
"using sha2: ", sha2_impl);
35 if(!cfg.has_value()) {
36 log->error(
"Error parsing options");
40 log->set_loglevel(cfg->m_loglevel);
42 if(cfg->m_agent_endpoints.size() <= cfg->m_component_id) {
43 log->error(
"No endpoint for component id");
47 log->info(
"Connecting to shards...");
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});
56 log->error(
"Error connecting to shard");
59 shards.emplace_back(client);
62 log->info(
"Connected to shards, connecting to 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");
74 = std::make_shared<cbdc::parsec::directory::impl>(shards.size());
76 = std::make_shared<cbdc::parsec::broker::impl>(cfg->m_component_id,
82 log->info(
"Requesting broker recovery...");
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());
91 log->error(
"Error requesting broker recovery");
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");
101 auto recover_res = recover_fut.get();
103 log->error(
"Error during broker recovery");
108 if(cfg->m_component_id == 0) {
113 log->error(
"Error minting initial accounts");
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));
124 = std::unique_ptr<cbdc::parsec::agent::rpc::server_interface>();
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),
137 auto rpc_server = std::make_unique<cbdc::rpc::json_rpc_http_server>(
138 cfg->m_agent_endpoints[cfg->m_component_id],
140 server = std::make_unique<cbdc::parsec::agent::rpc::http_server>(
141 std::move(rpc_server),
146 log->error(
"Unknown runner type");
150 if(!server->init()) {
151 log->error(
"Error listening on RPC interface");
155 static auto running = std::atomic_bool{
true};
157 std::signal(SIGINT, [](
int ) {
161 log->info(
"Agent running");
164 std::this_thread::sleep_for(std::chrono::seconds(1));
167 log->info(
"Shutting down...");