PHP生成助記詞和BTC、ETH、LTC地址

本文作者:陳進堅
個人博客:https://jian1098.github.io
CSDN博客:https://blog.csdn.net/c_jian
簡書:https://www.jianshu.com/u/8ba9ac5706b6
聯繫方式:[email protected]

安裝擴展

composer require bitwasp/bitcoin		# BTC庫,需要運行在64位的php7.0+上
composer require web3p/ethereum-util	 # ETH庫

注意:使用bitwasp庫需要安裝PHPgmp擴展,不然會報錯Call to undefined function gmp_init()LNMP環境安裝gmp擴展可以看我的另一篇文章《LNMP1.6安裝gmp擴展》

生成助記詞

<?php
require_once './vendor/autoload.php';

use BitWasp\Bitcoin\Address\PayToPubKeyHashAddress;
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;

 //生成助記詞
function createMnemonicWord(){
     // Bip39
     //$math = Bitcoin::getMath();
     //$network = Bitcoin::getNetwork();
     $random = new Random();
     // 生成隨機數(initial entropy)
     $entropy = $random->bytes(Bip39Mnemonic::MIN_ENTROPY_BYTE_LEN);
     $bip39 = MnemonicFactory::bip39();
     // 通過隨機數生成助記詞
     $mnemonic = $bip39->entropyToMnemonic($entropy);
     // 輸出助記詞
     echo $mnemonic;
 }

創建BTC地址

function createBtcAddress($mnemonicWord,$offset){
        $seedGenerator = new Bip39SeedGenerator();
        // 通過助記詞生成種子,傳入可選加密串'hello'
        $seed = $seedGenerator->getSeed($mnemonicWord);
        echo "seed: " . $seed->getHex() . PHP_EOL;				//種子
        $hdFactory = new HierarchicalKeyFactory();
        $master = $hdFactory->fromEntropy($seed);
        $hardened = $master->derivePath("44/0'/0'/0/".$offset);    //44的含義:https://github.com/bitcoin/bips
        echo 'WIF: ' . $hardened->getPrivateKey()->toWif();		  //私鑰
        $address = new PayToPubKeyHashAddress($hardened->getPublicKey()->getPubKeyHash());
        return $address->getAddress();
    }

參數說明:mnemonicWord(帶空格的字符串)是上一步生成的助記詞;offset(整數)是同一個助記詞生成的第幾個地址,相同助記詞傳入相同數字會得到同一個地址

創建ETH地址

// Bip39
$math = Bitcoin::getMath();
$network = Bitcoin::getNetwork();
$random = new Random();
// 生成隨機數(initial entropy)
$entropy = $random->bytes(Bip39Mnemonic::MIN_ENTROPY_BYTE_LEN);
$bip39 = MnemonicFactory::bip39();
// 通過隨機數生成助記詞
$mnemonic = $bip39->entropyToMnemonic($entropy);
echo "mnemonic: " . $mnemonic.PHP_EOL.PHP_EOL;// 助記詞

$seedGenerator = new Bip39SeedGenerator();
// 通過助記詞生成種子,傳入可選加密串'hello'
$seed = $seedGenerator->getSeed($mnemonic);
echo "seed: " . $seed->getHex() . PHP_EOL;
$hdFactory = new HierarchicalKeyFactory();
$master = $hdFactory->fromEntropy($seed);

$util = new Util();
// 設置路徑account
$hardened = $master->derivePath("44'/60'/0'/0/0");
echo " - m/44'/60'/0'/0/0 " .PHP_EOL;
echo " public key: " . $hardened->getPublicKey()->getHex().PHP_EOL;
echo " private key: " . $hardened->getPrivateKey()->getHex().PHP_EOL;// 可以導入到imtoken使用的私鑰
echo " address: " . $util->publicKeyToAddress($util->privateKeyToPublicKey($hardened->getPrivateKey()->getHex())) . PHP_EOL;// 私鑰導入imtoken後一樣的地址

創建LTC地址

<?php
require_once './vendor/autoload.php';

use BitWasp\Bitcoin\Address\PayToPubKeyHashAddress;
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\Bitcoin\Network\NetworkFactory;

// Bip39
$math = Bitcoin::getMath();
// 設置萊特幣網絡
$network = NetworkFactory::litecoin();
$random = new Random();
// 生成隨機數(initial entropy)
$entropy = $random->bytes(Bip39Mnemonic::MIN_ENTROPY_BYTE_LEN);
$bip39 = MnemonicFactory::bip39();
// 通過隨機數生成助記詞
$mnemonic = $bip39->entropyToMnemonic($entropy);
//$mnemonic = 'security hurdle lift acoustic skate recall hotel elegant amateur hidden escape slow';
echo "mnemonic: " . $mnemonic.PHP_EOL.PHP_EOL;// 助記詞

$seedGenerator = new Bip39SeedGenerator();
// 通過助記詞生成種子,傳入可選加密串'hello'
$seed = $seedGenerator->getSeed($mnemonic);
echo "seed: " . $seed->getHex() . PHP_EOL;
$hdFactory = new HierarchicalKeyFactory();
$master = $hdFactory->fromEntropy($seed);

$hardened = $master->derivePath("44'/2'/0'/0/0");
echo 'WIF ' . $hardened->getPrivateKey()->toWif($network);
echo PHP_EOL;
$address = new PayToPubKeyHashAddress($hardened->getPublicKey()->getPubKeyHash());
echo 'address ' . $address->getAddress($network);
echo PHP_EOL;

參考文章

  • https://www.cnblogs.com/ygcool/p/11714335.html
  • https://iancoleman.io/bip39/
  • https://github.com/bitcoin/bips
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章