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

前几天简单地了解了一下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就会下载安装相应的依赖并编译运行程序,成功运行后,就会格式化输出我账户的全部内容啦。

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

Reveal spoiler

image.png

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

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

相关链接

Sort:  

use curl::easy::Easy;

也太過驕傲了,一開頭就說curl代碼很簡單是吧... 😠

不好,一下子就被你发现大秘密了

艾玛,刘美女也是IT的。

虎熊熊来O哥这报个到。😂

我不喜欢熊熊,我喜欢牛牛😂

进步使人变强

没想到这里也能看见rust,还真是越来越普及了。

曾经有兴趣过,但是看到那个语法是有点提不起劲… 感觉回到了写C++的时代啊哈哈。

哈哈,我是初学者
了解一下

当然,作为一个初学者,要实现这样的功能,无疑是高难度挑战,

从平时你的帖子来看,从头看到脚。
怎么看都看不出来你是个初学者。大佬级别我倒是信了。

唉,又是看不懂系列😂

We have seen that you have previously supported proposals for the improvement of Hive.

We would love to have your support in our proposal that seeks to add a new tool to the Hive environment that will help ensure that your content continues to prioritize quality and above all originality.

You can vote here:
Peakd
Ecency

We would appreciate your support, criticism, and collaboration. Thank you for considering this proposal.