From 1804c8e00cb2608112974d5db27d3e095fa3a14b Mon Sep 17 00:00:00 2001 From: ghe0 Date: Thu, 19 Sep 2024 04:54:21 +0300 Subject: [PATCH] testnet starting --- rewrite/Cargo.lock | 95 ++++++++++++++++++++++++++++++-------- rewrite/Cargo.toml | 3 +- rewrite/scripts/Dockerfile | 4 ++ rewrite/scripts/start.sh | 12 +++++ rewrite/scripts/testnet.sh | 24 ++++++++++ rewrite/src/datastore.rs | 15 ++++-- rewrite/src/http_server.rs | 9 ++-- rewrite/src/main.rs | 14 +++--- 8 files changed, 143 insertions(+), 33 deletions(-) create mode 100644 rewrite/scripts/Dockerfile create mode 100755 rewrite/scripts/start.sh create mode 100755 rewrite/scripts/testnet.sh diff --git a/rewrite/Cargo.lock b/rewrite/Cargo.lock index d77d827..ac34414 100644 --- a/rewrite/Cargo.lock +++ b/rewrite/Cargo.lock @@ -237,6 +237,21 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anyhow" version = "1.0.89" @@ -723,7 +738,12 @@ version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", "num-traits", + "wasm-bindgen", + "windows-targets", ] [[package]] @@ -769,6 +789,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cpufeatures" version = "0.2.14" @@ -1169,6 +1195,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "hacker-challenge" +version = "0.1.0" +dependencies = [ + "actix-web", + "async-stream", + "chrono", + "dashmap", + "prost", + "prost-types", + "rand 0.8.5", + "serde", + "solana-sdk", + "tokio", + "tokio-stream", + "tonic", + "tonic-build", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1343,6 +1388,29 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -2045,24 +2113,6 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" -[[package]] -name = "rewrite" -version = "0.1.0" -dependencies = [ - "actix-web", - "async-stream", - "dashmap", - "prost", - "prost-types", - "rand 0.8.5", - "serde", - "solana-sdk", - "tokio", - "tokio-stream", - "tonic", - "tonic-build", -] - [[package]] name = "rustc-demangle" version = "0.1.24" @@ -2865,6 +2915,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-sys" version = "0.52.0" diff --git a/rewrite/Cargo.toml b/rewrite/Cargo.toml index 62bc508..2ce3dca 100644 --- a/rewrite/Cargo.toml +++ b/rewrite/Cargo.toml @@ -1,11 +1,12 @@ [package] -name = "rewrite" +name = "hacker-challenge" version = "0.1.0" edition = "2021" [dependencies] actix-web = "4.9.0" async-stream = "0.3.5" +chrono = "0.4.38" dashmap = "6.1.0" prost = "0.13.2" prost-types = "0.13.2" diff --git a/rewrite/scripts/Dockerfile b/rewrite/scripts/Dockerfile new file mode 100644 index 0000000..6e80e44 --- /dev/null +++ b/rewrite/scripts/Dockerfile @@ -0,0 +1,4 @@ +FROM alpine:edge +COPY start.sh /start.sh +COPY hacker-challenge /hacker-challenge +ENTRYPOINT ["/start.sh"] diff --git a/rewrite/scripts/start.sh b/rewrite/scripts/start.sh new file mode 100755 index 0000000..11ac960 --- /dev/null +++ b/rewrite/scripts/start.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +# This script start the hacker challenge from within the docker container. +# It's only purpose is to help bootstrap a test network. + +if [ -z "${INIT_NODES}" ]; then + echo "The INIT_NODES environment variable is not set." +else + echo $INIT_NODES | tr ' ' '\n' > /detee_challenge_nodes +fi + +/hacker-challenge diff --git a/rewrite/scripts/testnet.sh b/rewrite/scripts/testnet.sh new file mode 100755 index 0000000..9b97e42 --- /dev/null +++ b/rewrite/scripts/testnet.sh @@ -0,0 +1,24 @@ +#!/bin/bash +cd "$(dirname "$0")"/.. +set -e +cargo build --release --target x86_64-unknown-linux-musl +rm -rf build +mkdir -p build +cp ./target/x86_64-unknown-linux-musl/release/hacker-challenge build/ +cp scripts/start.sh build/ +cp scripts/Dockerfile build/ +cd build + +docker build -t hacker-challenge:latest . + +docker ps -a | grep 'hacker-challenge' | awk '{ print $NF }' | xargs docker rm -f || true + +docker run -d --name "hacker-challenge_0" \ + hacker-challenge:latest + +for i in {1..10} +do + docker run -d --name "hacker-challenge_$i" \ + --env INIT_NODES="172.17.0.2 172.17.0.3 172.17.0.4" \ + hacker-challenge:latest +done diff --git a/rewrite/src/datastore.rs b/rewrite/src/datastore.rs index f32f09e..1e12c95 100644 --- a/rewrite/src/datastore.rs +++ b/rewrite/src/datastore.rs @@ -5,6 +5,7 @@ use dashmap::DashSet; use solana_sdk::signature::keypair::Keypair; use std::time::SystemTime; use std::time::{Duration, UNIX_EPOCH}; +use chrono::{DateTime, Utc}; type IP = String; pub const LOCALHOST: &str = "localhost"; @@ -93,7 +94,9 @@ impl Store { } pub fn increase_mint_requests(&self) { + println!("increasing localhost"); if let Some(mut localhost_info) = self.nodes.get_mut(LOCALHOST) { + println!("increasing localhost from {}", localhost_info.mint_requests); localhost_info.mint_requests += 1; } } @@ -155,15 +158,21 @@ impl Store { pub fn get_http_node_list(&self) -> Vec { self.nodes .iter() - .map(|node| crate::http_server::NodesResp { + .map(|node| { + let joined_at: DateTime = node.value().started_at.into(); + let last_keepalive: DateTime = node.value().started_at.into(); + let joined_at = joined_at.format("%Y-%m-%d %H:%M:%S").to_string(); + let last_keepalive = last_keepalive.format("%Y-%m-%d %H:%M:%S").to_string(); + crate::http_server::NodesResp { ip: node.key().to_string(), - joined_at: node.value().started_at, - last_keepalive: node.value().keepalive, + joined_at, + last_keepalive, mints: node.value().mints, ratls_connections: node.value().ratls_conns, ratls_attacks: node.value().ratls_attacks, public: node.value().public, mint_requests: node.value().mint_requests, + } }) .collect() } diff --git a/rewrite/src/http_server.rs b/rewrite/src/http_server.rs index f6ed5c4..2828ce0 100644 --- a/rewrite/src/http_server.rs +++ b/rewrite/src/http_server.rs @@ -10,10 +10,9 @@ use actix_web::{ HttpServer, Responder, }; +use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use std::sync::Arc; -use std::time::SystemTime; -// use std::{fmt, sync::Arc}; const HOMEPAGE: &str = r#"Welcome, beloved hacker! @@ -45,8 +44,8 @@ async fn homepage() -> impl Responder { #[derive(Serialize)] pub struct NodesResp { pub ip: String, - pub joined_at: SystemTime, - pub last_keepalive: SystemTime, + pub joined_at: String, + pub last_keepalive: String, pub mint_requests: u64, pub ratls_attacks: u64, pub ratls_connections: u64, @@ -66,6 +65,7 @@ struct MintReq { #[post("/mint")] async fn mint(ds: web::Data>, _: web::Json) -> impl Responder { + println!("wat"); ds.increase_mint_requests(); HttpResponse::Ok().json({}) } @@ -84,4 +84,3 @@ pub async fn init(ds: Arc) { .await .unwrap(); } - diff --git a/rewrite/src/main.rs b/rewrite/src/main.rs index f90f8d9..d6160a5 100644 --- a/rewrite/src/main.rs +++ b/rewrite/src/main.rs @@ -66,12 +66,14 @@ async fn main() { long_term_tasks.spawn(http_server::init(ds.clone())); long_term_tasks.spawn(grpc::server::MyServer::init(ds.clone(), tx.clone()).start()); - let input = File::open(INIT_NODES).unwrap(); - let buffered = BufReader::new(input); - for line in buffered.lines() { - init_tasks.spawn( - grpc::client::ConnManager::init(ds.clone(), tx.clone()).start_with_node(line.unwrap()), - ); + if let Ok(input) = File::open(INIT_NODES) { + let buffered = BufReader::new(input); + for line in buffered.lines() { + init_tasks.spawn( + grpc::client::ConnManager::init(ds.clone(), tx.clone()) + .start_with_node(line.unwrap()), + ); + } } let mut connection_count = 0;