Расширение функционала Zennoposter с помощью стороннего кода

kul0n

Client
Регистрация
10.03.2016
Сообщения
97
Благодарностей
35
Баллы
18
Привет, форумчане!

Прошло не мало времени как я познакомился с ZennoPoster и начал осваивать все прелести автоматизации. За это время я получил много полезной информации от форума, за что всем огромное спасибо!:dh: И вот, наконец-то, решился внести свой небольшой вклад в это замечательное комьюнити. Приступим.

В этой статье хочу поделится костылем решением, которое поможет нам расширить функционал Zennoposter с помощью стороннего кода, заранее скомпилированного в exe файл. Понимаю, что для многих я не открою Америки, но для новичков и тех кто "работает в криптовалюте" думаю пригодится :-). Покажу на примере C# так как он ближе, роднее, но само собой этот способ можно реализовать используя абсолютно любой ЯП.

Суть поставленной задачи: получить приватный и публичный ключ из сид фразы для Solana чейна. На первый взгляд вроде как все просто, есть библиотеки Solnet.Wallet и SimpleBase которые на раз справятся с этим, но минимальные требования либ - .Net 5.0, а у нас .Net 4.8 :(

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

SolanaKeyGen.cs:
using System;
using Solnet.Wallet;
using SimpleBase;

class Program
{
    static void Main(string[] args)
    {
        if (args.Length == 0)
        {
            Console.WriteLine("Error: No seed phrase provided.");
            return;
        }

        //  Получаем seed phrase из аргументов командной строки
        string mnemonic = string.Join(" ", args);

        try
        {
            //  Создаём кошелёк Solana
            Wallet wallet = new Wallet(mnemonic);

            //  Получаем первый аккаунт (m/44'/501'/0'/0')
            Account account = wallet.GetAccount(0);

            //  Приватный ключ (64 байта, Ed25519)
            byte[] privateKeyBytes = account.PrivateKey;  // ✅ Используем `account.PrivateKey`, который уже byte[]

            //  Кодируем приватный ключ в Base58 (Solana формат)
            string privateKeyBase58 = Base58.Bitcoin.Encode(privateKeyBytes.AsSpan());

            //  Публичный ключ (Base58)
            string publicKeyBase58 = account.PublicKey.Key;

            //  Выводим ключи
            Console.WriteLine(privateKeyBase58+":"+ publicKeyBase58);

        }
        catch (Exception ex)
        {
            Console.WriteLine("❌ Error: " + ex.Message);
        }
    }
}
Код на входе в качестве аргументов получает нашу сид фразу, а на выходе отдает нам ключи.

Для проверки корректности работы нашей будущей программы возьмем валидную сид фразу execute bubble involve chief card planet year exhibit book opera beyond reveal импортируем ее в расширение BackPack и получим ключи:
privateKey: 3GdcP9ccbfEZpBwQQF8qwgCL6bPet48k6tHPaCoEYpLFWYtyEVuSXjib2HLBEVsxEZZGjTe59JDYReg9jZJDbuYM
publicKey: GwwNCFnbNp9KjXiXrbTqjCi1TU74NJJ3gbLFfikSfogm

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

Для компиляции кода :
1.
Устанавливаем .NET 6 SDK (если ещё не установлен).
2. Создаем рабочую папку в любом месте на ПК и сохраняем наш код в текстовый файл с расширением .cs
В моем случае это папка по пути F:\sol\и файл SolanaKeyGen.cs
3. Открываем терминал Windows (Win+R > cmd) и переходим в нашу папку командой cd /d F:\sol\
4. Создаем консольное приложение dotnet new console -n SolanaKeyGen
После этой команды у нас создастся папка SolanaKeyGen и в ней структура приложения.
131274

5. Та как в файле Program.cs у нас Hello, World! - удаляем в нем все, вставляем туда наш код из SolanaKeyGen.cs и сохраняем.
6. Далее переходим в папку SolanaKeyGen cd SolanaKeyGen
7. Устанавливаем необходимые библиотеки dotnet add package Solnet.Wallet и dotnet add package SimpleBase
8. Компилируем наш проект dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true
Если все прошло успешно то готовый .exe появится в SolanaKeyGen/bin/Release/net6.0/win-x64/publish/
9. Чтобы не бегать по папкам копируем полученный .exe в папку SolanaKeyGen и прямо в терминале проверяем наш EXEшник SolanaKeyGen.exe "execute bubble involve chief card planet year exhibit book opera beyond reveal"
131277

Работает) Обратите внимание в качестве аргументов мы передаем программе нашу сид фразу, ну а на выходе получаем валидные ключи.

