Rust代理管理库pallet-proxy的使用,实现高效账户权限委托与链上操作代理
Rust代理管理库pallet-proxy的使用,实现高效账户权限委托与链上操作代理
Proxy Module
这是一个允许账户授予其他账户权限的模块,可以从其签名来源处派发特定类型的调用。
被授予权限的账户可能需要在执行前一定时间提前宣布他们希望执行的操作。在这种情况下,目标账户可能会拒绝该宣布,从而否决执行。
概述
pallet-proxy模块提供了以下主要功能:
- 账户可以委托权限给其他账户
- 代理账户可以代表原始账户执行特定类型的操作
- 支持延迟执行机制,允许原始账户审查和否决代理操作
- 可配置不同的代理类型和权限级别
接口
可调度函数
许可证: Apache-2.0
完整示例代码
use frame_support::{assert_ok, traits::Currency};
use sp_core::H256;
use sp_runtime::{
traits::{BlakeTwo256, IdentityLookup},
BuildStorage,
};
type Block = frame_system::mocking::MockBlock<Test>;
// 配置测试环境
frame_support::construct_runtime!(
pub enum Test {
System: frame_system,
Balances: pallet_balances,
Proxy: pallet_proxy,
}
);
impl frame_system::Config for Test {
type BaseCallFilter = frame_support::traits::Everything;
type BlockWeights = ();
type BlockLength = ();
type DbWeight = ();
type RuntimeOrigin = RuntimeOrigin;
type RuntimeCall = RuntimeCall;
type Nonce = u64;
type Hash = H256;
type Hashing = BlakeTwo256;
type AccountId = u64;
type Lookup = IdentityLookup<Self::AccountId>;
type Block = Block;
type RuntimeEvent = RuntimeEvent;
type BlockHashCount = ();
type Version = ();
type PalletInfo = PalletInfo;
type AccountData = pallet_balances::AccountData<u64>;
type OnNewAccount = ();
type OnKilledAccount = ();
type SystemWeightInfo = ();
type SS58Prefix = ();
type OnSetCode = ();
type MaxConsumers = frame_support::traits::ConstU32<16>;
}
impl pallet_balances::Config for Test {
type Balance = u64;
type DustRemoval = ();
type RuntimeEvent = RuntimeEvent;
type ExistentialDeposit = ();
type AccountStore = System;
type WeightInfo = ();
type MaxLocks = ();
type MaxReserves = ();
type ReserveIdentifier = [u8; 8];
type HoldIdentifier = ();
type FreezeIdentifier = ();
type MaxHolds = ();
type MaxFreezes = ();
}
impl pallet_proxy::Config for Test {
type RuntimeEvent = RuntimeEvent;
type RuntimeCall = RuntimeCall;
type Currency = Balances;
type ProxyType = ();
type ProxyDepositBase = ();
type ProxyDepositFactor = ();
type MaxProxies = ();
type WeightInfo = ();
type MaxPending = ();
type CallHasher = BlakeTwo256;
type AnnouncementDepositBase = ();
type AnnouncementDepositFactor = ();
type MaxPending = ();
}
// 测试用例
#[test]
fn proxy_works() {
new_test_ext().execute_with(|| {
// 创建账户
let alice = 1;
let bob = 2;
let charlie = 3;
// 给Alice一些余额
Balances::make_free_balance_be(&alice, 100);
// Alice添加Bob作为她的代理
assert_ok!(Proxy::add_proxy(
RuntimeOrigin::signed(alice),
bob,
(),
0
));
// Bob现在可以作为Alice的代理执行操作
let call = Box::new(RuntimeCall::Balances(pallet_balances::Call::transfer {
dest: charlie,
value: 10,
}));
assert_ok!(Proxy::proxy(
RuntimeOrigin::signed(bob),
alice,
None,
call
));
// 检查转账是否成功
assert_eq!(Balances::free_balance(&charlie), 10);
});
}
#[test]
fn delayed_proxy_works() {
new_test_ext().execute_with(|| {
// 创建账户
let alice = 1;
let bob = 2;
let charlie = 3;
// 给Alice一些余额
Balances::make_free_balance_be(&alice, 100);
// Alice添加Bob作为她的代理
assert_ok!(Proxy::add_proxy(
RuntimeOrigin::signed(alice),
bob,
(),
0
));
// Bob宣布一个代理操作
let call = Box::new(RuntimeCall::Balances(pallet_balances::Call::transfer {
dest: charlie,
value极链上治理等。
1 回复