Add json-rpc requestAirdrop endpoint
This commit is contained in:
committed by
Tyera Eulberg
parent
a9c3a28a3b
commit
f7f7ecd4c6
@ -3,6 +3,7 @@
|
|||||||
use bank::Bank;
|
use bank::Bank;
|
||||||
use broadcast_stage::BroadcastStage;
|
use broadcast_stage::BroadcastStage;
|
||||||
use crdt::{Crdt, NodeInfo, TestNode};
|
use crdt::{Crdt, NodeInfo, TestNode};
|
||||||
|
use drone::DRONE_PORT;
|
||||||
use entry::Entry;
|
use entry::Entry;
|
||||||
use ledger::read_ledger;
|
use ledger::read_ledger;
|
||||||
use ncp::Ncp;
|
use ncp::Ncp;
|
||||||
@ -202,10 +203,13 @@ impl Fullnode {
|
|||||||
);
|
);
|
||||||
thread_hdls.extend(rpu.thread_hdls());
|
thread_hdls.extend(rpu.thread_hdls());
|
||||||
|
|
||||||
|
let mut drone_addr = node.data.contact_info.tpu;
|
||||||
|
drone_addr.set_port(DRONE_PORT);
|
||||||
let rpc_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), RPC_PORT);
|
let rpc_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), RPC_PORT);
|
||||||
let rpc_service = JsonRpcService::new(
|
let rpc_service = JsonRpcService::new(
|
||||||
bank.clone(),
|
bank.clone(),
|
||||||
node.data.contact_info.tpu,
|
node.data.contact_info.tpu,
|
||||||
|
drone_addr,
|
||||||
rpc_addr,
|
rpc_addr,
|
||||||
exit.clone(),
|
exit.clone(),
|
||||||
);
|
);
|
||||||
@ -302,10 +306,13 @@ impl Fullnode {
|
|||||||
);
|
);
|
||||||
thread_hdls.extend(rpu.thread_hdls());
|
thread_hdls.extend(rpu.thread_hdls());
|
||||||
|
|
||||||
|
let mut drone_addr = entry_point.contact_info.ncp;
|
||||||
|
drone_addr.set_port(DRONE_PORT);
|
||||||
let rpc_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), RPC_PORT);
|
let rpc_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), RPC_PORT);
|
||||||
let rpc_service = JsonRpcService::new(
|
let rpc_service = JsonRpcService::new(
|
||||||
bank.clone(),
|
bank.clone(),
|
||||||
node.data.contact_info.tpu,
|
node.data.contact_info.tpu,
|
||||||
|
drone_addr,
|
||||||
rpc_addr,
|
rpc_addr,
|
||||||
exit.clone(),
|
exit.clone(),
|
||||||
);
|
);
|
||||||
|
28
src/rpc.rs
28
src/rpc.rs
@ -25,6 +25,7 @@ impl JsonRpcService {
|
|||||||
pub fn new(
|
pub fn new(
|
||||||
bank: Arc<Bank>,
|
bank: Arc<Bank>,
|
||||||
transactions_addr: SocketAddr,
|
transactions_addr: SocketAddr,
|
||||||
|
drone_addr: SocketAddr,
|
||||||
rpc_addr: SocketAddr,
|
rpc_addr: SocketAddr,
|
||||||
exit: Arc<AtomicBool>,
|
exit: Arc<AtomicBool>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
@ -40,6 +41,7 @@ impl JsonRpcService {
|
|||||||
ServerBuilder::with_meta_extractor(io, move |_req: &hyper::Request| Meta {
|
ServerBuilder::with_meta_extractor(io, move |_req: &hyper::Request| Meta {
|
||||||
request_processor: request_processor.clone(),
|
request_processor: request_processor.clone(),
|
||||||
transactions_addr,
|
transactions_addr,
|
||||||
|
drone_addr,
|
||||||
}).threads(4)
|
}).threads(4)
|
||||||
.cors(DomainsValidation::AllowOnly(vec![
|
.cors(DomainsValidation::AllowOnly(vec![
|
||||||
AccessControlAllowOrigin::Any,
|
AccessControlAllowOrigin::Any,
|
||||||
@ -76,6 +78,7 @@ impl Service for JsonRpcService {
|
|||||||
pub struct Meta {
|
pub struct Meta {
|
||||||
pub request_processor: JsonRpcRequestProcessor,
|
pub request_processor: JsonRpcRequestProcessor,
|
||||||
pub transactions_addr: SocketAddr,
|
pub transactions_addr: SocketAddr,
|
||||||
|
pub drone_addr: SocketAddr,
|
||||||
}
|
}
|
||||||
impl Metadata for Meta {}
|
impl Metadata for Meta {}
|
||||||
|
|
||||||
@ -98,6 +101,9 @@ build_rpc_trait! {
|
|||||||
#[rpc(meta, name = "getTransactionCount")]
|
#[rpc(meta, name = "getTransactionCount")]
|
||||||
fn get_transaction_count(&self, Self::Metadata) -> Result<u64>;
|
fn get_transaction_count(&self, Self::Metadata) -> Result<u64>;
|
||||||
|
|
||||||
|
#[rpc(meta, name= "requestAirdrop")]
|
||||||
|
fn request_airdrop(&self, Self::Metadata, String, u64) -> Result<bool>;
|
||||||
|
|
||||||
#[rpc(meta, name = "sendTransaction")]
|
#[rpc(meta, name = "sendTransaction")]
|
||||||
fn send_transaction(&self, Self::Metadata, Vec<u8>) -> Result<String>;
|
fn send_transaction(&self, Self::Metadata, Vec<u8>) -> Result<String>;
|
||||||
}
|
}
|
||||||
@ -136,6 +142,18 @@ impl RpcSol for RpcSolImpl {
|
|||||||
fn get_transaction_count(&self, meta: Self::Metadata) -> Result<u64> {
|
fn get_transaction_count(&self, meta: Self::Metadata) -> Result<u64> {
|
||||||
meta.request_processor.get_transaction_count()
|
meta.request_processor.get_transaction_count()
|
||||||
}
|
}
|
||||||
|
fn request_airdrop(&self, meta: Self::Metadata, id: String, tokens: u64) -> Result<bool> {
|
||||||
|
let pubkey_vec = bs58::decode(id)
|
||||||
|
.into_vec()
|
||||||
|
.map_err(|_| Error::invalid_request())?;
|
||||||
|
if pubkey_vec.len() != mem::size_of::<Pubkey>() {
|
||||||
|
return Err(Error::invalid_request());
|
||||||
|
}
|
||||||
|
let pubkey = Pubkey::new(&pubkey_vec);
|
||||||
|
request_airdrop(&meta.drone_addr, &pubkey, tokens)
|
||||||
|
.map_err(|_| Error::internal_error())?;
|
||||||
|
Ok(true)
|
||||||
|
}
|
||||||
fn send_transaction(&self, meta: Self::Metadata, data: Vec<u8>) -> Result<String> {
|
fn send_transaction(&self, meta: Self::Metadata, data: Vec<u8>) -> Result<String> {
|
||||||
let tx: Transaction = deserialize(&data).map_err(|_| Error::invalid_request())?;
|
let tx: Transaction = deserialize(&data).map_err(|_| Error::invalid_request())?;
|
||||||
let transactions_socket = UdpSocket::bind("0.0.0.0:0").unwrap();
|
let transactions_socket = UdpSocket::bind("0.0.0.0:0").unwrap();
|
||||||
@ -182,6 +200,7 @@ mod tests {
|
|||||||
use jsonrpc_core::Response;
|
use jsonrpc_core::Response;
|
||||||
use mint::Mint;
|
use mint::Mint;
|
||||||
use signature::{Keypair, KeypairUtil};
|
use signature::{Keypair, KeypairUtil};
|
||||||
|
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use transaction::Transaction;
|
use transaction::Transaction;
|
||||||
|
|
||||||
@ -197,11 +216,16 @@ mod tests {
|
|||||||
|
|
||||||
let request_processor = JsonRpcRequestProcessor::new(Arc::new(bank));
|
let request_processor = JsonRpcRequestProcessor::new(Arc::new(bank));
|
||||||
let transactions_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0);
|
let transactions_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0);
|
||||||
|
let drone_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0);
|
||||||
|
|
||||||
let mut io = MetaIoHandler::default();
|
let mut io = MetaIoHandler::default();
|
||||||
let rpc = RpcSolImpl;
|
let rpc = RpcSolImpl;
|
||||||
io.extend_with(rpc.to_delegate());
|
io.extend_with(rpc.to_delegate());
|
||||||
let meta = Meta { request_processor, transactions_addr };
|
let meta = Meta {
|
||||||
|
request_processor,
|
||||||
|
transactions_addr,
|
||||||
|
drone_addr,
|
||||||
|
};
|
||||||
|
|
||||||
let req = format!(
|
let req = format!(
|
||||||
r#"{{"jsonrpc":"2.0","id":1,"method":"getBalance","params":["{}"]}}"#,
|
r#"{{"jsonrpc":"2.0","id":1,"method":"getBalance","params":["{}"]}}"#,
|
||||||
@ -238,6 +262,7 @@ mod tests {
|
|||||||
let meta = Meta {
|
let meta = Meta {
|
||||||
request_processor: JsonRpcRequestProcessor::new(Arc::new(bank)),
|
request_processor: JsonRpcRequestProcessor::new(Arc::new(bank)),
|
||||||
transactions_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0),
|
transactions_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0),
|
||||||
|
drone_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0),
|
||||||
};
|
};
|
||||||
|
|
||||||
let res = io.handle_request_sync(req, meta);
|
let res = io.handle_request_sync(req, meta);
|
||||||
@ -262,6 +287,7 @@ mod tests {
|
|||||||
let meta = Meta {
|
let meta = Meta {
|
||||||
request_processor: JsonRpcRequestProcessor::new(Arc::new(bank)),
|
request_processor: JsonRpcRequestProcessor::new(Arc::new(bank)),
|
||||||
transactions_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0),
|
transactions_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0),
|
||||||
|
drone_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0),
|
||||||
};
|
};
|
||||||
|
|
||||||
let res = io.handle_request_sync(req, meta);
|
let res = io.handle_request_sync(req, meta);
|
||||||
|
Reference in New Issue
Block a user