start rewrite based on ticket #2

keys go migrated to solana_sdk in a 01b889d
This commit is contained in:
ghe0 2024-09-10 03:11:46 +03:00
parent 01b889d273
commit d7b0c3fd2c
Signed by: ghe0
GPG Key ID: 451028EE56A0FBB4
22 changed files with 1432 additions and 1 deletions

2
.gitignore vendored

@ -1,4 +1,4 @@
/target
target
build
detee_challenge_nodes
.cargo

1297
rewrite/Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

10
rewrite/Cargo.toml Normal file

@ -0,0 +1,10 @@
[package]
name = "rewrite"
version = "0.1.0"
edition = "2021"
[dependencies]
actix-web = "4.9.0"
rand = "0.8.5"
serde = { version = "1.0.210", features = ["derive"] }
tokio = { version = "1.40.0", features = ["macros", "rt-multi-thread", "fs"] }

110
rewrite/src/http_server.rs Normal file

@ -0,0 +1,110 @@
use actix_web::{
error::ResponseError, get, http::StatusCode, post, web, App, HttpResponse, HttpServer,
Responder, Result,
};
use rand::Rng;
use serde::{Deserialize, Serialize};
use std::{fmt, sync::Arc};
const HOMEPAGE: &str = r#"Welcome, beloved hacker!
This node is part of the DeTEE hacker-challenge network. This network allows you
to mint the token {token_address},
and owns the mint address {mint_address}.
To be able to mint, you will need to send SOL to {mint_address}, however:
BE AWARE THAT THE ONLY WAY TO GET THE SOL OUT IS BY HACKING THIS NETWORK!
DeTEE REPRESENTATIVES DON'T KNOW HOW TO HACK IT! THAT'S ACTUALLY WHY THIS GOT CREATED...
Allowed operations:
/nodes <- information about nodes and counters of network activity
/mint (address) <- mint DHCT tokens to the address; the wallet needs sol for this operation
Feel free to use this as a faucet for HCKT tokens, that you can use for testing in any dApp.
The objective of the hacker challenge is to get the SOL out of {mint_address}.
If you hack it, contact us at https://detee.cloud cause we have lots of rewards.
"#;
#[get("/")]
async fn homepage() -> impl Responder {
HttpResponse::Ok().body(HOMEPAGE)
}
#[derive(Serialize)]
struct NodesResp {
ip: String,
last_keepalive: u64,
online: bool,
public: bool,
mints: u64,
mint_requests: u64,
ratls_attacks: u64,
}
#[get("/nodes")]
async fn get_nodes() -> HttpResponse {
let mock_nodes = generate_mock_data();
HttpResponse::Ok().json(mock_nodes)
}
#[derive(Deserialize)]
struct MintReq {
wallet: String,
}
#[post("/mint")]
async fn mint(req: web::Json<MintReq>) -> impl Responder {
HttpResponse::Ok().json({})
}
// TODO: init(ds: Arc<Store>)
pub async fn init() {
HttpServer::new(move || {
App::new()
// .app_data(web::Data::new(ds.clone()))
.service(homepage)
.service(get_nodes)
.service(mint)
})
.bind("0.0.0.0:31372")
.unwrap()
.run()
.await
.unwrap();
}
fn generate_mock_data() -> Vec<NodesResp> {
let mut rng = rand::thread_rng();
let mut nodes = Vec::new();
for _ in 0..15 {
let ip = format!(
"{}.{}.{}.{}",
rng.gen_range(1..=255),
rng.gen_range(1..=255),
rng.gen_range(1..=255),
rng.gen_range(1..=255)
);
let last_keepalive = rng.gen_range(1_000_000..10_000_000);
let online = rng.gen_bool(0.5);
let public = rng.gen_bool(0.5);
let mints = rng.gen_range(0..500);
let mint_requests = rng.gen_range(0..1000);
let ratls_attacks = rng.gen_range(0..10);
nodes.push(NodesResp {
ip,
last_keepalive,
online,
public,
mints,
mint_requests,
ratls_attacks,
});
}
nodes
}

14
rewrite/src/main.rs Normal file

@ -0,0 +1,14 @@
mod http_server;
use tokio::task::JoinSet;
#[tokio::main]
async fn main() {
let mut long_term_tasks = JoinSet::new();
long_term_tasks.spawn(http_server::init());
long_term_tasks.join_next().await;
println!("Shutting down...");
}