• XSS.stack #1 – первый литературный журнал от юзеров форума

прочее TRX Vanity Generator

duk

🦆 quack
КИДАЛА
Регистрация
05.01.2023
Сообщения
169
Реакции
120
Гарант сделки
2
Пожалуйста, обратите внимание, что пользователь заблокирован
К своему сожалению, имел неосторожность отправть N-ую сумму на идентичный моему получателю кошелек. Как в этом треде - https://xss.pro/threads/82463/
Вашему вниманию, Golang скрипт для генерации адресов в сети TRON

1. Поиск по первым символам (pKey: 524f8fd83cb54259a4209d178abe686bf45eef77b92a8956439f34d178b0669f, address: TXSSemgwBZVb5SHZTYZ6XVVBWS688MTomF)
2. Поиск по последним символам (pKey: b8ae5661b8d1f8bf5de9beff97b27c81a7323190c41e2b2a8cf22b575d328f63, address: TRkgSp7xGzopgraWqiLdXwfRnQhqhFbXSS)
3. Поиск по первым и последним символам (см. спойлер)
4. Поиск по последовательности символов (pKey: 2c9e13aa731a04ac2caca775f01c045a999ce9dfb0fa174fa308d258541f3b95, address: TTvwsCKNDSg4zE6tQAv5iZBgv2y1XSSisF)

Данные адреса можно использовать в аналогичных атаках
Если будете генерировать какой-либо красивый кошелек для себя (например начинающийся с 5 символов T), - не забывайте про мультиподпись.
- Кошельки начинающиеся более чем с 5 символов T подсвечены
- Вывод скорости генераций

trxgen.jpg


Код:
package main

import (
    "crypto/ecdsa"
    "crypto/sha256"
    "encoding/hex"
    "errors"
    "fmt"
    "strings"
    "time"

    "github.com/ethereum/go-ethereum/common/hexutil"
    "github.com/ethereum/go-ethereum/crypto"
    "github.com/fatih/color"
    "github.com/mr-tron/base58"
)

type key struct {
    privateKey    string
    publicKey     string
    addressHex    string
    addressBase58 string
    attempts      int
    numT          int
}

func main() {
    var searchOption int
    fmt.Println("█████████████████████████████████████████████████████████")
    fmt.Println("█─▄─▄─█▄─▄▄▀█▄─▀─▄███▄─█─▄██▀▄─██▄─▀█▄─▄█▄─▄█─▄─▄─█▄─█─▄█")
    fmt.Println("███─████─▄─▄██▀─▀█████▄▀▄███─▀─███─█▄▀─███─████─████▄─▄██")
    fmt.Println("▀▀▄▄▄▀▀▄▄▀▄▄▀▄▄█▄▄▀▀▀▀▀▄▀▀▀▄▄▀▄▄▀▄▄▄▀▀▄▄▀▄▄▄▀▀▄▄▄▀▀▀▄▄▄▀▀")
    fmt.Println("")
    fmt.Printf("Wallets starting with more than 5 characters \033[32mT\033[0m are \033[32mhighlighted\033[0m\n")
    fmt.Println("The generation rate is output every 5 minutes")
    fmt.Println("")
    fmt.Println("Choose search option:")
    fmt.Println("1. Search by first characters")
    fmt.Println("2. Search by last characters")
    fmt.Println("3. Search by both first and last characters")
    fmt.Println("4. Search by any sequence of letters or numbers")
    fmt.Print("Enter the option number: ")
    fmt.Scan(&searchOption)

    var firstCharacters, lastCharacters, sequence string

    switch searchOption {
    case 1:
        fmt.Print("Enter the first characters to search: ")
        fmt.Scan(&firstCharacters)
    case 2:
        fmt.Print("Enter the last characters to search: ")
        fmt.Scan(&lastCharacters)
    case 3:
        fmt.Print("Enter the first characters to search: ")
        fmt.Scan(&firstCharacters)
        fmt.Print("Enter the last characters to search: ")
        fmt.Scan(&lastCharacters)
    case 4:
        fmt.Print("Enter any sequence of letters or numbers to search: ")
        fmt.Scan(&sequence)
    default:
        fmt.Println("Invalid option")
        return
    }

    addressChannel := make(chan *key)
    attemptsChannel := make(chan int, 100)

    go func() {
        ticker := time.NewTicker(time.Duration(5 * time.Minute))
        var attempts int

        for {
            select {
            case <-ticker.C:
                fmt.Printf("speed: %d\n", attempts)
                attempts = 0
            case <-attemptsChannel:
                attempts++
            }
        }
    }()

    for i := 0; i < 255; i++ {
        go func() {
            attempts := 1
            for {
                k, err := generateKey(attempts)
                if err != nil {
                    fmt.Println(err)
                    return
                }
                if matchesPattern(k.addressBase58, searchOption, firstCharacters, lastCharacters, sequence) {
                    addressChannel <- k
                    attemptsChannel <- 1
                    return
                }
                attemptsChannel <- 1
                attempts++
            }
        }()
    }

    for i := 0; i < 255; i++ {
        select {
        case k := <-addressChannel:
            var numTColor, addressColor string

            switch {
            case k.numT <= 5:
                numTColor = color.WhiteString("%d", k.numT)
                addressColor = k.addressBase58
            case k.numT == 6:
                numTColor = color.GreenString("%d", k.numT)
                addressColor = color.GreenString(k.addressBase58)
            case k.numT >= 7:
                numTColor = color.RedString("%d", k.numT)
                addressColor = color.RedString(k.addressBase58)
            }

            fmt.Printf("attempts: %d, tNum: %s, pKey: %s, address: %s\n", k.attempts, numTColor, k.privateKey, addressColor)
        }
    }
}

func matchesPattern(address string, searchOption int, firstCharacters, lastCharacters, sequence string) bool {
    switch searchOption {
    case 1:
        return strings.HasPrefix(address, firstCharacters)
    case 2:
        return strings.HasSuffix(address, lastCharacters)
    case 3:
        return strings.HasPrefix(address, firstCharacters) && strings.HasSuffix(address, lastCharacters)
    case 4:
        return strings.Contains(address, sequence)
    default:
        return false
    }
}

func generateKey(attempts int) (*key, error) {
    var k key

    privateKey, err := crypto.GenerateKey()
    if err != nil {
        return nil, fmt.Errorf("failed to generate key: %w", err)
    }
    privateKeyBytes := crypto.FromECDSA(privateKey)
    k.privateKey = hexutil.Encode(privateKeyBytes)[2:]
    publicKey := privateKey.Public()
    publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
    if !ok {
        return nil, errors.New("error casting public key to ECDSA")
    }
    publicKeyBytes := crypto.FromECDSAPub(publicKeyECDSA)
    k.publicKey = hexutil.Encode(publicKeyBytes)[2:]

    address := crypto.PubkeyToAddress(*publicKeyECDSA).Hex()
    address = "41" + address[2:]
    k.addressHex = address
    addb, _ := hex.DecodeString(address)
    hash1 := s256(s256(addb))
    secret := hash1[:4]
    addb = append(addb, secret...)
    k.addressBase58 = base58.Encode(addb)
    k.attempts = attempts
    k.numT = countStartingTs(k.addressBase58)

    return &k, nil
}

func s256(s []byte) []byte {
    h := sha256.New()
    h.Write(s)
    bs := h.Sum(nil)
    return bs
}

func countStartingTs(address string) int {
    var count int
    for _, char := range address {
        if char == 'T' {
            count++
        } else {
            break
        }
    }
    return count
}
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Годно! А есть какой то скрипт который рассылает 0 trx на адреса? Это вроде нулевая транзакция называется вот как тут https://xss.pro/threads/92712/ https://xss.pro/threads/94592/
Как будет свободное время - сделаю
Если дополнительно написать парсер последних транзакций, автоматическую генерацию и отправку нулевой транзакции, то можно подаваться в конкурс проектов)
 
Как будет свободное время - сделаю
Если дополнительно написать парсер последних транзакций, автоматическую генерацию и отправку нулевой транзакции, то можно подаваться в конкурс проектов)
ждём!!!!
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пока только теория.

1. TRX
  • Отправка минимальной суммы в TRX, при заданном юзером условии (например, трансфер более 10.000 TRX)

2. USDT
  • а) Использование метода transferFrom
    [*]
    transferFrom.jpg
  • Отправка минимальной суммы в USDT, при заданной условии (например, перевод более 10.000 USDT)
  • Отправка похожей суммы в USDT (с адреса ушло 125.500 USDT, отправляем 0.1255 USDT)
  • Отправка похожей суммы в TRX (аналогично пункту выше)
  • Отправка минимальной суммы в TRX, при заданном условии (например, трансфер более 10.000 USDT)
- Какие атаки вы видите более перспективными?
- Генерируем похожие адреса при парсинге или генерируем и потом обращаемся к ним (ищем похожие, уже при парсинге)?
- Если заниматься в промышленных масштабах разоритесь на комиссииях (при отсутствии результата)
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Продолжение:

Dust Attack (атака копейками/пылью) в сети TRX
В нашем случае, это отправка мелких транзакций на идентичные пользователям кошельки с целью получения обратной транзакции
(рассчитано на невнимательность владельца кошелька отправителя)

Теория:
Предварительно мы подготавливаем кошелек, на котором будет достаточное количество TRX и Bandwidth для переводов
При переводе TRX - TRX расходуется Bandwidth. Если нет необходимого количества Bandwidth для перевода, комиссия на перевод увеличивается
(Решение: стейкинг TRX для получения Bandwidth или аренда ресурсов на специаизированных ресурсах)
Далее для активации свежесгенерированного кошелька потребуется 1 TRX - это требование сети
После активации на кошельке будет 600 Bandwidth - этого будет достаточно для одного-двух "бесплатных" переводов
Одна транзакция будет стоить нам ~1.1-1.2 TRX ($0.15). 1000 транзакций $150, дороговато. Если у вас есть мысли, как пофиксить этот момент, прошу в ЛС

