Alert Source Discuss
⚠️ Review Standards Track: ERC

ERC-7750: 去中心化雇佣系统

一个记录雇佣历史的雇佣系统。

Authors James Savechives (@jamesavechives) <james.walstonn@gmail.com>
Created 2024-08-04

摘要

本 ERC 提出了一种构建在以太坊区块链上的去中心化雇佣系统(DES)。该 DES 促进了公司的创建和管理,通过唯一的员工代币记录了全面的雇佣历史,能够形成和执行劳动合同,通过托管机制自动支付工资,整合了一个强大的仲裁系统以解决争议,并为雇主和雇员都实施了基于声誉的审查系统。通过利用区块链的透明性和不可变性,DES 确保了从公司创建和招聘到合同履行和终止的整个雇佣生命周期中的责任和信任。

该系统在员工测试之后以及最终招聘和合同签订之前运行。员工拥有一个代表他们雇佣历史的 Soulbound Token (SBT),公司在最终确定劳动合同之前会审查该代币。这种基于代币的方法确保了安全且可验证的雇佣记录,从而提高了招聘过程的完整性。

动机

传统的雇佣系统是中心化的、不透明的,并且常常缺乏信任。DES 旨在通过利用区块链技术,将透明性、不可变性和信任引入到雇佣过程中。通过在链上记录雇佣历史、实现去中心化的公司创建、自动执行合同以及提供争议解决机制,DES 促进了一个更公平和透明的雇佣生态系统。此外,该系统通过安全地管理雇佣记录和自动化合同义务来简化招聘流程。

规范

Solidity 接口

为了给开发者提供一种清晰和标准化的方式与DES进行交互,以下Solidity接口概述了系统的主要功能和事件:

pragma solidity ^0.8.0;

/// @title Decentralized Employment System Interface
interface IDecentralizedEmploymentSystem {
    
    // Events
    event CompanyRegistered(uint companyId, address owner, string name, string industry);
    event EmployeeTokenMinted(uint tokenId, address employee);
    event ContractCreated(uint contractId, uint companyId, uint employeeTokenId, uint salary, uint duration);
    event ContractExecuted(uint contractId);
    event SalaryDeposited(uint contractId, uint amount);
    event SalaryReleased(uint contractId, address employee);
    event DisputeRaised(uint contractId, address raisedBy);
    event DisputeResolved(uint contractId, bool decisionForEmployee);
    event ContractTerminated(uint contractId, string reason);
    event ReviewSubmitted(uint contractId, uint rating, string comments);
    
    // Company Management
    function registerCompany(string calldata name, string calldata industry) external returns (uint companyId);
    function getCompany(uint companyId) external view returns (string memory name, string memory industry, address owner, uint[] memory employeeIds);
    
    // Employee Management
    function mintEmployeeToken(address employee, string calldata metadataURI) external returns (uint tokenId);
    function getEmploymentHistory(uint employeeTokenId) external view returns (uint[] memory contractIds);
    
    // Labor Contracts
    function createContract(uint companyId, uint employeeTokenId, uint salary, uint duration, string calldata responsibilities, string calldata terminationConditions) external returns (uint contractId);
    function executeContract(uint contractId) external;
    
    // Payment System
    function depositSalary(uint contractId) external payable;
    function releaseSalary(uint contractId) external;
    
    // Dispute Resolution
    function raiseDispute(uint contractId) external;
    function resolveDispute(uint contractId, bool decisionForEmployee) external;
    
    // Contract Termination
    function terminateContract(uint contractId, string calldata reason) external;
    
    // Review System
    function submitReview(uint contractId, uint rating, string calldata comments) external;
    function getReviews(uint contractId) external view returns (Review[] memory);
    
    // Structures
    struct Review {
        uint rating;
        string comments;
        address reviewer;
    }
}

详细功能规范

1. 公司管理

a. 公司注册

  • 函数: registerCompany(string calldata name, string calldata industry) external returns (uint companyId)

  • 描述: 允许用户在区块链上注册一家新公司。每个公司被分配一个唯一的 companyId,并与调用者的地址关联作为所有者。

  • 参数:
    • name: 公司的名称。
    • industry: 公司的行业部门。
  • 返回:
    • companyId: 已注册公司的唯一标识符。

b. 检索公司资料

  • 函数: getCompany(uint companyId) external view returns (string memory name, string memory industry, address owner, uint[] memory employeeIds)

  • 描述: 检索已注册公司的资料详情,包括其名称、行业、所有者地址以及关联的员工代币 ID 列表。

  • 参数:
    • companyId: 公司的唯一标识符。
  • 返回:
    • name: 公司的名称。
    • industry: 公司的行业部门。
    • owner: 公司所有者的以太坊地址。
    • employeeIds: 与公司关联的员工代币 ID 数组。

2. 员工管理

a. 员工代币化

  • 函数: mintEmployeeToken(address employee, string calldata metadataURI) external returns (uint tokenId)

  • 描述: 铸造代表员工的 Soulbound Token (SBT)。该代币包含关于员工的元数据,例如专业证书,这些数据存储在链下并通过 metadataURI 引用。

  • 参数:
    • employee: 员工的以太坊地址。
    • metadataURI: 指向员工元数据的 URI。
  • 返回:
    • tokenId: 员工代币的唯一标识符。

b. 检索雇佣历史

  • 函数: getEmploymentHistory(uint employeeTokenId) external view returns (uint[] memory contractIds)

  • 描述: 通过返回关联的 contractIds 数组,获取员工的完整雇佣历史。

  • 参数:
    • employeeTokenId: 员工代币的唯一标识符。
  • 返回:
    • contractIds: 代表员工雇佣历史的合同 ID 数组。

3. 劳动合同

a. 合同创建

  • 函数: createContract(uint companyId, uint employeeTokenId, uint salary, uint duration, string calldata responsibilities, string calldata terminationConditions) external returns (uint contractId)

  • 描述: 使公司能够与员工创建新的劳动合同。此函数将唯一的 contractId 分配给合同。

  • 参数:
    • companyId: 发起合同的公司的唯一标识符。
    • employeeTokenId: 员工代币的唯一标识符。
    • salary: 合同期限内约定的工资。
    • duration: 合同期限,以月为单位。
    • responsibilities: 员工职责的描述。
    • terminationConditions: 可以终止合同的条件。
  • 返回:
    • contractId: 新创建合同的唯一标识符。

b. 合同执行

  • 函数: executeContract(uint contractId) external

  • 描述: 通过将合同标记为活动状态来激活合同,一旦公司和员工都同意通过使用各自的钱包签署交易来同意条款。

  • 参数:

    • contractId: 要执行的合同的唯一标识符。

4. 支付系统

a. 工资存款

  • 函数: depositSalary(uint contractId) external payable

  • 描述: 允许公司将约定的工资存入合同的托管账户。该函数确保存入的金额与合同的工资相符。

  • 参数:
    • contractId: 要存入工资的合同的唯一标识符。
  • Payable: 是的,该函数是 payable 的,可以接受工资资金。

b. 自动支付

  • 函数: releaseSalary(uint contractId) external

  • 描述: 根据合同的支付时间表或合同完成时,将工资从托管账户释放到员工的地址。

  • 参数:

    • contractId: 要释放工资的合同的唯一标识符。

5. 争议解决

a. 争议启动

  • 函数: raiseDispute(uint contractId) external

  • 描述: 允许合同中的任何一方启动争议。此操作会触发分配仲裁员来解决问题。

  • 参数:

    • contractId: 有争议的合同的唯一标识符。

b. 争议解决

  • 函数: resolveDispute(uint contractId, bool decisionForEmployee) external

  • 描述: 使指定的仲裁员可以通过做出决定来解决争议。如果该决定有利于员工,则相应地转移托管资金;否则,它们可能会返回给公司。

  • 参数:

    • contractId: 正在争议中的合同的唯一标识符。
    • decisionForEmployee: 布尔值,指示该决定是否有利于员工。

6. 合同终止

a. 终止条件

  • 函数: terminateContract(uint contractId, string calldata reason) external

  • 描述: 允许公司基于预定义的条件终止合同。此函数将合同状态更新为“已终止”。

  • 参数:

    • contractId: 要终止的合同的唯一标识符。
    • reason: 终止的原因。

7. 审查系统

a. 提交审查

  • 函数: submitReview(uint contractId, uint rating, string calldata comments) external

  • 描述: 使公司和员工都能够在合同结束后提交审查。审查包括评分和评论,有助于提高双方的声誉分数。

  • 参数:

    • contractId: 正在审查的合同的唯一标识符。
    • rating: 反映体验的数字评分。
    • comments: 关于合同的详细反馈。

b. 检索审查

  • 函数: getReviews(uint contractId) external view returns (Review[] memory)

  • 描述: 检索与特定合同关联的所有审查。

  • 参数:
    • contractId: 要获取其审查的合同的唯一标识符。
  • 返回:
    • Review[]: 与合同相关的审查数组。

