iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
Modern Web

web3 短篇集系列 第 18

認識 User Operation

  • 分享至 

  • xImage
  •  

今天簡單介紹抽象帳戶的偽交易物件 - User Operation 的每個欄位。

2024/2 以太坊官方帳戶抽象開發團隊 eth_infinitism 發佈了 ERC-4337 v0.7,相較於 v0.6 的 User Operation 有 11 個欄位,在 v0.7 版中改為 9 個欄位,struct 的名字換成 PackedUserOperation:

struct PackedUserOperation {
    address sender;
    uint256 nonce;
    bytes initCode;
    bytes callData;
    bytes32 accountGasLimits;
    uint256 preVerificationGas;
    bytes32 gasFees;
    bytes paymasterAndData;
    bytes signature;
}

1. sender

交易的發起者,即 SCA 的地址。

2. nonce

避免重送攻擊的計數器。

3. initCode

選填,若 SCA 尚未部署,會執行這裡的 code 來部署合約。部署 SCA 和第一筆交易可以合起來成一筆交易。

4. callData

由 EntryPoint 對 SCA 呼叫的 calldata,即 SCA 要執行的交易內容。

5. accountsGasLimits

32-bytes 的資料由兩個 gasLimit 組成,一個是驗證一個是執行:

  1. EntryPoint 呼叫 validateUserOp 的 gasLimit
  2. EntryPoint 執行 callData 的 gasLimit

例如:

0x000000000000000000000000000f423f000000000000000000000000000f423f

6. preVerificationGas

簡稱 PVG,用於補貼 Bundler 執行 EntryPoint.handleOps 之外所消耗的 gas。如果使用 Bundler 送 UserOps 這欄沒給或給太少,Bundler 可能就不幫你送 UserOps 了。

詳情見 Stackup - An analysis of PreVerificationGas

7. gasFees

32-bytes 的資料由 maxPriorityFeePerGas 和 maxFeePerGas 組成。

EIP-1559 的手續費公式:

ActualGasPrice = min(maxFeePerGas, baseFee + maxPriorityFeePerGas)
GasFee = GasPrice * GasUsed

8. paymasterAndData

選填,如果要使用 paymaster 在這填寫相關資料。

(尚未研究 paymaster 之後補上)

9. signature

用於 SCA 要驗的簽章,以 SimpleAccount.sol 為例,它的 _validateSignature 如下:

function _validateSignature(PackedUserOperation calldata userOp, bytes32 userOpHash)
    internal override virtual returns (uint256 validationData) {
        bytes32 hash = MessageHashUtils.toEthSignedMessageHash(userOpHash);
        if (owner != ECDSA.recover(hash, userOp.signature))
            return SIG_VALIDATION_FAILED;
        return SIG_VALIDATION_SUCCESS;
    }

SimpleAccount 的擁有者製作簽章的方式如下:

bytes32 userOpHash = IEntryPoint(entryPoint).getUserOpHash(userOp);
(uint8 v, bytes32 r, bytes32 s) = vm.sign(0xbeef, MessageHashUtils.toEthSignedMessageHash(userOpHash));

userOp.signature = abi.encodePacked(r, s, v);

Reference


上一篇
合約錢包的簽章 (ERC-1271)
下一篇
實作自己送 UserOperation - Part 1
系列文
web3 短篇集30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言