Как это должно работать?
1. Wallet1 отправляет на Wallet2 некую сумму в TRX
2. Мы генерируем кошелек, похожий на кошелек получателя. Назовем его Wallet2Copy
3. С кошелька на котором достаточно TRX (вашего кошелька) отправляем минимальную транзакцию на Wallet2Copy
4. Отправляем копейки в TRX с Wallet2Copy на кошелек Wallet1
5. Ожидаем, что Wallet1 снова захочет отправить TRX на Wallet2 и скопирует похожий кошелек из последней транзации

Практика:
Мониторим последние транзакции блокчейна.
https://apilist.tronscanapi.com/api/transaction - эндпоинт для проверки последних транзакций и исключения ненужных по условиям кошельков
https://apilist.tronscanapi.com/api/accountv2?address - эндпоинт для проверки условий нужных кошельков

Исключаем из нашей выборки кошельки, которые принадлежат биржам (на которых есть теги)
ownerAddressTag: "название биржи/обменника"
toAddressTag: "название биржи/обменника"
Исключаем кошельки получателей, на которые уже была произведена отправка (кошелек получателя повторяется только 1 раз)
Исключаем (предположительно) кошельки обменников (балансы более 1КК TRX) - других способов не придумал, но наверняка есть какая-то база обменников

Задаем условия нужных нам кошельков:
1. Сумма операции должна превышать 100 TRX
2. После отправки транзакции на кошельке отправтеля должно остаться более чем 15К TRX, но менее 1КК

P.S. С одной стороны, если автоматизировать весь процесс будет гораздо проще.
Но будет сжираться бесконечное число TRX
P.P.S. При обработке операций вручную (мы будем отправлять копейки с "нужным" опазданием) мы будем последней транзакцией относительно других таких же ребят, у которых все автоматизировано

Красные - блеклист
Зеленые - нужные

log.jpg

Код:
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "strconv"
    "time"
)

type Transaction struct {
    Block           int      `json:"block"`
    Hash            string   `json:"hash"`
    Timestamp       int64    `json:"timestamp"`
    OwnerAddress    string   `json:"ownerAddress"`
    ToAddressList   []string `json:"toAddressList"`
    ToAddress       string   `json:"toAddress"`
    OwnerAddressTag string   `json:"ownerAddressTag"`
    ToAddressTag    string   `json:"toAddressTag"`
    ContractType    int      `json:"contractType"`
    Confirmed       bool     `json:"confirmed"`
    Revert          bool     `json:"revert"`
    ContractData    struct {
        Data            string `json:"data"`
        OwnerAddress    string `json:"owner_address"`
        ContractAddress string `json:"contract_address"`
    } `json:"contractData"`
    Result string `json:"result"`
    Amount string `json:"amount"`
}

type ResponseData struct {
    Data []Transaction `json:"data"`
}

func main() {
    var (
        endpoint = "https://apilist.tronscanapi.com/api/transaction?"
        sort     = "sort=-timestamp"
        count    = 50
        start    = 0
    )

    uniqueToAddresses := make(map[string]bool)

    for {
        transactions, err := getTransactions(endpoint + sort + "&count=" + strconv.Itoa(count) + "&start=" + strconv.Itoa(start))
        if err != nil {
            fmt.Println("Error fetching transactions:", err)
            continue
        }

        for _, txn := range transactions {
            if txn.ContractType == 1 {
                if len(txn.ToAddressList) == 0 {
                    continue
                }

                amount, err := strconv.ParseFloat(txn.Amount, 64)
                if err != nil {
                    fmt.Println("Error converting amount to float64:", err)
                    continue
                }
                amountTRX := amount / 1000000

                from := txn.OwnerAddress
                to := txn.ToAddress
                isBlacklisted := false
                isGreen := false

                if txn.OwnerAddressTag != "" || txn.ToAddressTag != "" || amountTRX > 1000000 {
                    isBlacklisted = true
                }

                if txn.OwnerAddressTag != "" {
                    from = fmt.Sprintf("\x1b[31m%s\x1b[0m", txn.OwnerAddressTag)
                }

                if txn.ToAddressTag != "" {
                    to = fmt.Sprintf("\x1b[31m%s\x1b[0m", txn.ToAddressTag)
                }

                if amountTRX > 100 {
                    balanceMsg := ""
                    balance, err := getBalance(txn.OwnerAddress)
                    if err != nil {
                        fmt.Println("Error fetching balance:", err)
                    } else {
                        if isBlacklisted {
                            balanceMsg = "\x1b[31mBlacklisted\x1b[0m"
                        } else {
                            if balance > 15000 && balance < 999999 {
                                balanceMsg = fmt.Sprintf("\x1b[32m%.4f TRX\x1b[0m", balance)
                                isGreen = true
                            } else if balance > 1000000 {
                                balanceMsg = "\x1b[31mBlacklisted\x1b[0m"
                            } else {
                                balanceMsg = fmt.Sprintf("%.4f TRX", balance)
                            }
                        }
                    }
                    if isGreen {
                        fmt.Printf("Hash: %s, From: \x1b[32m%s\x1b[0m, To: \x1b[32m%s\x1b[0m, Amount: %.4f TRX, Sender's balance: %s\n", txn.Hash, from, to, amountTRX, balanceMsg)
                    } else {
                        fmt.Printf("Hash: %s, From: %s, To: %s, Amount: %.4f TRX, Sender's balance: %s\n", txn.Hash, from, to, amountTRX, balanceMsg)
                    }
                }

                for _, toAddress := range txn.ToAddressList {
                    if !uniqueToAddresses[toAddress] {
                        uniqueToAddresses[toAddress] = true
                    }
                }
            }
        }

        start += count
        time.Sleep(5 * time.Second)
    }
}

