Exemplo n.º 1
0
<?php

use BitWasp\BitcoinLib\BitcoinLib;
use BitWasp\BitcoinLib\Electrum;
require_once __DIR__ . '/../vendor/autoload.php';
$magic_byte = '00';
$string = trim('teach start paradise collect blade chill gay childhood creek picture creator branch');
$seed = Electrum::decode_mnemonic($string);
echo "Words: {$string}\n";
echo "Seed:  {$seed}\n";
$secexp = Electrum::stretch_seed($seed);
$secexp = $secexp['seed'];
echo "Secret Exponent: {$secexp}\n";
$mpk = Electrum::generate_mpk($seed);
echo "MPK: {$mpk}\n";
for ($i = 0; $i < 5; $i++) {
    $privkey = Electrum::generate_private_key($secexp, $i, 0);
    echo "Private key: {$privkey}\n";
    echo "Private WIF: " . BitcoinLib::private_key_to_WIF($privkey, FALSE, $magic_byte) . "\n";
    $public_key = Electrum::public_key_from_mpk($mpk, $i);
    echo "Public Key: {$public_key}\n";
    $address = BitcoinLib::public_key_to_address($public_key, $magic_byte);
    echo "Public derivation: {$address}.\n";
    $address = BitcoinLib::private_key_to_address($privkey, $magic_byte);
    echo "Private derivation: {$address}.\n";
    echo "-----------\n";
}
 public function testGetPrivKeyWif()
 {
     $cnt = (getenv('BITCOINLIB_EXTENSIVE_TESTING') ?: 1) * 5;
     for ($i = 0; $i < $cnt; $i++) {
         $hex = (string) str_pad(bin2hex(mcrypt_create_iv(32, \MCRYPT_DEV_URANDOM)), 64, '0', STR_PAD_LEFT);
         // create private key and WIF
         $wif = BitcoinLib::private_key_to_WIF($hex, FALSE, $this->addressVersion);
         $key = BitcoinLib::WIF_to_private_key($wif);
         $this->assertTrue($key['key'] == $hex);
         // create private key and WIF, without specifying address version
         $wif = BitcoinLib::private_key_to_WIF($hex, FALSE);
         $key = BitcoinLib::WIF_to_private_key($wif);
         $this->assertTrue($key['key'] == $hex);
     }
 }
$seed = $seed['seed'];
$master_public_key = Electrum::generate_mpk($seed);
$private_keys = array();
$have_keys = 0;
$done = FALSE;
// Loop until the user is satisfied they have found all keys.
$j = 0;
$offset = 30;
while ($done == FALSE) {
    $start = $offset * $j;
    echo "Trying keys {$start} to " . ($start + $offset) . "\n";
    // Do public derivation to learn which private keys to derive.
    for ($i = $start; $i < $start + $offset; $i++) {
        $pubkey = Electrum::public_key_from_mpk($master_public_key, $i);
        if (in_array($pubkey, $decode_redeem_script['keys'])) {
            $private_keys[] = BitcoinLib::private_key_to_WIF(Electrum::generate_private_key($seed, $i), FALSE, '00');
            $have_keys++;
        }
        if ($have_keys == $decode_redeem_script['m']) {
            $done = TRUE;
            break;
        }
    }
    $j++;
    // See if we should continue searching.
    $ask = FALSE;
    if ($done == FALSE) {
        echo "Have " . count($private_keys) . " private keys we can sign with. Look for more? (y/n) ";
        while ($ask == FALSE) {
            switch (trim(fgets(STDIN))) {
                case 'y':