微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NEAR SmartContract 承诺使用

如何解决NEAR SmartContract 承诺使用

在 NEAR 协议中开发 SmartConract 时我应该使用 Promises 并不是一件显而易见的事情。当它是多余的。

例如,我有一些逻辑来完成一些公共方法

    #[private]
    fn record_data(&mut self,key: &Vec<u8>) -> Balance {
        let initial_storage = env::storage_usage();
        assert!(
            !self.used_events.contains(&key),"Proof event cannot be reused. Proof already exist."
        );
        self.used_events.insert(&key);
        let current_storage = env::storage_usage();
        let attached_deposit = env::attached_deposit();
        let required_deposit =
            Balance::from(current_storage - initial_storage) * STORAGE_PRICE_PER_BYTE;
        attached_deposit - required_deposit
    }

在同一个合约中,我有一个功能

    #[payable]
    fn deposit(&mut self,amount: Balance) {
        // ...some logic
        self.record_data(&data)
    }

因此,使用 Promises,我可以以 record_data 的方式调用 async。 但不清楚何时必须使用这种方式(Promise 调用)。当我可以以非常简单的方式调用时:

self.record_data(&data)

很明显,跨合约调用总是通过 Promise 进行。 但它是同一个合约调用特定的内部合约函数 - 不清楚我们什么时候应该使用 Promises。

所以我需要清楚地说明什么时候必须使用 Promises,什么时候它是多余的。

解决方法

您可以异步调用 record_data,但这是有代价的。您需要支付基本费用以进行另一笔交易 + 运行代码的燃料成本 + 与主机调用交互的燃料(例如 env::*)。所以使内部调用异步的原因是为了利用并发性:参见 rust-sdk's merge sort

    pub fn merge_sort(&self,arr: Vec<u8>) -> PromiseOrValue<Vec<u8>> {
        if arr.len() <= 1 {
            return PromiseOrValue::Value(arr);
        }
        let pivot = arr.len() / 2;
        let arr0 = arr[..pivot].to_vec();
        let arr1 = arr[pivot..].to_vec();
        let prepaid_gas = env::prepaid_gas();
        let account_id = env::current_account_id();

        ext::merge_sort(arr0,&account_id,prepaid_gas / 4)
            .and(ext::merge_sort(arr1,prepaid_gas / 4))
            .then(ext::merge(&account_id,prepaid_gas / 4))
            .into()
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。