当前位置:首页 > 物联网 > 区块链
[导读] 介 绍 在写智能合约时,我倾向于采取引导方式。即使它们旨在用于生产环境,我也使它们尽可能易于理解。我写的智能合约是可重用的,但是通常会针对每个特定的业务案例重新编写智能合约。 在

介 绍

在写智能合约时,我倾向于采取引导方式。即使它们旨在用于生产环境,我也使它们尽可能易于理解。我写的智能合约是可重用的,但是通常会针对每个特定的业务案例重新编写智能合约。

在本文中,我将讨论solidity智能合约中的三种许可方法。讨论这些方法的复杂性从高到低,这是您在项目中应考虑的顺序。 我提供了可用于每种方法的代码。

本文假定您可以轻松地编写智能合约,并使用继承和传递合约地址等功能作为参数。

简单方法— Ownable.sol

OpenZeppelin的Ownable.sol合同必须是最重用的合同之一。它在77行中实现:

1. 断言某人是智能合约所有者的逻辑。

2. 限制函数调用以继承智能合约的所有者的逻辑。

3. 将所有权转移到其他地址的逻辑。

在编写智能合约时,您会经常从Ownable继承。让我们来看一个如何使用Ownable的示例。想象一下,您想在智能合约中保留一个地址列表,但是您想成为唯一可以添加更多地址的列表。可以将其视为您信任的人的注册表。您可以执行以下操作:

contract Whitelist is Ownable {

mapping (address =》 bool) members;

constructor() public Ownable() {

}

function addMember(address _member)

public

onlyOwner

{

members[_member] = true;

}

}

从Ownable继承并在您的Ownable上调用其构造函数可确保将部署智能合约的地址注册为所有者。如果未通过注册为所有者的地址调用,则onlyOwner修饰符会使函数恢复。

部署此智能合约后,只有您或您指定的人可以将新成员添加到其中的列表中。

尽管有用,但很多时候Ownable还不够。 在给定时间只有一个地址可以成为所有者,只有所有者可以决定谁可以成为新所有者,您只能检查您是否是所有者,而不是其他人。

中级复杂方法— Whitelist.sol

Whitelist.sol保留一个地址列表,然后可用于限制功能或任何其他目的。它在功能上与OpenZeppelin的Roles.sol非常相似,尽管有一些重要差异。

Whitelist.sol仅具有三个功能:

funcTIon isMember(address _member) public view returns(bool);

funcTIon addMember(address _member) public onlyOwner;

funcTIon removeMember(address _member) public onlyOwner;

例如通过该智能合约,您可以保留一份已批准的利益相关者列表,这些利益相关者可能是令牌转移的唯一接收者。 您可以执行以下操作:

pragma solidity ^0.5.0;

import “@openzeppelin/contracts/token/ERC20/ERC20.sol”;

import “。./access/Whitelist.sol”;

contract ERC20Whitelisted is ERC20 {

Whitelist whitelist;

constructor(address _whitelistAddress) public {

whitelist = Whitelist(_whitelistAddress);

}

funcTIon transfer(address account, uint256 amount) public {

require(whitelist.isMember(account), “Account not whitelisted.”);

super._transfer(account, amount);

}

}

在上面的示例中,您还可以使ERC20Whitelisted继承自ERC20和Whitelist。 我很乐意讨论一些折衷方案。

简单的白名单功能可能非常强大。OpenZeppelin使用它们实现了许多ERC20和ERC721变体,并设法提供了超出我们大多数人所需的更多功能。在TechHQ,我们也仅使用白名单实施了CementDAO。

但是有时候,白名单也会落空。您可能需要有多个所有者才能拥有白名单。或者您可能需要管理许多重叠的白名单。对于这些情况,我们具有分层的角色合约。

高级复杂方法-RBAC.sol

我们开发了RBAC.sol,旨在提供与现代共享系统一样的多用户功能。

1. 有些角色不过是地址组。

2. 组成员资格只能由某些管理员角色的成员修改。

3. 可以在运行时创建新角色。

4. 可以验证角色成员身份。

在低层,我们使用用户选择的bytes32参数来标识角色。 通常,这些是可识别的短字符串,但是您也可以使用加密的值或地址。

角色本身是一组成员地址和admin角色的标识符。 有趣的是,我们不需要将角色的标识符存储在其自己的结构中。

struct Role {

bytes32 adminRoleId;

mapping (address =》 bool) members;

}

现在有两种方法可以添加新角色并验证角色是否存在:

function roleExists(bytes32 _roleId) public view returns(bool);

function addRole(bytes32 _roleId, bytes32 _adminRoleId) public;

并且管理成员的功能是相同的,只是现在必须指定相关角色:

function isMember(address _member, bytes32 _roleId) public view returns(bool);

function addMember(address _member, bytes32 _roleId) public;

function removeMember(address _member, bytes32 _roleId) public;

仅当调用者属于我们要添加成员的角色的管理员角色时,addMember和removeMember才会成功。

仅当调用者属于将管理所创建角色的角色时,addRole才会成功。

这些简单的规则将允许创建角色的层次结构,然后可将其用于实现具有不同权限级别或区域的复杂多用户平台。

进阶学习

为了进一步深入兔子洞,我建议从OpenZeppelin的这个问题开始。他们的代码库与我们的代码库没有什么不同,即使在我们选择采用其他方法的情况下,您也会发现大多数设计决策的透彻推理。他们在诸如ERC20Mintable之类的合约中使用Roles是一个很好的例子,可以替代Whitelist。

勇敢者的另一个资源是AragonOS ACL合约。界面一眼就可以看出他们决定走得更远:

function hasPermission(address who, address where, bytes32 what,

bytes how) public view returns (bool);

对于我们自己的@ hq20 / contracts包中的示例,我们使用本文中描述的三个级别的访问控制,因此,您也应该注意这一点。

结 论

对于智能合约的实现,最好仅实现所需的复杂性,而无需再实现任何复杂性。 在许可方面,存在三种不同的复杂性级别:

· 单用户

· 用户群

· 用户组的层次结构

您可以将Ownable.sol用于单个用户允许的系统。 您可以将@ openzeppelin/Roles.sol或@ hq20/Whitelist.sol用于需要组中权限用户的系统。对于需要组层次结构的系统,我们过去已成功使用@ hq20/RBAC.sol。

您将有自己的要求,并且需要权衡取舍。了解每个实现背后的设计决策将使您可以使用现有合约,也可以修改合约以供自己使用。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

区块链是目前最有前途的技术趋势之一,在广泛的用例中具有很大的潜力。它基本上是数据库的分布式加密变体,可以解决与在线安全和信任有关的不同问题。虽然许多人将区块链与比特币等加密货币联系在一起,但它在供应链管理和防止身份盗窃以...

关键字: 区块链 智能合约 NFT

区块链能通过严格的身份核验机制和密码学的数据加密机制确保整个智慧城市系统建设的终端安全。每一个终端设备都将拥有自身的公私钥对,区块链系统通过智能合约来维护一张终端身份名单,并审核是否该设备有权接入节点并将数据上传,从而避...

关键字: 区块链 智慧医疗 智能合约

宝尊旗下全资子公司White Horse Hongkong Holding Limited与Gap Inc.及Gap (UK Holdings) Limited达成股份购买协议,以收购全面负责运营Gap大中华区业务的两家...

关键字: HOLDING LIMIT WHITE HORSE

区块链技术对电子数据证据认定的作用,即对电子证据“三性”的影响,首先在于对电子证据真实性的判定所产出的显著影响。此外,对于某些业务类型,诸如证据在链上形成并同步存储的情形,该系统对于证明所存证据的合法性和关联性也具有一定...

关键字: 区块链 电子数据 智能合约

伦敦2022年9月8日 /美通社/ -- 欧洲领先的另类投资管理公司LCM Partners今天宣布,任命Roger Kibble-White为集团首席财务官。  Roger作为首席财务官在投资行业拥有丰富经...

关键字: RS GE BSP WHITE

全程线上办理、无人签字确认的“网贷”合同,法官如何查明真伪?当“区块链”技术遇到“云庭智审”,将会碰撞出怎样的火花?近日,山东省威海市环翠区人民法院金融审判庭开庭审理了这样一起特殊的案件。

关键字: 区块链 智能合约 互联网

智能化是酒店业未来不可避免的趋势。智能客房、机器人服务、大数据等方向持续成为行业热点,而区块链将伴随智能化“颠覆”各大传统行业。互联网将使得全球之间的互动越来越紧密,伴随而来的就是巨大的信任鸿沟。

关键字: 区块链 机器人 智能合约

两年前,“区块链”开始广泛的出现在众人视野中,而近段时间它的发展比较缓慢,很多区块链企业并无所作为,但国家却在今年两会中高度重视区块链,与人工智能共同视为互联网的重要发展对象,其影响已开始显现在各个行业当中,虽然我们看到...

关键字: 区块链 互联网 智能合约

当区块链行业的发展进入到深水区,它的底层的驱动力同样正在发生着一场深刻变革。以往,提及区块链,我们首先想到的是,如何借助创新的商业模式来引发资本市场的关注,继而借助资本的力量发展;现在,提及区块链,我们首先想到的是,如何...

关键字: 区块链 互联网 智能合约

(全球TMT2022年4月27日讯)SK海力士发布截至2022年3月31日的2022财年第一季度财务报告。公司2022财年第一季度结合并收入为12.156万亿韩元,营业利润为2.860万亿韩元,净利润为1.983万亿韩...

关键字: SK海力士 DRAM NAND SOLID
关闭
关闭