func getTransactions(endpoint string) ([]Transaction, error) {
    resp, err := http.Get(endpoint)
    if err != nil {
        return nil, fmt.Errorf("error fetching transactions: %v", err)
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        return nil, fmt.Errorf("error fetching transactions: unexpected status code: %d", resp.StatusCode)
    }

    var response ResponseData
    if err := json.NewDecoder(resp.Body).Decode(&response); err != nil {
        return nil, fmt.Errorf("error fetching transactions: %v", err)
    }

    return response.Data, nil
}

func getBalance(address string) (float64, error) {
    resp, err := http.Get("https://apilist.tronscanapi.com/api/accountv2?address=" + address)
    if err != nil {
        return 0, fmt.Errorf("error fetching balance: %v", err)
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        return 0, fmt.Errorf("error fetching balance: unexpected status code: %d", resp.StatusCode)
    }

    var accountData struct {
        Balance int64 `json:"balance"`
    }
    if err := json.NewDecoder(resp.Body).Decode(&accountData); err != nil {
        return 0, fmt.Errorf("error fetching balance: %v", err)
    }

    balanceTRX := float64(accountData.Balance) / 1000000

    return balanceTRX, nil
}
 
Последнее редактирование:
Продолжение:

Dust Attack (атака копейками/пылью) в сети TRX
В нашем случае, это отправка мелких транзакций на идентичные пользователям кошельки с целью получения обратной транзакции
(рассчитано на невнимательность владельца кошелька отправителя)

Теория:
Предварительно мы подготавливаем кошелек, на котором будет достаточное количество TRX и Bandwidth для переводов
При переводе TRX - TRX расходуется Bandwidth. Если нет необходимого количества Bandwidth для перевода, комиссия на перевод увеличивается
(Решение: стейкинг TRX для получения Bandwidth или аренда ресурсов на специаизированных ресурсах)
Далее для активации свежесгенерированного кошелька потребуется 1 TRX - это требование сети
После активации на кошельке будет 600 Bandwidth - этого будет достаточно для одного-двух "бесплатных" переводов
Одна транзакция будет стоить нам ~1.1-1.2 TRX ($0.15). 1000 транзакций $150, дороговато. Если у вас есть мысли, как пофиксить этот момент, прошу в ЛС

Как это должно работать?
1. Wallet1 отправляет на Wallet2 некую сумму в TRX
2. Мы генерируем кошелек, похожий на кошелек получателя. Назовем его Wallet2Copy
3. С кошелька на котором достаточно TRX (вашего кошелька) отправляем минимальную транзакцию на Wallet2Copy
4. Отправляем копейки в TRX с Wallet2Copy на кошелек Wallet1
5. Ожидаем, что Wallet1 снова захочет отправить TRX на Wallet2 и скопирует похожий кошелек из последней транзации

Практика:
Мониторим последние транзакции блокчейна.
https://apilist.tronscanapi.com/api/transaction - эндпоинт для проверки последних транзакций и исключения ненужных по условиям кошельков
https://apilist.tronscanapi.com/api/accountv2?address - эндпоинт для проверки условий нужных кошельков

Исключаем из нашей выборки кошельки, которые принадлежат биржам (на которых есть теги)
ownerAddressTag: "название биржи/обменника"
toAddressTag: "название биржи/обменника"
Исключаем кошельки получателей, на которые уже была произведена отправка (кошелек получателя повторяется только 1 раз)
Исключаем (предположительно) кошельки обменников (балансы более 1КК TRX) - других способов не придумал, но наверняка есть какая-то база обменников

Задаем условия нужных нам кошельков:
1. Сумма операции должна превышать 100 TRX
2. После отправки транзакции на кошельке отправтеля должно остаться более чем 15К TRX, но менее 1КК

