はじめに
『DApps開発入門』という本や色々記事を書いているかるでねです。
今回は、コントラクト上で企業の設立から契約などの管理を行う仕組みを提案しているERC7750についてまとめていきます!
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
他にも様々なEIPについてまとめています。
概要
ERC7750は、Ethereumブロックチェーン上で分散型雇用システム(DES: Decentralized Employment System)を構築する提案をしています。
DESは、企業の設立と管理を可能にして雇用履歴を一意の従業員トークンとして記録し、雇用契約の締結と履行を支援します。
また、給与の支払いをエスクロー機能により自動化し、紛争解決のためのモデレーションシステム(監査機構)を提供します。
さらに、企業と従業員の双方が相互に評価を行うことで、信頼性を確保する仕組みも提案しています。
ブロックチェーンの透明性と改ざん不可という特性を活用し、雇用プロセスにおいて信頼性を確保し、企業の設立から雇用、契約の履行、終了に至るまでの各段階で説明責任を持たせることを目的としています。
このシステムは、企業の従業員の選考プロセスを終えた後、最終的な雇用契約を締結する前に機能します。
従業員は、自身の雇用履歴を記録したソウルバウンドトークン(SBT: Soulbound Token)を持ち、企業はそれを確認した上で最終的な雇用契約を結びます。
ソウルバウンドトークンは譲渡が不可能なNFTであり、従業員の過去の雇用履歴を改ざんされることなく記録し、企業が正確な雇用判断を行えるようにする役割を持ちます。
このトークンベースのアプローチにより、採用プロセスの信頼性と透明性を高めることができます。
動機
従来の雇用システムは、中央集権的で透明性が低く信頼に欠ける問題を抱えています。
DESは、ブロックチェーン技術を活用することで、雇用プロセスに透明性と信頼性をもたらして課題を解決することを目的としています。
以下の要素によって公正で信頼できる雇用エコシステムの実現を提案しています。
履歴の改ざんや虚偽の経歴申告を防ぐ
従業員の雇用履歴をブロックチェーンに記録することで、履歴の改ざんや虚偽の経歴申告を防ぎます。
現在、多くの企業は履歴書や職務経歴書を基に採用判断を行っていますが、それらは簡単に改ざん可能であり、企業は応募者の過去の実績を完全に信頼できません。
DESでは、雇用履歴がSBTとして記録されるため、過去の雇用実績を正確に証明することができます。
企業の設立と管理を分散
企業の設立と管理を分散型で行える仕組みを導入します。
従来の企業登録や法人設立には、政府や中央機関の審査が必要であり時間やコストがかかります。
DESでは、企業の設立プロセスをブロックチェーン上で実行し、企業情報や代表者の身元をコントラクトによって管理することでより迅速かつ透明なプロセスを提供します。
契約違反のリスク軽減
雇用契約の締結と履行をコントラクトで自動化し、契約違反のリスクを軽減します。
従来の雇用契約では、契約違反が発生した場合に裁判などの法的手続きをとる必要がありますが膨大な時間とコストがかかります。
DESでは、契約内容をコントラクトに組み込み、合意された条件が満たされた場合にのみ給与が支払われる仕組みを構築して雇用契約の遵守を促進します。
紛争解決
紛争解決のためのモデレーションシステムを組み込み、トラブル発生時の対応を分散型で行います。
従来の労働問題は、企業側に有利な形で進められることが多く、従業員が適正な補償を受けられないケースが多いです。
DESでは、ブロックチェーン上の分散型自治組織(DAO: Decentralized Autonomous Organization)による公正な審査が行われ、雇用契約の適正性を確保します。
企業と従業員の相互評価
企業と従業員が相互に評価を行うことで信頼性を高めます。
従来の雇用関係では、企業側が一方的に従業員を評価することが多いですが、DESでは従業員も企業を評価できる仕組みを導入して公正な環境を提供します。
評価システムは、ブロックチェーン上に記録され、改ざんができないため、雇用市場の健全性を維持することが可能になります。
仕様
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;
}
}
registerCompany
function registerCompany(string calldata name, string calldata industry) external returns (uint companyId);
概要
新しい企業をブロックチェーン上に登録する関数。
詳細
新しい企業を登録して一意の companyId
を割り当てます。
登録された企業は呼び出し元のアドレスと紐づけられ、そのオーナーとして認識されます。
登録後、企業の基本情報(名前、業界)が保存されます。
引数
-
name
- 企業の名前。
-
industry
- 企業が属する業界。
戻り値
-
companyId
- 登録された企業の一意の識別子。
getCompany
function getCompany(uint companyId) external view returns (string memory name, string memory industry, address owner, uint[] memory employeeIds);
概要
登録済みの企業の情報を取得する関数。
詳細
指定された companyId
に対応する企業の詳細情報(名前、業界、オーナーアドレス、雇用する従業員のトークンID一覧)を取得します。
引数
-
companyId
- 取得したい企業の一意の識別子。
戻り値
-
name
- 企業の名前。
-
industry
- 企業が属する業界。
-
owner
- 企業のオーナーアドレス。
-
employeeIds
- 企業に所属する従業員のトークンID一覧。
mintEmployeeToken
function mintEmployeeToken(address employee, string calldata metadataURI) external returns (uint tokenId);
概要
従業員の雇用履歴を示すソウルバウンドトークン(SBT)を発行する関数。
詳細
従業員に一意の tokenId
を持つソウルバウンドトークンを発行します。
このトークンには従業員の職務経歴に関する情報が含まれており、オフチェーンに保存されたメタデータへアクセスする metadataURI
が紐づけられます。
トークンは譲渡不可能であり、従業員の履歴の改ざんを防ぎます。
引数
-
employee
- トークンを発行する従業員のアドレス。
-
metadataURI
- 従業員の経歴情報を参照するURI。
戻り値
-
tokenId
- 発行されたトークンの一意の識別子。
getEmploymentHistory
function getEmploymentHistory(uint employeeTokenId) external view returns (uint[] memory contractIds);
概要
指定された従業員トークンの雇用履歴を取得する関数。
詳細
従業員の employeeTokenId
を指定すると、その従業員が関与した過去のコントラクトの contractIds
のリストを取得できます。
引数
-
employeeTokenId
- 雇用履歴を取得したい従業員のトークンID。
戻り値
-
contractIds
- 過去のコントラクトID一覧。
createContract
function createContract(uint companyId, uint employeeTokenId, uint salary, uint duration, string calldata responsibilities, string calldata terminationConditions) external returns (uint contractId);
概要
新しい雇用契約を作成する関数。
詳細
企業が従業員と新たな契約を結ぶ時に使用します。
給与、期間、業務内容、契約解除条件などの詳細情報を含む新しい契約が作成され、一意の contractId
が割り当てられます。
引数
-
companyId
- 契約を作成する企業のID。
-
employeeTokenId
- 契約の対象となる従業員のトークンID。
-
salary
- 契約に基づき支払われる給与額。
-
duration
- 契約の有効期間(単位: 月)。
-
responsibilities
- 従業員の業務内容の説明。
-
terminationConditions
- 契約解除の条件。
戻り値
-
contractId
- 作成された契約の一意の識別子。
executeContract
function executeContract(uint contractId) external;
概要
作成された契約を有効化する関数。
詳細
企業と従業員が契約の内容に合意した後、この関数を実行することで契約が正式に開始されます。
引数
-
contractId
- 実行する契約の一意の識別子。
depositSalary
function depositSalary(uint contractId) external payable;
概要
企業が給与をエスクローに預ける関数。
詳細
企業が契約に定められた給与額をエスクローに預けます。
引数
-
contractId
- 給与を預ける対象の契約ID。
releaseSalary
function releaseSalary(uint contractId) external;
概要
エスクローから従業員へ給与を支払う関数。
詳細
エスクローに預けられた給与が契約の条件に基づいて従業員へ送金されます。
引数
-
contractId
- 給与を支払う対象の契約ID。
raiseDispute
function raiseDispute(uint contractId) external;
概要
契約に関する紛争を提起する関数。
詳細
企業または従業員が契約の履行状況について異議を申し立てたい場合に使用します。
紛争が発生したことが記録され、仲裁人が割り当てられます。
モデレーターは、紛争内容を調査して公平な判定を下す役割を担います。
引数
-
contractId
- 紛争の対象となる契約の一意の識別子。
resolveDispute
function resolveDispute(uint contractId, bool decisionForEmployee) external;
概要
発生した紛争を解決するための関数。
詳細
モデレーターが紛争内容を審査し、従業員か企業のどちらかに有利な決定を下すかを decisionForEmployee
の値で指定します。
従業員に有利な決定が下された場合、エスクローに預けられている給与が従業員に支払われる可能性があります。
一方、企業側に有利な決定が下された場合、給与の返還などが行われる場合があります。
引数
-
contractId
- 解決対象の契約の一意の識別子。
-
decisionForEmployee
-
true
の場合は従業員側に有利な判定、false
の場合は企業側に有利な判定。
-
terminateContract
function terminateContract(uint contractId, string calldata reason) external;
概要
契約を解除するための関数。
詳細
企業が定められた解除条件を満たした場合に契約を終了できます。
契約が終了すると、その後の給与支払いは停止されて関係者に通知されます。
終了理由は reason
に指定され記録されます。
引数
-
contractId
- 解除対象の一意な契約の識別子。
-
reason
- 契約を終了する理由(例:「業務不履行」、「会社の経営状況による解雇」など)。
submitReview
function submitReview(uint contractId, uint rating, string calldata comments) external;
概要
契約終了後に評価を投稿する関数。
詳細
契約を完了・解除した後、企業と従業員の両方が相手に対してレビューを投稿できます。
このレビューは、rating
と comments
を含み、公開されることで今後の雇用関係における判断材料となります。
引数
-
contractId
- 評価を投稿する対象の契約ID。
-
rating
- 数値評価(例: 1~5のスコア)。
-
comments
- 具体的なコメント(例: 「納期を厳守し、素晴らしい働きをした」)。
getReviews
function getReviews(uint contractId) external view returns (Review[] memory);
概要
特定の契約に対するレビューを取得する関数。
詳細
過去の契約に対する評価を閲覧できます。
企業や従業員はこの関数を利用して、他の契約履歴を参考にできます。
引数
-
contractId
- 取得対象の契約ID。
戻り値
-
Review[]
- 契約に対する評価リスト。
- 各
Review
はrating
(数値評価)、comments
(コメント)、reviewer
(評価者のアドレス)を含む。
雇用履歴
雇用履歴は、各従業員に発行されるソウルバウンドトークン(SBT: Soulbound Token)に紐づく形で記録されます。
SBTは一度発行されると他者に譲渡できないトークンで、その従業員が過去に関与したすべての契約のIDが記録される仕組みです。
このデータはブロックチェーン上に保存されるため、第三者による改ざんが不可能なため雇用履歴が恒久的に保証されます。
企業は新たな従業員を雇う前に、getEmploymentHistory
関数を使用することで、応募者の過去の雇用履歴を確認できます。
この関数を実行すると、該当するSBTに紐づくコントラクトIDの一覧が取得できるため、企業は応募者の過去の職務経験や労働実績を正確に把握した上で雇用の判断を下すことができます。
雇用履歴が改ざん不可能であることから、虚偽の経歴を申告することはできず、企業と従業員両方にとって透明性の高い雇用環境が実現されます。
給与支払いシステム
給与は、企業が契約に基づいて指定の金額をコントラクトのエスクローに預けることで管理されます。
このプロセスは、depositSalary
関数を呼び出すことで実行され、契約が満たすべき条件を達成するまで資金が安全に保管されます。
給与の未払いリスクを防ぐために、企業はあらかじめ契約期間分の給与をエスクローに入れる必要がある場合があります。
給与の支払いは、契約で定められた条件が満たされた場合に自動的に行われるか、releaseSalary
関数を呼び出すことで手動で実行されます。
この仕組みにより、給与の支払いが遅延することなく適切なタイミングで行われ、従業員の労働の対価が確実に支払われるようになります。
モデレーションと紛争解決
企業と従業員の間で契約の履行に関する意見の相違や問題が発生した場合、どちらの当事者も raiseDispute
関数を呼び出すことで紛争を提起できます。
実行されるとブロックチェーン上で紛争が記録され、モデレーター(仲裁人)が自動的に割り当てられます。
モデレーターは、提出された証拠やコントラクトの内容を元に公正な判断を下し、問題の解決を図ります。
紛争が発生した場合、最終的な解決策としてモデレーターが resolveDispute
関数を実行します。
この時、従業員に有利な判決が下された場合、エスクローに預けられた給与が従業員に支払われます。
一方、企業側の主張が認められた場合、エスクローされた資金の一部または全部が企業に返還されることもあります。
これにより、両方にとって公平な形で紛争を解決することが可能となります。
従業員の解雇
企業が従業員との契約を終了する場合、事前に定められた条件に基づいて terminateContract
関数を実行します。
この関数を呼び出すことで、契約の状態が「終了済み」に変更され、それ以降の給与支払いが停止されます。
しかし、コントラクトの解除が一方的または不当であると従業員が判断した場合、紛争解決のプロセスを通じて異議を申し立てることができます。
その場合、モデレーターが契約条件や証拠を元に判断を下して不当解雇が認められた場合には、従業員に適切な補償が支払われる可能性があります。
これにより、企業が一方的に不利益な解雇を行うことを防ぎ、公正な労働環境を確保します。
レビューシステム
契約が完了または解除された後、企業と従業員の両方が submitReview
関数を使用して相互に評価を行うことができます。
この評価には rating
(数値スコア)と comments
(テキストレビュー)が含まれ、ブロックチェーン上に記録されます。
この評価は、各参加者の信用度を示す「レピュテーションスコア」に影響を与えます。
企業は従業員の過去の評価を参考にすることで、信頼できる人材を雇用しやすくなります。
一方、従業員も企業の過去の雇用履歴を確認することで、適切な職場環境を選ぶことができます。
この仕組みによって、エコシステム全体の信頼性が向上し、誠実な行動が促進されます。
補足
従業員のトークン化
従業員を識別する手段として、ソウルバウンドトークン(SBT: Soulbound Token)を用いることで、各従業員の身元をブロックチェーン上で一意に管理します。
ソウルバウンドトークンは、一度発行されると他者に譲渡することができないトークンであり、従業員が持つ職務経歴の信頼性を担保する役割を果たします。
この仕組みを採用することで、雇用履歴の改ざんを防ぎ、企業が応募者の過去の職務経験を正確に確認できるようになります。
例えば、従業員が過去に複数の企業で働いた経験を持つ場合、それらの雇用履歴はすべてブロックチェーン上に記録され、新たに雇用を検討する企業が getEmploymentHistory
関数を使用して確認することが可能です。
従来の履歴書や職務経歴書では偽造や誇張のリスクがありましたが、ソウルバウンドトークンによる記録は改ざんが不可能であるため、信頼性の高い雇用判断を行うことができます。
給与支払いのエスクローシステム
給与の支払いをより安全かつ確実に行うため、エスクローシステムを導入します。
このシステムでは、企業が depositSalary
関数を実行することで、契約期間中の給与を事前にコントラクトに預けます。
従業員が契約内容を履行したことが確認された時点で releaseSalary
関数が呼び出され、エスクローに保管されていた資金が従業員へ支払われます。
この仕組みによって、従業員は「働いたのに給与が支払われない」といったリスクから守られます。
同時に企業側も、従業員が契約通りに業務を遂行しない場合に支払いを保留することができるため、公正な取引が保証されます。
例えば、従業員が業務を放棄した場合、企業は raiseDispute
関数を呼び出して給与支払いを差し止めることが可能です。
このように、エスクローシステムを活用することで、雇用契約に基づいた透明性のある給与支払いを実現します。
モデレーションと紛争解決
雇用に関するすべての事項をコントラクトだけで処理することは難しく、複雑な問題が発生する場合には人間による判断が必要になります。
そのため、モデレーター(仲裁人)を配置し、雇用紛争が発生した時に公正な判定を下せる仕組みを導入します。
企業または従業員が raiseDispute
関数を実行すると、ブロックチェーン上に紛争が記録され、指定されたモデレーターが問題の解決を担当します。
モデレーターは、契約内容や提出された証拠を元に判断を行い、resolveDispute
関数を実行することで紛争の決着をつけます。
例えば、従業員が給与の未払いを訴えた場合、モデレーターは雇用契約や業務履行状況を確認し、支払いの可否を決定します。
この仕組みにより、企業と従業員のどちらか一方が一方的に不利益を被ることなく公正な解決を実現します。
公開される雇用履歴
従業員の雇用履歴を公開することで、企業が応募者の過去の勤務実績を確認しやすくなり、より適切な採用判断が可能になります。
例えば、従業員が過去に優れた実績を持つ場合、その情報がブロックチェーン上で確認できるため、企業は信頼性のある人材を見極めやすくなります。
また、公開された雇用履歴は、企業が従業員に対して不当な解雇や給与未払いを行った場合の証拠としても機能します。
従業員が過去に不当な扱いを受けた企業の情報を他の求職者が参照できるため、不誠実な企業の行動が抑制され、公正な労働環境の構築につながります。
レビューシステム
雇用契約が終了した後、企業と従業員の双方が submitReview
関数を利用して相手を評価できる仕組みを導入します。
このレビューには rating
(数値評価)と comments
(詳細なフィードバック)が含まれ、ブロックチェーン上に記録されることで、改ざんされることなく公開されます。
この仕組みにより、企業は過去の雇用契約に基づいた従業員の評価を確認し、信頼できる人材を採用することができます。
同様に、従業員も過去に労働環境が良好だった企業を選ぶことができるため、労働市場の健全性が向上します。
例えば、過去に従業員への給与未払いが多発した企業があった場合、その企業には低評価のレビューが蓄積され、求職者がリスクを事前に察知できるようになります。
セキュリティ
契約の完全性
雇用に関する契約は、一度作成・実行されると変更や改ざんができないように設計されています。
コントラクトの特性を活かし、企業と従業員が合意した契約内容がブロックチェーン上に記録された後は、誰もその内容を書き換えることはできません。
これにより、契約の透明性が確保されて後から条件を一方的に変更することが防がれます。
例えば、企業が給与額を契約後に引き下げたり、従業員が業務内容を変更したと主張する状況は発生しません。
また、契約の作成時には契約条件を詳細に記述し、労働期間、給与、業務内容、解雇条件などの情報を明示する必要があります。
契約が開始された後は、契約内容の履行状況もブロックチェーン上に記録されるため、後から履行状況を確認することが可能です。
資金の安全性
給与はコントラクトのエスクローシステムを利用して管理されます。
企業は雇用契約を締結した時点で、給与分の資金をコントラクトに預け入れる必要があります。
この資金は depositSalary
関数を通じて送金され、契約条件が満たされるまでロックされます。
給与の支払いは、契約条件が正常に履行された場合にのみ releaseSalary
関数が実行され、従業員に送金される仕組みです。
この仕組みにより、企業が給与を支払わずに従業員を働かせることや、従業員が契約を履行しないまま給与を受け取ることを防ぎます。
また、コントラクトによって資金の動きが制御されるため、第三者が資金を不正に引き出すこともできません。
例えば、企業が terminateContract
を実行して契約を解除した場合でも、給与が支払われるかどうかは契約内容と紛争解決の結果に基づいて決定されます。
これにより、両方の権利を適切に保護することが可能となります。
モデレーターの信頼性
紛争解決に関わるモデレーターの選定と監視には、分散型かつ透明性の高い仕組みを採用します。
モデレーターは、紛争が発生した時に中立的な判断を下す役割を担いますが、特定の企業や従業員に対して不当な判定を下すことがないように監視メカニズムが必要です。
そのため、モデレーターはDAOの投票によって選出される仕組みを導入し、偏りのない公平な判断を行うことを保証します。
さらに、モデレーターが不正行為を行った場合や公平性を欠いた判定を下した場合には、モデレーターの信用スコアが低下するシステムを組み込みます。
信用スコアが一定の水準を下回った場合、そのモデレーターは資格を剥奪されて新たなモデレーターが選出される仕組みです。
例えば、モデレーターが特定の企業に偏った判定を続けた場合、ほかの参加者がその行為を報告して投票によって解任が決定されるように設計します。
このような仕組みを導入することで、モデレーターが公正な判断を下すことを促進し、信頼性の高い紛争解決を実現します。
レビューシステムの安全性
企業と従業員が相互に評価を行うレビューシステムでは、不正な評価を防ぐための対策が必要です。
そのため、評価は実際に契約を完了した関係者のみが行えるように設計されています。
具体的には、submitReview
関数を実行できるのは、contractId
に紐づく企業または従業員に限定されており、第三者が虚偽のレビューを投稿することはできません。
また、1つのコントラクトに対して複数回のレビューを行えないよう制限を設けることで、過剰な評価操作を防ぎます。
例えば、同じ契約に対して何度も低評価を付けたり、偽のアカウントを作成して評価を水増しする行為を防ぐために、各 contractId
に対するレビューは1回のみに制限されます。
さらに、レピュテーションスコアの算出には、過去のレビュー履歴や評価を考慮し、極端なスコアが平均値に影響を与えにくい仕組みを採用します。
例えば、悪意のあるレビューによって一時的に評価が下がった場合でも、一定の期間が経過することで影響を緩和できるようにします。
これにより、公正で信頼性の高い評価システムを維持できます。
トークンの安全性
従業員の雇用履歴を管理するソウルバウンドトークン(SBT)は、一度発行されると譲渡できない特性を持っています。
これにより、雇用履歴が他者に流用されることを防ぎ、従業員ごとの正確な履歴管理を実現します。
例えば、NFTでは所有権の移転が可能ですが、SBTは従業員本人以外が保有することができないため、別の人物が偽の職務経歴を持つことは不可能です。
また、SBTに紐づくデータはオフチェーンで管理され、metadataURI
を通じてアクセスできるようになっています。
この仕組みにより、ブロックチェーンのスケーラビリティを損なうことなく、大量の雇用履歴データを安全に管理できます。
データの改ざんを防ぐために、オフチェーンのストレージにはIPFSやArweaveを利用し、データの永続性と耐改ざん性を確保します。
引用
James Savechives (@jamesavechives) james.walstonn@gmail.com, "ERC-7750: Decentralized Employment System [DRAFT]," Ethereum Improvement Proposals, no. 7750, August 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7750.
最後に
今回は「コントラクト上で企業の設立から契約などの管理を行う仕組みを提案しているERC7750」についてまとめてきました!
いかがだったでしょうか?
質問などがある方は以下のTwitterのDMなどからお気軽に質問してください!
他の媒体でも情報発信しているのでぜひ他も見ていってください!