使用 Rust 的比特币 cURL/JSON-RPC

Posted

技术标签:

【中文标题】使用 Rust 的比特币 cURL/JSON-RPC【英文标题】:Bitcoin cURL/JSON-RPC using Rust 【发布时间】:2019-08-28 11:59:41 【问题描述】:

我正在 RUST 中编写代码以使用 JSON-RPC 从比特币核心查询数据。我正在使用这个curl-rust,但在运行cargo run 时没有显示输出。

extern crate curl;

use std::io::Read;
use curl::easy::Easy, List;

fn main() 
    let mut data = r#""jsonrpc":"1.0","id":"curltext","method":"getrawtransaction","params":["f8ae07a1292136def6d79d5aef15aacfa1aefa2db153037b878b06f00e2cd051", 2]"#.as_bytes();

    let mut easy = Easy::new();
    easy.url("http://192.168.X.X:8332").unwrap();
    easy.post(true).unwrap();
    easy.post_field_size(data.len() as u64).unwrap();

    let mut list = List::new();
    list.append("Authorization: Basic some_user:some_password").unwrap();
    easy.http_headers(list).unwrap();

    let mut transfer = easy.transfer();
    transfer.read_function(|buf| 
        Ok(data.read(buf).unwrap_or(0))
    ).unwrap();
    transfer.perform().unwrap();

我希望代码给出一些输出,为什么不是这样?

【问题讨论】:

哪里有输出代码? 在最后一行,我什至尝试了:let p = transfer.perform().unwrap(); println!(":?", p),但仍然没有输出。 【参考方案1】:

您错过了write_function 电话。一个例子:

use std::io::Read;

use curl::easy::Easy;

fn main() 
    let mut body = r#""jsonrpc":"2.0","method":"guru.test","params":["Guru"],"id":123"#.as_bytes();

    let mut easy = Easy::new();
    easy.url("https://gurujsonrpc.appspot.com/guru").unwrap();
    easy.post(true).unwrap();
    easy.post_field_size(body.len() as u64).unwrap();

    let mut data = Vec::new();
    
        // Create transfer in separate scope ...
        let mut transfer = easy.transfer();

        // Request body
        transfer.read_function(|buf| 
            Ok(body.read(buf).unwrap_or(0))
        ).unwrap();

        // Response body
        transfer.write_function(|new_data| 
            data.extend_from_slice(new_data);
            Ok(new_data.len())
        ).unwrap();

        transfer.perform().unwrap();
        // .. to force drop it here, so we can use easy.response_code()
    

    println!("", easy.response_code().unwrap());
    println!("Received  bytes", data.len());
    if !data.is_empty() 
        println!("Bytes: :?", data);
        println!("As string: ", String::from_utf8_lossy(&data));
    

【讨论】:

感谢您指出。我根据您的示例修改了我的代码。现在输出在那里,但响应代码为 401,我怀疑这是由于 Auth 方法实施不当造成的。您能否帮助我使用正确的语法来使用用户名和密码身份验证?提前感谢您。 您是否阅读过文档? Easy & username, password & http_auth. 感谢您提供链接。不熟悉 rust,我只是查看curl-rust 给出的示例。代码现在正在使用 easy.username("some_user").unwrap(); easy.password("some_password").unwrap(); easy.http_auth(auth.basic(true));再一次感谢你。 ?

以上是关于使用 Rust 的比特币 cURL/JSON-RPC的主要内容,如果未能解决你的问题,请参考以下文章

Rust区块链开发包

刘教链比特币原理1-2 比特币的特点和使用

使用 Async Rust 构建简单的 P2P 节点

04.1_存储和使用比特币

究竟什么比特币?如何理解比特币?

比特币的测试网络