После импорта sdk в проект его можно использовать для взаимодействия с блокчейном Namada. Предположим, что у нас есть узел, работающий по ip и порту 127.0.0.1:26657
, и мы хотим отправить транзакцию в сеть.
SDK может быть использован для различных целей, но в данном примере мы будем использовать его для отправки транзакции в сеть.
Для начала нам необходимо реализовать клиент, чтобы мы могли взаимодействовать с работающим узлом.
Copy 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
}
}
Нам также необходимо определить некоторые функции, которые клиент будет использовать для взаимодействия с сетью.
Copy #[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))
}
}
}
}
Теперь мы готовы использовать этого клиента для отправки транзакций.