diff --git a/Cargo.toml b/Cargo.toml index 01d7739..9c7a527 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,6 +52,8 @@ serde = { version = "1.0.210", features = ["derive"] } sqlx = { version = "*" } serde_json = { version = "1.0.128" } stone-cli = { git = "https://github.com/zksecurity/stone-cli.git" } +starknet-os = { git = "https://github.com/keep-starknet-strange/snos" } +#starknet-os = { git = "https://github.com/keep-starknet-strange/snos", branch = "main"} tempfile = { version = "3.13.0" } test-log = { version = "0.2.16" } testcontainers-modules = { version = "0.11.3" } @@ -68,6 +70,9 @@ url = { version = "2.4.0", features = ["serde"] } uuid = { version = "1.10.0", features = ["v4"] } reqwest = "0.12.9" tokio-postgres = "0.7.12" +base64 = "0.22.1" +zip = "0.6.6" + [patch.crates-io] merlin = { git = "https://github.com/aptos-labs/merlin" } diff --git a/Dockerfile b/Dockerfile index db54b85..7dba321 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,35 +1,42 @@ # Using the `rust-musl-builder` as base image, instead of # the official Rust toolchain -FROM clux/muslrust:stable AS chef -USER root -RUN cargo install cargo-chef - +FROM lukemathwalker/cargo-chef:latest-rust-1 AS chef WORKDIR /app -FROM clux/muslrust:stable AS bunyan -RUN cargo install bunyan - FROM chef AS planner COPY . . RUN cargo chef prepare --recipe-path recipe.json FROM chef AS builder +RUN apt update +RUN apt install -y build-essential libssl-dev pkg-config protobuf-compiler libclang1 clang \ + cmake \ + libpq-dev \ + libdw-dev \ + binutils \ + lld \ + libudev-dev +RUN rm -rf /var/lib/apt/lists/* + COPY --from=planner /app/recipe.json recipe.json RUN cargo chef cook --release --recipe-path recipe.json COPY . . RUN cargo build --release --all RUN mv target/${CARGO_BUILD_TARGET}/release /out -FROM alpine AS public-dev +FROM debian:bookworm-slim AS public-server WORKDIR /user -COPY crates/public/config/00-default.toml 00-default.toml -COPY --from=builder /out/cli /usr/local/bin/rust-api-server -COPY --from=bunyan /root/.cargo/bin/bunyan /usr/local/bin/ -ENTRYPOINT ["/bin/sh"] -CMD ["-c", "/usr/local/bin/irelia --config-path=*.toml | bunyan"] +RUN apt install -y libssl-dev libpq-dev -FROM scratch AS public-prod -WORKDIR /user COPY crates/public/config/00-default.toml 00-default.toml COPY --from=builder /out/irelia /usr/local/bin/irelia ENTRYPOINT ["/usr/local/bin/irelia", "--config-path=*.toml"] + +FROM debian:bookworm-slim AS public-worker +WORKDIR /user +RUN apt update +RUN apt install -y libssl-dev libpq-dev + +COPY crates/worker/config/00-default.toml 00-default.toml +COPY --from=builder /out/irelia_worker /usr/local/bin/irelia_worker +ENTRYPOINT ["/usr/local/bin/irelia_worker", "--config-path=*.toml"] diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index e14f01a..5aee702 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -13,5 +13,6 @@ regex = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } stone-cli = { workspace = true } +starknet-os = { workspace = true } thiserror = { workspace = true } uuid = { workspace = true, features = ["v4", "serde"] } diff --git a/crates/core/src/entities/job.rs b/crates/core/src/entities/job.rs index 15bf06b..7031b4b 100644 --- a/crates/core/src/entities/job.rs +++ b/crates/core/src/entities/job.rs @@ -1,51 +1,9 @@ -use std::fmt; use std::str::FromStr; use serde::{Deserialize, Serialize}; +use starknet_os::sharp::CairoJobStatus; use uuid::Uuid; -#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] -pub enum JobStatus { - Failed, // Stone failed - Invalid, // Wrong pie format - Unknown, // - InProgress, // init status - NotCreated, // - Processed, // stone completed => to submit on chain - Onchain, // stone completed and submit on chain completed -} - -impl fmt::Display for JobStatus { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - JobStatus::Failed => write!(f, "FAILED"), - JobStatus::Invalid => write!(f, "INVALID"), - JobStatus::Unknown => write!(f, "UNKNOWN"), - JobStatus::InProgress => write!(f, "IN_PROGRESS"), - JobStatus::NotCreated => write!(f, "NOT_CREATED"), - JobStatus::Processed => write!(f, "PROCESSED"), - JobStatus::Onchain => write!(f, "ONCHAIN"), - } - } -} - -impl FromStr for JobStatus { - type Err = String; - - fn from_str(s: &str) -> Result { - match s.to_uppercase().as_str() { - "FAILED" => Ok(JobStatus::Failed), - "INVALID" => Ok(JobStatus::Invalid), - "UNKNOWN" => Ok(JobStatus::Unknown), - "IN_PROGRESS" => Ok(JobStatus::InProgress), - "NOT_CREATED" => Ok(JobStatus::NotCreated), - "PROCESSED" => Ok(JobStatus::Processed), - "ONCHAIN" => Ok(JobStatus::Onchain), - _ => Err(format!("'{}' is not a valid value of job status", s)), - } - } -} - #[derive(Debug, Eq, Hash, PartialEq, Serialize, Deserialize, Clone)] pub struct JobId(pub Uuid); @@ -54,7 +12,7 @@ pub struct JobEntity { pub id: JobId, pub customer_id: String, pub cairo_job_key: String, - pub status: JobStatus, + pub status: CairoJobStatus, pub invalid_reason: String, pub error_log: String, pub validation_done: bool, diff --git a/crates/core/src/entities/worker_job.rs b/crates/core/src/entities/worker_job.rs index ce9d5a3..91b2df5 100644 --- a/crates/core/src/entities/worker_job.rs +++ b/crates/core/src/entities/worker_job.rs @@ -1,45 +1,8 @@ use serde::{Deserialize, Serialize}; use uuid::Uuid; -#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] -pub enum ProofLayout { - Plain, - Small, - Dex, - Recursive, - Starknet, - StarknetWithKeccak, - RecursiveLargeOutput, - RecursiveWithPoseidon, - AllSolidity, - AllCairo, - Dynamic, -} - -impl std::str::FromStr for ProofLayout { - type Err = (); - - fn from_str(s: &str) -> Result { - match s { - "plain" => Ok(ProofLayout::Plain), - "small" => Ok(ProofLayout::Small), - "dex" => Ok(ProofLayout::Dex), - "recursive" => Ok(ProofLayout::Recursive), - "starknet" => Ok(ProofLayout::Starknet), - "starknet_with_keccak" => Ok(ProofLayout::StarknetWithKeccak), - "recursive_large_output" => Ok(ProofLayout::RecursiveLargeOutput), - "recursive_with_poseidon" => Ok(ProofLayout::RecursiveWithPoseidon), - "all_solidity" => Ok(ProofLayout::AllSolidity), - "all_cairo" => Ok(ProofLayout::AllCairo), - "dynamic" => Ok(ProofLayout::Dynamic), - _ => Err(()), - } - } -} - #[derive(Clone, Debug, PartialEq)] pub enum WorkerJobStatus { - FaultyCairoPie, IncorrectLayout, AdditionalBadFlag, NoCairoJobId, diff --git a/crates/public/Cargo.toml b/crates/public/Cargo.toml index 871dc67..c3fadd7 100644 --- a/crates/public/Cargo.toml +++ b/crates/public/Cargo.toml @@ -26,6 +26,8 @@ readonly = { workspace = true } reqwest = { workspace = true, features = ["json"] } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } +stone-cli = { workspace = true } +starknet-os = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true, features = ["full"] } tokio-postgres = { workspace = true } @@ -34,3 +36,5 @@ tower-http = { workspace = true, features = ["timeout", "trace"] } tracing = { workspace = true } tracing-opentelemetry = { workspace = true } uuid = { workspace = true } +base64 = { workspace = true } +zip = { workspace = true } diff --git a/crates/public/config/00-default.toml b/crates/public/config/00-default.toml index a5f05f8..a1a5c13 100644 --- a/crates/public/config/00-default.toml +++ b/crates/public/config/00-default.toml @@ -1,9 +1,9 @@ -exporter_endpoint = "http://localhost:7281" +exporter_endpoint = "http://0.0.0.0:7281" service_name = "irelia-rest-api" [pg] max_size = 10 -url = "postgres://postgres:changeme@localhost:5432/postgres" +url = "postgres://postgres:changeme@0.0.0.0:5432/postgres" [server] port = 8000 diff --git a/crates/public/src/assets/test_data/encoded_cairo_pie.txt b/crates/public/src/assets/test_data/encoded_cairo_pie.txt new file mode 100644 index 0000000..8ad2b3c --- /dev/null +++ b/crates/public/src/assets/test_data/encoded_cairo_pie.txt @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/crates/public/src/tests/test_samples/fibonacci_with_output.zip b/crates/public/src/assets/test_data/fibonacci_with_output.zip similarity index 100% rename from crates/public/src/tests/test_samples/fibonacci_with_output.zip rename to crates/public/src/assets/test_data/fibonacci_with_output.zip diff --git a/crates/public/src/lib.rs b/crates/public/src/lib.rs index b4c7ac1..8fb8dd1 100644 --- a/crates/public/src/lib.rs +++ b/crates/public/src/lib.rs @@ -6,3 +6,4 @@ pub mod options; pub mod router; pub mod services; pub mod tests; +pub mod utils; diff --git a/crates/public/src/main.rs b/crates/public/src/main.rs index 15608d4..eddd572 100644 --- a/crates/public/src/main.rs +++ b/crates/public/src/main.rs @@ -23,8 +23,6 @@ use tracing::info; #[tokio::main] async fn main() { let options: Options = CliArgs::default_run_or_get_options(env!("APP_VERSION")); - println!("options: {:?}", options); - init_telemetry( options.service_name.as_str(), options.exporter_endpoint.as_str(), diff --git a/crates/public/src/services/job.rs b/crates/public/src/services/job.rs index 91858f7..d7aa367 100644 --- a/crates/public/src/services/job.rs +++ b/crates/public/src/services/job.rs @@ -3,6 +3,7 @@ use std::sync::Arc; use irelia_core::entities::job::{JobEntity, JobId, JobStatus}; use irelia_core::ports::job::JobPort; use serde::{Deserialize, Serialize}; +use starknet_os::sharp::CairoJobStatus; use tracing::log::info; use uuid::Uuid; @@ -22,7 +23,7 @@ impl JobService { pub async fn add_job( &self, params: NewWorkerJob, - job_status: JobStatus, + job_status: CairoJobStatus, validation_done_value: bool, ) -> Result<(), AppError> { let job = self diff --git a/crates/public/src/services/worker_job.rs b/crates/public/src/services/worker_job.rs index c05125a..13f2ed1 100644 --- a/crates/public/src/services/worker_job.rs +++ b/crates/public/src/services/worker_job.rs @@ -1,19 +1,21 @@ use std::{str::FromStr, sync::Arc}; -use irelia_core::entities::job::JobStatus::InProgress; use irelia_core::entities::worker_job::WorkerJobStatus::{ AdditionalBadFlag, IncorrectLayout, IncorrectOffchainProof, NoCairoJobId, Successfully, }; use irelia_core::entities::worker_job::{ - ProofLayout, WorkerJobEntity, WorkerJobId, WorkerJobStatus, + WorkerJobEntity, WorkerJobId, WorkerJobStatus, }; use irelia_core::ports::worker::WorkerPort; use serde::{Deserialize, Serialize}; +use stone_cli::args::LayoutName; +use starknet_os::sharp::CairoJobStatus::IN_PROGRESS; use uuid::Uuid; use crate::controllers::worker_job::{CairoPieReq, NewWorkerJob}; use crate::errors::AppError; use crate::services::job::JobService; +use crate::utils::save_cairo_pie; const SUCCESSFULLY_CODE: &str = "JOB_RECEIVED_SUCCESSFULLY"; const INTERNAL_SERVER_ERROR_CODE: &str = "500"; @@ -43,6 +45,11 @@ impl WorkerJobService { return Ok(WorkerJobResponse::get_worker_job_response(response_code)); } + let cairo_pie = save_cairo_pie(&req.request.cairo_pie, &*params.clone().cairo_job_key.unwrap()) + .expect("Failed to save cairo pie") + .to_string_lossy() + .to_string(); + let _ = self .worker_job .add(WorkerJobEntity { @@ -51,21 +58,22 @@ impl WorkerJobService { cairo_job_key: params.clone().cairo_job_key.unwrap(), offchain_proof: params.clone().offchain_proof, proof_layout: params.clone().proof_layout, - cairo_pie: req.request.cairo_pie, + cairo_pie }) .await?; if response_code == AdditionalBadFlag { - let _ = job_service.add_job(params.clone(), InProgress, true).await; + let _ = job_service.add_job(params.clone(), IN_PROGRESS, true).await; + return Ok(WorkerJobResponse::get_worker_job_response(response_code)) } - let _ = job_service.add_job(params, InProgress, false).await; + let _ = job_service.add_job(params, IN_PROGRESS, false).await; Ok(WorkerJobResponse::get_worker_job_response(response_code)) } pub fn check_job(params: NewWorkerJob) -> WorkerJobStatus { // Check incorrect layout - match ProofLayout::from_str(params.proof_layout.to_lowercase().as_str()) { + match LayoutName::from_str(params.proof_layout.to_lowercase().as_str()) { Ok(_) => (), _ => { return IncorrectLayout; @@ -115,7 +123,6 @@ impl WorkerJobResponse { pub fn get_worker_job_response(code: WorkerJobStatus) -> Self { match code { - WorkerJobStatus::FaultyCairoPie => Self::successfully(), IncorrectLayout => Self::internal_server_error(), AdditionalBadFlag => Self::successfully(), NoCairoJobId => Self::internal_server_error(), diff --git a/crates/public/src/tests/test_add_job.rs b/crates/public/src/tests/test_add_job.rs index 2b4f500..37b8f24 100644 --- a/crates/public/src/tests/test_add_job.rs +++ b/crates/public/src/tests/test_add_job.rs @@ -22,51 +22,30 @@ async fn test_add_job() { options.server.url.as_str(), options.server.port ); + + let cairo_pie = fs::read_to_string("./src/assets/test_data/encoded_cairo_pie.txt").unwrap(); + // Set up the database setup_database(&*options.pg.url).await; println!("✅ Database setup completed"); - test_faulty_cairo_pie(client.clone(), base_url.clone()).await; - println!("✅ test_faulty_cairo_pie completed"); - - test_incorrect_layout(client.clone(), base_url.clone()).await; + test_incorrect_layout(client.clone(), base_url.clone(), cairo_pie.clone()).await; println!("✅ test_incorrect_layout completed"); - test_additional_bad_flag(client.clone(), base_url.clone()).await; + test_additional_bad_flag(client.clone(), base_url.clone(), cairo_pie.clone()).await; println!("✅ test_additional_bad_flag completed"); - test_no_cairo_job_id(client.clone(), base_url.clone()).await; + test_no_cairo_job_id(client.clone(), base_url.clone(), cairo_pie.clone()).await; println!("✅ test_no_cairo_job_id completed"); - test_incorrect_offchain_proof(client.clone(), base_url.clone()).await; + test_incorrect_offchain_proof(client.clone(), base_url.clone(), cairo_pie.clone()).await; println!("✅ test_incorrect_offchain_proof completed"); - test_successfully(client.clone(), base_url.clone()).await; - println!("✅ test_faulty_cairo_pie completed"); -} - -async fn test_faulty_cairo_pie(client: Client, base_url: String) { - let url = - format!( - "{}/v1/gateway/add_job?customer_id={}&cairo_job_key={}&offchain_proof={}&proof_layout={}", - base_url, Uuid::new_v4(), Uuid::new_v4(), true, "small" - ); - let incorrect_body = json!( - { - "action": "add_job", - "request": { - "cairo_pie": "" - } - } - ); - let expected = json!( - {"code" : "JOB_RECEIVED_SUCCESSFULLY"} - ); - let res = post_request(client, url, incorrect_body).await; - assert_eq!(res, expected, "Response did not match expected value"); + test_successfully(client.clone(), base_url.clone(), cairo_pie.clone()).await; + println!("✅ test_successfully completed"); } -async fn test_incorrect_layout(client: Client, base_url: String) { +async fn test_incorrect_layout(client: Client, base_url: String, cairo_pie: String) { let url = format!( "{}/v1/gateway/add_job?customer_id={}&cairo_job_key={}&offchain_proof={}&proof_layout={}", @@ -76,7 +55,7 @@ async fn test_incorrect_layout(client: Client, base_url: String) { { "action": "add_job", "request": { - "cairo_pie": "./src/tests/test_samples/fibonacci_with_output.zip" + "cairo_pie": cairo_pie } } ); @@ -90,7 +69,7 @@ async fn test_incorrect_layout(client: Client, base_url: String) { assert_eq!(res, expected, "Response did not match expected value"); } -async fn test_additional_bad_flag(client: Client, base_url: String) { +async fn test_additional_bad_flag(client: Client, base_url: String, cairo_pie: String) { let url = format!( "{}/v1/gateway/add_job?customer_id={}&cairo_job_key={}&offchain_proof={}&proof_layout={}&bla={}", base_url, Uuid::new_v4(), Uuid::new_v4(), true, "small", true @@ -99,7 +78,7 @@ async fn test_additional_bad_flag(client: Client, base_url: String) { { "action": "add_job", "request": { - "cairo_pie": "./src/tests/test_samples/fibonacci_with_output.zip" + "cairo_pie": cairo_pie } } ); @@ -110,7 +89,7 @@ async fn test_additional_bad_flag(client: Client, base_url: String) { assert_eq!(res, expected, "Response did not match expected value"); } -async fn test_no_cairo_job_id(client: Client, base_url: String) { +async fn test_no_cairo_job_id(client: Client, base_url: String, cairo_pie: String) { let url = format!( "{}/v1/gateway/add_job?customer_id={}&offchain_proof={}&proof_layout={}", base_url, @@ -122,7 +101,7 @@ async fn test_no_cairo_job_id(client: Client, base_url: String) { { "action": "add_job", "request": { - "cairo_pie": "./src/tests/test_samples/fibonacci_with_output.zip" + "cairo_pie": cairo_pie } } ); @@ -136,7 +115,7 @@ async fn test_no_cairo_job_id(client: Client, base_url: String) { assert_eq!(res, expected, "Response did not match expected value"); } -async fn test_incorrect_offchain_proof(client: Client, base_url: String) { +async fn test_incorrect_offchain_proof(client: Client, base_url: String, cairo_pie: String) { let url = format!( "{}/v1/gateway/add_job?customer_id={}&cairo_job_key={}&offchain_proof={}&proof_layout={}", @@ -146,7 +125,7 @@ async fn test_incorrect_offchain_proof(client: Client, base_url: String) { { "action": "add_job", "request": { - "cairo_pie": "./src/tests/test_samples/fibonacci_with_output.zip" + "cairo_pie": cairo_pie } } ); @@ -160,7 +139,7 @@ async fn test_incorrect_offchain_proof(client: Client, base_url: String) { assert_eq!(res, expected, "Response did not match expected value"); } -async fn test_successfully(client: Client, base_url: String) { +async fn test_successfully(client: Client, base_url: String, cairo_pie: String) { let url = format!( "{}/v1/gateway/add_job?customer_id={}&cairo_job_key={}&offchain_proof={}&proof_layout={}", @@ -170,7 +149,7 @@ async fn test_successfully(client: Client, base_url: String) { { "action": "add_job", "request": { - "cairo_pie": "./src/tests/test_samples/fibonacci_with_output.zip" + "cairo_pie": cairo_pie } } ); diff --git a/crates/public/src/tests/test_get_status.rs b/crates/public/src/tests/test_get_status.rs index ea9e8d1..bf74019 100644 --- a/crates/public/src/tests/test_get_status.rs +++ b/crates/public/src/tests/test_get_status.rs @@ -21,6 +21,7 @@ async fn test_get_status() { options.server.url.as_str(), options.server.port ); + // Set up the database setup_database(&*options.pg.url).await; println!("✅ Database setup completed"); diff --git a/crates/public/src/utils.rs b/crates/public/src/utils.rs new file mode 100644 index 0000000..560fd7e --- /dev/null +++ b/crates/public/src/utils.rs @@ -0,0 +1,75 @@ +use std::fs; +use std::fs::File; +use std::io::Write; +use std::path::PathBuf; + +use base64::Engine; + +pub fn save_cairo_pie(encoded_pie: &String, file_name: &str) -> anyhow::Result { + let path = pie_storage_path(file_name); + + fs::create_dir_all(path.parent().unwrap())?; + let decoded_pie = base64::engine::general_purpose::STANDARD.decode(encoded_pie)?; + let reader = std::io::Cursor::new(decoded_pie); + File::create(&path)?.write_all(reader.get_ref())?; + + check_cairo_pie_zip(file_name)?; + Ok(path) +} + +fn pie_storage_path(file_name: &str) -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("cairo_pies") + .join(format!("{}.zip", file_name)) +} + +fn check_cairo_pie_zip(file_name: &str) -> anyhow::Result<()> { + let path = pie_storage_path(file_name); + let mut zip_archive = zip::ZipArchive::new(File::open(path)?)?; + for file in [ + "additional_data.json", + "execution_resources.json", + "memory.bin", + "metadata.json", + "version.json", + ] { + zip_archive.by_name(file)?; + } + Ok(()) +} + +#[cfg(test)] +mod test { + use std::fs; + use std::fs::File; + use std::io::Read; + + use base64::engine::general_purpose; + use base64::Engine; + + use crate::utils::save_cairo_pie; + + #[test] + fn test_save_cairo_pie() { + let encoded_origin = + encode_zip("./src/assets/test_data/fibonacci_with_output.zip"); + let written_path = save_cairo_pie(&encoded_origin, "test").unwrap(); + let encoded_written = encode_zip(written_path.to_str().unwrap()); + + assert_eq!(encoded_origin, encoded_written); + + let cairo_pie = fs::read_to_string("./src/assets/test_data/encoded_cairo_pie.txt").unwrap(); + save_cairo_pie( + &cairo_pie, + "test2", + ) + .unwrap(); + } + + fn encode_zip(path: &str) -> String { + let mut file = File::open(path).unwrap(); + let mut buffer = Vec::new(); + file.read_to_end(&mut buffer).unwrap(); + general_purpose::STANDARD.encode(&buffer) + } +} \ No newline at end of file diff --git a/crates/worker/config/00-default.toml b/crates/worker/config/00-default.toml index fdc2941..1222ce9 100644 --- a/crates/worker/config/00-default.toml +++ b/crates/worker/config/00-default.toml @@ -1,9 +1,9 @@ -exporter_endpoint = "http://localhost:7281" +exporter_endpoint = "http://0.0.0.0:7281" service_name = "irelia-worker" [pg] max_size = 10 -url = "postgres://postgres:changeme@localhost:5432/postgres" +url = "postgres://postgres:changeme@0.0.0.0:5432/postgres" [server] port = 8001 diff --git a/crates/worker/src/main.rs b/crates/worker/src/main.rs index ecf8553..b5f49c1 100644 --- a/crates/worker/src/main.rs +++ b/crates/worker/src/main.rs @@ -26,7 +26,7 @@ use crate::options::Options; #[tokio::main] async fn main() { let options: Options = CliArgs::default_run_or_get_options(env!("APP_VERSION")); - + println!("options: {:?}", options); init_telemetry( options.service_name.as_str(), options.exporter_endpoint.as_str(), @@ -90,6 +90,7 @@ pub async fn run_workers(options: Options) { .max_size(options.pg.max_size.try_into().unwrap()) .build() .unwrap(); + let job_port = Arc::new(JobDBRepository::new(pool.clone())); let state = State::new(job_port);