bitcoin_bridge.rs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. use secp256k1::key::SecretKey;
  2. use bitcoin::util::{ecdsa::PrivateKey, address::Address};
  3. use super::reqrep::{PeerId, RepProtocol, Reply, ReqProtocol, Request};
  4. use std::net::SocketAddr;
  5. use async_std::sync::Arc;
  6. use async_executor::Executor;
  7. pub struct BitcoinAddr {
  8. secret_key: PrivateKey,
  9. pub_address: Address
  10. }
  11. impl BitcoinAddr {
  12. pub fn new(
  13. ) -> Result<Arc<BitcoinAddr>> {
  14. let secret_key = SecretKey::new();
  15. }
  16. }
  17. pub struct CashierService {
  18. addr: SocketAddr,
  19. pub_addr: SocketAddr,
  20. }
  21. impl CashierService {
  22. pub fn new(
  23. addr: SocketAddr,
  24. pub_addr: SocketAddr,
  25. )-> Result<Arc<CashierService>> {
  26. Ok(Arc::new(CashierService {
  27. addr,
  28. pub_addr,
  29. }))
  30. }
  31. pub async fn start(self: Arc<Self>, executor: Arc<Executor<'_>>) -> Result<()> {
  32. let service_name = String::from("CASHIER DAEMON");
  33. let mut protocol = RepProtocol::new(self.addr.clone(), service_name.clone());
  34. let (send, recv) = protocol.start().await?;
  35. let handle_request_task = executor.spawn(self.handle_request_loop(
  36. send.clone(),
  37. recv.clone(),
  38. executor.clone(),
  39. ));
  40. protocol.run(executor.clone()).await?;
  41. let _ = handle_request_task.cancel().await;
  42. Ok(())
  43. }
  44. async fn handle_request_loop(
  45. self: Arc<Self>,
  46. send_queue: async_channel::Sender<(PeerId, Reply)>,
  47. recv_queue: async_channel::Receiver<(PeerId, Request)>,
  48. executor: Arc<Executor<'_>>,
  49. ) -> Result<()> {
  50. loop {
  51. match recv_queue.recv().await {
  52. Ok(msg) => {
  53. let slabstore = self.slabstore.clone();
  54. let _ = executor
  55. .spawn(Self::handle_request(
  56. msg,
  57. slabstore,
  58. send_queue.clone(),
  59. ))
  60. .detach();
  61. }
  62. Err(_) => {
  63. break;
  64. }
  65. }
  66. }
  67. Ok(())
  68. }
  69. async fn handle_request(
  70. msg: (PeerId, Request),
  71. slabstore: Arc<SlabStore>,
  72. send_queue: async_channel::Sender<(PeerId, Reply)>,
  73. ) -> Result<()> {
  74. let request = msg.1;
  75. let peer = msg.0;
  76. match request.get_command() {
  77. 0 => {
  78. }
  79. 1 => {
  80. }
  81. 2 => {
  82. }
  83. _ => {
  84. return Err(Error::ServicesError("received wrong command"));
  85. }
  86. }
  87. Ok(())
  88. }
  89. }