Menyiapkan klien
Menyiapkan klien SDK
Setelah SDK diimpor ke dalam proyek, SDK tersebut dapat digunakan untuk berinteraksi dengan blockchain Namada. Anggaplah kita memiliki node yang berjalan pada ip dan port 127.0.0.1:26657
dan kita ingin mengirim transaksi ke jaringan.
SDK mungkin untuk berbagai tujuan, namun dalam contoh ini kita akan menggunakannya untuk mengirim transaksi ke jaringan.
Pertama, kita perlu mengimplementasikannya Client
agar kita dapat berkomunikasi dengan node yang sedang berjalan.
use reqwest::{Client, Response as ClientResponse};
pub struct SdkClient {
url: String,
client: Client,
}
impl SdkClient {
pub fn new(url: String) -> Self {
Self {
client: Client::new(),
url,
}
}
pub async fn post(&self, body: String) -> Result<ClientResponse, reqwest::Error> {
self.client
.post(format!("http://{}", &self.url))
.body(body)
.send()
.await
}
}
Hal ini memungkinkan kita menggunakan Client
from reqwest
(perpustakaan eksternal) untuk mengirim transaksi ke jaringan.
Kita juga perlu mendefinisikan beberapa fungsi yang akan digunakan klien untuk berinteraksi dengan jaringan.
#[async_trait::async_trait]
impl ClientTrait for SdkClient {
type Error = Error;
async fn request(
&self,
path: String,
data: Option<Vec<u8>>,
height: Option<BlockHeight>,
prove: bool,
) -> Result<EncodedResponseQuery, Self::Error> {
let data = data.unwrap_or_default();
let height = height
.map(|height| {
tendermint::block::Height::try_from(height.0)
.map_err(|_err| Error::InvalidHeight(height))
})
.transpose()?;
let response = self
.abci_query(
Some(std::str::FromStr::from_str(&path).unwrap()),
data,
height,
prove,
)
.await?;
match response.code {
Code::Ok => Ok(EncodedResponseQuery {
data: response.value,
info: response.info,
proof: response.proof,
}),
Code::Err(code) => Err(Error::Query(response.info, code)),
}
}
async fn perform<R>(&self, request: R) -> Result<R::Response, tm_rpc::Error>
where
R: tm_rpc::SimpleRequest,
{
let request_body = request.into_json();
let response = self.post(request_body).await;
match response {
Ok(response) => {
let response_json = response.text().await.unwrap();
R::Response::from_string(response_json)
}
Err(e) => {
let error_msg = e.to_string();
Err(tm_rpc::Error::server(error_msg))
}
}
}
}
Sekarang, kami siap menggunakan klien ini untuk mengirim transaksi.
Last updated