[TOC]

AIP-71 - 使用模块事件重构 Aptos 框架事件

一、摘要

这个AIP提出了一个迁移计划,将 Aptos 框架中的所有句柄(handle)事件(event v1)迁移到模块(module)事件(event v2),并添加新的事件。

1. 目标

  • 尽快将所有现有事件迁移到模块事件,以最小程度影响下游自定义索引器。
  • 在迁移更改中附加新的有用的模块事件。

二、动机

AIP-44 引入了模块事件,并解释了与旧事件 EventHandle 相比的动机和优势。鉴于其优越性,将 Aptos 框架中的所有事件迁移到模块事件是可取的。其主要优点包括:

  • 模块事件不需要事件句柄。
  • 模块事件支持并行执行。
  • 模块事件更易于索引。

此外,在迁移过程中,也是在框架升级时添加新的、实用的事件的绝佳时机。

三、影响

迁移成功后,将使 Aptos Move 开发人员和索引构建者更容易使用事件。 此外,对于普通用户来说,模块事件将更容易理解和使用,因为当前的形式更类似于 Solidity 的语法。

四、替代方案

另一种解决方案是直接将所有事件从现有的形式更改为模块事件。这样做的结果是,所有这些更改在主网可用之前未更新的分布式应用(dApps)都会立即出现问题,因为它们依赖于当前的事件形式。

五、规范

默认的迁移策略:

  • 为事件类型创建新的 T2 结构体,并通过每个 event::emit_event<T1>() 调用添加一个 #[event],并添加一个 event::emit<T2>() 调用。

已迁移的事件

模块事件 v1 名称事件 v2 名称ABI 更新
account.moveKeyRotationEventKeyRotation+account:address
aptos_account.moveDirectCoinTransferConfigUpdatedEventDirectCoinTransferConfigUpdated+ account:address
coin.moveDepositEventDeposit+ account:address
coin.moveWithdrawEventWithdraw+ account: address
object.moveTransferEventTransfer
aptos_governance.moveCreateProposalEventCreateProposal
aptos_governance.moveVoteEventVote
aptos_governance.moveUpdateConfigEventUpdateConfig
block.moveNewBlockEventNewBlock
block.moveUpdateEpochIntervalEventUpdateEpochInterval
aptos-token-objects/token.moveMutationEventMutation+ token:address
aptos-token-objects/collection.moveMutationEventMutation+ collection:address
aptos-token-objects/collection.moveBurnEventBurn+ previous_owner
aptos-token-objects/collection.moveMintEventMint+ collection:address
multisig_account.moveAddOwnersEventAddOwners+ account: address
multisig_account.moveRemoveOwnersEventRemoveOwners+ account: address
multisig_account.moveUpdateSignaturesRequiredEventUpdateSignaturesRequired+ account: address
multisig_account.moveCreateTransactionEventCreateTransaction+ account: address
multisig_account.moveVoteEventVote+ account: address
multisig_account.moveExecuteRejectedTransactionEventExecuteRejectedTransaction+ account: address
multisig_account.moveTransactionExecutionSucceededEventTransactionExecutionSucceeded+ account: address
multisig_account.moveTransactionExecutionFailedEventTransactionExecutionFailed+ account: address
multisig_account.moveMetadataUpdatedEventMetadataUpdated+ account: address
reconfiguration.moveNewEpochEventNewEpoch
stake.moveRegisterValidatorCandidateEventRegisterValidatorCandidate
stake.moveSetOperatorEventSetOperator
stake.moveAddStakeEventAddStake
stake.moveReactivateStakeEventReactivateStake
stake.moveRotateConsensusKeyEventRotateConsensusKey
stake.moveUpdateNetworkAndFullnodeAddressesEventUpdateNetworkAndFullnodeAddresses
stake.moveIncreaseLockupEventIncreaseLockup
stake.moveJoinValidatorSetEventJoinValidatorSet
stake.moveDistributeRewardsEventDistributeRewards
stake.moveUnlockStakeEventUnlockStake
stake.moveWithdrawStakeEventWithdrawStake
stake.moveLeaveValidatorSetEventLeaveValidatorSet
staking_contract.moveUpdateCommissionEventUpdateCommission
staking_contract.moveCreateStakingContractEventCreateStakingContract
staking_contract.moveUpdateVoterEventUpdateVoter
staking_contract.moveResetLockupEventResetLockup
staking_contract.moveAddStakeEventAddStake
staking_contract.moveRequestCommissionEventRequestCommission
staking_contract.moveUnlockStakeEventUnlockStake
staking_contract.moveSwitchOperatorEventSwitchOperator
staking_contract.moveAddDistributionEventAddDistribution
staking_contract.moveDistributeEventDistribute
staking_contract.moveSwitchOperatorEventSwitchOperator
vesting.moveCreateVestingContractEventCreateVestingContract
vesting.moveUpdateOperatorEventUpdateOperator
vesting.moveUpdateVoterEventUpdateVoter
vesting.moveResetLockupEventResetLockup
vesting.moveSetBeneficiaryEventSetBeneficiary
vesting.moveUnlockRewardsEventUnlockRewards
vesting.moveVestEventVest
vesting.moveDistributeEventDistribute
vesting.moveTerminateEventTerminate
vesting.moveAdminWithdrawEventAdminWithdraw
voting.moveCreateProposalEventCreateProposal
voting.moveRegisterForumEventRegisterForum
voting.moveVoteEventVote
voting.moveResolveProposal
token_event_store.moveCollectionDescriptionMutateEventCollectionDescriptionMutate
token_event_store.moveCollectionUriMutateEventCollectionUriMutate
token_event_store.moveCollectionMaxiumMutateEventCollectionMaxiumMutate
token_event_store.moveOptInTransferEventOptInTransfer
token_event_store.moveUriMutationEventUriMutation
token_event_store.moveDefaultPropertyMutateEventDefaultPropertyMutate
token_event_store.moveDescriptionMutateEventDescriptionMutate
token_event_store.moveRoyaltyMutateEventRoyaltyMutate
token_event_store.moveMaxiumMutateEventMaximumMutate

六、参考实现

https://github.com/aptos-labs/aptos-core/pull/10532

https://github.com/aptos-labs/aptos-core/pull/11688

七、风险和缺点

在迁移过程中,

  • 同时发出 v1 和 v2 事件会导致区块链性能下降 5% - 10%
  • 涉及框架模块双重发出事件的相关交易会增加 5% - 15% 的 Gas

八、未来潜力

迁移期将需要 3-6 个月,具体取决于过渡到模块事件流的进展情况。之后,可能需要一个新的 AIP 来删除所有旧事件。

九、时间表

1. 建议的实施时间表

已完成

2. 建议的开发者平台支持时间表

在1.11版本发布到主网之前。

3. 建议的部署时间表

在 Q1 结束时发布到测试网,然后发布到主网。

十、安全注意事项

请参阅风险和缺点