【问题标题】:how to generate Trx wallet without using API如何在不使用 API 的情况下生成 Trx 钱包
【发布时间】:2019-11-09 18:30:56
【问题描述】:

基于TRX documents 和 GitHub 中的一些搜索,我尝试离线生成钱包,但由于某些原因我无法使用 API。

根据 Trx 文档,我应该执行以下步骤:

  1. 生成密钥对并提取公钥(表示其 x,y 坐标的 64 字节字节数组)。
  2. 使用 sha3-256 函数对公钥进行散列,并提取结果的最后 20 个字节。
  3. 将 0x41 添加到字节数组的开头。起始地址的长度应为 21 个字节。
  4. 使用sha256函数对地址进行两次哈希运算,取前4个字节作为验证码。
  5. 在初始地址末尾加上验证码,通过base58编码得到base58check格式的地址。
  6. 编码的主网地址以 T 开头,长度为 34 个字节。

请注意:采用的sha3协议是KECCAK-256。

我在 GitHub 中找到了mattvb91/tron-trx-php,这个存储库有一个钱包生成器方法/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

附加信息

我使用 ionux/phactor 生成 keyPair 和 iexbase/tron-api 支持哈希类和 ...

【问题讨论】:

    标签: php cryptography tron


    【解决方案1】:

    我可以调试并解决问题并与您分享解决方案

    无处可寻

    这行代码有一个错误异常

    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 (Exception: stripos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior #770) 修复

    并解决差异

    在密钥对数组中,我从 Private Key Hex 的第一个中删除 0x,我可以访问 Tron Link Extention 中的钱包不记得有钱包激活的过渡

    【讨论】:

      猜你喜欢
      • 2013-09-19
      • 2011-12-13
      • 1970-01-01
      • 2012-11-06
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多