概念
Last updated
Last updated
智能合约只能响应传入的消息,无法自主执行操作。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)通过模块为其他合约的开始区块执行支付费用。
当合约第一次注册时,用户需要指定FundingMode
,该模式指示合约执行的资金来源。支持三种模式:
SelfFunded - 合约将为其自身的执行支付费用(默认模式)
GrantOnly - 合约将在其关联的津贴覆盖的情况下执行(由ContractRegistrationRequest
中的GranterAddress
提供)
Dual - 合约将优先使用其津贴资金。如果津贴不足以支付执行费用,则会使用其自身资金
由于x/feegrant
模块提供了三种津贴(Basic、Periodic和AllowedMsg),wasmx
模块仅支持Basic
和Periodic
。不建议向合约授予AllowedMsgAllowance
,因为任何尝试使用此类津贴的合约默认会报错。
合约的拥有者可以随时停用或激活合约,无需治理投票。他们还可以随时更新合约执行的参数,如 gas 价格或 gas 限制。
为了方便,Wasmx
模块提供了一些先前提到的提案的批量版本,例如批量注册和注销,以及StoreCodeProposal
的批量版本。这些批量版本允许同时处理多个提案,而不是逐个处理。