53个版本 (重大变更)
0.37.1 | 2024年7月25日 |
---|---|
0.36.0 | 2024年6月4日 |
0.34.0 | 2024年3月18日 |
0.31.0 | 2023年11月27日 |
0.1.0 | 2020年9月24日 |
#1007 in 魔法豆
18,133 每月下载量
用于 36 个crate(23直接)
280KB
6K SLoC
ic-agent
是一个易于使用的库,用于通过Rust与互联网计算机交互。它是dfx
的后端。
有用链接
lib.rs
:
ic-agent
是一个易于使用的库,它允许您使用Rust构建应用程序并与互联网计算机交互。它作为DFINITY Canister软件开发工具包(SDK)和命令行执行环境dfx
的基于Rust的低级后端。
概述
ic-agent
是一个Rust crate,可以直接通过互联网计算机协议(ICP)连接到互联网计算机。ICP的关键软件组件通常被称为副本。
该代理旨在与多个版本的副本API兼容,并公开了与副本等互联网计算机协议组件通信的低级API,同时提供了与作为canister部署的软件应用程序通信的高级API。
示例
以下示例说明了如何使用代理接口向执行网络管理操作的网络计算机罐发送调用。在本例中,对网络计算机管理罐(aaaaa-aa
)的调用通过注册特定于网络的标识符为新罐创建占位符。然后,管理罐将结果以罐标识符的文本表示形式返回给调用者。
# // This test is ignored because it requires an ic to be running. We run these
# // in the ic-ref workflow.
use ic_agent::{Agent, export::Principal};
use candid::{Encode, Decode, CandidType, Nat};
use serde::Deserialize;
#[derive(CandidType)]
struct Argument {
amount: Option<Nat>,
}
#[derive(CandidType, Deserialize)]
struct CreateCanisterResult {
canister_id: Principal,
}
# fn create_identity() -> impl ic_agent::Identity {
# let rng = ring::rand::SystemRandom::new();
# let key_pair = ring::signature::Ed25519KeyPair::generate_pkcs8(&rng)
# .expect("Could not generate a key pair.");
#
# ic_agent::identity::BasicIdentity::from_key_pair(
# ring::signature::Ed25519KeyPair::from_pkcs8(key_pair.as_ref())
# .expect("Could not read the key pair."),
# )
# }
#
async fn create_a_canister() -> Result<Principal, Box<dyn std::error::Error>> {
# let url = format!("https://127.0.0.1:{}", option_env!("IC_REF_PORT").unwrap_or("4943"));
let agent = Agent::builder()
.with_url(url)
.with_identity(create_identity())
.build()?;
// Only do the following call when not contacting the IC main net (e.g. a local emulator).
// This is important as the main net public key is static and a rogue network could return
// a different key.
// If you know the root key ahead of time, you can use `agent.set_root_key(root_key);`.
agent.fetch_root_key().await?;
let management_canister_id = Principal::from_text("aaaaa-aa")?;
// Create a call to the management canister to create a new canister ID,
// and wait for a result.
// The effective canister id must belong to the canister ranges of the subnet at which the canister is created.
let effective_canister_id = Principal::from_text("rwlgt-iiaaa-aaaaa-aaaaa-cai").unwrap();
let response = agent.update(&management_canister_id, "provisional_create_canister_with_cycles")
.with_effective_canister_id(effective_canister_id)
.with_arg(Encode!(&Argument { amount: None})?)
.await?;
let result = Decode!(response.as_slice(), CreateCanisterResult)?;
let canister_id: Principal = result.canister_id;
Ok(canister_id)
}
# let mut runtime = tokio::runtime::Runtime::new().unwrap();
# runtime.block_on(async {
let canister_id = create_a_canister().await.unwrap();
eprintln!("{}", canister_id);
# });
有关本例中使用的代理接口的更多信息,请参阅[代理]文档。
参考文献
有关对互联网计算机和DFINITY罐SDK的介绍,请参阅以下资源
互联网计算机协议和接口规范尚未公开发布。当这些规范公开发布并广泛可用时,此处将提供对支持版本的更多详细信息。
依赖项
~18–32MB
~628K SLoC