как создать Trx кошелек без использования API - PullRequest
0 голосов
/ 09 ноября 2019

основано на TRX-документах и некотором поиске в GitHub. Я попытался сгенерировать кошелек в автономном режиме и по некоторым причинам не могу использовать API.

на основе Trx-документов. Я должен сделать эти шаги:

  1. Создать пару ключей и извлечь открытый ключ (64-байтовый байтовый массив, представляющий его координаты x, y).
  2. Хешировать открытый ключ с помощью sha3-256 и извлеките последние 20 байтов результата.
  3. Добавьте 0x41 в начало байтового массива. Длина начального адреса должна составлять 21 байт.
  4. Хешировать адрес дважды, используя функцию sha256, и взять первые 4 байта в качестве кода подтверждения.
  5. Добавить код проверки в конец начальногоадрес и получить адрес в формате base58check через кодировку base58.
  6. Кодированный адрес Mainnet начинается с T и имеет длину 34 байта.

Обратите внимание: протокол sha3принят KECCAK-256.

Я нахожу mattvb91/tron-trx-php в GitHub, и в этом хранилище есть метод генератора кошельков /src/Wallet.php, но сгенерированный ключ проверки возвращает исключение ошибки, и проверка не удалась.

Я пытаюсь перекодировать mattvb91/tron-trx-php метод генератора кошельков и создать мой генератор кошельков

class walletGenerator
    {

        private $addressPrefix = "41";
        private $addressPrefixByte = 0x41;
        private $addressSize = 34;

        public function __construct()
        {

        }

        public function generateWallet()
        {
            $key = new Key();

            $odd = false;
            while (!$odd)
            {
                $keyPair = $key->GenerateKeypair();
                if(strlen($keyPair['public_key']) % 2 == 0) $odd = true;
            }

            $privateKeyHex = $keyPair['private_key_hex'];
            $pubKeyHex = $keyPair['public_key'];

            $pubKeyBin = hex2bin($pubKeyHex);
            $addressHex = $this->getAddressHex($pubKeyBin);
            $addressBin = hex2bin($addressHex);
            $addressBase58 = $this->getBase58CheckAddress($addressBin);
            $validAddress = $this->validateAddress($addressBase58);

        }

        private function getAddressHex($pubKeyBin)
        {
            if (strlen($pubKeyBin) == 65) {
                $pubKeyBin = substr($pubKeyBin, 1);
            }

            $hash = Keccak::hash($pubKeyBin , 256);
            $hash = substr($hash, 24);

            return $this->addressPrefix . $hash;
        }

        private function getBase58CheckAddress($addressBin){
            $hash0 = Hash::SHA256($addressBin);
            $hash1 = Hash::SHA256($hash0);
            $checksum = substr($hash1, 0, 4);
            $checksum = $addressBin . $checksum;
            $result = Base58::encode(Crypto::bin2bc($checksum));

            return $result;
        }

        private function validateAddress($walletAddress){
            if(strlen($walletAddress) !== $this->addressSize) return false;

            $address = Base58Check::decode($walletAddress , false , 0 , false);
            $utf8 = hex2bin($address);

            if(strlen($utf8) !== 25) return false;
            if(strpos($utf8 , $this->addressPrefixByte) !== 0) return false; // strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior

            $checkSum = substr($utf8, 21);
            $address = substr($utf8, 0, 21);


            $hash0 = Hash::SHA256($address);
            $hash1 = Hash::SHA256($hash0);
            $checkSum1 = substr($hash1, 0, 4);

            if ($checkSum === $checkSum1) {
                return true;
            }
        }

Вот мои проблемы:

  1. validateAddress метод имеетисключение ошибки
  2. , когда я вручную добавляю закрытый ключ в кошельки Trx, обнаруженный адрес кошелька отличается от сгенерированного адреса.
if(strpos($utf8 , $this->addressPrefixByte) !== 0) return false; // strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior

additионная информация

Я использовал ionux/phactor для генерации keyPair и iexbase/tron-api Поддержка классов для Hash и ...

1 Ответ

1 голос
/ 10 ноября 2019

Я могу отладить и решить проблему и поделиться с вами решениями

нигде нет решений

эта строка кода имеет исключение ошибки

if(strpos($utf8 , $this->addressPrefixByte) !== 0) return false; // strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior

этопроблема из-за ошибок в PHP 7.3 и исправление с помощью PHP 7.2 ( Исключение: stripos (): в будущем нестроковые иглы будут интерпретироваться как строки. Используйте явный вызов chr () для сохранения текущего поведения # 770 )

и адреса различия

в массиве пар ключей, я удаляю 0x из первого из Личный ключ Hex , и я могу получить доступ к кошельку в Tron LinkРасширение не помню, чтобы был переход для активации кошелька

...