Testnet

bitcoinTestnet 網路返回一個主網地址

  • June 29, 2018

我正在使用此程式碼從擴展公鑰中獲取新地址:

   $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;

這導致了一個地址,如

15fuesDBKKnEMnrZz3mT9fxbm7dkjwDN3z

這是一個主網 P2PKH 地址。

有沒有辦法讓它給我一個測試網 P2PKH 地址(例如mjKxMDjShxKS5LymC43EmctDoB5Sg3n6UZ)?

這打破了我使用來自錯誤網路的地址 b/c 創建原始交易的嘗試。如果不是,我應該在他們的 github 項目上報告這個問題嗎?

下面的程式碼解決了這個問題。問題是我使用的類沒有在 bitwasp 比特幣對像上設置網路。程式碼來自自由節點

高畫質.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);
 }
}

引用自:https://bitcoin.stackexchange.com/questions/74307