30.Solidity-modifier_3

本文展示了一个使用Solidity编写的智能合约示例,重点介绍了如何利用modifier来增强代码的重用性和拓展性。示例中定义了不同级别的访问控制,并应用于修改合约状态的函数。
 pragma solidity 0.8.0;

 contract modifierTest{
    uint public level = 10;
    string public name;
    uint public Dna;
函数的modifier是可以有参数的
modifier controllevel(uint needlevel){
    require(level > = needlevel);
    _;
}
使用modifier。增加代码的重用性和拓展性
    function changeName()public controllevel(2){
       // require(level >= 2);
        name = "csb";
    }
    function changeDna()public controllevel(10){
        //require(level >=10);
        Dna= 999;
    }
 }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; contract PermissionSystem { // 角色枚举 enum Role { None, Breeder, // 养殖场 Processor, // 加工厂 Logistics, // 物流商 Consumer, // 消费者 Admin // 系统管理员 } // 权限枚举 enum Permission { SubmitBreedData, // 提交养殖数据 ReadOwnHistory, // 读取自身历史记录 SubmitBatchData, // 提交生产批次数据 ProvideInspectionReport, // 提供质检报告 TriggerStatusChange, // 触发"可出厂"状态变更 UpdateTransportInfo, // 更新运输节点信息 QueryTraceability, // 查询产品溯源 ManageRoles, // 角色管理 EmergencyFreeze, // 紧急冻结批次 UpgradeContract // 合约升级 } // 角色-权限映射 mapping(Role => Permission[]) private _rolePermissions; // 用户-角色映射 mapping(address => Role) private _userRoles; // 事件定义 event RoleUpdated(address indexed user, Role role); event ContractUpgraded(); constructor() { _initializePermissions(); // 部署者自动获得 Admin 角色 _userRoles[msg.sender] = Role.Admin; } // 初始化权限配置 function _initializePermissions() private { _rolePermissions[Role.Breeder] = [ Permission.SubmitBreedData, Permission.ReadOwnHistory ]; _rolePermissions[Role.Processor] = [ Permission.SubmitBatchData, Permission.ProvideInspectionReport, Permission.TriggerStatusChange ]; _rolePermissions[Role.Logistics] = [ Permission.UpdateTransportInfo ]; _rolePermissions[Role.Consumer] = [ Permission.QueryTraceability ]; _rolePermissions[Role.Admin] = [ Permission.ManageRoles, Permission.EmergencyFreeze, Permission.UpgradeContract ]; // 明确初始化 None 角色为空权限数组 _rolePermissions ; } // 权限校验修饰符 modifier hasPerm(Permission perm) {
03-28
<think>好的,我需要回答用户关于在Solidity智能合约中实现基于角色的访问控制(RBAC)和权限校验机制的问题。首先,我得回忆一下Solidity的基本语法和RBAC的常见实现方式。RBAC通常涉及角色分配和权限检查,比如管理员、普通用户等不同角色有不同的访问权限。 用户需要一个具体的例子,所以应该提供一个简单的合约结构,包含角色定义、权限分配和修饰器用于权限检查。可能还需要提到事件记录,比如角色变更时触发事件,这样符合区块链的透明性原则。 首先,定义一个枚举来表示不同的角色,比如管理员、操作员和普通用户。然后,使用映射来记录每个地址对应的角色。接下来,创建修饰器来检查调用者是否拥有特定角色,如果没有则回滚交易。此外,需要函数来授予和撤销角色,这些函数应该只能由管理员调用,所以这些函数本身也需要权限控制。 需要注意的是,在Solidity中,函数修饰器可以简化权限检查的代码,避免重复编写require语句。另外,构造函数中应该将合约部署者设为初始管理员,确保系统有一个起点。 可能还需要考虑扩展性,比如添加更多角色或权限层次结构。但用户的问题主要是基础实现,所以保持简单明了。最后,应该生成相关问题,比如如何优化Gas消耗、如何扩展角色系统或如何处理权限继承,这些能帮助用户进一步探索。 检查一下代码是否符合Solidity语法,比如使用0.8.0以上的版本,正确使用修饰器,事件定义和触发是否正确。确保权限函数中的修饰器应用正确,比如grantRole和revokeRole只能由管理员调用。 总结步骤:定义角色、存储角色、修饰器检查、角色管理函数、事件记录。然后编写示例代码,确保每个部分都清晰,并添加注释说明。最后生成相关问题,覆盖实现细节、优化和扩展方向。</think>### 基于角色的访问控制(RBAC)在Solidity中的实现 #### 1. 角色定义与存储 首先定义角色类型并存储角色分配关系: ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract RBAC { enum Role { NONE, ADMIN, OPERATOR, USER } mapping(address => Role) private _roles; event RoleGranted(address indexed account, Role role); event RoleRevoked(address indexed account, Role role); constructor() { _roles[msg.sender] = Role.ADMIN; // 部署者初始化为管理员[^1] } } ``` #### 2. 权限校验修饰器 使用修饰器进行权限验证: ```solidity modifier onlyRole(Role role) { require(_roles[msg.sender] == role, "RBAC: forbidden"); _; } ``` #### 3. 角色管理函数 实现角色分配/撤销逻辑: ```solidity function grantRole(address account, Role role) external onlyRole(Role.ADMIN) { require(role != Role.NONE, "Invalid role"); _roles[account] = role; emit RoleGranted(account, role); } function revokeRole(address account) external onlyRole(Role.ADMIN) { delete _roles[account]; emit RoleRevoked(account); } ``` #### 4. 业务函数权限控制 在具体业务函数中添加权限控制: ```solidity function sensitiveOperation() external onlyRole(Role.OPERATOR) { // 只有操作员可执行 } function userAction() external onlyRole(Role.USER) { // 普通用户可执行 } ``` #### 5. 权限校验扩展 对于复杂权限需求,可组合多个修饰器: ```solidity modifier eitherRole(Role role1, Role role2) { require(_roles[msg.sender] == role1 || _roles[msg.sender] == role2, "RBAC: invalid role"); _; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值