Генерируем Tron адрес в PHP
Tron использует account-модель адреса. Адрес — это уникальный идентификатор аккаунта, для работы с которым требуется подпись закрытого ключа. Аккаунт имеет множество атрибутов: балансы, bandwidth, energy и т. д. Аккаунт может отправлять Аккаунты являются основой всех действий в блокчейне Tron.
Зависимости
Для генерации Tron адреса нам нужно будет вычислять Keccak-256 хэш и кодировать данные в Base58:
1
composer req kornrunner/keccak stephenhill/base58
Алгоритм
Пара ключей
Для генерации адреса нужна будет пара приватный/публичный ключ. В Tron-е для подписи транзакций используется кривая SECP256K1. Генерацию такой пары мы уже рассматривали на примере Ethereum. Для Tron-а алгоритм будет точно такой же, код можно взять от туда.
SHA3
Хэшируем публичный ключ (без 0x
) в Keccak-256 (sha3–256):
1
2
3
4
5
// $pubKeyHex = '04e824786429af0135e2c4636a206467b5def515a8bc74d7f0b524ca9cf5078db9c3c46cfd1a44d294db9dd19d4ead589cad5002447659cbf6c14486b9cd75ac84'
$pubKeyBin = hex2bin($pubKeyHex);
$hash = Keccak::hash($pubKeyBin, 256);
$addressHex = '41' . substr($hash, -20);
Все хэши берутся от двоичных данных, не от строк в 16-ой системе!
Из полученного хэша берем последние 20 байт и спереди добавляем 41
. Длина адреса сейчас должна быть 21 байт.
Base58Check
Дважды хэшируем в sha256 полученный адрес и берём первые 4 байта из второго хэша в качестве чексуммы:
1
2
3
4
$addressBin = hex2bin($addressHex);
$hash0 = hash('sha256', $addressBin, true);
$hash1 = hash('sha256', $hash0, true);
$checksum = substr($hash1, 0, 4);
Добавляем чексумму в конец адреса, кодируем это в Base58 и получаем адрес в формате base58check:
1
2
3
$base58 = new StephenHill\Base58('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
$addressBase58 = $base58->encode($checksum);
echo $addressBase58 . PHP_EOL;
Полученный адрес всегда начинается с T
и имеет 34 байта в длину.
Проверить себя можно здесь. Вставить приватный ключ (без 0x
) и увидеть по шагам, как генерируется адрес.
Например, здесь из приватного ключа:
1
0xc79d712296aa5ce7f386b0844ce474e5135451077c92678c6c64cc0d2b811028
был получен адрес TTwpCeW31tAxmVsoC6ezWnRtXNg99LiELE
.
Активация
Чтобы активировать новый адрес в сети Tron нужно с уже существующего аккаунта вызвать любой из 3-ех API:
- напрямую вызвать Create Account API
- перевести TRX на новый адрес
- перевести TRC10 токены на новый адрес.
Важно: перевод TRC20 токенов не активирует новый адрес.
После подтверждения транзакции на блокчейне можно будет запрашивать информацию о новом адресе. Создание аккаунта сжигает у создателя или накопленный bandwidth, или 0.1 TRX (если bandwidth недостаточно).