每天进步一点点:使用rust编程读取hive区块链

Words
706
Reading
4 min
Listen
Play
4y

前几天简单地了解了一下Rust语言,然后我就一直在思索,能用Rust编程做点啥呢?不能就写个Hello World啊,那学来也没啥意义呀。

image.png
(图源 :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就会下载安装相应的依赖并编译运行程序,成功运行后,就会格式化输出我账户的全部内容啦。

限于篇幅,只截取部分内容:

image.png

所以,貌似使用rust编程读取hive区块链也很简单的啦(中间之曲折我就不多哭诉了)。

小伙伴们可以开动啦,用rust做一个HIVE交易机器人咋样?帮我赔钱,呜呜呜。

相关链接

每天进步一点点:使用rust编程读取hive区块链 | Ecency