-1

我一直在研究 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######### 的地址,这意味着它在 mainnet 网络上传递,它应该在 testnet 网络上。

问题 #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 交易的地址。请帮忙。

4

1 回答 1

-1

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

return $child_key->getAddress(new AddressCreator())->getAddress($btc);
于 2021-11-11T11:48:47.217 回答