雇佣历史

  1. 不可变的记录:雇佣历史被维护为链接到每个员工的 Soulbound Token (SBT) 的合同 ID 数组。这确保了所有雇佣记录都永久且不可变地存储在区块链上。

  2. 公共可访问性:雇佣历史数据可以通过 getEmploymentHistory 函数公开访问,允许公司在最终确定合同之前验证员工的过去参与情况。

支付系统

  1. 工资存款:公司通过调用 depositSalary 将工资存入由智能合约管理的托管账户。该合约确保资金安全地持有,直到满足支付条件。

  2. 自动支付:工资会自动释放或在触发 releaseSalary 函数时释放,从而确保及时且基于条件的员工支付。

仲裁与争议解决

  1. 争议发起和解决:任何一方都可以提出争议,然后由指定的仲裁员解决。仲裁员充当公正的仲裁员,以确保基于合同条款和提供的证据的公平结果。

解雇员工

  1. 终止条件:公司可以根据预定义的条件终止合同,如果对终止提出异议,可以选择争议解决。

审查系统

  1. 声誉分数:审查有助于提高公司和员工的声誉分数,从而在生态系统中培养责任感并鼓励积极行为。

理由

  1. 员工代币化
    • 使用 Soulbound Tokens (SBTs) 来代表员工,确保每个员工在区块链上都有一个唯一的、不可转让的身份。这种设计选择增强了雇佣记录的完整性,使其防篡改且可验证。它还允许公司在最终确定合同之前访问全面的雇佣历史,从而提高透明度。
  2. 工资支付的托管系统
    • 实施托管机制可以确保工资支付的安全,确保只有在满足合同义务时才释放资金。该系统通过保证工资可用并且支付取决于合同的履行来保护员工和公司。
  3. 仲裁与争议解决
    • 纳入仲裁系统可以解决智能合约无法自动执行的争议。仲裁员在复杂的雇佣事务中提供必要的人工监督,确保公平公正的结果。
  4. 公开雇佣历史
    • 公开雇佣历史可以促进信任和责任感。它允许潜在的雇主验证过去的雇佣情况和凭证,从而降低欺诈风险并提高生态系统中员工的可信度。
  5. 审查系统
    • 基于声誉的审查系统鼓励用户之间进行积极的互动和行为。通过允许公司和员工提交审查,该系统可以促进相互问责制,并有助于建立可靠的声誉。

