bless
This commit is contained in:
parent
d6f7c758c0
commit
cb43facd9e
4
out
Normal file
4
out
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[?1049h[1;1H┏[1;3HInput[1;9HPane[1;14H━━━━━━━━━━━━━━━━━┓┏[1;34HOutput[1;41HPane[1;46H━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓[2;1H┃>[2;31H┃┃[2;103H┃[3;1H┃[3;31H┃┃[3;103H┃[4;1H┃[4;31H┃┃[4;103H┃[5;1H┃[5;31H┃┃[5;103H┃[6;1H┃[6;31H┃┃[6;103H┃[7;1H┃[7;31H┃┃[7;103H┃[8;1H┃[8;31H┃┃[8;103H┃[9;1H┃[9;31H┃┃[9;103H┃[10;1H┃[10;31H┃┃[10;103H┃[11;1H┃[11;31H┃┃[11;103H┃[12;1H┃[12;31H┃┃[12;103H┃[13;1H┃[13;31H┃┃[13;103H┃[14;1H┃[14;31H┃┃[14;103H┃[15;1H┃[15;31H┃┃[15;103H┃[16;1H┃[16;31H┃┃[16;103H┃[17;1H┃[17;31H┃┃[17;103H┃[18;1H┃[18;31H┃┃[18;103H┃[19;1H┃[19;31H┃┃[19;103H┃[20;1H┃[20;31H┃┃[20;103H┃[21;1H┃[21;31H┃┃[21;103H┃[22;1H┃[22;31H┃┃[22;103H┃[23;1H┃[23;31H┃┃[23;103H┃[24;1H┃[24;31H┃┃[24;103H┃[25;1H┃[25;31H┃┃[25;103H┃[26;1H┃[26;31H┃┃[26;103H┃[27;1H┃[27;31H┃┃[27;103H┃[28;1H┃[28;31H┃┃[28;103H┃[29;1H┃[29;31H┃┃[29;103H┃[30;1H┃[30;31H┃┃[30;103H┃[31;1H┃[31;31H┃┃[31;103H┃[32;1H┃[32;31H┃┃[32;103H┃[33;1H┃[33;31H┃┃[33;103H┃[34;1H┃[34;31H┃┃[34;103H┃[35;1H┃[35;31H┃┃[35;103H┃[36;1H┃[36;31H┃┃[36;103H┃[37;1H┃[37;31H┃┃[37;103H┃[38;1H┃[38;31H┃┃[38;103H┃[39;1H┃[39;31H┃┃[39;103H┃[40;1H┃[40;31H┃┃[40;103H┃[41;1H┃[41;31H┃┃[41;103H┃[42;1H┃[42;31H┃┃[42;103H┃[43;1H┃[43;31H┃┃[43;103H┃[44;1H┃[44;31H┃┃[44;103H┃[45;1H┃[45;31H┃┃[45;103H┃[46;1H┃[46;31H┃┃[46;103H┃[47;1H┃[47;31H┃┃[47;103H┃[48;1H┃[48;31H┃┃[48;103H┃[49;1H┃[49;31H┃┃[49;103H┃[50;1H┃[50;31H┃┃[50;103H┃[51;1H┃[51;31H┃┃[51;103H┃[52;1H┃[52;31H┃┃[52;103H┃[53;1H┃[53;31H┃┃[53;103H┃[54;1H┃[54;31H┃┃[54;103H┃[55;1H┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛[39m[49m[59m[0m[?25l[2;33H[INFO][2;41H21:14:03[2;50H|[2;52HStarted[2;60HRenderer[39m[49m[59m[0m[?25l[3;33H[INFO][3;41H21:14:03[3;50H|[3;52HStarted[3;60HParser[39m[49m[59m[0m[?25l[4;33H[INFO][4;41H21:14:03[4;50H|[4;52HStarted[4;60HExecutor[39m[49m[59m[0m[?25l[5;33H[INFO][5;41H21:14:03[5;50H|[5;52HStarted[5;60HNode[39m[49m[59m[0m[?25l[6;33H[INFO][6;41H21:14:03[6;50H|[6;52HBuilding[6;61HChain[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[2;4Hc[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[2;5Hc[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[2;5H [39m[49m[59m[0m[?25l[2;4H [39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[3;2H>[39m[49m[59m[0m[?25l[7;33H[INFO][7;41H21:14:08[7;50H|[7;52HExec:[7;58HRecieved[7;67Hecho[7;72Hcommand[39m[49m[59m[0m[?25l[8;33H[INFO][8;41H21:14:08[8;50H|[8;52HParser:[8;60HReceived[8;69Hmessage[8;77Hfrom[8;82Hwatcher[39m[49m[59m[0m[?25l[10;33HUsage:[10;42H<COMMAND>[12;33HCommands:[13;35Hnode[13;42HA[13;44Hblockchain[13;55Hnode[13;60HCLI[13;64Htool[14;35Hclear[15;35Hhelp[15;42HPrint[15;48Hthis[15;53Hmessage[15;61Hor[15;64Hthe[15;68Hhelp[15;73Hof[15;76Hthe[15;80Hgiven[15;86Hsubcommand(s)[17;33HOptions:[18;35H-h,[18;39H--help[18;47HPrint[18;53Hhelp[39m[49m[59m[0m[?25l[3;4Hc[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[3;5Ha[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[39m[49m[59m[0m[?25l[?1049lHello, world!
|
||||||
|
[DEBUG] [src/watcher/renderer.rs:125] 21:14:11 | Renderer Exit
|
||||||
|
|
||||||
|
[?25h
|
||||||
@ -4,6 +4,7 @@ use clap::{Parser, Subcommand};
|
|||||||
use crate::core;
|
use crate::core;
|
||||||
use crate::watcher::RenderPane;
|
use crate::watcher::RenderPane;
|
||||||
|
|
||||||
|
|
||||||
use clap::*;
|
use clap::*;
|
||||||
|
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
|
|||||||
@ -22,6 +22,7 @@ async fn main() {
|
|||||||
let mut watcher = Watcher::build()
|
let mut watcher = Watcher::build()
|
||||||
.file(args.seed_file)
|
.file(args.seed_file)
|
||||||
.addr(args.addr)
|
.addr(args.addr)
|
||||||
|
.seed(args.seed)
|
||||||
.bootstrap(args.bootstrap)
|
.bootstrap(args.bootstrap)
|
||||||
.start().await;
|
.start().await;
|
||||||
|
|
||||||
|
|||||||
@ -76,7 +76,7 @@ impl node::NativeNode {
|
|||||||
|
|
||||||
match message {
|
match message {
|
||||||
ProtocolMessage::BootstrapRequest { .. } => {
|
ProtocolMessage::BootstrapRequest { .. } => {
|
||||||
log!(INFO, "Received BootstrapRequest from {peer_id}");
|
self.log(msg!(INFO, "Received BootstrapRequest from {peer_id}")).await;
|
||||||
let peer = &self.tcp_peers[&peer_id];
|
let peer = &self.tcp_peers[&peer_id];
|
||||||
let resp = ProtocolMessage::BootstrapResponse {
|
let resp = ProtocolMessage::BootstrapResponse {
|
||||||
blocks: self.chain.blocks().to_vec()
|
blocks: self.chain.blocks().to_vec()
|
||||||
@ -84,6 +84,10 @@ impl node::NativeNode {
|
|||||||
peer.sender.send(resp).await.unwrap();
|
peer.sender.send(resp).await.unwrap();
|
||||||
log!(INFO, "Send BootstrapResponse to {peer_id}");
|
log!(INFO, "Send BootstrapResponse to {peer_id}");
|
||||||
},
|
},
|
||||||
|
ProtocolMessage::BootstrapResponse { blocks } => {
|
||||||
|
self.log(msg!(INFO, "Received BootstrapResponse from seed")).await;
|
||||||
|
self.chain = core::Blockchain::build(blocks.to_vec()).unwrap();
|
||||||
|
},
|
||||||
ProtocolMessage::Ping {peer_id} => {
|
ProtocolMessage::Ping {peer_id} => {
|
||||||
log!(INFO, "Received Ping from {peer_id}");
|
log!(INFO, "Received Ping from {peer_id}");
|
||||||
let resp = ProtocolMessage::Pong { peer_id: self.id.clone() };
|
let resp = ProtocolMessage::Pong { peer_id: self.id.clone() };
|
||||||
|
|||||||
@ -55,31 +55,31 @@ impl NativeNode {
|
|||||||
addr
|
addr
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn list_peers(&self) {
|
pub fn list_peers(&self) -> String {
|
||||||
println!("Peer List\n-----------");
|
let mut ret = String::from("Peer List\n-----------");
|
||||||
for (i, p) in self.tcp_peers.iter().enumerate() {
|
for (i, p) in self.tcp_peers.iter().enumerate() {
|
||||||
println!("Peer #{i}: {}", p.1.id)
|
ret.push_str(format!("Peer #{i}: {}", p.1.id).as_str())
|
||||||
}
|
}
|
||||||
|
ret
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn show_id(&self) {
|
pub async fn show_id(&self) {
|
||||||
println!("Node Id: {}", self.id)
|
self.log(msg!(INFO, "Node Id: {}", self.id)).await
|
||||||
}
|
}
|
||||||
|
|
||||||
fn remove_tcp_peer(&mut self, peer_id: Uuid) {
|
async fn remove_tcp_peer(&mut self, peer_id: Uuid) {
|
||||||
log!(INFO, "Removing Peer {peer_id}");
|
self.log(msg!(INFO, "Removing Peer {peer_id}")).await;
|
||||||
self.tcp_peers.remove_entry(&peer_id);
|
self.tcp_peers.remove_entry(&peer_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_tcp_peer(&mut self, id: Uuid, addr: SocketAddr, sender: tokio::sync::mpsc::Sender<ProtocolMessage>) {
|
async fn add_tcp_peer(&mut self, id: Uuid, addr: SocketAddr, sender: tokio::sync::mpsc::Sender<ProtocolMessage>) {
|
||||||
let peer = TcpPeer {
|
let peer = TcpPeer {
|
||||||
id,
|
id,
|
||||||
addr,
|
addr,
|
||||||
sender
|
sender
|
||||||
};
|
};
|
||||||
|
|
||||||
log!(INFO, "Adding Peer {}", peer.id);
|
self.log(msg!(INFO, "Added Peer from address: {addr}")).await;
|
||||||
|
|
||||||
self.tcp_peers.insert(id, peer);
|
self.tcp_peers.insert(id, peer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,53 +134,32 @@ impl NativeNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn send_handshake(id: uuid::Uuid, stream: &mut tokio::net::TcpStream) -> Result<uuid::Uuid, ValidationError> {
|
pub async fn send_message_to_peer_addr(&self, addr: SocketAddr, msg: ProtocolMessage) {
|
||||||
let handshake = ProtocolMessage::Handshake { peer_id: id.clone(), version: "".to_string() };
|
if let Some((_, peer)) = self.tcp_peers.iter().find(|(_, v)| v.addr == addr) {
|
||||||
NativeNode::send_message(stream, &handshake).await.unwrap();
|
if let Err(e) = peer.sender.send(msg).await {
|
||||||
if let Ok(response) = NativeNode::receive_message(stream).await {
|
self.log(msg!(ERROR, "Error Sending message to peer: {e}")).await;
|
||||||
match response {
|
|
||||||
message::ProtocolMessage::Handshake { peer_id, version: _ } => {
|
|
||||||
Ok(peer_id)
|
|
||||||
},
|
|
||||||
_ => {
|
|
||||||
log!(ERROR, "Invalid response on Handshake");
|
|
||||||
Err(ValidationError::InvalidBlockHash)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
Err(ValidationError::InvalidBlockHash)
|
|
||||||
|
pub async fn send_message_to_peer_id(&self, id: Uuid, msg: ProtocolMessage) {
|
||||||
|
if let Some(peer) = self.tcp_peers.get(&id) {
|
||||||
|
if let Err(e) = peer.sender.send(msg).await {
|
||||||
|
self.log(msg!(ERROR, "Error Sending message to peer: {e}")).await;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn bootstrap(&mut self) -> Result<(), ValidationError> {
|
pub async fn bootstrap(&mut self) -> Result<(), ValidationError> {
|
||||||
self.log(msg!(INFO, "Running As Native Node")).await;
|
self.log(msg!(INFO, "Running As Native Node")).await;
|
||||||
|
|
||||||
let mut stream = tokio::net::TcpStream::connect(SEED_NODES[0]).await.unwrap();
|
self.connect_to_peer(SEED_NODES[0]).await;
|
||||||
|
|
||||||
let id = uuid::Uuid::new_v4();
|
let message = ProtocolMessage::BootstrapRequest{peer_id: self.id, version: "".to_string()};
|
||||||
|
self.send_message_to_peer_addr(SEED_NODES[0], message).await;
|
||||||
|
|
||||||
if let Ok(_) = NativeNode::send_handshake(id, &mut stream).await {
|
|
||||||
let message = message::ProtocolMessage::BootstrapRequest { peer_id: id.clone(), version: "".to_string() };
|
|
||||||
NativeNode::send_message(&mut stream, &message).await.unwrap();
|
|
||||||
self.log(msg!(INFO, "Sent BootstrapRequest to seed")).await;
|
self.log(msg!(INFO, "Sent BootstrapRequest to seed")).await;
|
||||||
if let Ok(response) = NativeNode::receive_message(&mut stream).await {
|
|
||||||
match response {
|
|
||||||
ProtocolMessage::BootstrapResponse { blocks } => {
|
|
||||||
self.log(msg!(INFO, "Received BootstrapResponse from seed")).await;
|
|
||||||
self.chain = core::Blockchain::build(blocks).unwrap();
|
|
||||||
Ok(())
|
Ok(())
|
||||||
},
|
|
||||||
_ => {
|
|
||||||
self.log(msg!(ERROR, "Invalid Response from BootstrapRequest: {:?}", &response)).await;
|
|
||||||
Err(ValidationError::InvalidBlockHash)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Err(ValidationError::InvalidBlockHash)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Err(ValidationError::InvalidBlockHash)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn broadcast_transaction(&self, tx: &core::Tx) {
|
pub async fn broadcast_transaction(&self, tx: &core::Tx) {
|
||||||
@ -212,6 +191,7 @@ impl NativeNode {
|
|||||||
self.listner_handle.as_ref().unwrap().abort();
|
self.listner_handle.as_ref().unwrap().abort();
|
||||||
self.listner_handle = None;
|
self.listner_handle = None;
|
||||||
}
|
}
|
||||||
|
self.log(msg!(INFO, "Listening on address: {}", addr)).await;
|
||||||
|
|
||||||
if let Ok(tcp_listner) = tokio::net::TcpListener::bind(addr).await {
|
if let Ok(tcp_listner) = tokio::net::TcpListener::bind(addr).await {
|
||||||
let id = self.id.clone();
|
let id = self.id.clone();
|
||||||
@ -223,7 +203,7 @@ impl NativeNode {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn log(&self, msg: String) {
|
pub async fn log(&self, msg: String) {
|
||||||
let _ = self.exec_tx.send(ExecutorCommand::Print(msg)).await;
|
let _ = self.exec_tx.send(ExecutorCommand::Print(msg)).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,10 +234,10 @@ impl NativeNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
NodeCommand::AddPeer { peer_id, addr, sender } => {
|
NodeCommand::AddPeer { peer_id, addr, sender } => {
|
||||||
self.add_tcp_peer(peer_id, addr, sender);
|
self.add_tcp_peer(peer_id, addr, sender).await;
|
||||||
},
|
},
|
||||||
NodeCommand::RemovePeer { peer_id } => {
|
NodeCommand::RemovePeer { peer_id } => {
|
||||||
self.remove_tcp_peer(peer_id);
|
self.remove_tcp_peer(peer_id).await;
|
||||||
}
|
}
|
||||||
NodeCommand::ProcessMessage { peer_id, message } => {
|
NodeCommand::ProcessMessage { peer_id, message } => {
|
||||||
self.process_message(peer_id, &message).await;
|
self.process_message(peer_id, &message).await;
|
||||||
@ -281,7 +261,7 @@ impl NativeNode {
|
|||||||
},
|
},
|
||||||
NodeCommand::ShowId => {
|
NodeCommand::ShowId => {
|
||||||
self.log(msg!(INFO, "Received DebugListBlocks command")).await;
|
self.log(msg!(INFO, "Received DebugListBlocks command")).await;
|
||||||
self.show_id();
|
self.show_id().await;
|
||||||
},
|
},
|
||||||
NodeCommand::DumpBlocks(s) => {
|
NodeCommand::DumpBlocks(s) => {
|
||||||
self.chain.dump_blocks(s);
|
self.chain.dump_blocks(s);
|
||||||
|
|||||||
@ -17,13 +17,6 @@ pub struct Watcher {
|
|||||||
handles: Vec<tokio::task::JoinHandle<()>>
|
handles: Vec<tokio::task::JoinHandle<()>>
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
|
||||||
pub struct WatcherBuilder {
|
|
||||||
addr: Option<SocketAddr>,
|
|
||||||
seed_file: Option<String>,
|
|
||||||
bootstrap: bool
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Watcher {
|
impl Watcher {
|
||||||
pub fn build() -> WatcherBuilder {
|
pub fn build() -> WatcherBuilder {
|
||||||
WatcherBuilder::new()
|
WatcherBuilder::new()
|
||||||
@ -97,6 +90,14 @@ impl Watcher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct WatcherBuilder {
|
||||||
|
addr: Option<SocketAddr>,
|
||||||
|
seed_file: Option<String>,
|
||||||
|
bootstrap: bool,
|
||||||
|
seed: bool,
|
||||||
|
}
|
||||||
|
|
||||||
impl WatcherBuilder {
|
impl WatcherBuilder {
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
Self::default()
|
Self::default()
|
||||||
@ -109,6 +110,7 @@ impl WatcherBuilder {
|
|||||||
|
|
||||||
pub fn file(mut self, seed_file: Option<String>) -> Self {
|
pub fn file(mut self, seed_file: Option<String>) -> Self {
|
||||||
self.seed_file = seed_file;
|
self.seed_file = seed_file;
|
||||||
|
self.seed = true;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,13 +119,18 @@ impl WatcherBuilder {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn seed(mut self, seed: bool) -> Self {
|
||||||
|
self.seed = seed;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn log(render_tx: &mpsc::Sender<RenderCommand>, msg: String) {
|
pub async fn log(render_tx: &mpsc::Sender<RenderCommand>, msg: String) {
|
||||||
let rendermsg = RenderCommand::RenderStringToPane { str: msg, pane: RenderPane::CliOutput };
|
let rendermsg = RenderCommand::RenderStringToPane { str: msg, pane: RenderPane::CliOutput };
|
||||||
let _ = render_tx.send(rendermsg).await;
|
let _ = render_tx.send(rendermsg).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub async fn start(self) -> Watcher {
|
pub async fn start(mut self) -> Watcher {
|
||||||
let (render_tx, render_rx) = mpsc::channel::<RenderCommand>(100);
|
let (render_tx, render_rx) = mpsc::channel::<RenderCommand>(100);
|
||||||
let (parser_tx, parser_rx) = mpsc::channel::<ParserCommand>(100);
|
let (parser_tx, parser_rx) = mpsc::channel::<ParserCommand>(100);
|
||||||
let (exec_tx, exec_rx) = mpsc::channel::<ExecutorCommand>(100);
|
let (exec_tx, exec_rx) = mpsc::channel::<ExecutorCommand>(100);
|
||||||
@ -141,10 +148,18 @@ impl WatcherBuilder {
|
|||||||
.and_then(|path| std::fs::read_to_string(path).ok())
|
.and_then(|path| std::fs::read_to_string(path).ok())
|
||||||
.and_then(|content| serde_json::from_str(&content).ok());
|
.and_then(|content| serde_json::from_str(&content).ok());
|
||||||
|
|
||||||
|
if self.seed {
|
||||||
|
self.addr = Some(crate::seeds_constants::SEED_NODES[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
let _ = Self::log(&render_tx, msg!(INFO, "Addr: {:?}", self.addr)).await;
|
||||||
|
|
||||||
let mut node = NativeNode::new(self.addr.clone(), blocks, exec_tx.clone()).await;
|
let mut node = NativeNode::new(self.addr.clone(), blocks, exec_tx.clone()).await;
|
||||||
|
|
||||||
if self.bootstrap {
|
if self.bootstrap {
|
||||||
let _ = node.bootstrap().await;
|
let _ = node.bootstrap().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
let _ = Self::log(&render_tx, msg!(INFO, "Build Node"));
|
let _ = Self::log(&render_tx, msg!(INFO, "Build Node"));
|
||||||
|
|
||||||
let parser_handle = tokio::spawn({
|
let parser_handle = tokio::spawn({
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user