red bitcoinTestnet que devuelve una dirección de red principal

Estoy usando este código para obtener una nueva dirección de una clave pública extendida:

    $index = 97;
    $change = false;
    $key = HierarchicalKeyFactory::fromExtended($tpubaddress, NetworkFactory::bitcoinTestnet());
    $path = ($change ? '1' : '0').'/'.$index;
    $child_key = $key->derivePath($path);
    $address = new PayToPubKeyHashAddress($child_key->getPublicKey()->getPubKeyHash()))->getAddress();
    echo $address;

Esto está dando como resultado una dirección como

15fuesDBKKnEMnrZz3mT9fxbm7dkjwDN3z

que es una dirección P2PKH de red principal.

¿Hay alguna manera de que me dé una dirección P2PKH de testnet (por ejemplo, mjKxMDjShxKS5LymC43EmctDoB5Sg3n6UZ)?

Esto está rompiendo mi intento de crear una transacción sin procesar con la dirección porque proviene de la red incorrecta. Si no, ¿debería informar esto como un problema en su proyecto github?

Respuestas (1)

El siguiente código soluciona el problema. El problema era que la clase que estaba usando no configuró la red en el objeto bitcoin bitwasp. El código provino del nodo de libertad .

hd.php

<?php

require_once(__DIR__.'/../autoload.php');

use BitWasp\Bitcoin\Bitcoin;
use BitWasp\Bitcoin\Address\AddressCreator;
use BitWasp\Bitcoin\Key\Deterministic\HdPrefix\GlobalPrefixConfig;
use BitWasp\Bitcoin\Key\Deterministic\HdPrefix\NetworkConfig;
use BitWasp\Bitcoin\Network\Slip132\BitcoinRegistry;
use BitWasp\Bitcoin\Network\Slip132\BitcoinTestnetRegistry;
use BitWasp\Bitcoin\Key\Deterministic\Slip132\Slip132;
use BitWasp\Bitcoin\Key\KeyToScript\KeyToScriptHelper;
use BitWasp\Bitcoin\Key\Deterministic\HierarchicalKeyFactory;
use BitWasp\Bitcoin\Key\Deterministic\HierarchicalKeySequence;
use BitWasp\Bitcoin\Key\Deterministic\MultisigHD;
use BitWasp\Bitcoin\Network\NetworkFactory;
use BitWasp\Bitcoin\Serializer\Key\HierarchicalKey\Base58ExtendedKeySerializer;
use BitWasp\Bitcoin\Serializer\Key\HierarchicalKey\ExtendedKeySerializer;

class HD {
  private $network_name = NULL;
  private $network = NULL;
  private $xpub = NULL;
  private $ypub = NULL;
  private $zpub = NULL;
  private $multisig_xpubs = NULL;

  public function __construct($network = 'bitcoin') {
    $this->network_name = $network;
    if (version_compare(PHP_VERSION, '5.3') >= 0) {
      $this->network = NetworkFactory::$network();
    } elseif (version_compare(PHP_VERSION, '5.2.3') >= 0) {
      $this->network = call_user_func("NetworkFactory::$network");
    } else {
      $this->network = call_user_func('NetworkFactory', $network);
    }
    Bitcoin::setNetwork($this->network);
  }

  public function set_xpub($xpub) {
    $this->xpub = $xpub;
  }

  public function set_ypub($ypub) {
    $this->ypub = $ypub;
  }

  public function set_zpub($zpub) {
    $this->zpub = $zpub;
  }

  public function set_multisig_xpubs($xpubs) {
    $this->multisig_xpubs = $xpubs;
  }

  public function address_from_master_pub($path = '0/0') {
    if ($this->xpub === NULL && $this->ypub === NULL && $this->zpub === NULL) {
      throw new Exception("XPUB, YPUB or ZPUB key is not present!");
    }

    $adapter = Bitcoin::getEcAdapter();
    $slip132 = new Slip132(new KeyToScriptHelper($adapter));
    $registry_classname = 'BitWasp\\Bitcoin\\Network\\Slip132\\'.$this->network_name.'Registry';
    $bitcoin_prefixes = new $registry_classname();

    if ($this->xpub !== NULL) {
      $pubPrefix = $slip132->p2pkh($bitcoin_prefixes);
      $pub = $this->xpub;
    } else if ($this->ypub !== NULL) {
      $pubPrefix = $slip132->p2shP2wpkh($bitcoin_prefixes);
      $pub = $this->ypub;
    } else if ($this->zpub !== NULL) {
      $pubPrefix = $slip132->p2wpkh($bitcoin_prefixes);
      $pub = $this->zpub;
    }

    $config = new GlobalPrefixConfig([
      new NetworkConfig($this->network, [
        $pubPrefix,
      ])
    ]);

    $serializer = new Base58ExtendedKeySerializer(
      new ExtendedKeySerializer($adapter, $config)
    );

    $key = $serializer->parse($this->network, $pub);
    $child_key = $key->derivePath($path);

    return $child_key->getAddress(new AddressCreator())->getAddress();
  }

  public function multisig_address_from_xpub($m, $path = '0/0') {
    if (count($this->multisig_xpubs) < 2) {
      throw new Exception("XPUB keys are not present!");
    }

    $keys = array();

    foreach ($this->multisig_xpubs as $xpub) {
      $keys[] = HierarchicalKeyFactory::fromExtended($xpub, $this->network);
    }

    $sequences = new HierarchicalKeySequence();
    $hd = new MultisigHD($m, 'm', $keys, $sequences, TRUE);

    $child_key = $hd->derivePath($path);

    return $child_key->getAddress()->getAddress($this->network);
  }
}