Testnet
bitcoinTestnet 網路返回一個主網地址
我正在使用此程式碼從擴展公鑰中獲取新地址:
$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); } }