[TOC]
AIP-82 - 交易上下文扩展
一、摘要
本AIP提议在Aptos框架内扩展交易上下文模块。增强功能将使用户能够在智能合约中直接检索用户交易信息。这一特性对于支持自定义用户序言和尾声的机制至关重要,这些将在以后的AIP中单独处理。
1. 不讨论的部分
本AIP不包括检索用户交易签名的API,尽管它们是已签名交易的一部分。这是因为目前还没有识别到对这种功能的需求。然而,如果将来需要,可以引入此功能。
此扩展仅适用于用户交易,不适用于其他类型的系统交易。
二、宏观概述
此特性通过在 Aptos 框架内扩展交易上下文模块,为智能合约提供对当前用户交易信息的访问权限。信息包括发送者、次要签名者、Gas 支付者、最大 Gas 量、Gas 价格、链 ID、入口函数有效载荷和多签有效载荷。
本 AIP 在交易上下文模块内引入了一个API,它由一组公共函数组成,用于检索交易上下文信息。例如,在智能合约执行期间,可以通过调用相应的函数来检索交易发送者的地址或 Gas 支付者的地址。有关提议 API 的更全面解释,请参见规范和实现细节部分。
这一增强对于促进自定义用户开始和结束( prologues and epilogues)的机制至关重要,目前这些正在开发中。自定义开始和结束将能够使用提案的 API 检索交易信息并根据用户交易上下文执行特定逻辑。有关自定义用户开始和结束的设计和实现的详细信息将在未来的 AIP 中讨论。
三、影响
智能合约开发者可以利用这一特性,使他们的智能合约能够直接从当前用户交易中访问上下文信息。
四、规范和实现细节
本 AIP 通过引入交易上下文 API 扩展了 Aptos 框架的交易上下文模块(即aptos_framework::transaction_context)。这个API包括一系列公共函数,允许智能合约访问当前用户交易的信息。API规范如下:
public fun sender(): address- 返回当前交易的发送者地址。
public fun secondary_signers(): vector<address>- 返回当前交易的次要签名者列表。
public fun gas_payer(): address- 返回当前交易的 Gas 支付者地址。
public fun max_gas_amount(): u64- 返回当前交易所指定的最大 gas 单位数。
public fun gas_unit_price(): u64- 返回当前交易中指定的以 Octas 计价的 gas 单位价格。
public fun chain_id(): u8- 返回为当前交易指定的链 ID。
public fun entry_function_payload(): Option<EntryFunctionPayload>- 如果当前交易存在有效载荷,则返回这个交易中入口函数的有效载荷。否则,返回
None。
- 如果当前交易存在有效载荷,则返回这个交易中入口函数的有效载荷。否则,返回
public fun multisig_payload(): Option<MultisigPayload>- 如果当前交易存在有效载荷,则返回这个交易中多签的有效载荷。否则,返回
None。
- 如果当前交易存在有效载荷,则返回这个交易中多签的有效载荷。否则,返回
入口函数有效载荷定义如下:
struct EntryFunctionPayload has copy, drop {
account_address: address,
module_name: String,
function_name: String,
ty_args_names: vector<String>,
args: vector<vector<u8>>,
}
以下是访问入口函数有效载荷字段的函数:
public fun account_address(payload: &EntryFunctionPayload): addresspublic fun module_name(payload: &EntryFunctionPayload): Stringpublic fun function_name(payload: &EntryFunctionPayload): Stringpublic fun type_arg_names(payload: &EntryFunctionPayload): vector<String>public fun args(payload: &EntryFunctionPayload): vector<vector<u8>>
多签有效载荷定义如下:
struct MultisigPayload has copy, drop {
multisig_address: address,
entry_function_payload: Option<EntryFunctionPayload>,
}
以下是访问多签有效载荷字段的函数:
public fun multisig_address(payload: &MultisigPayload): addresspublic fun inner_entry_function_payload(payload: &MultisigPayload): Option<EntryFunctionPayload>
五、参考实现
https://github.com/aptos-labs/aptos-core/pull/11843
六、测试
参考实现包括多个单元测试和端到端测试,涵盖各种正面和负面场景。这些场景将在 devnet 和 testnet 上进行测试。
七、安全考虑
本 AIP 允许智能合约访问当前执行的交易信息。由于用户交易数据已经存储在链上并且是公开可用的,本 AIP 不引入与秘密信息披露相关的任何额外安全风险。
八、未来潜力
这一特性对于启用将在单独的 AIP 中详细说明的自定义用户序言和尾声至关重要。
九、时间线
1. 建议的实现时间表
实现已在v1.12分支截止前登陆到main分支。
2. 建议的开发者平台支持时间表
N.A.
3. 建议的部署时间表
- 在devnet上:随版本v1.12发布
- 在 testnet 和 mainnet 上:取决于 AIP 批准进程