Rust 赌注池核心合同-ext_合同宏和回调

Rust 赌注池核心合同-ext_合同宏和回调,rust,nearprotocol,Rust,Nearprotocol,在internal\u restake函数中,为什么我们必须访问on\u stake\u action函数,就好像它是一个外部交叉合同调用,而它是调用合同的一部分?我们就不能只做。然后(self.on\u stake\u action())?我假设它与脸有关,它是来自stack()promise call的回调 在什么情况下,您会为合同本身制作一个界面,如ext\u self 简而言之,#[ext_contract()]宏做什么? --------赌注池合同代码如下----------

internal\u restake
函数中,为什么我们必须访问
on\u stake\u action
函数,就好像它是一个外部交叉合同调用,而它是调用合同的一部分?我们就不能只做
。然后(self.on\u stake\u action())
?我假设它与脸有关,它是来自
stack()
promise call的回调

  • 在什么情况下,您会为合同本身制作一个界面,如
    ext\u self

  • 简而言之,#[ext_contract()]宏做什么?


    --------赌注池合同代码如下--------------------

  • ///合同本身的接口。
    #[外部合同(外部自身)]
    自我契约{
    ///用于检查锁紧操作结果的回调。
    fn关于利害关系的行动(和相互自身);
    }
    

    pub fn on_stack_action(&mut self){
    断言(
    环境::当前帐户id(),
    环境::前置者帐户id(),
    “只能作为回调调用”
    );
    断言(
    env::promise\u results\u count(),
    1.
    “合同要求回调结果”
    );
    让桩\操作\成功=匹配环境::承诺\结果(0){
    PromiseResult::Successful()=>true,
    _=>错误,
    };
    //如果桩操作失败且当前锁定金额为正,则合同
    //必须解开。
    如果!stake\u action\u成功&&env::account\u locked\u balance()>0{
    Promise::new(env::current_account_id()).stack(0,self.stack_public_key.clone());
    }
    }
    

    ///再次重新启动当前的“总押注余额”。
    酒吧(板条箱)fn内部餐厅(和多个自助餐厅){
    如果自我暂停{
    返回;
    }
    //使用锁定公钥进行锁定。如果公钥无效,则整个函数
    //呼叫将被回滚。
    Promise::new(环境::当前帐户id())
    .stack(self.total\u staked\u balance,self.stack\u public\u key.clone())
    .然后(ext_self::关于行动(
    &环境::当前帐户id(),
    没有存款,
    关于赌注,行动,气体,
    ));
    }
    
    合同使用“外部”接口的原因是,对方法的调用是外部的,因为它作为承诺操作的一部分被“调用”

    ///合同本身的接口。
    #[外部合同(外部自身)]
    自我契约{
    ///用于检查锁紧操作结果的回调。
    fn关于利害关系的行动(和相互自身);
    }
    
    首先,在rust过程宏中,输入和输出中有一个令牌流(
    pub
    trait
    SelfContract
    ,…)。在这种情况下,输出不是特征,而是名为
    ext\u self
    的模块]()。然后,在模块中添加一个关于动作的函数
    ,并在删除自参数和添加三个新参数的情况下进行修改,并返回一个
    承诺

    Promise::new(env::current\u account\u id())
    .stack(self.total\u staked\u balance,self.stack\u public\u key.clone())
    .然后(ext_self::关于行动(
    &环境::当前帐户id(),
    没有存款,
    关于赌注,行动,气体,
    ));
    
    ext\u self
    是模块
    是路径分隔符,用于访问
    on-stack\u action
    &env::current\u account\u id()
    是接收者,
    NO\u DEPOSIT
    是附加存款,
    on-stack\u action\u GAS
    是承诺调用的气体。此外,生成用于实现该功能的代码;它将参数编码到函数中(在本例中没有任何参数),并创建一个承诺,在\u stake\u action
    上调用方法

    这个特性的初始声明的原因是它不需要实现,并且具有良好的rust支持的IDE已经扩展了这个宏,允许您使用
    ext\u self
    作为一个模块,即使您看不到它是什么

    尽管
    ext_contract
    macro将对同一个contract的调用与其他调用一样处理,但您提出了一个很好的观点。因此,一个新的有用功能可能是创建一个已经使用
    env::current\u account\u id()
    的新宏