核心系统
我们在开发或使用自主世界时,接触到的绝大多数功能均由 Mud 框架内的核心系统实现,它们的主要功能如下:
AccessManagementSystem, 访问管理BalanceTransferSystem, 余额转移BatchCallSystem, 批量调用ModuleInstallationSystem, 模组安装StoreRegistrationSystem, 表、表钩子注册WorldRegistrationSystem, 系统、系统钩子、委托注册
访问管理系统 AccessManagementSystem
访问管理系统负责管理资源的访问权限。它提供了以下主要功能:
grantAccess
授予指定地址访问某个资源的权限。
function grantAccess(ResourceId resourceId, address grantee)
要求调用者拥有该资源所在的命名空间
resourceId: 要授权的资源IDgrantee: 被授权的地址
revokeAccess
撤销指定地址访问某个资源的权限。
function revokeAccess(ResourceId resourceId, address grantee)
要求调用者拥有该资源所在的命名空间
resourceId: 要撤销权限的资源IDgrantee: 被撤销权限的地址
transferOwnership
转移命名空间的所有权给新的所有者。
function transferOwnership(ResourceId namespaceId, address newOwner)
要求调用者拥有该命名空间
namespaceId: 要转移所有权的命名空间IDnewOwner: 新的所有者地址会撤销原所有者的访问权限,并授予新所有者访问权限
renounceOwnership
放弃命名空间的所有权。
function renounceOwnership(ResourceId namespaceId)
要求调用者拥有该命名空间
namespaceId: 要放弃所有权的命名空间ID会删除命名空间所有者记录并撤销原所有者的访问权限
重要
如果原所有者曾授予自己对单独的系统或表资源的访问权限,变更所有权并不会让他失去这些 资源的访问权限。如果新所有者希望禁止这些访问,应该手动撤销这些权限。
余额转移系统 BalanceTransferSystem
余额转移系统用于在命名空间之间或从命名空间到外部地址转移 ETH 余额。
transferBalanceToNamespace
在命名空间之间转移余额。
function transferBalanceToNamespace(ResourceId fromNamespaceId, ResourceId toNamespaceId, uint256 amount)
要求调用者拥有源命名空间的访问权限
fromNamespaceId: 源命名空间IDtoNamespaceId: 目标命名空间IDamount: 转移金额源命名空间必须有足够的余额
目标命名空间必须存在
transferBalanceToAddress
从命名空间转移余额到外部地址。
function transferBalanceToAddress(ResourceId fromNamespaceId, address toAddress, uint256 amount)
要求调用者拥有源命名空间的访问权限
fromNamespaceId: 源命名空间IDtoAddress: 目标地址amount: 转移金额源命名空间必须有足够的余额
如果转移失败会回滚交易
批量调用系统 BatchCallSystem
批量调用系统用于在单个交易中执行多个系统调用。
batchCall
批量调用多个系统。
function batchCall(SystemCallData[] calldata systemCalls) returns (bytes[] memory returnDatas)
systemCalls: 系统调用数据数组,每个元素包含systemId和callDatareturnDatas: 返回每个系统调用的返回数据如果任何一个调用失败,整个交易会回滚
batchCallFrom
以指定地址身份批量调用多个系统。
function batchCallFrom(SystemCallFromData[] calldata systemCalls) returns (bytes[] memory returnDatas)
systemCalls: 系统调用数据数组,每个元素包含from、systemId和callDatareturnDatas: 返回每个系统调用的返回数据如果任何一个调用失败,整个交易会回滚
模组安装系统 ModuleInstallationSystem
模组安装系统负责处理自主世界中非根模组的安装。它仅提供一个功能:
installModule
安装一个非根模组到自主世界的指定命名空间。
function installModule(IModule module, bytes memory encodedArgs)
module: 要安装的模组encodedArgs: 模组安装所需的编码参数要求模组实现
IModule接口安装成功后会在
InstalledModules表中记录该模组
重要
使用模组安装系统无法安装根模组。安装根模组的功能并不由模组安装系统实现,而是由自主世界的主合约 World 实现。
存储注册系统 StoreRegistrationSystem
存储注册系统负责管理自主世界中的表和表钩子。它提供了以下主要功能:
registerTable
注册一个表到自主世界。
function registerTable(
ResourceId tableId,
FieldLayout fieldLayout,
Schema keySchema,
Schema valueSchema,
string[] keyNames,
string[] fieldNames
)
tableId: 表的资源IDfieldLayout: 表的字段布局keySchema: 表的键模式valueSchema: 表的值模式keyNames: 表的键名称数组fieldNames: 表的字段名称数组要求调用者拥有该表所在的命名空间
要求表名不能为空字符串
registerStoreHook
为指定表注册一个存储钩子。
function registerStoreHook(
ResourceId tableId,
IStoreHook hookAddress,
uint8 enabledHooksBitmap
)
tableId: 要注册钩子的表的资源IDhookAddress: 钩子合约的地址enabledHooksBitmap: 用于指示什么情况下启用钩子的位图要求调用者拥有该表所在的命名空间
要求钩子合约实现
IStoreHook接口
unregisterStoreHook
为指定表注销一个存储钩子。
function unregisterStoreHook(ResourceId tableId, IStoreHook hookAddress)
tableId: 要注销钩子的表的资源IDhookAddress: 要注销的钩子合约地址要求调用者拥有该表所在的命名空间
世界注册系统 WorldRegistrationSystem
世界注册系统负责注册命名空间、系统、系统钩子、函数选择器和委托。它提供了以下主要功能:
registerNamespace
注册一个新的命名空间。
function registerNamespace(ResourceId namespaceId)
namespaceId: 要注册的命名空间的资源ID要求命名空间不存在
要求命名空间名称有效(不包含保留字符``__``, 不能以
_结尾)
registerSystemHook
为指定系统注册一个系统钩子。
function registerSystemHook(
ResourceId systemId,
ISystemHook hookAddress,
uint8 enabledHooksBitmap
)
systemId: 要注册钩子的系统的资源IDhookAddress: 钩子合约的地址enabledHooksBitmap: 用于指示什么情况下启用钩子的位图要求调用者拥有该系统所在的命名空间
要求钩子合约实现
ISystemHook接口
unregisterSystemHook
为指定系统注销一个系统钩子。
function unregisterSystemHook(ResourceId systemId, ISystemHook hookAddress)
systemId: 要注销钩子的系统的资源IDhookAddress: 要注销的钩子合约地址要求调用者拥有该系统所在的命名空间
registerSystem
注册一个新的系统。
function registerSystem(ResourceId systemId, System system, bool publicAccess)
systemId: 要注册的系统的资源IDsystem: 系统合约的地址publicAccess: 是否允许公开访问要求调用者拥有该系统所在的命名空间
要求系统合约实现
IWorldContextConsumer接口要求系统合约未曾使用不同的资源 ID 注册过
如果系统已存在,则会升级系统
registerFunctionSelector
注册一个系统函数的选择器。
function registerFunctionSelector(
ResourceId systemId,
string memory systemFunctionSignature
) returns (bytes4 worldFunctionSelector)
systemId: 系统的资源IDsystemFunctionSignature: 系统函数的签名创建世界函数到系统函数的映射,世界函数名是系统函数名加命名空间的名称作为前缀,并用
__连接要求调用者拥有该系统所在的命名空间
要求函数选择器全局唯一
registerRootFunctionSelector
注册一个根系统函数的选择器。
function registerRootFunctionSelector(
ResourceId systemId,
string memory worldFunctionSignature,
string memory systemFunctionSignature
) returns (bytes4 worldFunctionSelector)
systemId: 系统的资源IDworldFunctionSignature: 世界函数的签名systemFunctionSignature: 系统函数的签名创建世界函数到系统函数的映射
要求调用者拥有根命名空间
要求函数选择器全局唯一
registerDelegation
为单个地址注册一个委托。
function registerDelegation(
address delegatee,
ResourceId delegationControlId,
bytes memory initCallData
)
delegatee: 被委托者的地址delegationControlId: 委托控制合约的资源IDinitCallData: 委托控制合约的初始化数据
unregisterDelegation
为单个地址注销一个委托。
function unregisterDelegation(address delegatee)
delegatee: 被委托者的地址
registerNamespaceDelegation
为命名空间注册一个委托。
function registerNamespaceDelegation(
ResourceId namespaceId,
ResourceId delegationControlId,
bytes memory initCallData
)
namespaceId: 命名空间的资源IDdelegationControlId: 委托控制合约的资源IDinitCallData: 委托控制合约的初始化数据要求调用者拥有该命名空间
要求委托控制合约不能为默认的无限制委托。
unregisterNamespaceDelegation
为命名空间注销一个委托。
function unregisterNamespaceDelegation(ResourceId namespaceId)
namespaceId: 命名空间的资源ID要求调用者拥有该命名空间