Ich verwende diesen Code, um eine neue Adresse von einem erweiterten öffentlichen Schlüssel zu erhalten:
$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;
Dies führt zu einer Adresse wie
15fuesDBKKnEMnrZz3mT9fxbm7dkjwDN3z
das ist eine Mainnet-P2PKH-Adresse.
Gibt es eine Möglichkeit, mir eine Testnet-P2PKH-Adresse (z. B. mjKxMDjShxKS5LymC43EmctDoB5Sg3n6UZ
) zu geben?
Dies unterbricht meinen Versuch, eine Rohtransaktion mit der Adresse zu erstellen, weil sie aus dem falschen Netzwerk stammt. Wenn nicht, sollte ich dies als Problem in ihrem Github-Projekt melden?
Der folgende Code behebt das Problem. Das Problem war, dass die von mir verwendete Klasse das Netzwerk nicht auf das Bitwasp-Bitcoin-Objekt gesetzt hat. Der Code stammt von Freedom Node .
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);
}
}