合约中一般会有多种针对不同数据的操作:例如对于存证内容的增加、更新及查询,若不进行一套符合要求的权限控制,事实上整个合约在真实环境下是没有多少使用价值的。那么应当如何对合约的权限进行划分?我们针对Solidity语言来寻找其对应的解决方案。

一、通过地址标记解决方案

传统的数据库方式是将不同的接口进行区分标记,同时将不同角色所拥有的不同接口权限进行标记,存入数据库当中。Solidity由于本身语法能力限制不能实现较为复杂的功能。类似于Linux文件系统的操作权限,我们可以使用0和1来区分当前角色是否对该接口拥有操作权限,同时将值进行排序,组合出不同的uint代表不同的权限。例如:对当前存证内容的可更新权限及对当前存证内容可查询权限我们将其排序可以得到权限0、1、2、3四种不通过权限,二进制00、01、10和11,分别代表不可更新不可查询、不可更新可查询、可更新不可查询及可更新可查询这四种不同权限。当权限种类较少的情况下完全可以使用这种方式,用uint对不同权限值进行映射(得到权限uint字段)。之后我们对每个具体人(address)映射对应的权限字段【mapping(address => uint)】。对于一个存证内容,我们可能需要分配多个不同人物不同权限,因此不同地址可以对应不同权限,当前该存证内容应当包含拥有1、2、3三种不同权限的所有用户address,未出现address默认权限值为0。同时我们还可以对该存证内容某些权限进行开放例如:将查询权限完全开放,任何人都可以拥有查询权限即一个基础默认权限01,所有的address拥有的权限与该权限进行  |   的位运算操作得到真实操作权限。

设计数据结构:

uint count;                           //用以计数当前非0权限用户个数

mapping(uint => mapping(address => uint)) Priviledge;      //通过映射方式来实现权限标记

使用该种方法的缺点是需要对每个用户权限进行分配,事实上也可以将分配权限这个任务也作为一个权限,分配给不同的用户进行操作【包括分配权限,去除权限等】,整体可能较为复杂。

二、通过密码解决方案

可以对当前查找及更新操作进行密码标记,使用不同密码代表拥有不同的权限,同时对于密码设置可修改操作。从使用上而言方便创建者仅仅只需要通过一次密码或少数密码就可以为多数角色进行权限分配,但是可能存在密码泄露及密码遗忘等不可控原因。主要还是看合约在具体使用时对于安全性的要求及是否会使用到账户等具体实现情况。

三、其他玩法

如密码加address绑定,这样子的好处是不同进行address的传递,直接由当前用户进行权限激活即可,一个密码仅仅只能使用一次,这里需要一个记录。

Solidity合约记录——(三)如何在合约中对操作进行权限控制的更多相关文章

  1. Java继承多态中的方法访问权限控制

    java中的方法天生具有继承多态特性,这点与C++有很大不同(需要在父类方发上加virtual关键字),但用起来确实方便了许多. 最简单的继承多态 声明一个接口BaseIF,只包含一个方法声明 pub ...

  2. MongoDB3.x中添加用户和权限控制

    现在需要创建一个帐号,该账号需要有grant权限,即:账号管理的授权权限.注意一点,帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth) ? 1 2 3 4 5 6 7 8 9 10 ...

  3. PHP中多IP段权限控制方案

    在某些项目中我们可能会用到根据IP段进行权限校验,比如不在我们配置的IP段内的用户访问某些页面或功能模块时,将提示其权限不够并禁止访问该页面的内容.鉴于项目中需求各异,下面只说下大致思路以及我个人的实 ...

  4. java中使用二进制进行权限控制

    基本概念 package test; publicclass Rights { publicstaticvoid main(String[] args) { int a=1; // 001 状态a i ...

  5. <实训|第九天>掌握linux中普通的权限控制和三种特殊的权限(sst),做合格的运维工程师

    linux中,权限的学习是必不可少的,不论是作为一名运维工程师或者是单一的管理者,学习好linux中的权限控制,你就可以保护好自己的隐私同时规划好你所管理的一切. 权限的学习是很多的,不要认为自己已经 ...

  6. django中的权限控制(form增删改)

    Django默认提供了权限控制,但只能对使用了其自带的登录认证的用户进行权限控制,说白了就是只能对存储在auth_user表中的用户进行权限控制,但不能对未登录过的用户进行权限控制.但如果通过集成LD ...

  7. 用solidity语言开发代币智能合约

    智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...

  8. 第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约

    智能合约是以太坊的核心之一,用户可以利用智能合约实现更灵活的代币以及其他DApp.不过在深入讲解如何开发智能合约之前,需要先介绍一下以太坊中用于开发智能合约的Solidity语言,以及相关的开发和测试 ...

  9. 以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明

    以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明 为了让你的Ðapp运行上以太坊,一种选择是使用web3.js library提供的web3.对象.底层实 ...

随机推荐

  1. Includes() vs indexOf() in JavaScript

    碰到一个问题, 部分机器网页数据源不正常, 简单排查发现是使用了较新的Array.includs 方法. 查了下兼容性, chrome 需要47版本以后支持, 客户机果然是很久的43版本. 用Arra ...

  2. 配置iis支持json解析,配置ssi

    配置json解析: 添加mime:*.json  类型 text/json 安装iis应用程序开发中的asp功能 添加处理程序映射: 添加脚本映射 请求路径:*.json 可执行文件:C:\Windo ...

  3. (转)EF5+SQLserver2012迁移到EF6+mysql5.5.47

    原文地址:https://www.cnblogs.com/tinyjian/p/6235014.html:https://www.cnblogs.com/tinyjian/p/6235397.html ...

  4. jsp jstl quote symbol expected

    org.apache.jasper.JasperException: /WEB-INF/jsp/user/index.jsp (line: 2, column: 27) quote symbol ex ...

  5. android toolbar使用记录

    1.打开Project structure,选择app modules,切换到Dependencies添加com.android.support.design.26.0.0.alpha1 2.在lay ...

  6. RestExpress response中addHeader 导致stackOverflow

    问题描述: 最近在项目使用中要在restExpress的header中增加一个键值对,同事在使用的时候没有对header的value进行非空判断,于是在测试环境测试的时候就出现了一个异常

  7. leetcode55

    bool canJump(vector<int>& nums) { ]; ; i < nums.size() && reach >= i; i++) { ...

  8. django-celery使用

    1.新进一个django项目 - proj/ - proj/__init__.py - proj/settings.py - proj/urls.py - manage.py 2.在该项目创建一个pr ...

  9. json.dump和json.dumps区别,json.load和json.loads的区别

    dumps是将python类型(list,dict等)转化成str格式,loads是将str转化成python类型(list,dict等). dump和load也是类似的功能,只是与文件操作结合起来了 ...

  10. Jenkins安装时Web页面报错提示离线安装

    先跳过所有. 方法1 先看它的提示:”参考离线Jenkins安装文档“发现链接点不开,我还以为是被墙了呢,FQ以后还是打不开.看来这个参考文档是没有用滴.点击配置HTTP代理跳出如下界面:安装Jenk ...