<p>The step you're missing is actually generating the public keys, since addresses are just hashes of a public key. Mycelium uses BIP39 with BIP32 to produce deterministic public keys, using the BIP44 scheme AFAICT. The following example does the same in PHP using the composer package: bitwasp/bitcoin.</p>

<p>Disclaimer: I maintain the library in question.</p>

<pre><code>use BitWasp\Bitcoin\Bitcoin;
use BitWasp\Bitcoin\Mnemonic\Bip39;
use BitWasp\Bitcoin\Mnemonic\MnemonicFactory;
use BitWasp\Bitcoin\Key\Deterministic\HierarchicalKeySequence;
use BitWasp\Bitcoin\Key\Deterministic\HierarchicalKeyFactory;

$generate = true;
$math = Bitcoin::getMath();
$bip39 = MnemonicFactory::bip39();

if ($generate) {
    $mnemonic = $bip39-&gt;create();
} else {
    $mnemonic = 'glad car usual air stomach again ecology champion ranch radar meadow wolf shrug film over glue chalk derive inform always ivory anchor jaguar umbrella floor topple click polar grid economy hint raccoon canal nose organ prepare differ escape utility major dirt scan soul shiver mention raw smoke rhythm';
}

// Produce HD root key from mnemonic
$entropy = $bip39-&gt;mnemonicToEntropy($mnemonic);
$hdRoot = HierarchicalKeyFactory::fromEntropy($entropy);

// Lets derive a branch: 
$sequence = new HierarchicalKeySequence($math);
// purpose' / coin_type' / account' / change / ...
$branch = $hdRoot-&gt;deriveFromList($sequence-&gt;decodePath('44h/0h/0/0'));

// Now lets print the first 5
for ($i = 0; $i &lt; 5; $i++) {
    $child = $branch-&gt;deriveChild($i);
    echo $child-&gt;getPublicKey()-&gt;getAddress()-&gt;getAddress() . "\n";
}
</code></pre>

CC BY-SA 3.0
2016-03-13T13:43:50.793Z
2016-03-13T13:43:50.793Z
karimkorun
<p>this is the code i got,how i can generated new random address using 1 pubkey,everytime page refresh;i try to use timestamp but din't work.</p>

<pre><code>&lt;?php

// step 1

$publickey='0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6';

$step1=hexStringToByteString($publickey);

echo "step1 ".$publickey."&lt;br&gt;";

// step 2

$step2=hash("sha256",$step1);
echo "step2 ".$step2."&lt;br&gt;";

// step 3

$step3=hash('ripemd160',hexStringToByteString($step2));
echo "step3 ".$step3."&lt;br&gt;";

// step 4

$step4="00".$step3;
echo "step4 ".$step4."&lt;br&gt;";

// step 5

$step5=hash("sha256",hexStringToByteString($step4));
echo "step5 ".$step5."&lt;br&gt;";

// step 6

$step6=hash("sha256",hexStringToByteString($step5));
echo "step6 ".$step6."&lt;br&gt;";

// step 7

$checksum=substr($step6,0,8);
echo "step7 ".$checksum."&lt;br&gt;";

// step 8

$step8=$step4.$checksum;
echo "step8 ".$step8."&lt;br&gt;";

// step 9
// base conversion is from hex to base58 via decimal. 
// Leading hex zero converts to 1 in base58 but it is dropped
// in the intermediate decimal stage.  Simply added back manually.

$step9="1".bc_base58_encode(bc_hexdec($step8));
echo "step9 ".$step9."&lt;br&gt;&lt;br&gt;";


function hexStringToByteString($hexString){
    $len=strlen($hexString);

    $byteString="";
    for ($i=0;$i&lt;$len;$i=$i+2){
        $charnum=hexdec(substr($hexString,$i,2));
        $byteString.=chr($charnum);
    }

return $byteString;
}

// BCmath version for huge numbers
function bc_arb_encode($num, $basestr) {
    if( ! function_exists('bcadd') ) {
        Throw new Exception('You need the BCmath extension.');
    }

    $base = strlen($basestr);
    $rep = '';

    while( true ){
        if( strlen($num) &lt; 2 ) {
            if( intval($num) &lt;= 0 ) {
                break;
            }
        }
        $rem = bcmod($num, $base);
        $rep = $basestr[intval($rem)] . $rep;
        $num = bcdiv(bcsub($num, $rem), $base);
    }
    return $rep;
}

function bc_arb_decode($num, $basestr) {
    if( ! function_exists('bcadd') ) {
        Throw new Exception('You need the BCmath extension.');
    }

    $base = strlen($basestr);
    $dec = '0';

    $num_arr = str_split((string)$num);
    $cnt = strlen($num);
    for($i=0; $i &lt; $cnt; $i++) {
        $pos = strpos($basestr, $num_arr[$i]);
        if( $pos === false ) {
            Throw new Exception(sprintf('Unknown character %s at offset %d', $num_arr[$i], $i));
        }
        $dec = bcadd(bcmul($dec, $base), $pos);
    }
    return $dec;
}


// base 58 alias
function bc_base58_encode($num) {   
    return bc_arb_encode($num, '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
}
function bc_base58_decode($num) {
    return bc_arb_decode($num, '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
}

//hexdec with BCmath
function bc_hexdec($num) {
    return bc_arb_decode(strtolower($num), '0123456789abcdef');
}
function bc_dechex($num) {
    return bc_arb_encode($num, '0123456789abcdef');
}
?&gt;
</code></pre>

CC BY-SA 3.0
2015-08-07T01:17:00.117Z
What's wrong? The script works for me in ideone: http://ideone.com/K0tJlV
Nick ODell
CC BY-SA 3.0
2015-08-07T01:21:52.250Z
nothing wrong,i just want to know how to generated different address using same pubkey.
Thadeus Paskal Kebubun
CC BY-SA 3.0
2015-08-07T13:55:19.300Z
you can't: one private key -> one pub. key -> one address, if you want multiple private keys (and so addresses) from a single parent private key you need to use HD wallets ( this is linked from the bip32 page: https://github.com/Bit-Wasp/bitcoin-lib-php/blob/master/examples/bip32.php#L2 )
makevoid
<php>
how i can make bitcoin address generator like mycelium gear using php script
Thadeus Paskal Kebubun
# how i can make bitcoin address generator like mycelium gear using php script

(Asked by: username_0 on 2015-08-07)

this is the code i got,how i can generated new random address using 1 pubkey,everytime page refresh;i try to use timestamp but din't work.

```
<?php

// step 1

$publickey='0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6';

$step1=hexStringToByteString($publickey);

echo "step1 ".$publickey."<br>";

// step 2

$step2=hash("sha256",$step1);
echo "step2 ".$step2."<br>";

// step 3

$step3=hash('ripemd160',hexStringToByteString($step2));
echo "step3 ".$step3."<br>";

// step 4

$step4="00".$step3;
echo "step4 ".$step4."<br>";

// step 5

$step5=hash("sha256",hexStringToByteString($step4));
echo "step5 ".$step5."<br>";

// step 6

$step6=hash("sha256",hexStringToByteString($step5));
echo "step6 ".$step6."<br>";

// step 7

$checksum=substr($step6,0,8);
echo "step7 ".$checksum."<br>";

// step 8

$step8=$step4.$checksum;
echo "step8 ".$step8."<br>";

// step 9
// base conversion is from hex to base58 via decimal. 
// Leading hex zero converts to 1 in base58 but it is dropped
// in the intermediate decimal stage.  Simply added back manually.

$step9="1".bc_base58_encode(bc_hexdec($step8));
echo "step9 ".$step9."<br><br>";

function hexStringToByteString($hexString){
    $len=strlen($hexString);

    $byteString="";
    for ($i=0;$i<$len;$i=$i+2){
        $charnum=hexdec(substr($hexString,$i,2));
        $byteString.=chr($charnum);
    }

return $byteString;
}

// BCmath version for huge numbers
function bc_arb_encode($num, $basestr) {
    if( ! function_exists('bcadd') ) {
        Throw new Exception('You need the BCmath extension.');
    }

    $base = strlen($basestr);
    $rep = '';

    while( true ){
        if( strlen($num) < 2 ) {
            if( intval($num) <= 0 ) {
                break;
            }
        }
        $rem = bcmod($num, $base);
        $rep = $basestr[intval($rem)] . $rep;
        $num = bcdiv(bcsub($num, $rem), $base);
    }
    return $rep;
}

function bc_arb_decode($num, $basestr) {
    if( ! function_exists('bcadd') ) {
        Throw new Exception('You need the BCmath extension.');
    }

    $base = strlen($basestr);
    $dec = '0';

    $num_arr = str_split((string)$num);
    $cnt = strlen($num);
    for($i=0; $i < $cnt; $i++) {
        $pos = strpos($basestr, $num_arr[$i]);
        if( $pos === false ) {
            Throw new Exception(sprintf('Unknown character %s at offset %d', $num_arr[$i], $i));
        }
        $dec = bcadd(bcmul($dec, $base), $pos);
    }
    return $dec;
}

// base 58 alias
function bc_base58_encode($num) {   
    return bc_arb_encode($num, '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
}
function bc_base58_decode($num) {
    return bc_arb_decode($num, '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
}

//hexdec with BCmath
function bc_hexdec($num) {
    return bc_arb_decode(strtolower($num), '0123456789abcdef');
}
function bc_dechex($num) {
    return bc_arb_encode($num, '0123456789abcdef');
}
?>

```

**Tags:** php

> **Comments:**
> **username_1**: What's wrong? The script works for me in ideone: http://ideone.com/K0tJlV  
> **username_0**: nothing wrong,i just want to know how to generated different address using same pubkey.  
> **username_2**: you can't: one private key -> one pub. key -> one address, if you want multiple private keys (and so addresses) from a single parent private key you need to use HD wallets ( this is linked from the bip32 page: https://github.com/Bit-Wasp/bitcoin-lib-php/blob/master/examples/bip32.php#L2 )  

---

## 1 answers

### Answer by username_3 on 2016-03-13. Score: 0 | Accepted answer

The step you're missing is actually generating the public keys, since addresses are just hashes of a public key. Mycelium uses BIP39 with BIP32 to produce deterministic public keys, using the BIP44 scheme AFAICT. The following example does the same in PHP using the composer package: bitwasp/bitcoin.

Disclaimer: I maintain the library in question.

```
use BitWasp\Bitcoin\Bitcoin;
use BitWasp\Bitcoin\Mnemonic\Bip39;
use BitWasp\Bitcoin\Mnemonic\MnemonicFactory;
use BitWasp\Bitcoin\Key\Deterministic\HierarchicalKeySequence;
use BitWasp\Bitcoin\Key\Deterministic\HierarchicalKeyFactory;

$generate = true;
$math = Bitcoin::getMath();
$bip39 = MnemonicFactory::bip39();

if ($generate) {
    $mnemonic = $bip39->create();
} else {
    $mnemonic = 'glad car usual air stomach again ecology champion ranch radar meadow wolf shrug film over glue chalk derive inform always ivory anchor jaguar umbrella floor topple click polar grid economy hint raccoon canal nose organ prepare differ escape utility major dirt scan soul shiver mention raw smoke rhythm';
}

// Produce HD root key from mnemonic
$entropy = $bip39->mnemonicToEntropy($mnemonic);
$hdRoot = HierarchicalKeyFactory::fromEntropy($entropy);

// Lets derive a branch: 
$sequence = new HierarchicalKeySequence($math);
// purpose' / coin_type' / account' / change / ...
$branch = $hdRoot->deriveFromList($sequence->decodePath('44h/0h/0/0'));

// Now lets print the first 5
for ($i = 0; $i < 5; $i++) {
    $child = $branch->deriveChild($i);
    echo $child->getPublicKey()->getAddress()->getAddress() . "\n";
}

```


---