P.S. С одной стороны, если автоматизировать весь процесс будет гораздо проще.
Но будет сжираться бесконечное число TRX
P.P.S. При обработке операций вручную (мы будем отправлять копейки с "нужным" опазданием) мы будем последней транзакцией относительно других таких же ребят, у которых все автоматизировано

Красные - блеклист
Зеленые - нужные

Посмотреть вложение 78704

Код:
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "strconv"
    "time"
)

type Transaction struct {
    Block           int      `json:"block"`
    Hash            string   `json:"hash"`
    Timestamp       int64    `json:"timestamp"`
    OwnerAddress    string   `json:"ownerAddress"`
    ToAddressList   []string `json:"toAddressList"`
    ToAddress       string   `json:"toAddress"`
    OwnerAddressTag string   `json:"ownerAddressTag"`
    ToAddressTag    string   `json:"toAddressTag"`
    ContractType    int      `json:"contractType"`
    Confirmed       bool     `json:"confirmed"`
    Revert          bool     `json:"revert"`
    ContractData    struct {
        Data            string `json:"data"`
        OwnerAddress    string `json:"owner_address"`
        ContractAddress string `json:"contract_address"`
    } `json:"contractData"`
    Result string `json:"result"`
    Amount string `json:"amount"`
}

type ResponseData struct {
    Data []Transaction `json:"data"`
}

func main() {
    var (
        endpoint = "https://apilist.tronscanapi.com/api/transaction?"
        sort     = "sort=-timestamp"
        count    = 50
        start    = 0
    )

    uniqueToAddresses := make(map[string]bool)

    for {
        transactions, err := getTransactions(endpoint + sort + "&count=" + strconv.Itoa(count) + "&start=" + strconv.Itoa(start))
        if err != nil {
            fmt.Println("Error fetching transactions:", err)
            continue
        }

        for _, txn := range transactions {
            if txn.ContractType == 1 {
                if len(txn.ToAddressList) == 0 {
                    continue
                }

                amount, err := strconv.ParseFloat(txn.Amount, 64)
                if err != nil {
                    fmt.Println("Error converting amount to float64:", err)
                    continue
                }
                amountTRX := amount / 1000000

                from := txn.OwnerAddress
                to := txn.ToAddress
                isBlacklisted := false
                isGreen := false

                if txn.OwnerAddressTag != "" || txn.ToAddressTag != "" || amountTRX > 1000000 {
                    isBlacklisted = true
                }

                if txn.OwnerAddressTag != "" {
                    from = fmt.Sprintf("\x1b[31m%s\x1b[0m", txn.OwnerAddressTag)
                }

                if txn.ToAddressTag != "" {
                    to = fmt.Sprintf("\x1b[31m%s\x1b[0m", txn.ToAddressTag)
                }

                if amountTRX > 100 {
                    balanceMsg := ""
                    balance, err := getBalance(txn.OwnerAddress)
                    if err != nil {
                        fmt.Println("Error fetching balance:", err)
                    } else {
                        if isBlacklisted {
                            balanceMsg = "\x1b[31mBlacklisted\x1b[0m"
                        } else {
                            if balance > 15000 && balance < 999999 {
                                balanceMsg = fmt.Sprintf("\x1b[32m%.4f TRX\x1b[0m", balance)
                                isGreen = true
                            } else if balance > 1000000 {
                                balanceMsg = "\x1b[31mBlacklisted\x1b[0m"
                            } else {
                                balanceMsg = fmt.Sprintf("%.4f TRX", balance)
                            }
                        }
                    }
                    if isGreen {
                        fmt.Printf("Hash: %s, From: \x1b[32m%s\x1b[0m, To: \x1b[32m%s\x1b[0m, Amount: %.4f TRX, Sender's balance: %s\n", txn.Hash, from, to, amountTRX, balanceMsg)
                    } else {
                        fmt.Printf("Hash: %s, From: %s, To: %s, Amount: %.4f TRX, Sender's balance: %s\n", txn.Hash, from, to, amountTRX, balanceMsg)
                    }
                }

                for _, toAddress := range txn.ToAddressList {
                    if !uniqueToAddresses[toAddress] {
                        uniqueToAddresses[toAddress] = true
                    }
                }
            }
        }

        start += count
        time.Sleep(5 * time.Second)
    }
}

func getTransactions(endpoint string) ([]Transaction, error) {
    resp, err := http.Get(endpoint)
    if err != nil {
        return nil, fmt.Errorf("error fetching transactions: %v", err)
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        return nil, fmt.Errorf("error fetching transactions: unexpected status code: %d", resp.StatusCode)
    }

    var response ResponseData
    if err := json.NewDecoder(resp.Body).Decode(&response); err != nil {
        return nil, fmt.Errorf("error fetching transactions: %v", err)
    }

    return response.Data, nil
}

