Alert Source Discuss
🚧 Stagnant Standards Track: ERC

ERC-1753: 许可证智能合约接口

Authors Lucas Cullen (@BitcoinBrisbane), Kai Yeung (@CivicKai), Anna Crowley <annaelizabethcrowley@gmail.com>, Caroline Marshall <caroline.marshall888@gmail.com>, Katrina Donaghy <katrina@civicledger.com>
Created 2019-02-06

摘要

本以太坊改进提案 (EIP) 提出了一个用于颁发许可证、许可和授权 (许可证) 的以太坊标准。

许可证是一种有限且临时的授权,授予自然人(例如,你)或法人(例如,公司),以从事根据法律框架原本不合法的行为。公共许可证由政府直接(例如,澳大利亚新南威尔士州主要产业部)或间接(例如,在政府授权下运营的代理机构)授予,并从立法中获得授权,尽管这通常通过授权立法(如法规)来实现。这可以与私人许可证形成对比 - 例如,您授予进入您财产的访客的许可证。

许可证具有以下属性:

  • 亲自授予被许可人(Licencee),尽管它可以转让给另一个人或公司;
  • 授予被许可人临时的权利,以拥有、使用或做某些原本会被禁止的事情,而不授予对基础事物的任何财产权益。例如,您可能被授予参观国家公园的许可证,而不会获得对公园本身的任何所有权;
  • 允许负责许可证的政府机构修改、撤销、更新、暂停或拒绝颁发许可证,或对不合规行为施加条件或处罚;以及
  • 通常仅在支付费用或满足某些标准后才颁发。

此外,许可证可以针对某些信息授予。例如,许可证可以针对车辆登记号码颁发,并附加到该特定登记车辆。

动机

政府负责许可证的颁发和管理。然而,维护和共享这些数据可能很复杂且效率低下。许可证的授予通常需要提交纸质申请表,手动监督适用的立法,并将数据输入注册表,以及颁发纸质许可证。如果个人希望查看许可证注册表上的信息,他们通常需要到政府办公室,并填写更多纸质查询表格,才能访问该数据(如果公开可用)。

本 EIP 旨在定义一个标准,该标准将允许通过以太坊智能合约授予和/或管理许可证。从本质上讲,其动机是解决当前许可系统中固有的低效率问题。

规范

方法

注意:

  • 以下规范使用 Solidity 0.4.17(或更高版本)的语法
  • 调用者必须处理从 returns (bool success) 返回的 false。调用者不得假设永远不会返回 false

name

返回许可证的名称 - 例如"MyPermit"

function name() public view returns (string);

totalSupply

返回许可证的总供应量。

function totalSupply() public view returns (uint256);

grantAuthority

将一个以太坊地址添加到有权修改许可证的地址白名单中。

function grantAuthority(address who) public;

revokeAuthority

从有权修改许可证的地址白名单中移除一个以太坊地址。

function revokeAuthority(address who) public;

hasAuthority

检查该地址是否具有授予或撤销许可证的权限。

function hasAuthority(address who) public view;

issue

在指定的日期范围内向一个以太坊地址颁发许可证。

function issue(address who, uint256 validFrom, uint256 validTo) public;

revoke

从一个以太坊地址撤销许可证。

function revoke(address who) public;

hasValid

检查一个以太坊地址是否具有有效的许可证。

function hasValid(address who) external view returns (bool);

purchase

允许用户自行购买许可证。

function purchase(uint256 validFrom, uint256 validTo) external payable;

理由

使用智能合约来申请、更新、暂停和撤销许可证将释放急需的政府资源,并允许更有效地管理许可证。本 EIP 还旨在改善许可证系统的最终用户体验。在开放政府时代,人们也越来越期望个人能够轻松访问许可证注册表,并且该过程将是透明和公平的。

通过创建 EIP,我们希望增加基于以太坊的许可证的使用,这将解决这些问题。

以太坊区块链适用于各种许可证和政府机构。它也很容易翻译成其他语言,并且可以被世界各地的其他政府机构使用。此外,在政府数据泄露量不断增加的时期,区块链将更有效地保护许可证持有者数据的隐私。

本 EIP 是在审查了澳大利亚国家和州一级的多项许可法规后制定的。审查允许识别通用许可证要求和标准,以便纳入 EIP。我们已将这些内容包含在拟议的标准中,但希望获得有关这些标准是否足够和通用的反馈。

测试用例

许可证的一个真实世界的例子是,根据《2000 年环境保护和生物多样性保护条例 (联邦)》(EPBC 法案) 和《2000 年环境保护和生物多样性保护条例》(条例),在澳大利亚国家公园(例如,澳大利亚北部地区的卡卡杜国家公园)露营所需的许可。根据 EPBC 法案和条例,国家公园管理局局长负责监督露营许可系统,该系统旨在帮助规范国家公园内的某些活动。如果申请人满足某些条件,则可以将允许进入国家公园的许可证颁发给法人或自然人。

可以在以下网址访问卡卡杜国家公园露营的当前数字门户和申请表(申请):https://www.environment.gov.au/system/files/resources/b3481ed3-164b-4e72-a9f8-91fc987d90e7/files/kakadu-camping-permit-form-19jan2015-pdf.pdf

用户在提出申请时必须提供以下详细信息:

  • 将向其颁发许可证的每个人的全名和联系方式;

  • 如果申请人是公司或其他法人团体:

o 公司或法人团体的名称、营业地址和邮寄地址;

o 如果申请人是一家公司 -

  • 公司每位董事的全名;

  • 完成申请表的人员的全名和联系方式;

  • 公司或其他法人团体的 ACN 或 ABN(如果适用);

  • 拟议露营目的的详细信息(例如,私人露营、学校团体等);

  • 露营的开始日期和持续时间(最长持续时间由法律规定);

  • 露营者人数(最多允许人数由法律规定);

  • 并非颁发许可证所必需的所有其他必需信息(例如,露营者的任何特殊医疗需求);以及

  • 应付费用,具体取决于场地、持续时间和露营者人数。

条例还规定了许可证持有者在颁发许可证后必须满足的许多条件。条例允许国家公园管理局局长取消、续签或转让许可证。上述工作流程可以通过智能合约更好地执行。

作为该过程一部分所需的主要标准构成了拟议的以太坊标准的一部分。通过考虑根据《1994 年渔业管理法 (新南威尔士州)》(渔业法) 制定的《2010 年渔业管理 (通用) 条例 (新南威尔士州)》(渔业条例) 第 8 部分“许可和其他商业渔业管理”颁发的商业捕鱼许可证,我们已经检查了这种方法。

实现

许可证的颁发和所有权可以在以太坊区块链上以数字方式表示。

智能合约可用于将与区块链中相关许可证相关的监管要求嵌入其中。许可证将以电子方式提供,以令牌的形式。例如,这可以通过 QR 码实际表示,显示当前的许可证信息。许可证的数字表示形式将存储在数字钱包中,通常是智能手机或平板电脑上的应用程序。拟议的标准允许颁发机构或监管机构不时修改、撤销或拒绝许可证,其决定的结果几乎实时地反映在许可证令牌中。因此,许可证持有人将几乎立即收到有关其许可证的任何修改、撤销或问题的通知。

接口

Solidity 示例

interface EIP1753 {
	
	function grantAuthority(address who) external;
	function revokeAuthority(address who) external;
	function hasAuthority(address who) external view returns (bool);
	
	function issue(address who, uint256 from, uint256 to) external;
	function revoke(address who) external;
	
	function hasValid(address who) external view returns (bool);
	function purchase(uint256 validFrom, uint256 validTo) external payable;
}

pragma solidity ^0.5.3;

contract EIP is EIP1753 {

	string public name = "Kakadu National Park Camping Permit"; // 卡卡杜国家公园露营许可证
	uint256 public totalSupply;

	address private _owner;
	mapping(address => bool) private _authorities;
	mapping(address => Permit) private _holders;
	
	struct Permit {
		address issuer;
		uint256 validFrom;
		uint256 validTo;
	}
	
	constructor() public {
		_owner = msg.sender;
	}
	
	function grantAuthority(address who) public onlyOwner() {
		_authorities[who] = true;
	}
	
	function revokeAuthority(address who) public onlyOwner() {
		delete _authorities[who];
	}
	
	function hasAuthority(address who) public view returns (bool) {
		return _authorities[who] == true;
	}
	
	function issue(address who, uint256 start, uint256 end) public onlyAuthority() {
		_holders[who] = Permit(_owner, start, end);
		totalSupply += 1;
	}
	
	function revoke(address who) public onlyAuthority() {
		delete _holders[who];
	}
	
	function hasValid(address who) external view returns (bool) {
	    return _holders[who].validFrom > now && _holders[who].validTo < now;
	}

	function purchase(uint256 validFrom, uint256 validTo) external payable {
	    require(msg.value == 1 ether, "Incorrect fee"); // 不正确的费用
	    issue(msg.sender, validFrom, validTo);
	}
	
	modifier onlyOwner() {
		require(msg.sender == _owner, "Only owner can perform this function"); // 只有所有者才可以执行此功能
		_;
	}
	
	modifier onlyAuthority() {
		require(hasAuthority(msg.sender), "Only an authority can perform this function"); // 只有授权人才能执行此功能
        _;
	}
}

版权

Copyright and related rights waived via CC0.

Citation

Please cite this document as:

Lucas Cullen (@BitcoinBrisbane), Kai Yeung (@CivicKai), Anna Crowley <annaelizabethcrowley@gmail.com>, Caroline Marshall <caroline.marshall888@gmail.com>, Katrina Donaghy <katrina@civicledger.com>, "ERC-1753: 许可证智能合约接口 [DRAFT]," Ethereum Improvement Proposals, no. 1753, February 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1753.