ERC-2400: 交易回执 URI
用于提交交易的 URI 格式,包含用于交易解码的完整信息
Authors | Ricardo Guilherme Schmidt (@3esmit), Eric Dvorsak (@yenda) |
---|---|
Created | 2019-11-05 |
Discussion Link | https://ethereum-magicians.org/t/eip-2400-transaction-receipt-uri/ |
Requires | EIP-155, EIP-681 |
摘要
交易哈希本身意义不大,因为它看起来与其他哈希一样,并且可能缺少读取交易的重要信息。
该标准包括显示交易及其详细信息所需的所有信息,例如 chainId
、调用的 method
签名和发出的 events
签名。
动机
以太坊客户端之间的互操作性,允许不同的系统就表示提交的交易哈希的标准方式达成一致,可以选择性地包含解码交易详细信息所需的信息。
用例
嵌入在二维码、网页超链接、电子邮件或聊天消息中的交易回执 URI 提供了非常松散耦合的应用程序之间强大的跨应用程序信令。标准化的 URI 格式允许即时调用用户首选的交易浏览器应用程序。例如:
- 在 web3 (dapps, mining pools, exchanges) 中,链接将自动打开用户首选的交易浏览器;
- 在钱包中,方便用户更轻松地共享交易回执;
- 在聊天应用程序中,作为对 EIP-681 交易请求的回复;
- 在加密货币自动售货机中,提交交易时可以显示二维码;
- 在向用户展示交易回执的任何地方。
规范
语法
交易回执 URL 在其 schema (协议) 部分包含 “ethereum”,并构造如下:
receipt = schema_part transaction_hash [ "@" chain_id ] [ "?" parameters ]
schema_part = "ethereum:tx-"
transaction_hash = "0x" 64*HEXDIG
chain_id = 1*DIGIT
parameters = parameter *( "&" parameter )
parameter = key "=" value
key = "method" / "events"
value = function_signature / event_list
function_signature = function_name "(" TYPE *( "," TYPE) ")"
function_name = STRING
event_list = event_signature *( ";" event_signature )
event_signature = event_name "(" event_type *( "," event_type) ")"
event_name = STRING
event_type = ["!"] TYPE
其中 TYPE
是标准 ABI 类型名称,如以太坊合约 ABI 规范中所定义。STRING
是 URL 编码的任意长度的 unicode 字符串。
感叹号 (!
) 在 event_type
中用于标识索引的事件参数。
语义
transaction_hash
是强制性的。必须在相应的 chain_id
交易历史记录中查找哈希,如果未找到,则应在待处理交易队列中查找并重新检查,直到找到为止。如果未找到,则应显示与“未找到交易错误”等效的错误,而不是交易。当交易处于待处理状态时,应继续检查,直到交易包含在区块中并变得“不可逆转”(通常在交易包含后的 12 个区块)。
chain_id
由 EIP-155 指定,是可选的,包含十进制链 ID,以便也可以表示各种测试和私有网络上的交易。如果不存在 chain_id
,则视为 $ETH/mainnet (1
)。
如果 method
不存在,则表示交易回执 URI 未指定详细信息,或者它是没有 calldata 的交易。如果存在,则需要通过比较交易 calldata 的前 4 个字节与 method
的 keccak256 哈希的前 4 个字节来验证,如果无效,则必须显示与“方法验证错误”等效的错误,而不是显示交易。
如果 events
不存在,则表示交易回执 URI 未指定详细信息,或者交易未引发任何事件。待处理和失败的交易不验证事件,但是,当交易成功(或从待处理更改为成功)并且 URI 中存在事件时,event_list
中的每个事件必须在交易回执事件日志中至少出现一次,否则应显示与“事件验证错误: {event(s) [$event_signature, …] not found}”等效的错误,而不是显示交易。URI 可能包含所有、部分或未引发事件的事件签名。
示例
简单的 ETH 转账:
ethereum:tx-0x1143b5e38fe3cf585fb026fb9b5ce35c85a691786397dc8a23a07a62796d8172@1
标准 Token 转账:
ethereum:tx-0x5375e805b0c6afa20daab8d37352bf09a533efb03129ba56dee869e2ce4f2f92@1?method="transfer(address,uint256)"&events="Transfer(!address,!address,uint256)"
复杂的合约交易:
ethereum:tx-0x4465e7cce3c784f264301bfe26fc17609855305213ec74c716c7561154b76fec@1?method="issueAndActivateBounty(address,uint256,string,uint256,address,bool,address,uint256)"&events="Transfer(!address,!address,uint256);BountyIssued(uint256);ContributionAdded(uint256,!address,uint256);BountyActivated(uint256,address)"
理由
该标准的目标仅涉及提交的交易的传输,因此必须从区块链或待处理交易队列中加载交易数据,这也用作验证交易是否存在的方式。
未找到交易哈希在新的交易中是正常的,但也可能意味着实际上从未提交交易或已被替换(通过“更高的 gasPrice”nonce 覆盖或通过叔块/分叉)。
为了解码交易参数和事件,需要 ABI 的一部分。交易签名者必须知道 ABI 才能签署交易,并且也是创建交易回执的人,因此可以选择性地共享交易回执,其中包含解码交易调用数据及其事件所需的信息。
向后兼容性
与此提案部分或完全不兼容的未来升级必须使用 tx-
以外的前缀,该前缀与后面的内容用短划线 (-) 字符分隔。
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Ricardo Guilherme Schmidt (@3esmit), Eric Dvorsak (@yenda), "ERC-2400: 交易回执 URI [DRAFT]," Ethereum Improvement Proposals, no. 2400, November 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2400.