0

在 NEARprotocol 上,我想从合同 (Rust) 中调用另一个合同。我尝试env::Promise了但无法检索呼叫答案。这里的正确方法是什么?此外,near-sdk板条箱文档给出了示例&"bob_near".to_string(),这是否等同于 idbob.near或拼写错误?

以下是我的代码的相关摘录:

near_sdk::setup_alloc!();

#[ext_contract]
pub trait AEXToken {
    fn collect_premie(&mut self, account_id: ValidAccountId) -> bool;
    fn get_min_balance(&self) -> u128;
}
#[near_bindgen]
#[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)]
pub struct Contract {
    tokens: NonFungibleToken,
    metadata: LazyOption<NFTContractMetadata>,
    aex_tokenId: ValidAccountId,
}

#[near_bindgen]
impl Contract {
    pub fn nft_mint(&mut self) -> Token {
        let amount: Balance = env::attached_deposit();
        aex_token::get_min_balance(&self.aex_tokenId.to_string(), 0, 1_000);
        let min_balance: u128 = env::promise_return(1);
        assert!(min_balance < amount);
4

1 回答 1

0

我认为你误解了它的工作方式。承诺不会以同样的方法返回。它会根据网络拥塞情况尽快在随后的某个块中执行,通常在 1 个块内。

返回值将作为回调落在另一个方法中。在 SDK的同一examples文件夹中查看此示例和其他几个示例

呼唤

/// Call functions a, b, and c asynchronously and handle results with `handle_callbacks`.
pub fn call_all(fail_b: bool, c_value: u8) -> Promise {
    let gas_per_promise = env::prepaid_gas() / 5;
    ext::a(env::current_account_id(), 0, gas_per_promise)
        .and(ext::b(fail_b, env::current_account_id(), 0, gas_per_promise))
        .and(ext::c(c_value, env::current_account_id(), 0, gas_per_promise))
        .then(ext::handle_callbacks(env::current_account_id(), 0, gas_per_promise))
}

接收回调

/// Receives the callbacks from the other promises called.
#[private]
pub fn handle_callbacks(
    #[callback_unwrap] a: u8,
    #[callback_result] b: Result<String, PromiseError>,
    #[callback_result] c: Result<u8, PromiseError>,
) -> (bool, bool) {
    require!(a == A_VALUE, "Promise returned incorrect value");
    if let Ok(s) = b.as_ref() {
        require!(s == "Some string");
    }
    (b.is_err(), c.is_err())
}

这可能有助于对它进行更多解释 https://www.near-sdk.io/cross-contract/callbacks


所以你的呼唤

aex_token::get_min_balance(&self.aex_tokenId.to_string(), 0, 1_000);

应该链接then到执行此检查的回调

let min_balance: u128 = env::promise_return(1);
assert!(min_balance < amount);
于 2022-02-20T17:00:16.673 回答