概述

FairdaoStorage 非接口合约

本文档包含 FairdaoStorage 项目中的三个非接口合约:FairdaoManagement、UserDataStorage 和 SharedDataStorage。

这些合约提供了 DAO 的核心功能,包括管理员管理、密钥管理、用户数据存储和共享数据存储。

许可证

SPDX-License-Identifier: GPL-3.0

Solidity 版本

^0.8.24

合约

FairdaoManagement

FAIR DAO 管理合约,提供管理员、所有者和密钥管理器的管理功能。

实现了 IFairdaoManager 接口,处理访问控制、紧急停止机制和密钥管理操作。

UserDataStorage

用户数据存储合约,负责管理特定于用户的数据。

允许密钥管理员为特定用户存储和检索数据。

SharedDataStorage

共享数据存储合约,负责管理所有用户共享的数据。

允许密钥管理员存储和检索可被所有用户访问的数据。

数据结构

Storage 结构 (UserDataStorage 和 SharedDataStorage)

struct Storage {
    uint64 timestamp; // 时间戳
    bytes data;       // 数据内容
}

用于存储数据及其时间戳的结构。

ManagerInfo 结构 (FairdaoManagement)

struct ManagerInfo {
    uint64 timestamp; // 时间戳
    bool isOwner;     // 是否为所有者
}

存储管理员信息的结构,包括创建时间戳和所有者权限标记。

事件

FairdaoManagement 事件

event ManagerAdded( address indexed manager, bool isOwner, address indexed operator )
添加
indexed

当添加新管理员时触发。

参数:

  • manager - 被添加的管理员地址
  • isOwner - 该管理员是否为所有者
  • operator - 执行添加操作的地址
event ManagerRemoved( address indexed manager, bool wasOwner, address indexed operator )
移除
indexed

当移除管理员时触发。

参数:

  • manager - 被移除的管理员地址
  • wasOwner - 该管理员是否曾经是所有者
  • operator - 执行移除操作的地址
event AddKeyManager( bytes32 indexed key, address manager, address indexed operator )
添加
indexed

当添加密钥管理员时触发。

参数:

  • key - 被管理的密钥
  • manager - 密钥管理员的地址
  • operator - 执行添加操作的地址
event TransferKeyManager( bytes32 indexed key, address oldManager, address newManager, address indexed operator )
转移
indexed

当密钥管理权限被转移时触发。

参数:

  • key - 被管理的密钥
  • oldManager - 先前的管理员地址
  • newManager - 新的管理员地址
  • operator - 执行转移操作的地址
event EmergencyStopped(address indexed operator)
紧急状态
indexed

当启用紧急停止时触发。

参数:

  • operator - 触发紧急停止的地址
event EmergencyResumed(address indexed operator)
恢复操作
indexed

当禁用紧急停止时触发。

参数:

  • operator - 恢复操作的地址

UserDataStorage 事件

event UserDataUpdated( address indexed user, bytes32 indexed key, uint256 dataLength, address indexed operator )
更新
indexed

当用户数据被更新时触发。

参数:

  • user - 用户地址
  • key - 用于存储数据的密钥
  • dataLength - 存储数据的长度
  • operator - 执行更新操作的地址
event FairdaoManagerSet( address indexed managerAddress, address indexed operator )
更新
indexed

当FairdaoManager地址被设置或更新时触发。

参数:

  • managerAddress - 新的FairdaoManager地址
  • operator - 执行更新操作的地址

SharedDataStorage 事件

event SharedDataUpdated( bytes32 indexed key, bytes32 indexed valueId, uint256 dataLength, address indexed operator )
更新
indexed

当共享数据被更新时触发。

参数:

  • key - 用于存储数据的密钥
  • valueId - 值的唯一标识符
  • dataLength - 存储数据的长度
  • operator - 执行更新操作的地址
event FairdaoManagerSet( address indexed managerAddress, address indexed operator )
更新
indexed

当FairdaoManager地址被设置或更新时触发。

