Cover photo

Продолжаем гонять бич-транзакции

На этот раз у нас zkSync Era Mainnet. Пост является неким продолжением прошлой статьи о деплое контрактов.

Схема работы всего этого довольно проста: • Деплоим свой контракт, который работает в качестве ячейки хранения для баланса. Состоит он из трех функций: Deposit, Withdraw и getBalance.• Взаимодействуем с этим контрактом, отсылая ETH на адрес, вызывая функцию Deposit. • Когда мы прогнали нужное количество транзакций и объем Эфира, вызываем функцию Withdraw, забирая свой баланс обратно на кошелек.

Стратегии:

  1. Фарм количества транзакций

  2. Прогон объема в ETH (Transaction Value, как было в Arbitrum)

  3. Обычный прогрев кошелька на дистанции, балансируя и количество транзакций и разумный объем.

Цена одной транзакции: ~0.10$ - 0.15$ в ETH

Разбавляя активность кошельков деплоями своих контрактов, и взаимодействий с ними, мы показываем, что мы некие "билдеры" и хотим сделать свой вклад в развитие сети.

Уверяю, кастомные контракты - это тема, которую многие недооценивают. Даже самый дебильный, но личный, контракт будет лучше любой очередной транзакции на юзлессной dapp'ке.

Скрипт

Без скрипта я вас снова не оставил. Далее вы найдете пошаговый гайд + репозиторий с Github, где есть весь опенсорс код скрипта. С ним можно работать на нескольких кошельках, а время между депозитами и количество ETH - рандомное.

Контракт

функции контракта
функции контракта

В гайде мы будем использовать контракт, который задеплоил я. Сильно настаиваю на том, чтобы вы задеплоили свой, а не использовали мой, так как это свяжет ваши кошельки с другими. Если вы полный ноль в деплое - сначала прочитайте прошлую статью. После - прочитайте эту статью до конца, и в конце будет код точно такого же контракта. Но если вы не переживаете за связь кошельков, то пожалуйста:

0x7442E417C0B53d622d93F5D7BbD84eEd808F26C5. Я его верифицировал на zkSync скане, так что код полностью открыт.

Как было упомянуто раньше, в нем всего 3 простых функции:

  • Deposit - депозит ETH на контракт

  • Withdraw - вывод ETH с контракта

  • getBalance - проверка баланса, безгазовая функция


Депозит

Чтобы задепозитить вручную, заходим на контракт, нажимаем на Write и подключаем кошелек кнопкой Connect MetaMask. Далее, deposit и вписуем к-во ETH, например 0.00001.

компенсация газа
компенсация газа

В окне транзакции от Metamask, мы должны вручную поменять лимит газа, установив его на 500000. В результате вам покажет цену около 0.20$, но на деле заплатите вы меньше (0.1$-0.15$), так как газ, который не был использован сетью, вернется через Gas Refund (компенсация газа). Подтверждаем транзакцию и мы успешно задепозитили ETH на контракт.

Вывод

eth converter
eth converter

Чтобы вывести, мы так же заходим в раздел Write. После нажатия на withdraw, мы вписываем в поле количество ETH, которое хотим вывести. Но функция withdraw принимает значения ETH только в Wei, так что заходим на сайт и конвертируем Ether в Wei. Подтверждаем транзакцию на кнопку write, и мы успешно вывели свои деньги с контракта!

Скрипт

Если вы не хотите все это делать вручную, я подготовил для этого скрипт. **Внимание! Я не отвечаю за ваши средства, так что все действия вы делаете на свой страх и риск. И мой контракт, и следующий код - opensouce, вы можете сами их проверить, если желаете. ** Репозиторий:

https://github.com/Nomzegh/zkSyncTXs


Конфиг

post image

Чтобы нормально начать работать со скриптом, вам нужно выставить значения в конфиге под себя:

  • from_sec : минимальное значение в секундах, от которого код будет ждать между транзакциями

  • to_sec : максимальное значение в секундах, до которого код будет ждать между транзакциями

  • eth_min : Минимальное значение в ETH, от которого скрипт будет рандомить число ETH для депозита

  • eth_max : Максимальное значение в ETH, до которого скрипт будет рандомить число ETH для депозита

  • contract_address : Всегда 0x7442E417C0B53d622d93F5D7BbD84eEd808F26C5, либо заменить на свой контракт

  • RPC : Всегда https://mainnet.era.zksync.io, либо заменить на свою RPC


Приватные ключи

Чтобы работал скрипт, нужно вставить приватные ключи аккаунтов, с которыми хотите работать в скрипте.Для этого нужно создать файл keys.txt, который должен находиться возле двух других файлов, необходимых для работы скрипта (cheap_zk.py и abi.py).


Запуск

post image

После запуска нам нужно выбрать одну из опций - вписать цифру:

1 : Депозит. При выборе Deposit, скрипт выберет рандомное значение ETH, которое он задепозитит, исходя из минимальных/максимальных значений в конфиге. 2 : Вывод. При выборе Withdraw, скрипт проверит ваш баланс на контракте, и выведет полную сумму ETH обратно на ваш кошелек. 3 : Проверка баланса. При выборе Check Balance, скрипт проверит ваш баланс на контракте, но выводить его не будет.


post image

Деплой своего контракта

Если вы не хотите пользоваться моим контрактом, вы можете задеплоить личный.

Эта часть статьи для более продвинутых пользователей, так что если вы пропустили мою прошлую статью о том, как деплоить контракты на zkSyncEra Mainnet, советую её прочитать, так как не будете понимать следующее.

  • В hardhat.config.ts , до всего того, что мы вписывали ранее, вписываем импорт:

import "@matterlabs/hardhat-zksync-verify";
  • Заходим в папку contracts и редактируем файл contract.sol:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract EtherDeposit {
    mapping(address => uint256) private balances;

    event Deposit(address indexed account, uint256 amount);
    event Withdrawal(address indexed account, uint256 amount);

    function deposit() external payable {
        require(msg.value > 0, "Invalid deposit amount");

        balances[msg.sender] += msg.value;
        emit Deposit(msg.sender, msg.value);
    }

    function withdraw(uint256 amount) external {
        require(amount > 0, "Invalid withdrawal amount");
        require(balances[msg.sender] >= amount, "Insufficient balance");

        balances[msg.sender] -= amount;

        (bool success, ) = payable(msg.sender).call{value: amount}("");
        if (!success) {
            revert("Withdrawal failed");
        }

        emit Withdrawal(msg.sender, amount);
    }

    function getBalance() public view returns (uint256) {
        return balances[msg.sender];
    }
}
  • Заходим в папку deploy и редактируем deploy.ts:

import fs from "fs";
import { utils, Wallet } from "zksync-web3";
import * as ethers from "ethers";
import { HardhatRuntimeEnvironment } from "hardhat/types";
import { Deployer } from "@matterlabs/hardhat-zksync-deploy";

const PRIV_KEY = fs.readFileSync(".secret").toString();

export default async function (hre: HardhatRuntimeEnvironment) {
  console.log(`Running deploy script for your contract`);

  const wallet = new Wallet(PRIV_KEY);

  const deployer = new Deployer(hre, wallet);
  const artifact = await deployer.loadArtifact("EtherDeposit");

  const contract = await deployer.deploy(artifact, []);
  console.log("constructor args:" + contract.interface.encodeDeploy([]));

  const contractAddress = contract.address;
  console.log(`${artifact.contractName} was deployed to ${contractAddress}`);
}
  • Не забываем в файл .secrets вписать приватный ключ

  • Компилируем контракт командой:

npx hardhat compile
  • Если контракт успешно скомпилился, деплоим его командой:

npx hardhat deploy-zksync
  • Верифицируем контракт для zkSync Scan:

npm i -D @matterlabs/hardhat-zksync-verify
npx hardhat verify 0xВАШ_АДРЕС_КОНТРАКТА

Вот и все, вы задеплоили свой контракт, и теперь адрес контракта с конфига можете заменить на свой.


https://t.me/roccrypto

Subscribe