func getBalance(address string) (float64, error) {
    resp, err := http.Get("https://apilist.tronscanapi.com/api/accountv2?address=" + address)
    if err != nil {
        return 0, fmt.Errorf("error fetching balance: %v", err)
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        return 0, fmt.Errorf("error fetching balance: unexpected status code: %d", resp.StatusCode)
    }

    var accountData struct {
        Balance int64 `json:"balance"`
    }
    if err := json.NewDecoder(resp.Body).Decode(&accountData); err != nil {
        return 0, fmt.Errorf("error fetching balance: %v", err)
    }

    balanceTRX := float64(accountData.Balance) / 1000000

    return balanceTRX, nil
}
Я слышал , что есть тема с отменой транзакции при помощью смены часовых поясов. Но на кошельке, который получил монету, будет оставаться какая то микро комиссия

Вообщем нужно думать
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Я слышал , что есть тема с отменой транзакции при помощью смены часовых поясов. Но на кошельке, который получил монету, будет оставаться какая то микро комиссия

Вообщем нужно думать
Пока что не встречал развернутых транзакций TRX (только TRC20 токенов)
Но, наверняка такие операции отфильтруются и пометятся спамом, если это возможно
 
Пожалуйста, обратите внимание, что пользователь заблокирован
К своему сожалению, имел неосторожность отправть N-ую сумму на идентичный моему получателю кошелек. Как в этом треде - https://xss.pro/threads/82463/
Вашему вниманию, Golang скрипт для генерации адресов в сети TRON

1. Поиск по первым символам (pKey: 524f8fd83cb54259a4209d178abe686bf45eef77b92a8956439f34d178b0669f, address: TXSSemgwBZVb5SHZTYZ6XVVBWS688MTomF)
2. Поиск по последним символам (pKey: b8ae5661b8d1f8bf5de9beff97b27c81a7323190c41e2b2a8cf22b575d328f63, address: TRkgSp7xGzopgraWqiLdXwfRnQhqhFbXSS)
3. Поиск по первым и последним символам (см. спойлер)
4. Поиск по последовательности символов (pKey: 2c9e13aa731a04ac2caca775f01c045a999ce9dfb0fa174fa308d258541f3b95, address: TTvwsCKNDSg4zE6tQAv5iZBgv2y1XSSisF)

Данные адреса можно использовать в аналогичных атаках
Если будете генерировать какой-либо красивый кошелек для себя (например начинающийся с 5 символов T), - не забывайте про мультиподпись.
- Кошельки начинающиеся более чем с 5 символов T подсвечены
- Вывод скорости генераций



Код:
package main

import (
    "crypto/ecdsa"
    "crypto/sha256"
    "encoding/hex"
    "errors"
    "fmt"
    "strings"
    "time"

    "github.com/ethereum/go-ethereum/common/hexutil"
    "github.com/ethereum/go-ethereum/crypto"
    "github.com/fatih/color"
    "github.com/mr-tron/base58"
)

type key struct {
    privateKey    string
    publicKey     string
    addressHex    string
    addressBase58 string
    attempts      int
    numT          int
}

func main() {
    var searchOption int
    fmt.Println("█████████████████████████████████████████████████████████")
    fmt.Println("█─▄─▄─█▄─▄▄▀█▄─▀─▄███▄─█─▄██▀▄─██▄─▀█▄─▄█▄─▄█─▄─▄─█▄─█─▄█")
    fmt.Println("███─████─▄─▄██▀─▀█████▄▀▄███─▀─███─█▄▀─███─████─████▄─▄██")
    fmt.Println("▀▀▄▄▄▀▀▄▄▀▄▄▀▄▄█▄▄▀▀▀▀▀▄▀▀▀▄▄▀▄▄▀▄▄▄▀▀▄▄▀▄▄▄▀▀▄▄▄▀▀▀▄▄▄▀▀")
    fmt.Println("")
    fmt.Printf("Wallets starting with more than 5 characters \033[32mT\033[0m are \033[32mhighlighted\033[0m\n")
    fmt.Println("The generation rate is output every 5 minutes")
    fmt.Println("")
    fmt.Println("Choose search option:")
    fmt.Println("1. Search by first characters")
    fmt.Println("2. Search by last characters")
    fmt.Println("3. Search by both first and last characters")
    fmt.Println("4. Search by any sequence of letters or numbers")
    fmt.Print("Enter the option number: ")
    fmt.Scan(&searchOption)

    var firstCharacters, lastCharacters, sequence string

    switch searchOption {
    case 1:
        fmt.Print("Enter the first characters to search: ")
        fmt.Scan(&firstCharacters)
    case 2:
        fmt.Print("Enter the last characters to search: ")
        fmt.Scan(&lastCharacters)
    case 3:
        fmt.Print("Enter the first characters to search: ")
        fmt.Scan(&firstCharacters)
        fmt.Print("Enter the last characters to search: ")
        fmt.Scan(&lastCharacters)
    case 4:
        fmt.Print("Enter any sequence of letters or numbers to search: ")
        fmt.Scan(&sequence)
    default:
        fmt.Println("Invalid option")
        return
    }

    addressChannel := make(chan *key)
    attemptsChannel := make(chan int, 100)

    go func() {
        ticker := time.NewTicker(time.Duration(5 * time.Minute))
        var attempts int

        for {
            select {
            case <-ticker.C:
                fmt.Printf("speed: %d\n", attempts)
                attempts = 0
            case <-attemptsChannel:
                attempts++
            }
        }
    }()

    for i := 0; i < 255; i++ {
        go func() {
            attempts := 1
            for {
                k, err := generateKey(attempts)
                if err != nil {
                    fmt.Println(err)
                    return
                }
                if matchesPattern(k.addressBase58, searchOption, firstCharacters, lastCharacters, sequence) {
                    addressChannel <- k
                    attemptsChannel <- 1
                    return
                }
                attemptsChannel <- 1
                attempts++
            }
        }()
    }

    for i := 0; i < 255; i++ {
        select {
        case k := <-addressChannel:
            var numTColor, addressColor string

            switch {
            case k.numT <= 5:
                numTColor = color.WhiteString("%d", k.numT)
                addressColor = k.addressBase58
            case k.numT == 6:
                numTColor = color.GreenString("%d", k.numT)
                addressColor = color.GreenString(k.addressBase58)
            case k.numT >= 7:
                numTColor = color.RedString("%d", k.numT)
                addressColor = color.RedString(k.addressBase58)
            }

            fmt.Printf("attempts: %d, tNum: %s, pKey: %s, address: %s\n", k.attempts, numTColor, k.privateKey, addressColor)
        }
    }
}