参数:

  • managerAddress - 新的FairdaoManager地址
  • operator - 执行更新操作的地址
修饰器
modifier isOwner()

检查调用者是否为合约所有者。

要求:调用者必须是合约所有者

失败消息:"Not owner"

modifier onlyManager()

检查调用者是否为合约管理员。

要求:调用者必须是合约管理员

失败消息:"Not manager"

modifier notEmergency()

检查合约是否处于紧急停止状态。

要求:合约不能处于紧急停止状态

失败消息:"Emergency stop active"

函数

FairdaoManagement 函数

constructor()

构造函数,初始化合约并设置部署者地址为第一个所有者。

function isManager(address user) external view returns (bool)

检查地址是否为管理员。

参数:

  • user - 要检查的地址

返回值:bool - 是否为管理员

function isOwner(address user) external view returns (bool)

检查地址是否具有所有者权限。

参数:

  • user - 要检查的地址

返回值:bool - 是否具有所有者权限

function addManager(address manager, bool withOwnerPermission) external isOwner notEmergency returns (bool)

添加新的管理员。

参数:

  • manager - 新管理员地址
  • withOwnerPermission - 是否具有所有者权限

返回值:bool - 操作是否成功

事件:ManagerAdded(manager, withOwnerPermission, msg.sender)

function getManagerCount() external view returns (uint256)

获取管理员数量。

返回值:uint256 - 管理员数量

function removeManager(uint256 index, address manager) external isOwner notEmergency returns (bool)

移除管理员。

参数:

  • index - 管理员在数组中的索引
  • manager - 要移除的管理员地址

要求:

  • index 必须有效
  • manager 必须在指定的索引位置

失败消息:

  • "Bad index"

返回值:bool - 操作是否成功

事件:ManagerRemoved(manager, wasOwner, msg.sender)

function getManagerAtIndex(uint256 index) external view returns (address)

获取指定索引处的管理员地址。

参数:

  • index - 数组中的索引

返回值:address - 管理员地址

function getManagerInfo(address user) external view returns (uint256 timestamp, bool isOwner)

获取指定地址的管理员信息。

参数:

  • user - 要获取信息的地址

返回值:

  • timestamp - 管理员添加时间戳(如果不是管理员则为0)
  • isOwner - 该管理员是否具有所有者权限
function isKeyManager(bytes32 key, address user) external view returns (bool)

检查地址是否为指定密钥的管理器。

参数:

  • key - 要检查的密钥
  • user - 要检查的地址

返回值:bool - 是否为密钥管理器

function getKeyManager(bytes32 key) external view returns (address manager)

获取特定密钥的管理器地址。

参数:

  • key - 要查询的密钥

返回值:address - 密钥管理器地址,如果没有则为 address(0)

function addKeyManager(bytes32 key, address manager) external onlyManager notEmergency returns (bool)

为单个密钥添加管理器。

参数:

  • key - 要添加管理器的密钥
  • manager - 管理器地址

返回值:bool - 操作是否成功

事件:AddKeyManager(key, manager, msg.sender)

function transferKeyManager(bytes32 key, address newManager) external notEmergency isOwner returns (bool)

将密钥管理权限转移给另一个地址。

参数:

  • key - 要转移管理权限的密钥
  • newManager - 新管理器地址

返回值:bool - 操作是否成功

事件:TransferKeyManager(key, oldManager, newManager, msg.sender)

function isEmergencyStopped() external view returns (bool)

检查合约是否处于紧急停止状态。

返回值:bool - 合约是否处于紧急停止状态

function enableEmergencyStop() external isOwner returns (bool)

启用紧急停止(仅限所有者)。

返回值:bool - 操作是否成功

事件:EmergencyStopped(msg.sender)

function disableEmergencyStop() external isOwner returns (bool)

禁用紧急停止(仅限所有者)。

返回值:bool - 操作是否成功

事件:EmergencyResumed(msg.sender)

UserDataStorage 函数

constructor()

构造函数,将合约所有者设置为部署者。

参数:

function setFairdaoManager(address fairdaoManagerAddress) external returns (bool)

设置FairdaoManager合约地址。调用者首次设置时必须是合约所有者,且指定的fairdaoManagerAddress必须是FairdaoManager合约的所有者。

参数:

  • fairdaoManagerAddress - FairdaoManager合约的地址

要求:

  • 如果FairdaoManager未设置,调用者必须是合约所有者
  • 调用者必须是fairdaoManager.isOwner认可的所有者
  • fairdaoManagerAddress 不能为 address(0)

失败消息:

  • "Not owner"
  • "Invalid manager addr"

返回值: bool - 操作是否成功

事件: FairdaoManagerSet(fairdaoManagerAddress, msg.sender)

function setUserData(address user, bytes32 key, bytes calldata data) external returns (bool)

存储用户数据。

参数:

  • user - 用户地址
  • key - 存储数据的键
  • data - 要存储的数据

要求:

  • 必须已设置FairdaoManager
  • user 不能为 address(0)
  • key 不能为 bytes32(0)
  • 调用者必须是指定密钥的密钥管理员

失败消息:

  • "Manager not set"
  • "Zero user"
  • "Zero key"
  • "Not key manager"

返回值:bool - 操作是否成功

事件:UserDataUpdated(user, key, data.length, msg.sender)

function getUserData(address user, bytes32 key) external view returns (bytes memory data, uint64 timestamp)

获取存储的用户数据。

参数:

  • user - 用户地址
  • key - 检索数据的键

要求:

  • 必须已设置FairdaoManager
  • user 不能为 address(0)
  • key 不能为 bytes32(0)

失败消息:

  • "Manager not set"
  • "Zero user"
  • "Zero key"

返回值:

  • data - 存储的数据
  • timestamp - 最后更新的时间戳
function getFairdaoManager() external view returns (address)

获取FairdaoManager合约的地址。

参数:

返回值: address - FairdaoManager合约的地址

SharedDataStorage 函数

constructor()

构造函数,将合约所有者设置为部署者。

参数:

function setFairdaoManager(address fairdaoManagerAddress) external returns (bool)

设置FairdaoManager合约地址。调用者首次设置时必须是合约所有者,且指定的fairdaoManagerAddress必须是FairdaoManager合约的所有者。

参数:

  • fairdaoManagerAddress - FairdaoManager合约的地址

要求:

  • 如果FairdaoManager未设置,调用者必须是合约所有者
  • 调用者必须是fairdaoManager.isOwner认可的所有者
  • fairdaoManagerAddress 不能为 address(0)

失败消息:

  • "Not owner"
  • "Invalid manager addr"

返回值: bool - 操作是否成功

事件: FairdaoManagerSet(fairdaoManagerAddress, msg.sender)

function setSharedData(bytes32 key, bytes32 sharedValueId, bytes calldata data) external returns (bool)

存储共享数据。

参数:

  • key - 存储数据的键
  • sharedValueId - 值的唯一标识符
  • data - 要存储的数据

要求:

  • 必须已设置FairdaoManager
  • key 不能为 bytes32(0)
  • sharedValueId 不能为 bytes32(0)
  • 调用者必须是指定密钥的密钥管理员

失败消息:

  • "Manager not set"
  • "Zero key"
  • "Zero value ID"
  • "Not key manager"
function getSharedData(bytes32 key, bytes32 sharedValueId) external view returns (bytes memory data, uint64 timestamp)

获取共享数据。

参数:

  • key - 检索数据的键
  • sharedValueId - 值的唯一标识符

要求:

  • 必须已设置FairdaoManager
  • key 不能为 bytes32(0)
  • sharedValueId 不能为 bytes32(0)

失败消息:

  • "Manager not set"
  • "Zero key"
  • "Zero value ID"

返回值:

  • data - 存储的共享数据
  • timestamp - 最后更新的时间戳
function getFairdaoManager() external view returns (address)

获取FairdaoManager合约的地址。

参数:

返回值: address - FairdaoManager合约的地址