繁体   English   中英

Bit-Wasp/bitcoin-php 从扩展公钥生成钱包

[英]Bit-Wasp/bitcoin-php Generate Wallet from Extended Public Key

我已经围绕 Bit-Wasp/bitcoin-php 库工作了一段时间,但遇到了无法解决的问题。

我有这个作为我的代码:

    public function bitcoinWalletFromPublicKey($key, $index) {

    $adapter = Bitcoin::getEcAdapter();

   if (config('market.btc_network') == "mainnet") {
       $btc = NetworkFactory::bitcoin();
       $bitcoinPrefixes = new BitcoinRegistry();
   } else {
        $btc = NetworkFactory::bitcoinTestnet();
        $bitcoinPrefixes = new BitcoinTestnetRegistry();
   }


    $slip132 = new Slip132(new KeyToScriptHelper($adapter));

    $pubkeytype=substr($key, 0, 4);

    if ($pubkeytype=='xpub' || $pubkeytype =='tpub') $pubPrefix = $slip132->p2pkh($bitcoinPrefixes);
    if ($pubkeytype=='ypub') $pubPrefix = $slip132->p2shP2wpkh($bitcoinPrefixes);
    if ($pubkeytype=='zpub' || $pubkeytype =='vpub') $pubPrefix = $slip132->p2wpkh($bitcoinPrefixes);

    $config = new GlobalPrefixConfig([
        new NetworkConfig($btc, [$pubPrefix])
    ]);



    $serializer = new Base58ExtendedKeySerializer(
        new ExtendedKeySerializer($adapter, $config)
    );

    $path = '0/' . $index;

    $fkey = $serializer->parse($btc, $key);

    $child_key = $fkey->derivePath($path);
    #$account0Key = $child_key->derivePath("84'/0'/0'");
    #$child_key = $fkey->derivePath("0/1");

    //dd($child_key->getAddress(new AddressCreator())->getAddress());
    return $child_key->getAddress(new AddressCreator())->getAddress();
}

这段代码有两个问题:

问题#1在代码的前几行你会看到我使用了一个 If 语句来检查它应该使用什么网络。 在我的测试中,我使用 testnet 网络,我也确定 If / else { # code } 上的代码可以正常工作,并且它正确使用了 NetworkFactory::bitcoinTestnet() 和 new BitcoinTestnetRegistry();

$key 变量代表我的用户的主公钥来自 Electrum 钱包或任何格式为 (xpub########################/vpub# ########################) 或在我的情况下,因为它在测试网上它使用 tpub############## ########### 格式。 但是,它返回一个格式为 bc######### 的地址,这意味着它在主网网络上传递,其中它应该在测试网网络上。

问题#2在我代码的下半部分,我使用了 $fkey = $serializer->parse($btc, $key); 和 $child_key = $fkey->derivePath($path) 其中 $path = '0/' $index. $index 这里只是随机数。 它可以是 0/1 或 0/99 或任何 0/随机。

这里的问题是与问题 #1 有某种关系,在它生成错误的地址后,当我尝试使用此地址进行交易时,我的 rpc 返回无效地址错误。 正如你所看到的,我有一个注释代码 $account0Key = $child_key->derivePath("84'/0'/0'"); 其中我收到一个错误,它需要一个私钥而不是公共密钥。 现在,我担心的是我不希望我正在制作的系统的用户将他们的私钥放在任何地方,因为它可能只会危及他们的钱包。

基本上,我想使用BitWasp 的这个库来实现的是,当用户从他们的钱包中放入他们的主公钥时,我的系统将能够生成一个用于 btc 交易的地址。 请帮忙。

在 getAddress() 方法中传递网络有效

return $child_key->getAddress(new AddressCreator())->getAddress($btc);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM