основано на TRX-документах и некотором поиске в GitHub. Я попытался сгенерировать кошелек в автономном режиме и по некоторым причинам не могу использовать API.
на основе Trx-документов. Я должен сделать эти шаги:
- Создать пару ключей и извлечь открытый ключ (64-байтовый байтовый массив, представляющий его координаты x, y).
- Хешировать открытый ключ с помощью sha3-256 и извлеките последние 20 байтов результата.
- Добавьте 0x41 в начало байтового массива. Длина начального адреса должна составлять 21 байт.
- Хешировать адрес дважды, используя функцию sha256, и взять первые 4 байта в качестве кода подтверждения.
- Добавить код проверки в конец начальногоадрес и получить адрес в формате base58check через кодировку base58.
- Кодированный адрес 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;
}
}
Вот мои проблемы:
validateAddress
метод имеетисключение ошибки - , когда я вручную добавляю закрытый ключ в кошельки 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 и ...