首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >zkSync时代的Paymaster,试图访问正在被调用的合同方法。

zkSync时代的Paymaster,试图访问正在被调用的合同方法。
EN

Ethereum用户
提问于 2023-04-07 22:36:55
回答 1查看 138关注 0票数 3

下面是一个基本示例,其中我在myContract上调用一个方法并使用Paymaster:

代码语言:javascript
复制
await myContract.myMethod(
  myArgs,
  {
    customData: {
      paymasterParams: paymasterParams,
      gasPerPubdata: utils.DEFAULT_GAS_PER_PUBDATA_LIMIT,
    }
  }
);

为了确保Paymaster只能用于myContract,并且只用于调用myMethod,我需要从paymaster智能契约代码中获取调用契约和方法。获取合同是直接的,它可以从transaction.to对象获得。

看来,transaction.data保存已编码的方法调用。因此,为了访问我尝试过的数据:

代码语言:javascript
复制
if (paymasterInputSelector == IPaymasterFlow.general.selector) {
  address userAddress = address(uint160(_transaction.from));
  address callerAddress = address(uint160(_transaction.to));
  require(userAddress == allowedUser, "Must be an Approved User");
  require(callerAddress == tokenAddr, "Invalid token address");
  bytes4 funcSlct = bytes4(keccak256(bytes(_transaction.data)));  //Trying to extract function selector from data
  if (funcSlct == bytes4(keccak256(bytes("0x1234abcd")))) {  
    // compare function selector from data to the expected value.
    // do something
    // But this always fails!
  } else {
    //don't do anything, revert! 
    // it always reverts here.
  }
  // rest of the paymaster code
}

问题是,这个条件从来没有得到满足,而且总是会恢复。

我不确定这是否与paymaster中的事务对象有关,或者我如何解码和比较函数签名/选择器是否有问题。注意,当它恢复时,它会将事务对象打印到屏幕上,而data将与匹配的函数选择器一起出现。

EN

回答 1

Ethereum用户

回答已采纳

发布于 2023-04-07 22:54:40

您正在从事务数据中提取函数选择器,但是它包含函数选择器,后面是ABI编码的参数,只需用要匹配的正确方法签名替换myMethod()

代码语言:javascript
复制
if (paymasterInputSelector == IPaymasterFlow.general.selector) {
    address userAddress = address(uint160(_transaction.from));
    address callerAddress = address(uint160(_transaction.to));
    require(userAddress == allowedUser, "Must be an Approved User");
    require(callerAddress == tokenAddr, "Invalid token address");
    
    bytes4 funcSlct = bytes4(_transaction.data[0] | (_transaction.data[1] << 8) | (_transaction.data[2] << 16) | (_transaction.data[3] << 24));
    bytes4 expectedFuncSlct = bytes4(keccak256("myMethod()"));

    if (funcSlct == expectedFuncSlct) {
        // Do something
    } else {
        // Revert
    }
    // Rest of the paymaster code
}
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/148670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档