Как создать учетную запись ZkSync?

В документации ZkSync говорится, что для создания новой учетной записи необходимо сделать депозит с существующей учетной записи Ethereum на несуществующую учетную запись ZkSync.

Однако метод , который используется для внесения депозита, уже принимает адрес учетной записи ZkSync в качестве параметра для указания получателя:

      /// @notice Deposit ETH to Layer 2 - transfer ether from user into contract, validate it, register deposit
/// @param _zkSyncAddress The receiver Layer 2 address
function depositETH(address _zkSyncAddress) external payable {
    require(_zkSyncAddress != SPECIAL_ACCOUNT_ADDRESS, "P");
    require(msg.value > 0, "M"); // Zero-value deposits are forbidden by zkSync rollup logic
    requireActive();
    registerDeposit(0, SafeCast.toUint128(msg.value), _zkSyncAddress);
}

Как нам передать адрес учетной записи ZkSync, если это именно то, чего мы пытаемся достичь?

Если вы посмотрите на один из примеров , предоставленных командой ZkSync для Swift SDK:

      let ethereumProvider = try self.wallet.createEthereumProvider(web3: Web3.InfuraRinkebyWeb3())

firstly {
    ethereumProvider.deposit(token: .ETH,
                             amount: amount,
                             userAddress: wallet.address) /// Ethereum wallet address is provided
}.done { (_) in
    self.present(UIAlertController.for(message: "Successfully deposited"), animated: true, completion: nil)
}.catch { (error) in
    self.present(UIAlertController.for(error: error), animated: true, completion: nil)
}

Параметром для депозита является адрес отправителя, который является учетной записью в сети Ethereum , а не ZkSync.

Источник

      func depositETH(address: EthereumAddress, value: BigUInt) -> Promise<TransactionSendingResult> {
    guard let tx = self.contract.write("depositETH",
                                       parameters: [address] as [AnyObject], // here the parameter passed for the depositETH method of the smart contract is the address of the sender's account, which is the Ethereum account.
                                       transactionOptions: createOptions(value: value)) else {
        return Promise(error: ZkSyncContractError.invalidParameters)
    }

    return tx.sendPromise()
}

Если вы выполните приведенный выше код, вы получите следующую ошибку:

Эта загадочная ошибка, по-видимому, указывает на ошибку соединения в соответствии с исходным кодом web3swift, поскольку она, кажется, говорит об ошибке 1.

      public enum Web3Error: Error {
    case transactionSerializationError
    case connectionError
    case dataError
    case walletError
    case inputError(desc:String)
    case nodeError(desc:String)
    case processingError(desc:String)
    case keystoreError(err:AbstractKeystoreError)
    case generalError(err:Error)
    case unknownError

Итак, какой адрес вам нужно указать для метода депозита, чтобы создать новую учетную запись ZkSync? Является ли пример Swift SDK правильным, передавая адрес отправителя учетной записи Ethereum? Если да, то каков источник ошибки?

Обновлять

Последовательность процесса депозита в примере кода Swift SDK выглядит примерно так:

  1. Кошелек создан _
      guard let wallet = try? DefaultWallet<ChangePubKeyECDSA, DefaultEthSigner>(ethSigner: ethSigner,
                                                                           zkSigner: zkSigner,
                                                                           provider: provider) else {
    fatalError()
}
  1. Кошелек передается контроллеру представления депозита и используется для отправки депозита .
      let ethereumProvider = try self.wallet.createEthereumProvider(web3: Web3.InfuraRinkebyWeb3())

firstly {
    ethereumProvider.deposit(token: .ETH,
                             amount: amount,
                             userAddress: wallet.address)
}.done { (_) in
    self.present(UIAlertController.for(message: "Successfully deposited"), animated: true, completion: nil)
}.catch { (error) in
    self.present(UIAlertController.for(error: error), animated: true, completion: nil)
}

Но, если я правильно понимаю, userAddressпараметр в методе депозита должен быть адресом получателя. wallet.address, однако, является адресом отправителя .

      public var address: String {
    self.ethSigner.address
}

Перед вызовом метода депозита я сгенерировал новый адрес Ethereum для отправки средств в надежде, что он сможет создать новую учетную запись в Zksync, но все равно получил ту же ошибку.

      KeysService().getWalletPrivateKey(password: password, completion: { [weak self] privateKey, error in
    if let error = error {
        print(error)
    }
    
    if let privateKey = privateKey {
        do {

            guard let newWallet = self?.createZKWallet(.rinkeby, privateKey: privateKey) else { return }
            let ethereumProvider = try newWallet.createEthereumProvider(web3: Web3.InfuraRinkebyWeb3())

            firstly {
                ethereumProvider.deposit(token: .ETH,
                                         amount: amount,
                                         userAddress: newWallet.address)
            }.done { (_) in
                self?.present(UIAlertController.for(message: "Successfully deposited"), animated: true, completion: nil)
            }.catch { (error) in
                self?.present(UIAlertController.for(error: error), animated: true, completion: nil)
            }
        } catch {
            self?.present(UIAlertController.for(error: error), animated: true, completion: nil)
        }
    }
})

2 ответа

Вам необходимо передать новый адрес (адрес получателя). Невозможно отправить с «несуществующего» адреса, как вы говорите.

Вы можете «создать» адрес, сгенерировав его случайным образом из закрытого ключа или скопировав его, если вы уже знаете адрес.

Что касается вашей проблемы, пример приложения использует учетную запись, на которой в настоящее время нет средств. Ethereum(0x46a23e25df9a0f6c18729dda9ad1af3b6a131160) (см. скриншот). Я отправил небольшую сумму, и теперь она будет работать.

чтобы создать учетную запись zkSync, нам нужно как-то взаимодействовать с нашим кошельком: fe: Мы можем сделать депозит с любого децентрализованного кошелька L1→L2 и это будет означать, что учетная запись была создана или сделать перевод на существующий адрес l2→l2 и он будет быть также работоспособным. Но для работы с этими средствами нам нужно будет активировать наш L2 - сделать CPK, заплатить комиссию. В противном случае нам нужно будет сделать альтернативный вывод.

Другие вопросы по тегам