zkSync Era的特点


zkSync Era的特点

虽然zkSync大部分是兼容Web3的,但与Ethereum相比,它有一些区别。其中主要的是。

  • 账户抽象支持(账户可以有近乎任意的验证逻辑,同时也启用了paymaster支持)。
  • 部署交易需要合约的字节码在一个单独的字段中传递。
  • 收费系统则有些不同。

这些需要我们用新的自定义字段来扩展标准的以太坊交易。这样的扩展交易被称为EIP712交易,因为EIP712open in new window被用来签署它们。你可以看一下EIP712交易的内部结构这里

本文档将只关注如何将这些参数传递给SDK。

Overrides

ethers.js有一个重写的概念。对于任何链上交易,ethers.js都能找到最佳的gasPricegasLimitnonce和其他重要的字段。但有时,你可能需要明确地提供这些值(例如,你想设置一个较小的gasPrice,或签署一个具有未来nonce的交易)。

在这种情况下,你可以提供一个Overrides对象作为最后一个参数。在那里你可以提供诸如gasPricegasLimitnonce等字段。

为了使SDK尽可能的灵活,zksync-web3在覆盖中使用customData对象来提供zkSync特定的字段。要提供zkSync特定的字段,你需要传递以下覆盖。

{
    overrides: {
        customData: {
            gasPerPubdata?: BigNumberish;
            factoryDeps?: BytesLike[];
            customSignature?: BytesLike;
            paymasterParams?: {
                paymaster: Address;
                paymasterInput: BytesLike;
            };
        }
    }
}

请再次注意:overridescustomData内的所有内容都与zkSync(L2 gas, etc)有关。

例子。

覆盖部署一个字节码为 "0xcde...12 "的合约,并强制要求运营商在第1层每发布一个字节不会收取超过 "100 "的二级气体。

{
    customData: {
        gasPerPubdata: "100", 
        factoryDeps: ["0xcde...12"],
    }
}

为账户使用自定义签名0x123456,同时使用地址为0x8e1DC7E4Bb15927E76a854a92Bf8053761501fdC的paymaster和paymaster输入0x8c5a3445

{
    customData: {
        customSignature: "0x123456",
        paymasterParams: {
            paymaster: "0x8e1DC7E4Bb15927E76a854a92Bf8053761501fdC",
            paymasterInput: "0x8c5a3445"
        }
    }
}

编码paymaster参数

虽然paymaster功能本身并没有对paymasterInput的值施加任何限制,但Matter Labs团队认可某些类型的paymaster flow是可以由EOAs处理的。

zkSync SDK提供了一个实用方法,可以用来获取正确形成的paymasterParams对象。getPaymasterParams

在行动中看到

如果你想调用一个名为greeterethersContract对象的setGreeting方法,这将看起来如下,同时用testnet paymaster支付费用。

// The `setGreeting` method has a single parameter -- new greeting
// We will set its value as `a new greeting`.
const greeting = "a new greeting";
const tx = await greeter.populateTransaction.setGreeting(greeting);
const gasPrice = await sender.provider.getGasPrice();
const gasLimit = await greeter.estimateGas.setGreeting(greeting);
const fee = gasPrice.mul(gasLimit);

const paymasterParams = utils.getPaymasterParams(testnetPaymaster, {
  type: "ApprovalBased",
  token,
  minimalAllowance: fee,
  innerInput: new Uint8Array(),
});
const sentTx = await sender.sendTransaction({
  ...tx,
  maxFeePerGas: gasPrice,
  maxPriorityFeePerGas: BigNumber.from(0),
  gasLimit,
  customData: {
    gasPerPubdata: utils.DEFAULT_GAS_PER_PUBDATA_LIMIT,
    paymasterParams,
  },
});

你也可以看看我们的教程关于成熟的mini-dApp,用户可以选择token来支付费用。

Last update:
Contributors: Blessing Krofegha,Newbee740,Stanislav Bezkorovainyi,AnastasiiaVashchuk,Antonio,Roman Brodetski,botdad