func matchesPattern(address string, searchOption int, firstCharacters, lastCharacters, sequence string) bool {
    switch searchOption {
    case 1:
        return strings.HasPrefix(address, firstCharacters)
    case 2:
        return strings.HasSuffix(address, lastCharacters)
    case 3:
        return strings.HasPrefix(address, firstCharacters) && strings.HasSuffix(address, lastCharacters)
    case 4:
        return strings.Contains(address, sequence)
    default:
        return false
    }
}

func generateKey(attempts int) (*key, error) {
    var k key

    privateKey, err := crypto.GenerateKey()
    if err != nil {
        return nil, fmt.Errorf("failed to generate key: %w", err)
    }
    privateKeyBytes := crypto.FromECDSA(privateKey)
    k.privateKey = hexutil.Encode(privateKeyBytes)[2:]
    publicKey := privateKey.Public()
    publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
    if !ok {
        return nil, errors.New("error casting public key to ECDSA")
    }
    publicKeyBytes := crypto.FromECDSAPub(publicKeyECDSA)
    k.publicKey = hexutil.Encode(publicKeyBytes)[2:]

    address := crypto.PubkeyToAddress(*publicKeyECDSA).Hex()
    address = "41" + address[2:]
    k.addressHex = address
    addb, _ := hex.DecodeString(address)
    hash1 := s256(s256(addb))
    secret := hash1[:4]
    addb = append(addb, secret...)
    k.addressBase58 = base58.Encode(addb)
    k.attempts = attempts
    k.numT = countStartingTs(k.addressBase58)

    return &k, nil
}

func s256(s []byte) []byte {
    h := sha256.New()
    h.Write(s)
    bs := h.Sum(nil)
    return bs
}

func countStartingTs(address string) int {
    var count int
    for _, char := range address {
        if char == 'T' {
            count++
        } else {
            break
        }
    }
    return count
}
Тоже самое только для EVM кошельков
1. Поиск по первым символам (pKey: d739263b43b2f5f40cef1bd0df229cabd8e1cb29a551fb550c890a3649210e63, address: 0x00000265DD1517b837ef28ae956961ACb3b776dd)
2. Поиск по последним символам (pKey: 8297ec5f2b41d4b30139b8e0d631f6ae0145d4973708ea996850fc50284ad5ae, address: 0x482a16656FB7017963B1FE0f9380A32600900000)
3. Поиск по первым и последним символам: (pKey: 1563fe0c22440e061a976bf5d43d2ea851eada5a7b85c1fbac86539fc5c73504, address: 0x00CF6eBDF66Aea266C7Eac3Cbb70D138869E8000)
4. Поиск по последовательности символов (pKey: a48d868356af854e46a110b57a5bcf0718539e31a1cefbc555dd00a3a347dabe, address: 0x50000004c6a2a20E26fcA174a052A4A221151834)

Код:
package main

import (
    "crypto/sha256"
    "encoding/hex"
    "fmt"
    "strings"
    "time"

    "github.com/ethereum/go-ethereum/common/hexutil"
    "github.com/ethereum/go-ethereum/crypto"
)

type key struct {
    privateKey string
    addressHex string
    attempts   int
}