测试用例

  1. 公司创建

    输入

    • 用户调用 registerCompany("TechCorp", "Technology")

    预期状态变化

    • 生成一个新的 companyId(例如,companyId = 1)。
    • companies 映射已更新:
      companies[1]{
       name="TechCorp",
       industry="Technology",
       owner=callerAddress,
       employeeIds=[ ]
       }
      
    • 发出一个带有参数 (1, callerAddress, "TechCorp", "Technology")CompanyRegistered 事件。

    预期输出

    • 返回值companyId = 1(新创建的公司 ID)。
    • 事件:记录 CompanyRegistered
  2. 员工代币铸造

    输入

    • 合约所有者(或授权地址)调用 mintEmployeeToken(employeeAddress, "ipfs://metadataURI")

    预期状态变化

    • 生成一个新的代币 ID(例如,tokenId = 5)。
    • 更新内部映射(例如,employeeTokenToOwner):
       employeeTokenToOwner[5]employeeAddress
      
    • (可选)如果实现跟踪元数据,则另一个映射(例如,employeeTokenMetadata)可能会存储:
       employeeTokenMetadata[5]"ipfs://metadataURI"
      
    • 发出一个带有 (5, employeeAddress)EmployeeTokenMinted 事件。

    预期输出

    • 返回值tokenId = 5(新铸造的员工代币 ID)。
    • 事件:记录 EmployeeTokenMinted
  3. 合同创建和执行

    输入

    1. companyId = 1 的公司调用:
      createContract(1,5,1000,6,"SoftwareDevelopment","Failuretomeetdeadlines")
      

      返回 contractId

    2. 公司和员工都调用 executeContract(contractId)

    预期状态变化

    • 合同创建
      1. 生成一个新的劳动合同 ID,例如,contractId = 10
      2. 更新 contracts 映射:
        contracts[10]{
          companyId=1,
          employeeTokenId=5,
          salary=1000,
          duration=6,
          responsibilities="SoftwareDevelopment",
          terminationConditions="Failuretomeetdeadlines",status="Created"
        }
        
      3. 系统还可以更新每个公司或每个员工的跟踪结构(可选但典型):
        companyContracts[1].push(10)
        employeeContracts[5].push(10)
        
      4. 发出一个带有参数 (10, 1, 5, 1000, 6)ContractCreated 事件。
    • 合同执行
      1. 在收到双方的调用后,合同的状态从 "Created" 更改为 "Active"
        contracts[10].status"Active"
        
      2. 一旦收到双方的签名/确认,就会发出一个带有 (10)ContractExecuted 事件。

    预期输出

    • 返回值(来自 createContract):contractId = 10
    • 事件:创建后发出 ContractCreated(10, 1, 5, 1000, 6)
    • 事件:一旦双方确认执行,发出 ContractExecuted(10)
  4. 工资存款

    输入

    • 公司(companyId = 1 的所有者)调用 depositSalary(10) 并将 1000 USDC(或等值的 wei,用于 ERC-20 代币或原生代币)发送到合约。

    预期状态变化

    1. 更新合约的托管余额映射:
      escrowBalances[10]1000
      
    2. 发出一个带有 (10, 1000)SalaryDeposited 事件。

    预期输出

    • 事件SalaryDeposited(10, 1000)
    • 合约的内部 escrowBalances[10] 现在应为 1000
  5. 工资支付

    输入

    • 在合同期限或满足任何释放条件后,调用 releaseSalary(10)(由合约或员工调用)。

    预期状态变化

    1. contractId = 10 的托管余额将转移到与代币 ID 5 关联的员工代币所有者 (employeeAddress)。
    2. escrowBalances[10] 设置为 0
      escrowBalances[10]0
      
    3. 发出一个带有 (10, employeeAddress)SalaryReleased 事件。

    预期输出

    • 事件SalaryReleased(10, employeeAddress)
    • 更新后的 escrowBalances[10] 现在为 0
    • 员工的链上余额(如果使用 ERC-20,则为代币余额)增加 1000
  6. 雇佣终止

    输入

    • 公司调用 terminateContract(10, "Failure to meet deadlines")

    预期状态变化

    1. contracts[10].status 更新为 "Terminated"
      contracts[10].status"Terminated"
      
    2. 发出一个带有 (10, "Failure to meet deadlines")ContractTerminated 事件。

    预期输出

    • 事件ContractTerminated(10, "Failure to meet deadlines")
    • contracts[10] 的状态现在为 "Terminated"
    • 除非在争议解决过程中另有说明,否则不存在进一步的工资义务。
  7. 争议解决

    输入

    1. 任何一方(公司或员工)调用 raiseDispute(10)
    2. 指定的仲裁员调用 resolveDispute(10, true),表明该决定有利于员工。

    预期状态变化

    • 争议提出
      1. 记录合同的争议状态(特定于实现,但通常为 contracts[10].disputeRaised = true)。
      2. 发出一个 DisputeRaised(10, msg.sender) 事件。
    • 争议解决
      1. 如果 decisionForEmployee == true,则 contractId = 10 的任何剩余托管资金都将转移给员工。
      2. 发出一个 DisputeResolved(10, true) 事件。

    预期输出

    • 事件DisputeRaised(10, msg.sender)
    • 事件DisputeResolved(10, true)
    • 如果资金保留在托管中,则 escrowBalances[10] 设置为 0,并且员工收到未付余额。

安全考虑事项

  1. 合同完整性:确保所有劳动合同都是不可变的,并且一旦创建和执行就不能被篡改。

  2. 资金安全:工资安全地保存在托管中,并且仅根据预定义的条件释放,以防止未经授权的访问或滥用。

  3. 仲裁员信任:实施一个去中心化和透明的系统来选择和监控仲裁员,以维持争议解决中的公正性和信任。

  4. 审查系统:纳入针对欺诈性审查的保护措施,例如验证审查与合法合同完成的关联,以维持准确和值得信赖的声誉评分。

  5. 代币安全:使用 Soulbound Tokens (SBTs) 进行员工表示,以防止代币转移并确保雇佣记录安全地与各自的个人相关联。

版权

Copyright and related rights waived via CC0.

Citation

Please cite this document as:

James Savechives (@jamesavechives) <james.walstonn@gmail.com>, "ERC-7750: 去中心化雇佣系统 [DRAFT]," Ethereum Improvement Proposals, no. 7750, August 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7750.