#授权 #cosmwasm #智能合约 #cosmos

neptune-auth

用于实现 cosmwasm 智能合约消息授权的 Crate

3 个版本 (1 个稳定版)

1.0.0 2024年1月19日
0.1.1 2023年5月17日
0.1.0 2023年1月6日

#2286魔法豆

Download history 29/week @ 2024-04-04 7/week @ 2024-05-30 3/week @ 2024-06-06

每月 72 次下载
neptune-common 中使用

Apache-2.0

9KB
111

neptune-auth

此包用于管理任何任意消息类型的调用者认证。

使用方法

第一步是创建某种类型的配置,该配置可以访问存储的地址。

#[derive(Copy, Display)]
#[cw_serde]
pub enum Config {
    Admin,
    Bot,
}

然后你应该为 Config 实现 GetPermissionGroup。

impl GetPermissionGroup for Config {
    fn get_permission_group(&self, deps: Deps<impl CustomQuery>, _env: &Env) -> Result<PermissionGroup, NeptAuthError> {
        // How your config accesses storage is up to you
        // Here we use a map from cw_storage_plus
        Ok(vec![self.load(deps).unwrap()].into())
    }
}

然后你可以为给定消息类型中的每个变体分配一个权限组。这里我使用 ExecuteMsg 作为示例。

use crate::config::Config::*;

impl NeptuneAuth for ExecuteMsg {
    fn permissions(&self) -> Result<Vec<&dyn GetPermissionGroup>, NeptAuthError> {
        Ok(match self {
            ExecuteMsg::SetConfig { .. } => vec![&Admin],
            ExecuteMsg::AddAsset { .. } => vec![&Bot],
            ExecuteMsg::RemoveAsset { .. } => vec![&Bot],
            ExecuteMsg::UpdatePrices { .. } => vec![&Admin, &Bot],
        })
    }
}

最后,你可以在执行入口点(或你想要验证授权的任何地方)放置授权检查。

#[cfg_attr(not(feature = "library"), entry_point)]
pub fn execute(deps: DepsMut<impl CustomQuery>, env: Env, info: MessageInfo, msg: ExecuteMsg) -> Result<Response, MyError> {
    // This is the line that checks the permissions
    // It will return an error if the caller does not have the required permissions
    msg.neptune_authorize(deps.as_ref(), &env, &info.sender)?;

    ...
}

依赖关系

~3.5–5.5MB
~114K SLoC