func main() {
    var searchOption int
    fmt.Println("███████████████████████████████████████████████████████")
    fmt.Println("█▄─█─▄██▀▄─██▄─▀█▄─▄█▄─▄█─▄─▄─█▄─█─▄███▄─▄▄─█─▄─▄─█─█─█")
    fmt.Println("██▄▀▄███─▀─███─█▄▀─███─████─████▄─▄█████─▄█▀███─███─▄─█")
    fmt.Println("▀▀▀▄▀▀▀▄▄▀▄▄▀▄▄▄▀▀▄▄▀▄▄▄▀▀▄▄▄▀▀▀▄▄▄▀▀▀▀▄▄▄▄▄▀▀▄▄▄▀▀▄▀▄▀")
    fmt.Println("")
    fmt.Println("Choose search option:")
    fmt.Println("1. Search by first characters")
    fmt.Println("2. Search by last characters")
    fmt.Println("3. Search by both first and last characters")
    fmt.Println("4. Search by any sequence of letters or numbers")
    fmt.Print("Enter the option number: ")
    fmt.Scan(&searchOption)

    var pattern string

    switch searchOption {
    case 1:
        fmt.Print("Enter the first characters to search: ")
        fmt.Scan(&pattern)
    case 2:
        fmt.Print("Enter the last characters to search: ")
        fmt.Scan(&pattern)
    case 3:
        var firstCharacters, lastCharacters string
        fmt.Print("Enter the first characters to search: ")
        fmt.Scan(&firstCharacters)
        fmt.Print("Enter the last characters to search: ")
        fmt.Scan(&lastCharacters)
        pattern = firstCharacters + "*" + lastCharacters
    case 4:
        fmt.Print("Enter any sequence of letters or numbers to search: ")
        fmt.Scan(&pattern)
    default:
        fmt.Println("Invalid option")
        return
    }

    addressChannel := make(chan *key)
    attemptsChannel := make(chan int, 100)

    go func() {
        ticker := time.NewTicker(5 * time.Minute)
        var attempts int

        for {
            select {
            case <-ticker.C:
                fmt.Printf("speed: %d\n", attempts)
                attempts = 0
            case <-attemptsChannel:
                attempts++
            }
        }
    }()

    for i := 0; i < 255; i++ {
        go func() {
            attempts := 1
            for {
                k, err := generateKey(attempts)
                if err != nil {
                    fmt.Println(err)
                    return
                }
                if matchesPattern(k.addressHex, searchOption, pattern) {
                    addressChannel <- k
                    attemptsChannel <- 1
                    return
                }
                attemptsChannel <- 1
                attempts++
            }
        }()
    }

    for i := 0; i < 255; i++ {
        select {
        case k := <-addressChannel:
            fmt.Printf("attempts: %d, pKey: %s, address: %s\n", k.attempts, k.privateKey, k.addressHex)
        }
    }
}

func generateKey(attempts int) (*key, error) {
    privateKey, err := crypto.GenerateKey()
    if err != nil {
        return nil, fmt.Errorf("failed to generate key: %w", err)
    }

    privateKeyBytes := crypto.FromECDSA(privateKey)

    addressHex := crypto.PubkeyToAddress(privateKey.PublicKey).Hex()
    addb, _ := hex.DecodeString(addressHex)
    hash1 := s256(s256(addb))
    secret := hash1[:4]
    addb = append(addb, secret...)

    return &key{
        privateKey: hexutil.Encode(privateKeyBytes)[2:],
        addressHex: addressHex,
        attempts:   attempts,
    }, nil
}

func matchesPattern(address string, searchOption int, pattern string) bool {
    switch searchOption {
    case 1:
        return strings.HasPrefix(address, pattern)
    case 2:
        return strings.HasSuffix(address, pattern)
    case 3:
        parts := strings.Split(pattern, "*")
        return strings.HasPrefix(address, parts[0]) && strings.HasSuffix(address, parts[1])
    case 4:
        return strings.Contains(address, pattern)
    default:
        return false
    }
}

func s256(s []byte) []byte {
    h := sha256.New()
    h.Write(s)
    return h.Sum(nil)
}
 
Пока что не встречал развернутых транзакций TRX (только TRC20 токенов)
Но, наверняка такие операции отфильтруются и пометятся спамом, если это возможно
Можешь мне пм написать, есть вопрос к тебе
 
возможно есть какие нибудь альтернативы на других языках? с поддержкой видеокарты и генерации первых и последних чисел сразу
в так называемом "паблике" ничего не нашёл, интересует именно под TRON

пытаюсь уже сутки возиться с использованием этого скрипта на cuda и ничего не выходит =(
 
возможно есть какие нибудь альтернативы на других языках? с поддержкой видеокарты и генерации первых и последних чисел сразу
в так называемом "паблике" ничего не нашёл, интересует именно под TRON

пытаюсь уже сутки возиться с использованием этого скрипта на cuda и ничего не выходит =(
В прошлом году заказывал, сделали за 1200$ , на C++ , использует CPU , генерирует первые и последние буквы , было бы не плохо переделать под GPU.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх