| Notation | Description |
|---|---|
| / | Indicate a new branch with number of new child. |
| ' | Hardened Child means that no new child can be derived by extended public key, unless you derived from extended private key. Index range from 2147483648 to 4294967296. |
| without ' | Normal Child is the inverse of Hardened Child. Index range from 0 to 2147483647. |
<?php
use BitWasp\Bitcoin\Bitcoin;
use BitWasp\Bitcoin\Crypto\Random\Random;
use BitWasp\Bitcoin\Key\Factory\HierarchicalKeyFactory;
use BitWasp\Bitcoin\Mnemonic\Bip39\Bip39Mnemonic;
use BitWasp\Bitcoin\Mnemonic\Bip39\Bip39SeedGenerator;
use BitWasp\Bitcoin\Mnemonic\MnemonicFactory;
use BitWasp\Buffertools\Buffer;
use BitWasp\Bitcoin\Key\Deterministic\HierarchicalKey;
include_once "../libraries/vendor/autoload.php";
include_once("html_iframe_header.php");
$result = 0;
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
try {
$hdFactory = new HierarchicalKeyFactory();
$bip32Root = $hdFactory->fromExtended($_POST['extended_priv']);
if ($_POST['relative_path']) {
$key = $bip32Root->derivePath($_POST['relative_path']);
$displayPubkey = $key->getPublicKey()->getHex();
$displayPrikey = $key->getPrivateKey()->getHex();
$displayExtendedPrikey = $key->toExtendedKey();
$displayExtendedPubkey = $key->toExtendedPublicKey();
}
$result = 1;
} catch (Exception $e) {
$errmsg .= "Problem found. " . $e->getMessage();
}
}
if ($errmsg) {
?>
<div class="alert alert-danger">
<strong>Error!</strong> <?php echo $errmsg?>
</div>
<?php
}
if ($result) {
?>
<h5>Derivation</h5>
<div class="table-responsive">
<table border=0 class='table'>
<tr><td>Relative Path</td><td><?php echo $_POST['relative_path']?></td></tr>
<tr><td>Public Key</td><td><?php echo $displayPubkey?></td></tr>
<tr><td>Private Key</td><td><?php echo $displayPrikey?></td></tr>
<tr><td>Bip32 Extended Private Key</td><td><?php echo $displayExtendedPrikey?></td></tr>
<tr><td>Bip32 Extended Public Key</td><td><?php echo $displayExtendedPubkey?></td></tr>
</table>
</div>
<?php
}
?>
<form action='' method='post'>
<div class="form-group">
<label for="extended_priv">Bip32 Extended Private Key (Extend From):</label>
<div class="input-group mb-3">
<input class="form-control" type='text' name='extended_priv' id='extended_priv' value='<?php echo $_POST['extended_priv']?>'>
</div>
</div>
<div class="form-group">
<label for="relative_path">Relative Path (Extend To):</label>
<input class="form-control" type='text' name='relative_path' id='relative_path' value='<?php echo htmlentities($_POST['relative_path'],ENT_QUOTES)?>'>
* Do not start with /
</div>
<input type='submit' class="btn btn-success btn-block"/>
</form>
<?php
include_once("html_iframe_footer.php");
<?php
use BitWasp\Bitcoin\Bitcoin;
use BitWasp\Bitcoin\Key\Factory\HierarchicalKeyFactory;
use BitWasp\Bitcoin\Mnemonic\Bip39\Bip39Mnemonic;
use BitWasp\Bitcoin\Mnemonic\Bip39\Bip39SeedGenerator;
use BitWasp\Bitcoin\Mnemonic\MnemonicFactory;
use BitWasp\Buffertools\Buffer;
use BitWasp\Bitcoin\Key\Deterministic\HierarchicalKey;
use BitWasp\Bitcoin\Network\NetworkFactory;
use BitWasp\Bitcoin\Address\PayToPubKeyHashAddress;
include_once "../libraries/vendor/autoload.php";
include_once("html_iframe_header.php");
$addresses = [];
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
try {
$networkClass = $_POST['network'];
Bitcoin::setNetwork(NetworkFactory::$networkClass());
$network = Bitcoin::getNetwork();
$hdFactory = new HierarchicalKeyFactory();
$key = $hdFactory->fromExtended($_POST['xpub'], $network);
$indexes = range((int)$_POST['from_index'],(int)$_POST['to_index']);
$addresses = [];
foreach($indexes as $index) {
$relativePath = strlen($_POST['relative_path']) >0 ? $_POST['relative_path'] . "/" : "";
$childKey = $key->derivePath( $relativePath . $index);
$pubKeyHash = $childKey->getPublicKey()->getPubKeyHash();
$addresses[$relativePath . $index] = (new PayToPubKeyHashAddress($pubKeyHash))->getAddress();
}
} catch (Exception $e) {
$errmsg .= "Problem found. " . $e->getMessage();
}
}
if ($errmsg) {
?>
<div class="alert alert-danger">
<strong>Error!</strong> <?php echo $errmsg?>
</div>
<?php
}
if ($addresses) {
?>
<h5>Address Array</h5>
<div class="table-responsive">
<table class="table table-bordered">
<tr><th>Full Relative Path</th><th>Address</th></tr>
<?php
foreach($addresses as $index => $address) {
?>
<tr><td><?php echo $index?></td><td><?php echo $address?></td></tr>
<?php
}
?>
</table>
</div>
<?php
}
?>
<form action='' method='post'>
<div class="form-group">
<label for="network">Network *:</label>
<select id="network" name="network" class="form-control" >
<?php
$networks = get_class_methods(new NetworkFactory());
foreach($networks as $network) {
echo "<option value='{$network}'".($network == $_POST['network'] ? " selected": "").">{$network}</option>";
}
?>
</select>
</div>
<div class="form-group">
<label for="xpub">Bip32 Extended Public Key (Xpub) *:</label>
<div class="input-group mb-3">
<input class="form-control" type='text' name='xpub' id='xpub' value='<?php echo $_POST['xpub']?>'>
</div>
</div>
<div class="form-group">
<label for="from_index">From Index *:</label>
<input class="form-control" type='text' name='from_index' id='from_index' value='<?php echo $_POST['from_index']?>'>
</div>
<div class="form-group">
<label for="to_index">To Index *:</label>
<input class="form-control" type='text' name='to_index' id='to_index' value='<?php echo $_POST['to_index']?>'>
</div>
<div class="form-group">
<label for="relative_path">Relative Path :</label>
<input class="form-control" type='text' name='relative_path' id='relative_path' value='<?php echo htmlentities($_POST['relative_path'],ENT_QUOTES)?>'>
* Do not start with /, this field is optional.
</div>
<input type='submit' class="btn btn-success btn-block"/>
</form>
<?php
include_once("html_iframe_footer.php");