智能合约只能响应传入的消息,无法自主执行操作。Wasmx
模块允许在每个区块的开始区块(begin blockers)部分注册和调用合约。为了符合此要求,每个注册的合约必须响应名为begin_blocker
的sudo消息,该消息只能由链本身调用,而不能直接由任何用户或其他合约调用。这确保了begin_blocker
消息的可信性。
在注册合约时,用户必须声明一个 gas 价格,即他们愿意为合约执行支付的费用,以及一个 gas 限制,即合约执行过程中可以消耗的最大 gas 数量。
目前,合约注册只能通过治理提案进行。如果提案获得批准,将把该合约添加到每个“开始区块”(begin blockers)期间执行的合约列表中。
出于安全考虑,提案者必须为合约指定一个code_id
,该code_id
将在注册时以及每次合约执行时进行验证。这是为了防止攻击者先注册一个无害的合约,但后来将其升级为恶意合约。提案者可以请求在注册合约时豁免此检查,以避免新版本合约发布时的延迟,但这可能会根据提案者的可信度影响投票结果。
提案者还可以请求将合约“固定”在内存中,这意味着合约将被加载并保持在内存中,从而大大提高合约的性能。
合约可以通过治理提案进行注销,任何人都可以发起该提案,包括合约拥有者(如果他们不再需要该合约)或任何其他个人(如果合约被发现是恶意的)。
如果合约因 gas 不足而执行失败,它将被自动注销。
当合约被注销时,wasmx
将调用合约中的特殊deregister{}
回调(如果存在),作为一个sudo消息。
合约可以在耗尽 gas 时自动停用,也可以由合约拥有者手动停用。当合约被停用时,wasmx
将调用合约中的特殊deactivate{}
回调(如果存在),作为一个sudo消息。合约可以由合约拥有者重新激活。
Wasmx
模块允许其他地址(合约、外部拥有账户EOA)通过x/feegrant
模块为其他合约的开始区块执行支付费用。
当合约第一次注册时,用户需要指定FundingMode
,该模式指示合约执行的资金来源。支持三种模式:
SelfFunded - 合约将为其自身的执行支付费用(默认模式)
GrantOnly - 合约将在其关联的津贴覆盖的情况下执行(由ContractRegistrationRequest
中的GranterAddress
提供)
Dual - 合约将优先使用其津贴资金。如果津贴不足以支付执行费用,则会使用其自身资金
由于x/feegrant
模块提供了三种津贴(Basic、Periodic和AllowedMsg),wasmx
模块仅支持Basic
和Periodic
。不建议向合约授予AllowedMsgAllowance
,因为任何尝试使用此类津贴的合约默认会报错。
合约的拥有者可以随时停用或激活合约,无需治理投票。他们还可以随时更新合约执行的参数,如 gas 价格或 gas 限制。
为了方便,Wasmx
模块提供了一些先前提到的提案的批量版本,例如批量注册和注销,以及StoreCodeProposal
的批量版本。这些批量版本允许同时处理多个提案,而不是逐个处理。
ContractRegistrationRequest
是用于注册新合约的基础消息(不应直接使用,而应作为提案的一部分)。
字段描述:
ContractAddress - 合约实例的唯一标识符,用于注册该合约。
GasLimit - 执行智能合约时可使用的最大 gas。
GasPrice - 执行智能合约时使用的 gas 价格。
PinContract - 是否应将合约固定在内存中。
AllowUpdating - 定义合约拥有者是否可以在不重新注册的情况下迁移合约(如果为false
,则只能执行当前的code_id
)。
CodeId - 正在注册的合约的code_id
,在执行时会进行验证,以允许在投票后进行最后的修改。
AdminAddress - 可选的管理员账户地址(该地址可以暂停或更新合约参数)。
GranterAddress - 提供执行资金的账户地址。如果FundMode
不是SelfFunded
,则必须设置此字段(见下文解释)。
FundingMode
表示合约将如何为其执行提供资金。
SelfFunded
- 合约将使用自己的资金来执行。
GrantOnly
- 合约仅使用由资助提供的资金。
Dual
- 合约将首先消耗资助的资金,然后再使用自己的资金。
ContractRegistrationRequestProposal
定义了一个 SDK 消息,用于在 wasmx
合约注册表中注册单个合约。
字段描述:
Title
- 描述提案的标题。
Description
- 描述提案的内容。
ContractRegistrationRequest
- 包含合约注册请求(如上所述)。
BatchContractRegistrationRequestProposal
定义了一个 SDK 消息,用于在 wasmx
合约注册表中注册一批合约。
字段描述:
Title
- 描述提案的标题。
Description
- 描述提案的内容。
ContractRegistrationRequests
- 包含合约注册请求的列表(如上所述)。
BatchStoreCodeProposal
定义了一个 SDK 消息,用于在 wasm 中存储一批合约。
字段描述:
Title
- 描述提案的标题。
Description
- 描述提案的内容。
Proposals
- 包含存储代码提案的列表(由 Cosmos wasm 模块定义)。
BatchContractDeregistrationProposal
定义了一个 SDK 消息,用于在 wasm 中注销一批合约。
字段描述:
Title
- 描述提案的标题。
Description
- 描述提案的内容。
Contracts
- 包含要注销的合约地址列表。
更新已注册合约的执行参数(gas 价格、限制)。还可以定义新的管理员账户。 此操作只能由管理员(如果已定义)或合约本身调用。
停用已注册的合约(该合约将不再在开始区块(begin blocker)中执行)。
重新激活已注册的合约(从现在起,该合约将在开始区块(begin blocker)中再次执行)。
调用智能合约中定义的函数。函数和参数通过ExecuteMsg
编码,ExecuteMsg
是一个以 Base64 编码的 JSON 消息。
可以由可迁移智能合约的拥有者发起,以将其code_id
重置为另一个code_id
。MigrateMsg
是一个以 Base64 编码的 JSON 消息。
可以由智能合约的拥有者发起,以转移所有权。
wasmx
模块的子空间是wasmx
。