Написать свой кошелёк

Регистрация
9 Июл 2024
Сообщения
426
Реакции
259
Баллы
63
CFC
84900
USDT
21.9
- Написать свой кошелёк? Ты что псих? 😱
- Да ну, там же не сложнее школьной домашки по информатике! 😝

- Ищу драйвера на редкую железку.
- Ну что? Нашёл драйвера?
- Да не, сам написал!

- Кто же такой Сатоши Накомото?
- Не Кто, а Кот.

А теперь ваш мозг начнёт поглощаться инструкцией, которая не требует семи пядей во лбу...
  1. Подбрасываем монетку 256 раз. Это случайное число (в двоичной системе счисления).
  2. Переводим из двоичной в 16-ричную (можно даже вручную на листочке, аки на уроке информатики).
  3. Добавляем префикс в начале и постфикс в конце.
  4. Дважды последовательно вычисляем хеш sha256.
  5. Дописываем в конец контрольную сумму (первые 8 символов хеша).
  6. Кодируем в Base58.
  7. Получился приватный ключ в формате WIF Compressed (Wallet Import Format).
  8. Экспортировать ключ в кошелёк, выбрав при экспорте тип адреса (legacy / segwit / native segwit / taproot).
Реализовать можно на любом языке программирования... Хоть написать принципиально новый BolgenWallet на паскале, от нефиг делать сидя на уроке информатики.

Bash:
#!/bin/bash

# на основе алгоритма https://secretscan.org/PrivateKeyWif
# вспомогательные конвертеры http://brainwalletx.github.io/#converter
# рыться в стэк_оверфлоу как курица лапой в помёте https://stackoverflow.com/questions/30630841/how-to-convert-decimal-number-to-base58-in-a-shell-script
# схожая поделка https://github.com/grondilu/bitcoin-bash-tools




##############
# цикл ввода #
##############

bin=''
echo ""
echo "вводите нули и единицы"
echo -ne "[0/256]\r"

while true
do
    read -n 1 -s char
  
    if [[ $char != "0" && $char != "1" ]]
    then
        continue
    fi

    bin+=$char
    echo -ne "[${#bin}/256]\r"

    if [ "${#bin}" -eq 256 ]
    then
        break
    fi
done

echo -e "\n"




##################
# верхний предел #
##################

decimal=$(echo "obase=10; ibase=2; $bin" | bc | tr -d '\\[:space:]')
limit=115792089237316195423570985008687907852837564279074904382605163141518161494336

if [ "$(echo "$decimal > $limit" | bc)" -eq 1 ]
then
    echo "ВАШЕ ЧИСЛО $decimal"
    echo "ПРЕВЫШАЕТ ЛИМИТ $limit"
    exit 0
fi




###########
# функции #
###########

hex_to_sha256() {
    echo -n $1 | xxd -r -p | openssl dgst -sha256 | awk '{print $2}'
}

encode58() {
    b58chars=123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
    numHex=$1

    # remain leading 1 in base58
    prefix=''
    if test "00" == "$(echo -n $numHex | cut -c 1-2)"; then
        prefix=1
    fi

    numHex=$(echo -n $numHex | tr a-z A-Z)
    num58=''
    for charIndex in $(echo "obase=58;ibase=16;$numHex" | bc | tr -d '\n\\'); do
        num58=$num58$(echo -n $b58chars | cut -c $(( 10#$charIndex+1 )))
    done
    echo $prefix$num58
}




##########
# логика #
##########

# двоичный → шестнадцатиричный (Bin → Hex)
hex=$(echo "obase=16; ibase=2; $bin" | bc | tr 'A-F' 'a-f')

# добивка шестнадцатиричного нулями слева (стандарт 64 символа)
hex=$(printf "%064s" "$hex" | tr ' ' '0')

# 80 и шестнадцатиричный и 01
wrapped_hex="80${hex}01"

# шестнадцатиричный_в_обёртке → sha256
first_sha=$(hex_to_sha256 $wrapped_hex)

# sha256 → sha256
second_sha=$(hex_to_sha256 $first_sha)

# контрольная сумма (8 первых символов от sha256)
summ=${second_sha:0:8}

# шестнадцатиричный_в_обёртке и констрольная_сумма
wrapped_hex_and_summ=${wrapped_hex}${summ}

# шестнадцатиричный_в_обёртке и констрольная_сумма → base58
wif=$(encode58 $wrapped_hex_and_summ)




########################
# показывает введённое #
########################

row_bin=$(echo -n $bin | fold -w 32)
row_bin=$(echo "$row_bin" | sed 's/.\{8\}/&\t/g')

printf "\e[33m%s\e[0m\n" "$row_bin"
echo ""




##########################
# показывает вычисленное #
##########################

echo "{
    \"шестнадцатиричный\" : {
        \"hex\" : \"$hex\",
        \"[80]hex[01]\" : \"$wrapped_hex\"
    },

    \"контрольные суммы\" : {
        \"1-я sha256\" : \"$first_sha\",
        \"2-я sha256\" : \"$second_sha\",
        \"8 знаков начала 2-й\" : \"$summ\"
    },

    \"[80]hex[01][8 знаков]\" : \"$wrapped_hex_and_summ\",
  
  
    \"приватный ключ (WIF Compressed)\" : \"$wif\"
}" | jq

 2024-11-07 в 01.05.06.png



 2024-11-07 в 01.05.54.png


 2024-11-07 в 01.07.47.png
 
Последнее редактирование:
k0ttee, очень интересно, но ничего не понятно))))
Ну, в целом, понятно, конечно, но для человека, который хотя бы видел код)))

Реально познавательно и интересно
 
Наговнокодил за вечер, буквально за пять кружек чая )))
Затевал поделку как способ разбавить обсуждения "где кнопки красивее", но случился фальшстарт в отсутствии обсуждений кошельков.

BolgenWallet это отсылка к школьнику Попову и его Bolgen OS. Уже древний прикол, когда школьник попал в новости под видом создателя новой операционной системы (по факту он сделал говносборку Ubuntu Linux со своими нескучными обоями).

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

очень интересно, но ничего не понятно))))
Это написано на том же языке, на котором пишут команды в терминале линуксов. В новой винде есть WSL (Windows Subsystem for Linux). Маки это такие линуксы с фотошопом.

Сам код, конечно, мерзкое говнище. Но его мало, поэтому - осилить можно... Хоть скармливая кусочками на аудит искусственному интеллекту.

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

Создайте аккаунт или войдите, чтобы комментировать

Вы должны быть участником, чтобы оставить комментарий

Регистрация

Создайте учетную запись в нашем сообществе. Это просто!

Войти

У вас уже есть аккаунт? Войдите здесь.

473Темы
2914Сообщения
252Пользователи
MishkoKhitНовый пользователь
Назад
Сверху