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
--------赌注池合同代码如下--------------------
///合同本身的接口。
#[外部合同(外部自身)]
自我契约{
///用于检查锁紧操作结果的回调。
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()
的新宏