合约中一般会有多种针对不同数据的操作:例如对于存证内容的增加、更新及查询,若不进行一套符合要求的权限控制,事实上整个合约在真实环境下是没有多少使用价值的。那么应当如何对合约的权限进行划分?我们针对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. weex Mac创建项目

    序言:本来在win 10 上创建项目真的很顺利!后来入手一个mac就从mac 上下载了最新的android studio开始搞起了weex,问题来了,weex-toolkit脚手架还是老的,我觉得是w ...

  2. leetcode14:最长公共字符串

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...

  3. django之 使用py文件操作django项目中的表

    要想在一个另外的py文件中操作django,可以使用如下的代码 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE",' ...

  4. sysctl-p报错:error: "net.bridge.bridge-nf-call-ip6ta

    1.刚配置完sysctl,加载时报错:[root@itpux1 yum.repos.d]# sysctl -pnet.ipv4.ip_forward = 0net.ipv4.conf.default. ...

  5. python函数作用域,嵌套函数,闭包

    函数作用域                                                                                                ...

  6. 与引导文件系统/vmfs/devices..的备用设备之间的连接已丢失,主机配置更改将不会保存到持久存储中

    Cisco UCS 刀片服务器与NETAPP存储 1.异常问题描述: 2.可能原因:存储链路异常     比如断电恢复.光纤线本身的问题.模块的问题.环境温度的问题.bug之类的都有可能 3.处理: ...

  7. jq动画分析1

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. STS(eclipse)3.7.3新建项目报错:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration)

    烦人的版本兼容问题 没有使用sts3.7.3系统内嵌的maven3.3.3,调整为稍高版本的maven3.5.2,懒得修改配置了. 升级eclipse插件吧. Eclipse,Help -> I ...

  9. input设置背景透明、placeholder的字体颜色及大小

    1.设置input背景透明: background:rgba(255,255,255,0.1); 前面三个参数为对应的rgb数值,第四个参数为透明度:0~1,0:透明,1:不透明: 2.设置input ...

  10. CSS 图像居中对齐

    CSS  图像居中对齐 我们在<CSS 内外边距>学过内容居中,它的原理是将外边左右设置为auto.图像居中也是这个原理. 示例 <!DOCTYPE html> <htm ...