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 事件
当添加新管理员时触发。
参数:
manager- 被添加的管理员地址isOwner- 该管理员是否为所有者operator- 执行添加操作的地址
当移除管理员时触发。
参数:
manager- 被移除的管理员地址wasOwner- 该管理员是否曾经是所有者operator- 执行移除操作的地址
当添加密钥管理员时触发。
参数:
key- 被管理的密钥manager- 密钥管理员的地址operator- 执行添加操作的地址
当密钥管理权限被转移时触发。
参数:
key- 被管理的密钥oldManager- 先前的管理员地址newManager- 新的管理员地址operator- 执行转移操作的地址
当启用紧急停止时触发。
参数:
operator- 触发紧急停止的地址
当禁用紧急停止时触发。
参数:
operator- 恢复操作的地址
UserDataStorage 事件
当用户数据被更新时触发。
参数:
user- 用户地址key- 用于存储数据的密钥dataLength- 存储数据的长度operator- 执行更新操作的地址
当FairdaoManager地址被设置或更新时触发。
参数:
managerAddress- 新的FairdaoManager地址operator- 执行更新操作的地址
检查调用者是否为合约所有者。
要求:调用者必须是合约所有者
失败消息:"Not owner"
检查调用者是否为合约管理员。
要求:调用者必须是合约管理员
失败消息:"Not manager"
检查合约是否处于紧急停止状态。
要求:合约不能处于紧急停止状态
失败消息:"Emergency stop active"
FairdaoManagement 函数
构造函数,初始化合约并设置部署者地址为第一个所有者。
检查地址是否为管理员。
参数:
user- 要检查的地址
返回值:bool - 是否为管理员
检查地址是否具有所有者权限。
参数:
user- 要检查的地址
返回值:bool - 是否具有所有者权限
添加新的管理员。
参数:
manager- 新管理员地址withOwnerPermission- 是否具有所有者权限
返回值:bool - 操作是否成功
事件:ManagerAdded(manager, withOwnerPermission, msg.sender)
获取管理员数量。
返回值:uint256 - 管理员数量
移除管理员。
参数:
index- 管理员在数组中的索引manager- 要移除的管理员地址
要求:
- index 必须有效
- manager 必须在指定的索引位置
失败消息:
- "Bad index"
返回值:bool - 操作是否成功
事件:ManagerRemoved(manager, wasOwner, msg.sender)
获取指定索引处的管理员地址。
参数:
index- 数组中的索引
返回值:address - 管理员地址
获取指定地址的管理员信息。
参数:
user- 要获取信息的地址
返回值:
timestamp- 管理员添加时间戳(如果不是管理员则为0)isOwner- 该管理员是否具有所有者权限
检查地址是否为指定密钥的管理器。
参数:
key- 要检查的密钥user- 要检查的地址
返回值:bool - 是否为密钥管理器
获取特定密钥的管理器地址。
参数:
key- 要查询的密钥
返回值:address - 密钥管理器地址,如果没有则为 address(0)
为单个密钥添加管理器。
参数:
key- 要添加管理器的密钥manager- 管理器地址
返回值:bool - 操作是否成功
事件:AddKeyManager(key, manager, msg.sender)
将密钥管理权限转移给另一个地址。
参数:
key- 要转移管理权限的密钥newManager- 新管理器地址
返回值:bool - 操作是否成功
事件:TransferKeyManager(key, oldManager, newManager, msg.sender)
检查合约是否处于紧急停止状态。
返回值:bool - 合约是否处于紧急停止状态
启用紧急停止(仅限所有者)。
返回值:bool - 操作是否成功
事件:EmergencyStopped(msg.sender)
禁用紧急停止(仅限所有者)。
返回值:bool - 操作是否成功
事件:EmergencyResumed(msg.sender)
UserDataStorage 函数
构造函数,将合约所有者设置为部署者。
参数: 无
设置FairdaoManager合约地址。调用者首次设置时必须是合约所有者,且指定的fairdaoManagerAddress必须是FairdaoManager合约的所有者。
参数:
fairdaoManagerAddress- FairdaoManager合约的地址
要求:
- 如果FairdaoManager未设置,调用者必须是合约所有者
- 调用者必须是fairdaoManager.isOwner认可的所有者
- fairdaoManagerAddress 不能为 address(0)
失败消息:
- "Not owner"
- "Invalid manager addr"
返回值: bool - 操作是否成功
事件: FairdaoManagerSet(fairdaoManagerAddress, msg.sender)
存储用户数据。
参数:
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)
获取存储的用户数据。
参数:
user- 用户地址key- 检索数据的键
要求:
- 必须已设置FairdaoManager
- user 不能为 address(0)
- key 不能为 bytes32(0)
失败消息:
- "Manager not set"
- "Zero user"
- "Zero key"
返回值:
data- 存储的数据timestamp- 最后更新的时间戳
获取FairdaoManager合约的地址。
参数: 无
返回值: address - FairdaoManager合约的地址