前几天简单地了解了一下Rust语言,然后我就一直在思索,能用Rust编程做点啥呢?不能就写个Hello World啊,那学来也没啥意义呀。
(图源 :pixabay)
然后我想,能不能用Rust写个程序,实现对HIVE区块链的访问(读取信息)以及操作(发布信息,转账、点赞等)?
当然,作为一个初学者,要实现这样的功能,无疑是高难度挑战,但是我们可以一点点来嘛,咋说来着,九尺之台,起于垒土,千里之行,始于足下。
要用rust实现对HIVE区块链的访问,大致有三个要点需要攻克(把大象装冰箱分几步?):
- 了解响应的API
- JSON编解码
- 网络访问
了解响应的API
我们可以在Hive Developer Portal找到有关HIVE上各种API的详细信息。
以获取账户信息为例,相应的API为:condenser_api.get_accounts,下边是使用curl访问API的一个简单示例:
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_accounts", "params":[["hiveio"]], "id":1}' https://api.hive.blog
其它各个API,基本上大同小异。
JSON编解码
通过上述示例,我们不难发现,数据以JSON形式传递给API节点,相应的,返回数据也是JSON格式。
这样就需要我们的程序,对JSON数据进行编码和解码,以便于传输数据和解读数据。
在rust中,有很多JSON库可以使用,serde_json
就是其中一个很好用的库。
网络访问
访问API节点的过程,其实就是把编码好的JSON数据发送到网络,并读取回复的过程。
比如前边我们用curl的例子,就是把相应的get_accounts的JSON数据,发送给https://api.hive.blog节点。
同样,在rust中有很多支持访问网络的库,据说较为常用的是reqwest
库,但是我试着写了几行代码,没用明白。所以我选择了curl
库。
测试代码
下边是一段简单的测试代码:
use curl::easy::Easy;
use serde_json::{json, from_str, to_string_pretty, Value};
fn main() {
let account = "oflyhigh";
let json_data = json!({
"jsonrpc": "2.0",
"method": "condenser_api.get_accounts",
"params": [
[account]
],
"id": 1
}).to_string();
let mut easy = Easy::new();
easy.url("https://api.hive.blog").unwrap();
easy.post(true).unwrap();
easy.post_field_size(json_data.len() as u64).unwrap();
easy.post_fields_copy(json_data.as_bytes()).unwrap();
let mut response = Vec::new();
{
let mut transfer = easy.transfer();
transfer.write_function(|data| {
response.extend_from_slice(data);
Ok(data.len())
}).unwrap();
transfer.perform().unwrap();
}
let response_string = String::from_utf8(response).unwrap();
let v:Value = from_str(&response_string).unwrap();
let pretty_json = to_string_pretty(&v).unwrap();
println!("{}", pretty_json);
}
若要成功编译上述代码,还需要在项目的Cargo.toml文件中添加如下内容:
[dependencies]
serde_json = "1.0"
curl = "0.4"
然后运行cargo run
就会下载安装相应的依赖并编译运行程序,成功运行后,就会格式化输出我账户的全部内容啦。
限于篇幅,只截取部分内容:
所以,貌似使用rust编程读取hive区块链也很简单的啦(中间之曲折我就不多哭诉了)。
小伙伴们可以开动啦,用rust做一个HIVE交易机器人咋样?帮我赔钱,呜呜呜。