Для использования нашего exe файла в ЗП удобно использовать ниже приведенный снипет, хотя можно и с помощью стандартного кирпича "Запуск программы".
Дерективы Using:
using System.Diagnostics;
run SolanaKeyGen.exe:
        //  Seed-фраза
        string mnemonic = "execute bubble involve chief card planet year exhibit book opera beyond reveal";

        //  Путь к .exe файлу
        string exePath = @"F:\sol\SolanaKeyGen\SolanaKeyGen.exe";

        //  Запускаем процесс
        ProcessStartInfo psi = new ProcessStartInfo
        {
            FileName = exePath,
            Arguments = "\"" + mnemonic + "\"", // Передаём seed как аргумент
            RedirectStandardOutput = true, // Читаем результат
            UseShellExecute = false,
            CreateNoWindow = true
        };

        Process process = new Process { StartInfo = psi };
        process.Start();

        //  Читаем результат
        string result = process.StandardOutput.ReadToEnd().Trim();

        process.WaitForExit();

        //  Присваиваем значения переменным ZennoPoster
    project.Variables["solPrivateKey"].Value = result.Split(':')[0];
    project.Variables["solPublicKey"].Value = result.Split(':')[1];

    return result;
Видео процесса:


На этом все, спасибо за внимание, если будут вопросы - пишите комментарии либо в ТГ.

Мои контакты:
Телеграм: https://t.me/z3p3r
Телеграм канал: https://t.me/auto_drops
 

Вложения

Последнее редактирование:

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 399
Благодарностей
955
Баллы
113
К сожалению тут приходится жертвовать скоростью. Хотя в данном случае она не особо критична, но есть проекты требующие именно скорость (например реализация транзакций в Solana), и запуск кода через exe тут не вывозит. С надеждой ждём когда же уже подвезут в зенку последнюю версию .NET
 
  • Спасибо
Реакции: seodamage и kul0n

kul0n

Client
Регистрация
10.03.2016
Сообщения
97
Благодарностей
35
Баллы
18
К сожалению тут приходится жертвовать скоростью. Хотя в данном случае она не особо критична, но есть проекты требующие именно скорость (например реализация транзакций в Solana), и запуск кода через exe тут не вывозит. С надеждой ждём когда же уже подвезут в зенку последнюю версию .NET
Да, это не панацея, но хоть какое-то решение, пока мы ждем обновления .NET )
 
  • Спасибо
Реакции: BAZAg

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 874
Благодарностей
2 588
Баллы
113
Спасибо за решение!

Когда мне с соланой приходилось работать - транзакции подписывал через nodejs.
Теперь буду знать ещё один способ как с ней работать.
 
  • Спасибо
Реакции: kul0n

kul0n

Client
Регистрация
10.03.2016
Сообщения
97
Благодарностей
35
Баллы
18
Спасибо за решение!

Когда мне с соланой приходилось работать - транзакции подписывал через nodejs.
Теперь буду знать ещё один способ как с ней работать.
Ну возможно через nodejs быстрее, это способ достаточно медленный, как было подмечено выше, но в моем случае скорость не важна)
 
  • Спасибо
Реакции: BAZAg

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 874
Благодарностей
2 588
Баллы
113
Ну возможно через nodejs быстрее, это способ достаточно медленный, как было подмечено выше, но в моем случае скорость не важна)
В моем случае также скорость была не важна.
Нужно было просто по очереди выполнить работу.
А на Net 5.0 не собирал, так как места на жестком диске мало - лень в студию было догружать нужные обновления, чтобы она поддерживала.
В результате оказалось, что через nodejs просто проще, это с одной стороны.
С другой стороны на nodejs очень легко ChatGPT рассказывает как поднять свой http сервер, а это уже значит что вызывать можно выполнение кода обычным post/get запросом (типа как API).

При всем этом, я часто использовал раньше подход, который описан в этой статье - например когда нужно было отправлять запросы в http/2 - то собирал что-то типа консольки, которая вызывалась через Зеннопостер с параметрами и возвращала уже готовый результат. Иногда, данный подход чуть ли не единственный очевидный вариант позволяющий быстро решить проблему.
 
  • Спасибо
Реакции: kul0n

Кто просматривает тему: (Всего: 1, Пользователи: 1, Гости: 0)